return c;
}
-block gen_const_array(block expr) {
+block gen_const_object(block expr) {
+ int is_const = 1;
+ jv o = jv_object();
+ jv k = jv_null();
+ jv v = jv_null();
+ for (inst *i = expr.first; i; i = i->next) {
+ if (i->op != SUBEXP_BEGIN ||
+ i->next == NULL ||
+ i->next->op != LOADK ||
+ i->next->next == NULL ||
+ i->next->next->op != SUBEXP_END) {
+ is_const = 0;
+ break;
+ }
+ k = jv_copy(i->next->imm.constant);
+ i = i->next->next->next;
+ if (i == NULL ||
+ i->op != SUBEXP_BEGIN ||
+ i->next == NULL ||
+ i->next->op != LOADK ||
+ i->next->next == NULL ||
+ i->next->next->op != SUBEXP_END) {
+ is_const = 0;
+ break;
+ }
+ v = jv_copy(i->next->imm.constant);
+ i = i->next->next->next;
+ if (i == NULL || i->op != INSERT) {
+ is_const = 0;
+ break;
+ }
+ o = jv_object_set(o, k, v);
+ }
+ if (!is_const) {
+ jv_free(o);
+ jv_free(k);
+ jv_free(v);
+ block b = {0,0};
+ return b;
+ }
+ block_free(expr);
+ return gen_const(o);
+}
+
+static block gen_const_array(block expr) {
/*
* An expr of all constant elements looks like this:
*
block gen_call(const char* name, block body);
block gen_subexp(block a);
block gen_both(block a, block b);
+block gen_const_object(block expr);
block gen_collect(block expr);
block gen_reduce(const char* varname, block source, block init, block body);
block gen_foreach(const char* varname, block source, block init, block update, block extract);
$$ = gen_const(jv_array());
} |
'{' MkDict '}' {
- $$ = BLOCK(gen_subexp(gen_const(jv_object())), $2, gen_op_simple(POP));
+ block o = gen_const_object($2);
+ if (o.first != NULL)
+ $$ = o;
+ else
+ $$ = BLOCK(gen_subexp(gen_const(jv_object())), $2, gen_op_simple(POP));
} |
'$' IDENT {
$$ = gen_location(@$, locations, gen_op_unbound(LOADV, jv_string_value($2)));