func = js_autoinit_func_table[id];
/* 'func' shall not modify the object properties 'pr' */
val = func(realm, p, prop, pr->u.init.opaque);
- js_autoinit_free(ctx->rt, pr);
- prs->flags &= ~JS_PROP_TMASK;
- pr->u.value = JS_UNDEFINED;
if (JS_IsException(val))
return -1;
if (id == JS_AUTOINIT_ID_MODULE_NS &&
JS_VALUE_GET_TAG(val) == JS_TAG_STRING) {
/* WARNING: a varref is returned as a string ! */
+ js_autoinit_free(ctx->rt, pr);
+ prs->flags &= ~JS_PROP_TMASK;
prs->flags |= JS_PROP_VARREF;
pr->u.var_ref = JS_VALUE_GET_PTR(val);
js_rc(pr->u.var_ref)->ref_count++;
JSVarRef *var_ref;
/* in the global object we use references */
var_ref = js_create_var_ref(ctx, FALSE);
- if (!var_ref)
+ if (!var_ref) {
+ JS_FreeValue(ctx, val);
return -1;
+ }
+ js_autoinit_free(ctx->rt, pr);
+ prs->flags &= ~JS_PROP_TMASK;
prs->flags |= JS_PROP_VARREF;
pr->u.var_ref = var_ref;
var_ref->value = val;
var_ref->is_const = !(prs->flags & JS_PROP_WRITABLE);
} else {
+ js_autoinit_free(ctx->rt, pr);
+ prs->flags &= ~JS_PROP_TMASK;
+ pr->u.value = JS_UNDEFINED;
pr->u.value = val;
}
return 0;
return call_setter(ctx, pr->u.getset.setter, this_obj, val, flags);
} else if ((prs->flags & JS_PROP_TMASK) == JS_PROP_AUTOINIT) {
/* Instantiate property and retry (potentially useless) */
- if (JS_AutoInitProperty(ctx, p1, prop, pr, prs))
+ if (JS_AutoInitProperty(ctx, p1, prop, pr, prs)) {
+ JS_FreeValue(ctx, val);
return -1;
+ }
goto retry2;
} else if (!(prs->flags & JS_PROP_WRITABLE)) {
goto read_only_prop;