From d948459f4459eacc01edba9d62f4e0108fc85306 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Fri, 24 Jan 2014 01:26:34 +0100 Subject: [PATCH] Record whether a function is script or function code. Script code returns the value of the last evaluated expression. Function code returns the explicit return value or undefined. --- jscompile.c | 11 ++++++----- jscompile.h | 1 + 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/jscompile.c b/jscompile.c index b7111de..ebf3631 100644 --- a/jscompile.c +++ b/jscompile.c @@ -2,7 +2,7 @@ #include "jsparse.h" #include "jscompile.h" -#define cexp js_cexp /* collision with math.h */ +#define cexp jsC_cexp /* collision with math.h */ #define JF js_State *J, js_Function *F @@ -30,7 +30,7 @@ int jsC_error(js_State *J, js_Ast *node, const char *fmt, ...) js_throw(J); } -static js_Function *newfun(js_State *J, js_Ast *name, js_Ast *params, js_Ast *body) +static js_Function *newfun(js_State *J, js_Ast *name, js_Ast *params, js_Ast *body, int script) { js_Function *F = malloc(sizeof *F); memset(F, 0, sizeof *F); @@ -41,6 +41,7 @@ static js_Function *newfun(js_State *J, js_Ast *name, js_Ast *params, js_Ast *bo F->filename = js_intern(J, J->filename); F->line = name ? name->line : params ? params->line : body ? body->line : 1; + F->script = script; cfunbody(J, F, name, params, body); @@ -412,7 +413,7 @@ static void cexp(JF, js_Ast *exp) break; case EXP_FUN: - emitfunction(J, F, newfun(J, exp->a, exp->b, exp->c)); + emitfunction(J, F, newfun(J, exp->a, exp->b, exp->c, 0)); break; case AST_IDENTIFIER: @@ -1015,7 +1016,7 @@ static void cfundecs(JF, js_Ast *list) while (list) { js_Ast *stm = list->a; if (stm->type == AST_FUNDEC) { - emitfunction(J, F, newfun(J, stm->a, stm->b, stm->c)); + emitfunction(J, F, newfun(J, stm->a, stm->b, stm->c, 0)); emitstring(J, F, OP_FUNDEC, stm->a->string); } list = list->b; @@ -1058,5 +1059,5 @@ static void cfunbody(JF, js_Ast *name, js_Ast *params, js_Ast *body) js_Function *jsC_compile(js_State *J, js_Ast *prog) { - return newfun(J, NULL, NULL, prog); + return newfun(J, NULL, NULL, prog, 1); } diff --git a/jscompile.h b/jscompile.h index 8fd5627..ee0e133 100644 --- a/jscompile.h +++ b/jscompile.h @@ -106,6 +106,7 @@ enum js_OpCode struct js_Function { const char *name; + int script; int numparams; const char **params;