From b618b835c74a8637e00ba1f4adf6b8884d360d43 Mon Sep 17 00:00:00 2001 From: Benoit Giannangeli Date: Fri, 3 Feb 2017 15:59:29 +0100 Subject: Table, metatable --- src/lobject.js | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) (limited to 'src/lobject.js') diff --git a/src/lobject.js b/src/lobject.js index 7efbef5..876a16f 100644 --- a/src/lobject.js +++ b/src/lobject.js @@ -18,11 +18,73 @@ class TValue { constructor(type, value) { this.type = type; this.value = value; + this.metatable = null; } } + +class TString extends TValue { + + constructor(string) { + super(CT.LUA_TSTRING, string); + } + +} + + +class Table extends TValue { + + constructor(array, hash) { + super(CT.LUA_TTABLE, { + array: array !== undefined ? array : [], + hash: new Map(hash) + }); + + this.usermetatable = null; + + this.metatable = { + __newindex: function (table, key) { + if (key instanceof TValue) { + // Those lua values are used by value, tables and functions by reference + if ([CT.TNUMBER, CT.TSTRING, CT.TSHRSTR, CT.TLNGSTR, CT.TNUMFLT, CT.TNUMINT].indexOf(key.type) > -1) { + key = key.value; + } + } + + if (typeof key === 'number') { + table.value.array[key] = value; + } else { + table.value.hash.set(key, value); + } + }, + + __index: function (table, key, value) { + if (key instanceof TValue) { + // Those lua values are used by value, tables and functions by reference + if ([CT.TNUMBER, CT.TSTRING, CT.TSHRSTR, CT.TLNGSTR, CT.TNUMFLT, CT.TNUMINT].indexOf(key.type) > -1) { + key = key.value; + } + } + + if (typeof key === 'number') { + return table.value.array[key]; + } else { + return table.value.hash.get(key); + } + }, + + __len: function (table) { + return t.value.array.length; + } + }; + } + +} + + module.exports = { LClosure: LClosure, - TValue: TValue + TValue: TValue, + Table: Table }; \ No newline at end of file -- cgit v1.2.3-54-g00ecf