使用されているハッシュの数

昨日の話の続き
http://d.hatena.ne.jp/tkuro/20100401/1270159580

また、{}でないテーブルのエントリを消して {}になった場合、確保されているエントリ数は変わらないので 0 にならない、という問題点が。。。(まずい?)

ちゃんと見てみたら numusehash() というのがあったりした。
と言うわけで

diff --git a/src/ltable.c b/src/ltable.c
index ec84f4f..d313bcf 100644
--- a/src/ltable.c
+++ b/src/ltable.c
@@ -575,6 +575,12 @@ int luaH_getn (Table *t) {
   else return unbound_search(t, j);
 }
 
+int luaH_gethn (Table *t) {
+  int nums[MAXBITS+1];  /* nums[i] = number of keys between 2^(i-1) and 2^i */
+  int dummy;
+  
+  return t->node == dummynode? 0: numusehash(t, nums, &dummy);
+}
 
 
 #if defined(LUA_DEBUG)

どうもこんだけで、

>  p = {a = 2}
> print(+p)
1
> p.a = nil
> print(+p)
0

いけるらしい。