mirror of
https://github.com/ccxvii/mujs.git
synced 2026-02-06 01:41:37 +08:00
Compile ES5 getters and setters.
This commit is contained in:
15
jscompile.c
15
jscompile.c
@@ -192,8 +192,8 @@ static void cobject(JF, js_Ast *list)
|
||||
{
|
||||
while (list) {
|
||||
js_Ast *kv = list->a;
|
||||
js_Ast *prop = kv->a;
|
||||
if (kv->type == EXP_PROP_VAL) {
|
||||
js_Ast *prop = kv->a;
|
||||
if (prop->type == AST_IDENTIFIER || prop->type == AST_STRING) {
|
||||
cexp(J, F, kv->b);
|
||||
emitstring(J, F, OP_INITPROP_S, prop->string);
|
||||
@@ -211,8 +211,15 @@ static void cobject(JF, js_Ast *list)
|
||||
jsC_error(J, list, "illegal property name in object initializer");
|
||||
}
|
||||
} else {
|
||||
// TODO: set/get
|
||||
jsC_error(J, kv, "property setters and getters are not implemented");
|
||||
if (prop->type == AST_IDENTIFIER || prop->type == AST_STRING)
|
||||
emitstring(J, F, OP_STRING, prop->string);
|
||||
if (prop->type == AST_NUMBER)
|
||||
emitnumber(J, F, prop->number);
|
||||
emitfunction(J, F, newfun(J, NULL, kv->b, kv->c, 0));
|
||||
if (kv->type == EXP_PROP_GET)
|
||||
emit(J, F, OP_INITGETTER);
|
||||
if (kv->type == EXP_PROP_SET)
|
||||
emit(J, F, OP_INITSETTER);
|
||||
}
|
||||
list = list->b;
|
||||
}
|
||||
@@ -599,7 +606,7 @@ static int isloop(js_AstType T)
|
||||
|
||||
static int isfun(js_AstType T)
|
||||
{
|
||||
return T == AST_FUNDEC || T == EXP_FUN;
|
||||
return T == AST_FUNDEC || T == EXP_FUN || T == EXP_PROP_GET || T == EXP_PROP_SET;
|
||||
}
|
||||
|
||||
static int matchlabel(js_Ast *node, const char *label)
|
||||
|
||||
@@ -48,6 +48,9 @@ enum js_OpCode
|
||||
OP_INITPROP_N, /* <obj> <val> -- <obj> */
|
||||
OP_INITPROP_S, /* <obj> <val> -- <obj> */
|
||||
|
||||
OP_INITGETTER, /* <obj> <key> <closure> -- <obj> */
|
||||
OP_INITSETTER, /* <obj> <key> <closure> -- <obj> */
|
||||
|
||||
OP_GETPROP, /* <obj> <name> -- <value> */
|
||||
OP_GETPROP_S, /* <obj> -S- <value> */
|
||||
OP_SETPROP, /* <obj> <name> <value> -- <value> */
|
||||
|
||||
6
jsdump.c
6
jsdump.c
@@ -197,14 +197,14 @@ static void pobject(int d, js_Ast *list)
|
||||
ps("get ");
|
||||
pexpi(d, COMMA, kv->a);
|
||||
ps("() {\n");
|
||||
pstmlist(d, kv->b);
|
||||
pstmlist(d, kv->c);
|
||||
in(d); ps("}");
|
||||
break;
|
||||
case EXP_PROP_SET:
|
||||
ps("set ");
|
||||
pexpi(d, COMMA, kv->a);
|
||||
ps("(");
|
||||
pexpi(d, COMMA, kv->b);
|
||||
pargs(d, kv->b);
|
||||
ps(") {\n");
|
||||
pstmlist(d, kv->c);
|
||||
in(d); ps("}");
|
||||
@@ -639,6 +639,8 @@ static void snode(int d, js_Ast *node)
|
||||
case AST_NUMBER: printf(" %.9g", node->number); break;
|
||||
case STM_BLOCK: afun = sblock; break;
|
||||
case AST_FUNDEC: case EXP_FUN: cfun = sblock; break;
|
||||
case EXP_PROP_GET: cfun = sblock; break;
|
||||
case EXP_PROP_SET: cfun = sblock; break;
|
||||
case STM_SWITCH: bfun = sblock; break;
|
||||
case STM_CASE: bfun = sblock; break;
|
||||
case STM_DEFAULT: afun = sblock; break;
|
||||
|
||||
@@ -259,7 +259,7 @@ static js_Ast *propassign(js_State *J)
|
||||
expect(J, '(');
|
||||
expect(J, ')');
|
||||
body = funbody(J);
|
||||
return EXP2(PROP_GET, name, body);
|
||||
return EXP3(PROP_GET, name, NULL, body);
|
||||
}
|
||||
if (!strcmp(name->string, "set")) {
|
||||
name = propname(J);
|
||||
@@ -267,7 +267,7 @@ static js_Ast *propassign(js_State *J)
|
||||
arg = identifier(J);
|
||||
expect(J, ')');
|
||||
body = funbody(J);
|
||||
return EXP3(PROP_SET, name, arg, body);
|
||||
return EXP3(PROP_SET, name, LIST(arg), body);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user