diff options
author | Benoit Giannangeli <benoit.giannangeli@boursorama.fr> | 2017-02-13 14:21:20 +0100 |
---|---|---|
committer | Benoit Giannangeli <benoit.giannangeli@boursorama.fr> | 2017-02-13 14:21:20 +0100 |
commit | ab14ee4aa480b21a6e5c6c4d8cdb1823951ed7c3 (patch) | |
tree | af213096b6f944ee00ee6c1e49d72147543ff782 /src/ltable.js | |
parent | 07d15af3d893e5eecc1baffaf47fe512d6218d0b (diff) | |
download | fengari-ab14ee4aa480b21a6e5c6c4d8cdb1823951ed7c3.tar.gz fengari-ab14ee4aa480b21a6e5c6c4d8cdb1823951ed7c3.tar.bz2 fengari-ab14ee4aa480b21a6e5c6c4d8cdb1823951ed7c3.zip |
Moved luaH_getn to ltable.js
Diffstat (limited to 'src/ltable.js')
-rw-r--r-- | src/ltable.js | 30 |
1 files changed, 30 insertions, 0 deletions
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 |