diff options
-rw-r--r-- | src/lobject.js | 25 | ||||
-rw-r--r-- | src/ltable.js | 30 | ||||
-rw-r--r-- | src/lvm.js | 1 |
3 files changed, 31 insertions, 25 deletions
diff --git a/src/lobject.js b/src/lobject.js index 385ac9c..e206bf1 100644 --- a/src/lobject.js +++ b/src/lobject.js @@ -163,31 +163,6 @@ class Table extends TValue { return this.luaH_getn(); } - /* - ** Try to find a boundary in table 't'. A 'boundary' is an integer index - ** such that t[i] is non-nil and t[i+1] is nil (and 0 if t[1] is nil). - */ - luaH_getn() { - let array = this.value.array; - let hash = this.value.hash; - - let j = array.length; - if (j > 0 && array[j - 1].ttisnil()) { - /* there is a boundary in the array part: (binary) search for it */ - let i = 0; - while (j - i > 1) { - let m = (i+j)/2; - if (array[m - 1].ttisnil()) j = m; - else i = m; - } - return i; - } - /* else must find a boundary in hash part */ - else if (hash.size === 0) - return j; - else return j; // TODO: unbound_search(t, j) => but why ? - } - } class LClosure extends TValue { diff --git a/src/ltable.js b/src/ltable.js new file mode 100644 index 0000000..6e3af15 --- /dev/null +++ b/src/ltable.js @@ -0,0 +1,30 @@ +/*jshint esversion: 6 */ +"use strict"; + +const lobject = require('./lobject.js'); +const Table = lobject.Table; + +/* +** Try to find a boundary in table 't'. A 'boundary' is an integer index +** such that t[i] is non-nil and t[i+1] is nil (and 0 if t[1] is nil). +*/ +Table.prototype.luaH_getn = function() { + let array = this.value.array; + let hash = this.value.hash; + + let j = array.length; + if (j > 0 && array[j - 1].ttisnil()) { + /* there is a boundary in the array part: (binary) search for it */ + let i = 0; + while (j - i > 1) { + let m = (i+j)/2; + if (array[m - 1].ttisnil()) j = m; + else i = m; + } + return i; + } + /* else must find a boundary in hash part */ + else if (hash.size === 0) + return j; + else return j; // TODO: unbound_search(t, j) => but why ? +};
\ No newline at end of file @@ -20,6 +20,7 @@ const CallInfo = lstate.CallInfo; const llimit = require('./llimit.js'); const ldo = require('./ldo.js'); const ltm = require('./ltm.js'); +const ltable = require('./ltable.js'); const TMS = ltm.TMS; const RA = function(L, base, i) { |