From ab14ee4aa480b21a6e5c6c4d8cdb1823951ed7c3 Mon Sep 17 00:00:00 2001 From: Benoit Giannangeli Date: Mon, 13 Feb 2017 14:21:20 +0100 Subject: Moved luaH_getn to ltable.js --- src/ltable.js | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/ltable.js (limited to 'src/ltable.js') 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 -- cgit v1.2.3-54-g00ecf