summaryrefslogtreecommitdiff
path: root/src/ldo.js
diff options
context:
space:
mode:
authorBenoit Giannangeli <benoit.giannangeli@boursorama.fr>2017-02-16 16:04:03 +0100
committerBenoit Giannangeli <benoit.giannangeli@boursorama.fr>2017-02-16 16:04:44 +0100
commit62cb8279094fd137ce2382fe99592ef0aae0f557 (patch)
tree0ec59ec29c410e20f177e874e0a001ab620e02e2 /src/ldo.js
parentf556eada483134f5dc433e6bd4510047e4953649 (diff)
downloadfengari-62cb8279094fd137ce2382fe99592ef0aae0f557.tar.gz
fengari-62cb8279094fd137ce2382fe99592ef0aae0f557.tar.bz2
fengari-62cb8279094fd137ce2382fe99592ef0aae0f557.zip
lua_call
Diffstat (limited to 'src/ldo.js')
-rw-r--r--src/ldo.js46
1 files changed, 42 insertions, 4 deletions
diff --git a/src/ldo.js b/src/ldo.js
index aa52b76..f965a47 100644
--- a/src/ldo.js
+++ b/src/ldo.js
@@ -1,6 +1,8 @@
/*jshint esversion: 6 */
"use strict";
+const assert = require('assert');
+
const lua = require('./lua.js');
const lobject = require('./lobject.js');
const lstate = require('./lstate.js');
@@ -15,15 +17,51 @@ const TMS = ltm.TMS;
const nil = new TValue(CT.LUA_TNIL, null);
+/*
+** Prepares a function call: checks the stack, creates a new CallInfo
+** entry, fills in the relevant information, calls hook if needed.
+** If function is a JS function, does the call, too. (Otherwise, leave
+** the execution ('luaV_execute') to the caller, to allow stackless
+** calls.) Returns true iff function has been executed (JS function).
+*/
const luaD_precall = function(L, off, nresults) {
let func = L.stack[off];
let ci;
switch(func.type) {
- case CT.LUA_TCCL: // JS function ?
- throw new Error("LUA_TCCL not implemeted yet");
- case CT.LUA_TLCF: // still JS function ?
- throw new Error("LUA_TLCF not implemeted yet");
+ case CT.LUA_TCCL:
+ case CT.LUA_TLCF: {
+ let f = func.type === CT.LUA_TCCL ? func.f : func.value;
+
+ // next_ci
+ if (L.ci.next) {
+ L.ci = L.ci.next;
+ ci = L.ci;
+ } else {
+ ci = new lstate.CallInfo(off);
+ L.ci.next = ci;
+ ci.previous = L.ci;
+ ci.next = null;
+
+ L.ci = ci;
+ L.ciOff++;
+ }
+
+ ci.nresults = nresults;
+ ci.func = func;
+ ci.funcOff = off;
+ ci.top = L.top + lua.LUA_MINSTACK;
+ ci.callstatus = 0;
+ // TODO: hook
+ let n = f(L); /* do the actual call */
+
+ assert(n < L.top - L.ci.funcOff, "not enough elements in the stack");
+
+ luaD_poscall(L, ci, L.top - n, n);
+
+ return true;
+ break;
+ }
case CT.LUA_TLCL: {
let p = func.p;
let n = L.top - off - 1;