diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2015-11-03 16:35:21 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2015-11-03 16:35:21 -0200 |
commit | 5100bc8aa1c05b1c967567c09d0c70b7c339cc28 (patch) | |
tree | 68c996b0c749133512ec9388551e97dfd5681195 | |
parent | ebb2afa54bb038f6d7ddb81b908ffeb4a9c3dea3 (diff) | |
download | lua-5100bc8aa1c05b1c967567c09d0c70b7c339cc28.tar.gz lua-5100bc8aa1c05b1c967567c09d0c70b7c339cc28.tar.bz2 lua-5100bc8aa1c05b1c967567c09d0c70b7c339cc28.zip |
no need for a special case to get long strings (not that common)
-rw-r--r-- | ltable.c | 38 |
1 files changed, 16 insertions, 22 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ltable.c,v 2.114 2015/11/03 15:47:30 roberto Exp roberto $ | 2 | ** $Id: ltable.c,v 2.115 2015/11/03 18:10:44 roberto Exp roberto $ |
3 | ** Lua tables (hash) | 3 | ** Lua tables (hash) |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -508,7 +508,7 @@ const TValue *luaH_getint (Table *t, lua_Integer key) { | |||
508 | if (nx == 0) break; | 508 | if (nx == 0) break; |
509 | n += nx; | 509 | n += nx; |
510 | } | 510 | } |
511 | }; | 511 | } |
512 | return luaO_nilobject; | 512 | return luaO_nilobject; |
513 | } | 513 | } |
514 | } | 514 | } |
@@ -534,11 +534,14 @@ const TValue *luaH_getshortstr (Table *t, TString *key) { | |||
534 | } | 534 | } |
535 | 535 | ||
536 | 536 | ||
537 | static const TValue *getlngstr (Table *t, TString *key) { | 537 | /* |
538 | Node *n = hashpow2(t, luaS_hashlongstr(key)); | 538 | ** "Generic" get version. (Not that generic: not valid for integers, |
539 | ** which may be in array part, nor for floats with integral values.) | ||
540 | */ | ||
541 | static const TValue *getgeneric (Table *t, const TValue *key) { | ||
542 | Node *n = mainposition(t, key); | ||
539 | for (;;) { /* check whether 'key' is somewhere in the chain */ | 543 | for (;;) { /* check whether 'key' is somewhere in the chain */ |
540 | const TValue *k = gkey(n); | 544 | if (luaV_rawequalobj(gkey(n), key)) |
541 | if (ttislngstring(k) && luaS_eqlngstr(tsvalue(k), key)) | ||
542 | return gval(n); /* that's it */ | 545 | return gval(n); /* that's it */ |
543 | else { | 546 | else { |
544 | int nx = gnext(n); | 547 | int nx = gnext(n); |
@@ -553,8 +556,11 @@ static const TValue *getlngstr (Table *t, TString *key) { | |||
553 | const TValue *luaH_getstr (Table *t, TString *key) { | 556 | const TValue *luaH_getstr (Table *t, TString *key) { |
554 | if (key->tt == LUA_TSHRSTR) | 557 | if (key->tt == LUA_TSHRSTR) |
555 | return luaH_getshortstr(t, key); | 558 | return luaH_getshortstr(t, key); |
556 | else | 559 | else { /* for long strings, use generic case */ |
557 | return getlngstr(t, key); | 560 | TValue ko; |
561 | setsvalue(cast(lua_State *, NULL), &ko, key); | ||
562 | return getgeneric(t, &ko); | ||
563 | } | ||
558 | } | 564 | } |
559 | 565 | ||
560 | 566 | ||
@@ -564,7 +570,6 @@ const TValue *luaH_getstr (Table *t, TString *key) { | |||
564 | const TValue *luaH_get (Table *t, const TValue *key) { | 570 | const TValue *luaH_get (Table *t, const TValue *key) { |
565 | switch (ttype(key)) { | 571 | switch (ttype(key)) { |
566 | case LUA_TSHRSTR: return luaH_getshortstr(t, tsvalue(key)); | 572 | case LUA_TSHRSTR: return luaH_getshortstr(t, tsvalue(key)); |
567 | case LUA_TLNGSTR: return getlngstr(t, tsvalue(key)); | ||
568 | case LUA_TNUMINT: return luaH_getint(t, ivalue(key)); | 573 | case LUA_TNUMINT: return luaH_getint(t, ivalue(key)); |
569 | case LUA_TNIL: return luaO_nilobject; | 574 | case LUA_TNIL: return luaO_nilobject; |
570 | case LUA_TNUMFLT: { | 575 | case LUA_TNUMFLT: { |
@@ -573,19 +578,8 @@ const TValue *luaH_get (Table *t, const TValue *key) { | |||
573 | return luaH_getint(t, k); /* use specialized version */ | 578 | return luaH_getint(t, k); /* use specialized version */ |
574 | /* else... */ | 579 | /* else... */ |
575 | } /* FALLTHROUGH */ | 580 | } /* FALLTHROUGH */ |
576 | default: { | 581 | default: |
577 | Node *n = mainposition(t, key); | 582 | return getgeneric(t, key); |
578 | for (;;) { /* check whether 'key' is somewhere in the chain */ | ||
579 | if (luaV_rawequalobj(gkey(n), key)) | ||
580 | return gval(n); /* that's it */ | ||
581 | else { | ||
582 | int nx = gnext(n); | ||
583 | if (nx == 0) | ||
584 | return luaO_nilobject; /* not found */ | ||
585 | n += nx; | ||
586 | } | ||
587 | }; | ||
588 | } | ||
589 | } | 583 | } |
590 | } | 584 | } |
591 | 585 | ||