diff options
-rw-r--r-- | README.md | 6 | ||||
-rw-r--r-- | src/lcorolib.js | 4 | ||||
-rw-r--r-- | src/lvm.js | 1 | ||||
-rw-r--r-- | tests/lcorolib.js | 51 |
4 files changed, 52 insertions, 10 deletions
@@ -56,6 +56,7 @@ - [x] lua_pushnil - [x] lua_pushnumber - [x] lua_pushstring + - [x] lua_pushthread - [x] lua_pushvalue - [x] lua_rawequal - [x] lua_rawget @@ -121,7 +122,6 @@ - [ ] lua_pcallk - [ ] lua_pushfstring - [ ] lua_pushlightuserdata - - [ ] lua_pushthread - [ ] lua_pushvfstring - [ ] lua_rawgetp - [ ] lua_rawseti @@ -224,11 +224,11 @@ - [ ] load - [ ] Coroutine - [x] coroutine.create + - [x] coroutine.isyieldable - [x] coroutine.resume + - [x] coroutine.status - [x] coroutine.yield - - [ ] coroutine.isyieldable - [ ] coroutine.running - - [ ] coroutine.status - [ ] coroutine.wrap - [ ] Debug (errors) - [ ] DOM API binding diff --git a/src/lcorolib.js b/src/lcorolib.js index b595d4d..32532a6 100644 --- a/src/lcorolib.js +++ b/src/lcorolib.js @@ -32,7 +32,7 @@ const auxresume = function(L, co, narg) { lapi.lua_xmove(L, co, narg); let status = ldo.lua_resume(co, L, narg); if (status === TS.LUA_OK || status === TS.LUA_YIELD) { - let nres = lapi.lua_gettop(L); + let nres = lapi.lua_gettop(co); if (!lapi.lua_checkstack(L, nres + 1)) { lapi.lua_pop(co, nres); /* remove results anyway */ lapi.lua_pushliteral(L, "too many results to resume"); @@ -123,7 +123,7 @@ const luaB_costatus = function(L) { }; const luaB_yieldable = function(L) { - lapi.lua_pushboolean(L, lapi.lua_isyieldable(L)); + lapi.lua_pushboolean(L, ldo.lua_isyieldable(L)); return 1; }; @@ -521,6 +521,7 @@ const luaV_execute = function(L) { for (let aux = 0; nfuncOff + aux < lim; aux++) L.stack[ofuncOff + aux] = L.stack[nfuncOff + aux]; oci.func = nci.func; + oci.funcOff = nci.funcOff; oci.u.l.base = ofuncOff + (nci.u.l.base - nfuncOff); L.top = ofuncOff + (L.top - nfuncOff); oci.top = L.top; diff --git a/tests/lcorolib.js b/tests/lcorolib.js index 400e721..5f6d43d 100644 --- a/tests/lcorolib.js +++ b/tests/lcorolib.js @@ -17,7 +17,7 @@ const linit = require('../src/linit.js'); const CT = lua.constant_types; -test('simple coroutine', function (t) { +test('coroutine.create, coroutine.yield, coroutine.resume', function (t) { let luaCode = ` local co = coroutine.create(function (start) local b = coroutine.yield(start * start); @@ -54,7 +54,7 @@ test('simple coroutine', function (t) { }); -test('simple coroutine', function (t) { +test('coroutine.status', function (t) { let luaCode = ` local co = coroutine.create(function (start) local b = coroutine.yield(start * start); @@ -75,7 +75,7 @@ test('simple coroutine', function (t) { t.plan(3); - // t.doesNotThrow(function () { + t.doesNotThrow(function () { let bc = toByteCode(luaCode).dataView; @@ -83,11 +83,11 @@ test('simple coroutine', function (t) { linit.luaL_openlibs(L); - lapi.lua_load(L, bc, "test-coroutine"); + lapi.lua_load(L, bc, "test-coroutine.status"); lapi.lua_call(L, 0, -1); - // }, "JS Lua program ran without error"); + }, "JS Lua program ran without error"); t.strictEqual( lapi.lua_tostring(L, -2), @@ -100,4 +100,45 @@ test('simple coroutine', function (t) { "dead", "Correct element(s) on the stack" ); +}); + + +test('coroutine.isyieldable', function (t) { + let luaCode = ` + local co = coroutine.create(function () + coroutine.yield(coroutine.isyieldable()); + end) + + local succes, yieldable = coroutine.resume(co) + + return yieldable, coroutine.isyieldable() + `, L; + + t.plan(3); + + t.doesNotThrow(function () { + + let bc = toByteCode(luaCode).dataView; + + L = lauxlib.luaL_newstate(); + + linit.luaL_openlibs(L); + + lapi.lua_load(L, bc, "test-coroutine.isyieldable"); + + lapi.lua_call(L, 0, -1); + + }, "JS Lua program ran without error"); + + t.strictEqual( + lapi.lua_toboolean(L, -2), + true, + "Correct element(s) on the stack" + ); + + t.strictEqual( + lapi.lua_toboolean(L, -1), + false, + "Correct element(s) on the stack" + ); });
\ No newline at end of file |