Compile ES5 getters and setters.

This commit is contained in:
Tor Andersson
2014-02-06 13:56:50 +01:00
parent ca3c7e4341
commit b659aa50e1
4 changed files with 20 additions and 8 deletions

View File

@@ -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)

View File

@@ -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> */

View File

@@ -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;

View File

@@ -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);
}
}