Differentiate between "global code" and "eval code" scripts.

Add a separate js_loadeval for "eval code" scripts, and let
js_do/loadstring create "global code" scripts.

js_newscript called with the NULL scope is equivalent to 'eval code'.
js_newscript called with the J->GE scape is equivalent to 'global code'.
js_newfunction is created with the lexical scope, i.e. 'function code'.
This commit is contained in:
Tor Andersson
2014-10-27 16:11:23 +01:00
parent 7d771cb0d9
commit 3fe6635426
5 changed files with 26 additions and 8 deletions

View File

@@ -34,7 +34,7 @@ static void jsB_eval(js_State *J)
js_copy(J, 1);
return;
}
js_loadstring(J, "(eval)", js_tostring(J, -1));
js_loadeval(J, "(eval)", js_tostring(J, -1));
js_pushglobal(J);
js_call(J, 0);
}

3
jsi.h
View File

@@ -71,7 +71,8 @@ double js_strtod(const char *as, char **aas);
/* Private stack functions */
void js_newfunction(js_State *J, js_Function *function, js_Environment *scope);
void js_newscript(js_State *J, js_Function *function);
void js_newscript(js_State *J, js_Function *function, js_Environment *scope);
void js_loadeval(js_State *J, const char *filename, const char *source);
js_Regexp *js_toregexp(js_State *J, int idx);
int js_isarrayindex(js_State *J, const char *str, unsigned int *idx);

11
jsrun.c
View File

@@ -890,14 +890,21 @@ static void jsR_callfunction(js_State *J, unsigned int n, js_Function *F, js_Env
jsR_restorescope(J);
}
static void jsR_callscript(js_State *J, unsigned int n, js_Function *F)
static void jsR_callscript(js_State *J, unsigned int n, js_Function *F, js_Environment *scope)
{
js_Value v;
if (scope)
jsR_savescope(J, scope);
js_pop(J, n);
jsR_run(J, F);
v = js_tovalue(J, -1);
TOP = --BOT; /* clear stack */
js_pushvalue(J, v);
if (scope)
jsR_restorescope(J);
}
static void jsR_callcfunction(js_State *J, unsigned int n, unsigned int min, js_CFunction F)
@@ -933,7 +940,7 @@ void js_call(js_State *J, int n)
else
jsR_callfunction(J, n, obj->u.f.function, obj->u.f.scope);
} else if (obj->type == JS_CSCRIPT)
jsR_callscript(J, n, obj->u.f.function);
jsR_callscript(J, n, obj->u.f.function, obj->u.f.scope);
else if (obj->type == JS_CCFUNCTION)
jsR_callcfunction(J, n, obj->u.c.length, obj->u.c.function);

View File

@@ -40,7 +40,7 @@ int js_ploadfile(js_State *J, const char *filename)
return 0;
}
void js_loadstring(js_State *J, const char *filename, const char *source)
static void js_loadstringx(js_State *J, const char *filename, const char *source, int iseval)
{
js_Ast *P;
js_Function *F;
@@ -53,11 +53,21 @@ void js_loadstring(js_State *J, const char *filename, const char *source)
P = jsP_parse(J, filename, source);
F = jsC_compile(J, P);
jsP_freeparse(J);
js_newscript(J, F);
js_newscript(J, F, iseval ? NULL : J->GE);
js_endtry(J);
}
void js_loadeval(js_State *J, const char *filename, const char *source)
{
js_loadstringx(J, filename, source, 1);
}
void js_loadstring(js_State *J, const char *filename, const char *source)
{
js_loadstringx(J, filename, source, 0);
}
void js_loadfile(js_State *J, const char *filename)
{
FILE *f;

View File

@@ -339,11 +339,11 @@ void js_newfunction(js_State *J, js_Function *fun, js_Environment *scope)
}
}
void js_newscript(js_State *J, js_Function *fun)
void js_newscript(js_State *J, js_Function *fun, js_Environment *scope)
{
js_Object *obj = jsV_newobject(J, JS_CSCRIPT, NULL);
obj->u.f.function = fun;
obj->u.f.scope = NULL;
obj->u.f.scope = scope;
js_pushobject(J, obj);
}