aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBenoit Giannangeli <benoit.giannangeli@boursorama.fr>2017-03-21 14:05:14 +0100
committerBenoit Giannangeli <benoit.giannangeli@boursorama.fr>2017-03-21 14:05:14 +0100
commitc4b23126f0cb803ec944c5d7877bbf669f582374 (patch)
tree9c2bf5740ee89268e57f73574ec3abe870a4e160 /src
parent932875c87ab3f2ed2b676a98f273392661535f65 (diff)
downloadfengari-c4b23126f0cb803ec944c5d7877bbf669f582374.tar.gz
fengari-c4b23126f0cb803ec944c5d7877bbf669f582374.tar.bz2
fengari-c4b23126f0cb803ec944c5d7877bbf669f582374.zip
Userdata are ArrayBuffers, new lightuserdata subtype for js objects
Diffstat (limited to 'src')
-rw-r--r--src/lapi.js190
-rw-r--r--src/lobject.js8
-rw-r--r--src/lstrlib.js3
-rw-r--r--src/lua.js3
4 files changed, 114 insertions, 90 deletions
diff --git a/src/lapi.js b/src/lapi.js
index 5872545..991e982 100644
--- a/src/lapi.js
+++ b/src/lapi.js
@@ -281,9 +281,13 @@ const lua_pushboolean = function(L, b) {
};
const lua_pushlightuserdata = function(L, p) {
- assert(typeof p === "object");
+ L.stack[L.top++] = new TValue(CT.LUA_TLIGHTUSERDATA_PTR, p);
- L.stack[L.top++] = new TValue(CT.LUA_TLIGHTUSERDATA, p);
+ assert(L.top <= L.ci.top, "stack overflow");
+};
+
+const lua_pushobject = function(L, p) {
+ L.stack[L.top++] = new TValue(CT.LUA_TLIGHTUSERDATA_OBJ, p);
assert(L.top <= L.ci.top, "stack overflow");
};
@@ -428,8 +432,8 @@ const lua_createtable = function(L, narray, nrec) {
assert(L.top <= L.ci.top, "stack overflow");
};
-const lua_newuserdata = function(L, u) {
- L.stack[L.top++] = new lobject.TValue(CT.LUA_TUSERDATA, u);
+const lua_newuserdata = function(L, size) {
+ L.stack[L.top++] = new lobject.TValue(CT.LUA_TUSERDATA, new ArrayBuffer(size));
assert(L.top <= L.ci.top, "stack overflow");
@@ -698,6 +702,11 @@ const lua_isstring = function(L, idx) {
return o.ttisstring() || o.ttisnumber();
};
+const lua_isuserdata = function(L, idx) {
+ let o = index2addr(L, idx);
+ return o.ttisfulluserdata(o) || o.ttislightuserdata();
+};
+
const lua_rawequal = function(L, index1, index2) {
let o1 = index2addr(L, index1);
let o2 = index2addr(L, index2);
@@ -863,88 +872,91 @@ const lua_getextraspace = function () {
return null;
};
-module.exports.index2addr = index2addr;
-module.exports.index2addr_ = index2addr_;
-module.exports.lua_absindex = lua_absindex;
-module.exports.lua_atpanic = lua_atpanic;
-module.exports.lua_call = lua_call;
-module.exports.lua_callk = lua_callk;
-module.exports.lua_checkstack = lua_checkstack;
-module.exports.lua_compare = lua_compare;
-module.exports.lua_compare_ = lua_compare_;
-module.exports.lua_concat = lua_concat;
-module.exports.lua_copy = lua_copy;
-module.exports.lua_createtable = lua_createtable;
-module.exports.lua_dump = lua_dump;
-module.exports.lua_error = lua_error;
-module.exports.lua_gc = lua_gc;
-module.exports.lua_getallocf = lua_getallocf;
-module.exports.lua_getextraspace = lua_getextraspace;
-module.exports.lua_getfield = lua_getfield;
-module.exports.lua_getglobal = lua_getglobal;
-module.exports.lua_geti = lua_geti;
-module.exports.lua_getmetatable = lua_getmetatable;
-module.exports.lua_gettable = lua_gettable;
-module.exports.lua_gettop = lua_gettop;
-module.exports.lua_insert = lua_insert;
-module.exports.lua_isinteger = lua_isinteger;
-module.exports.lua_isnil = lua_isnil;
-module.exports.lua_isnone = lua_isnone;
-module.exports.lua_isnoneornil = lua_isnoneornil;
-module.exports.lua_isnumber = lua_isnumber;
-module.exports.lua_isstring = lua_isstring;
-module.exports.lua_istable = lua_istable;
-module.exports.lua_len = lua_len;
-module.exports.lua_load = lua_load;
-module.exports.lua_newtable = lua_newtable;
-module.exports.lua_newuserdata = lua_newuserdata;
-module.exports.lua_next = lua_next;
-module.exports.lua_pcall = lua_pcall;
-module.exports.lua_pcallk = lua_pcallk;
-module.exports.lua_pop = lua_pop;
-module.exports.lua_pushboolean = lua_pushboolean;
-module.exports.lua_pushcclosure = lua_pushcclosure;
-module.exports.lua_pushcfunction = lua_pushcfunction;
-module.exports.lua_pushglobaltable = lua_pushglobaltable;
-module.exports.lua_pushinteger = lua_pushinteger;
-module.exports.lua_pushjsclosure = lua_pushjsclosure;
-module.exports.lua_pushjsfunction = lua_pushjsfunction;
-module.exports.lua_pushliteral = lua_pushliteral;
-module.exports.lua_pushlstring = lua_pushlstring;
-module.exports.lua_pushnil = lua_pushnil;
-module.exports.lua_pushnumber = lua_pushnumber;
-module.exports.lua_pushstring = lua_pushstring;
-module.exports.lua_pushthread = lua_pushthread;
-module.exports.lua_pushtvalue = lua_pushtvalue;
-module.exports.lua_pushvalue = lua_pushvalue;
-module.exports.lua_rawequal = lua_rawequal;
-module.exports.lua_rawget = lua_rawget;
-module.exports.lua_rawgeti = lua_rawgeti;
-module.exports.lua_rawlen = lua_rawlen;
-module.exports.lua_rawset = lua_rawset;
-module.exports.lua_remove = lua_remove;
-module.exports.lua_replace = lua_replace;
-module.exports.lua_rotate = lua_rotate;
-module.exports.lua_setfield = lua_setfield;
-module.exports.lua_setglobal = lua_setglobal;
-module.exports.lua_seti = lua_seti;
-module.exports.lua_setmetatable = lua_setmetatable;
-module.exports.lua_settable = lua_settable;
-module.exports.lua_settop = lua_settop;
-module.exports.lua_setupvalue = lua_setupvalue;
-module.exports.lua_status = lua_status;
-module.exports.lua_stringtonumber = lua_stringtonumber;
-module.exports.lua_toboolean = lua_toboolean;
-module.exports.lua_todataview = lua_todataview;
-module.exports.lua_tointeger = lua_tointeger;
-module.exports.lua_tointegerx = lua_tointegerx;
-module.exports.lua_tolstring = lua_tolstring;
-module.exports.lua_tonumber = lua_tonumber;
-module.exports.lua_topointer = lua_topointer;
-module.exports.lua_tostring = lua_tostring;
-module.exports.lua_tothread = lua_tothread;
-module.exports.lua_touserdata = lua_touserdata;
-module.exports.lua_type = lua_type;
-module.exports.lua_typename = lua_typename;
-module.exports.lua_version = lua_version;
-module.exports.lua_xmove = lua_xmove; \ No newline at end of file
+module.exports.index2addr = index2addr;
+module.exports.index2addr_ = index2addr_;
+module.exports.lua_absindex = lua_absindex;
+module.exports.lua_atpanic = lua_atpanic;
+module.exports.lua_call = lua_call;
+module.exports.lua_callk = lua_callk;
+module.exports.lua_checkstack = lua_checkstack;
+module.exports.lua_compare = lua_compare;
+module.exports.lua_compare_ = lua_compare_;
+module.exports.lua_concat = lua_concat;
+module.exports.lua_copy = lua_copy;
+module.exports.lua_createtable = lua_createtable;
+module.exports.lua_dump = lua_dump;
+module.exports.lua_error = lua_error;
+module.exports.lua_gc = lua_gc;
+module.exports.lua_getallocf = lua_getallocf;
+module.exports.lua_getextraspace = lua_getextraspace;
+module.exports.lua_getfield = lua_getfield;
+module.exports.lua_getglobal = lua_getglobal;
+module.exports.lua_geti = lua_geti;
+module.exports.lua_getmetatable = lua_getmetatable;
+module.exports.lua_gettable = lua_gettable;
+module.exports.lua_gettop = lua_gettop;
+module.exports.lua_insert = lua_insert;
+module.exports.lua_isinteger = lua_isinteger;
+module.exports.lua_isnil = lua_isnil;
+module.exports.lua_isnone = lua_isnone;
+module.exports.lua_isnoneornil = lua_isnoneornil;
+module.exports.lua_isnumber = lua_isnumber;
+module.exports.lua_isstring = lua_isstring;
+module.exports.lua_istable = lua_istable;
+module.exports.lua_isuserdata = lua_isuserdata;
+module.exports.lua_len = lua_len;
+module.exports.lua_load = lua_load;
+module.exports.lua_newtable = lua_newtable;
+module.exports.lua_newuserdata = lua_newuserdata;
+module.exports.lua_next = lua_next;
+module.exports.lua_pcall = lua_pcall;
+module.exports.lua_pcallk = lua_pcallk;
+module.exports.lua_pop = lua_pop;
+module.exports.lua_pushboolean = lua_pushboolean;
+module.exports.lua_pushcclosure = lua_pushcclosure;
+module.exports.lua_pushcfunction = lua_pushcfunction;
+module.exports.lua_pushglobaltable = lua_pushglobaltable;
+module.exports.lua_pushinteger = lua_pushinteger;
+module.exports.lua_pushjsclosure = lua_pushjsclosure;
+module.exports.lua_pushjsfunction = lua_pushjsfunction;
+module.exports.lua_pushlightuserdata = lua_pushlightuserdata;
+module.exports.lua_pushliteral = lua_pushliteral;
+module.exports.lua_pushlstring = lua_pushlstring;
+module.exports.lua_pushnil = lua_pushnil;
+module.exports.lua_pushnumber = lua_pushnumber;
+module.exports.lua_pushobject = lua_pushobject;
+module.exports.lua_pushstring = lua_pushstring;
+module.exports.lua_pushthread = lua_pushthread;
+module.exports.lua_pushtvalue = lua_pushtvalue;
+module.exports.lua_pushvalue = lua_pushvalue;
+module.exports.lua_rawequal = lua_rawequal;
+module.exports.lua_rawget = lua_rawget;
+module.exports.lua_rawgeti = lua_rawgeti;
+module.exports.lua_rawlen = lua_rawlen;
+module.exports.lua_rawset = lua_rawset;
+module.exports.lua_remove = lua_remove;
+module.exports.lua_replace = lua_replace;
+module.exports.lua_rotate = lua_rotate;
+module.exports.lua_setfield = lua_setfield;
+module.exports.lua_setglobal = lua_setglobal;
+module.exports.lua_seti = lua_seti;
+module.exports.lua_setmetatable = lua_setmetatable;
+module.exports.lua_settable = lua_settable;
+module.exports.lua_settop = lua_settop;
+module.exports.lua_setupvalue = lua_setupvalue;
+module.exports.lua_status = lua_status;
+module.exports.lua_stringtonumber = lua_stringtonumber;
+module.exports.lua_toboolean = lua_toboolean;
+module.exports.lua_todataview = lua_todataview;
+module.exports.lua_tointeger = lua_tointeger;
+module.exports.lua_tointegerx = lua_tointegerx;
+module.exports.lua_tolstring = lua_tolstring;
+module.exports.lua_tonumber = lua_tonumber;
+module.exports.lua_topointer = lua_topointer;
+module.exports.lua_tostring = lua_tostring;
+module.exports.lua_tothread = lua_tothread;
+module.exports.lua_touserdata = lua_touserdata;
+module.exports.lua_type = lua_type;
+module.exports.lua_typename = lua_typename;
+module.exports.lua_version = lua_version;
+module.exports.lua_xmove = lua_xmove; \ No newline at end of file
diff --git a/src/lobject.js b/src/lobject.js
index e1c3e97..dfe6337 100644
--- a/src/lobject.js
+++ b/src/lobject.js
@@ -57,6 +57,14 @@ class TValue {
ttislightuserdata() {
return this.checktag(CT.LUA_TLIGHTUSERDATA);
}
+
+ ttisobject() {
+ return this.checktag(CT.LUA_TLIGHTUSERDATA_OBJ);
+ }
+
+ ttisptr() {
+ return this.checktag(CT.LUA_TLIGHTUSERDATA_PTR);
+ }
ttisstring() {
return this.checktype(CT.LUA_TSTRING);
diff --git a/src/lstrlib.js b/src/lstrlib.js
index cd9278d..95fb375 100644
--- a/src/lstrlib.js
+++ b/src/lstrlib.js
@@ -1252,7 +1252,8 @@ const str_gmatch = function(L) {
let ls = s.length;
let lp = p.length;
lapi.lua_settop(L, 2); /* keep them on closure to avoid being collected */
- let gm = lapi.lua_newuserdata(L, new GMatchState());
+ let gm = new GMatchState();
+ lapi.lua_pushobject(L, gm);
prepstate(gm.ms, L, s, ls, p, lp);
gm.src = 0;
gm.p = 0;
diff --git a/src/lua.js b/src/lua.js
index be6cc1e..d7bfa01 100644
--- a/src/lua.js
+++ b/src/lua.js
@@ -60,6 +60,9 @@ const constant_types = {
constant_types.LUA_TSHRSTR = constant_types.LUA_TSTRING | (0 << 4); /* short strings */
constant_types.LUA_TLNGSTR = constant_types.LUA_TSTRING | (1 << 4); /* long strings */
+constant_types.LUA_TLIGHTUSERDATA_PTR = constant_types.LUA_TLIGHTUSERDATA | (0 << 4); /* short strings */
+constant_types.LUA_TLIGHTUSERDATA_OBJ = constant_types.LUA_TLIGHTUSERDATA | (1 << 4); /* long strings */
+
constant_types.LUA_TNUMFLT = constant_types.LUA_TNUMBER | (0 << 4); /* float numbers */
constant_types.LUA_TNUMINT = constant_types.LUA_TNUMBER | (1 << 4); /* integer numbers */