}
/* shortcut to add or redefine a new property value */
+/* XXX: rename to JS_DefinePropertyValue ? */
+static int JS_DefinePropertyValueC(JSContext *ctx, JSValueConst this_obj,
+ JSAtom prop, JSValueConst val, int flags)
+{
+ return JS_DefineProperty(ctx, this_obj, prop, val, JS_UNDEFINED, JS_UNDEFINED,
+ flags | JS_PROP_HAS_VALUE | JS_PROP_HAS_CONFIGURABLE | JS_PROP_HAS_WRITABLE | JS_PROP_HAS_ENUMERABLE);
+}
+
+/* shortcut to add or redefine a new property value */
+/* XXX: rename to JS_DefinePropertyValueFree ? */
int JS_DefinePropertyValue(JSContext *ctx, JSValueConst this_obj,
JSAtom prop, JSValue val, int flags)
{
int ret;
- ret = JS_DefineProperty(ctx, this_obj, prop, val, JS_UNDEFINED, JS_UNDEFINED,
- flags | JS_PROP_HAS_VALUE | JS_PROP_HAS_CONFIGURABLE | JS_PROP_HAS_WRITABLE | JS_PROP_HAS_ENUMERABLE);
+ ret = JS_DefinePropertyValueC(ctx, this_obj, prop, val, flags);
JS_FreeValue(ctx, val);
return ret;
}
return JS_EXCEPTION;
set_cycle_flag(ctx, obj);
set_cycle_flag(ctx, this_val);
- ret = JS_DefinePropertyValue(ctx, obj, JS_ATOM_constructor,
- JS_DupValue(ctx, this_val),
- JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
+ ret = JS_DefinePropertyValueC(ctx, obj, JS_ATOM_constructor,
+ this_val,
+ JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
if (ret < 0) {
JS_FreeValue(ctx, obj);
return JS_EXCEPTION;
/* the constructor property must be first. It can be overriden by
computed property names */
- if (JS_DefinePropertyValue(ctx, proto, JS_ATOM_constructor,
- JS_DupValue(ctx, ctor),
- JS_PROP_CONFIGURABLE |
- JS_PROP_WRITABLE | JS_PROP_THROW) < 0)
+ if (JS_DefinePropertyValueC(ctx, proto, JS_ATOM_constructor,
+ ctor,
+ JS_PROP_CONFIGURABLE |
+ JS_PROP_WRITABLE | JS_PROP_THROW) < 0)
goto fail;
/* set the prototype property */
- if (JS_DefinePropertyValue(ctx, ctor, JS_ATOM_prototype,
- JS_DupValue(ctx, proto), JS_PROP_THROW) < 0)
+ if (JS_DefinePropertyValueC(ctx, ctor, JS_ATOM_prototype,
+ proto, JS_PROP_THROW) < 0)
goto fail;
set_cycle_flag(ctx, ctor);
set_cycle_flag(ctx, proto);
goto fail;
}
}
- ret = JS_DefinePropertyValue(ctx, attributes, key,
- JS_DupValue(ctx, s->token.u.str.str), JS_PROP_C_W_E);
+ ret = JS_DefinePropertyValueC(ctx, attributes, key,
+ s->token.u.str.str, JS_PROP_C_W_E);
JS_FreeAtom(ctx, key);
if (ret < 0)
goto fail;
JSValueConst proto,
int proto_flags, int ctor_flags)
{
- if (JS_DefinePropertyValue(ctx, func_obj, JS_ATOM_prototype,
- JS_DupValue(ctx, proto), proto_flags) < 0)
+ if (JS_DefinePropertyValueC(ctx, func_obj, JS_ATOM_prototype,
+ proto, proto_flags) < 0)
return -1;
- if (JS_DefinePropertyValue(ctx, proto, JS_ATOM_constructor,
- JS_DupValue(ctx, func_obj),
- ctor_flags) < 0)
+ if (JS_DefinePropertyValueC(ctx, proto, JS_ATOM_constructor,
+ func_obj,
+ ctor_flags) < 0)
return -1;
set_cycle_flag(ctx, func_obj);
set_cycle_flag(ctx, proto);
goto exception1;
flags = JS_PROP_C_W_E | JS_PROP_THROW;
if (desc.flags & JS_PROP_GETSET) {
- if (JS_DefinePropertyValue(ctx, ret, JS_ATOM_get, JS_DupValue(ctx, desc.getter), flags) < 0
- || JS_DefinePropertyValue(ctx, ret, JS_ATOM_set, JS_DupValue(ctx, desc.setter), flags) < 0)
+ if (JS_DefinePropertyValueC(ctx, ret, JS_ATOM_get, desc.getter, flags) < 0
+ || JS_DefinePropertyValueC(ctx, ret, JS_ATOM_set, desc.setter, flags) < 0)
goto exception1;
} else {
- if (JS_DefinePropertyValue(ctx, ret, JS_ATOM_value, JS_DupValue(ctx, desc.value), flags) < 0
+ if (JS_DefinePropertyValueC(ctx, ret, JS_ATOM_value, desc.value, flags) < 0
|| JS_DefinePropertyValue(ctx, ret, JS_ATOM_writable,
JS_NewBool(ctx, desc.flags & JS_PROP_WRITABLE), flags) < 0)
goto exception1;
len_val = JS_NewInt32(ctx, 0);
}
}
- JS_DefinePropertyValue(ctx, func_obj, JS_ATOM_length,
- len_val, JS_PROP_CONFIGURABLE);
+ if (JS_DefinePropertyValue(ctx, func_obj, JS_ATOM_length,
+ len_val, JS_PROP_CONFIGURABLE) < 0)
+ goto exception;
name1 = JS_GetProperty(ctx, this_val, JS_ATOM_name);
if (JS_IsException(name1))
name1 = JS_ConcatString3(ctx, "bound ", name1, "");
if (JS_IsException(name1))
goto exception;
- JS_DefinePropertyValue(ctx, func_obj, JS_ATOM_name, name1,
- JS_PROP_CONFIGURABLE);
+ if (JS_DefinePropertyValue(ctx, func_obj, JS_ATOM_name, name1,
+ JS_PROP_CONFIGURABLE) < 0)
+ goto exception;
return func_obj;
exception:
JS_FreeValue(ctx, func_obj);
msg = JS_ToString(ctx, message);
if (unlikely(JS_IsException(msg)))
goto exception;
- JS_DefinePropertyValue(ctx, obj, JS_ATOM_message, msg,
- JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
+ if (JS_DefinePropertyValue(ctx, obj, JS_ATOM_message, msg,
+ JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE) < 0)
+ goto exception;
}
if (arg_index < argc) {
JSValue cause = JS_GetProperty(ctx, options, JS_ATOM_cause);
if (JS_IsException(cause))
goto exception;
- JS_DefinePropertyValue(ctx, obj, JS_ATOM_cause, cause,
- JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
+ if (JS_DefinePropertyValue(ctx, obj, JS_ATOM_cause, cause,
+ JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE) < 0)
+ goto exception;
}
}
}
JSValue error_list = iterator_to_array(ctx, argv[0]);
if (JS_IsException(error_list))
goto exception;
- JS_DefinePropertyValue(ctx, obj, JS_ATOM_errors, error_list,
- JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
+ if (JS_DefinePropertyValue(ctx, obj, JS_ATOM_errors, error_list,
+ JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE) < 0)
+ goto exception;
}
if (magic == JS_SUPPRESSED_ERROR) {
- JS_DefinePropertyValue(ctx, obj, JS_ATOM_error,
- JS_DupValue(ctx, argv[0]),
- JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
- JS_DefinePropertyValue(ctx, obj, JS_ATOM_suppressed,
- JS_DupValue(ctx, argv[1]),
- JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
+ if (JS_DefinePropertyValueC(ctx, obj, JS_ATOM_error,
+ argv[0],
+ JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE) < 0)
+ goto exception;
+ if (JS_DefinePropertyValueC(ctx, obj, JS_ATOM_suppressed,
+ argv[1],
+ JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE) < 0)
+ goto exception;
}
/* skip the Error() function in the backtrace */
if (ret < 0)
return JS_EXCEPTION;
if (ret == 0) {
- if (JS_DefinePropertyValue(ctx, this_val, JS_ATOM_stack, JS_DupValue(ctx, value),
+ if (JS_DefinePropertyValueC(ctx, this_val, JS_ATOM_stack, value,
JS_PROP_C_W_E | JS_PROP_THROW) < 0)
return JS_EXCEPTION;
} else {
JS_CLASS_ERROR);
if (JS_IsException(obj))
return obj;
- JS_DefinePropertyValue(ctx, obj, JS_ATOM_errors, JS_DupValue(ctx, errors),
- JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
+ if (JS_DefinePropertyValueC(ctx, obj, JS_ATOM_errors, errors,
+ JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE) < 0) {
+ JS_FreeValue(ctx, obj);
+ return JS_EXCEPTION;
+ }
return obj;
}
if (argc > 0) { // if setter
if (!JS_IsObject(argv[0]))
return JS_ThrowTypeErrorNotAnObject(ctx);
- ret = JS_DefinePropertyValue(ctx, this_val, JS_ATOM_constructor,
- JS_DupValue(ctx, argv[0]),
- JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
+ ret = JS_DefinePropertyValueC(ctx, this_val, JS_ATOM_constructor,
+ argv[0],
+ JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
if (ret < 0)
return JS_EXCEPTION;
return JS_UNDEFINED;
if (JS_SetProperty(ctx, this_val, JS_ATOM_Symbol_toStringTag, JS_DupValue(ctx, val)) < 0)
return JS_EXCEPTION;
} else {
- if (JS_DefinePropertyValue(ctx, this_val, JS_ATOM_Symbol_toStringTag, JS_DupValue(ctx, val), JS_PROP_C_W_E) < 0)
+ if (JS_DefinePropertyValueC(ctx, this_val, JS_ATOM_Symbol_toStringTag, val, JS_PROP_C_W_E) < 0)
return JS_EXCEPTION;
}
return JS_UNDEFINED;
JS_FreeValue(ctx, val);
} else {
JS_SetObjectData(ctx, obj, val);
- JS_DefinePropertyValue(ctx, obj, JS_ATOM_length, JS_NewInt32(ctx, p1->len), 0);
+ if (JS_DefinePropertyValue(ctx, obj, JS_ATOM_length, JS_NewInt32(ctx, p1->len), 0) < 0) {
+ JS_FreeValue(ctx, obj);
+ return JS_EXCEPTION;
+ }
}
return obj;
} else {
/* JS_HasProperty() cannot fail here */
if (!JS_IsUndefined(val) ||
!JS_HasProperty(ctx, indices_groups, group_name)) {
- if (JS_DefinePropertyValue(ctx, indices_groups,
- group_name, JS_DupValue(ctx, val), prop_flags) < 0) {
+ if (JS_DefinePropertyValueC(ctx, indices_groups,
+ group_name, val, prop_flags) < 0) {
JS_FreeValue(ctx, val);
goto fail;
}
/* JS_HasProperty() cannot fail here */
if (!JS_IsUndefined(val) ||
!JS_HasProperty(ctx, groups, group_name)) {
- if (JS_DefinePropertyValue(ctx, groups, group_name,
- JS_DupValue(ctx, val),
- prop_flags) < 0) {
+ if (JS_DefinePropertyValueC(ctx, groups, group_name,
+ val, prop_flags) < 0) {
JS_FreeValue(ctx, val);
goto fail;
}
wrapper = JS_NewObject(ctx);
if (JS_IsException(wrapper))
goto exception;
- if (JS_DefinePropertyValue(ctx, wrapper, JS_ATOM_empty_string,
- JS_DupValue(ctx, obj), JS_PROP_C_W_E) < 0)
+ if (JS_DefinePropertyValueC(ctx, wrapper, JS_ATOM_empty_string,
+ obj, JS_PROP_C_W_E) < 0)
goto exception;
val = JS_DupValue(ctx, obj);
if (JS_IsException(ret))
return ret;
if (flags & JS_PROP_HAS_GET) {
- JS_DefinePropertyValue(ctx, ret, JS_ATOM_get, JS_DupValue(ctx, getter),
- JS_PROP_C_W_E);
+ if (JS_DefinePropertyValueC(ctx, ret, JS_ATOM_get, getter,
+ JS_PROP_C_W_E) < 0)
+ goto fail;
}
if (flags & JS_PROP_HAS_SET) {
- JS_DefinePropertyValue(ctx, ret, JS_ATOM_set, JS_DupValue(ctx, setter),
- JS_PROP_C_W_E);
+ if (JS_DefinePropertyValueC(ctx, ret, JS_ATOM_set, setter,
+ JS_PROP_C_W_E) < 0)
+ goto fail;
}
if (flags & JS_PROP_HAS_VALUE) {
- JS_DefinePropertyValue(ctx, ret, JS_ATOM_value, JS_DupValue(ctx, val),
- JS_PROP_C_W_E);
+ if (JS_DefinePropertyValueC(ctx, ret, JS_ATOM_value, val,
+ JS_PROP_C_W_E) < 0)
+ goto fail;
}
if (flags & JS_PROP_HAS_WRITABLE) {
- JS_DefinePropertyValue(ctx, ret, JS_ATOM_writable,
- JS_NewBool(ctx, flags & JS_PROP_WRITABLE),
- JS_PROP_C_W_E);
+ if (JS_DefinePropertyValue(ctx, ret, JS_ATOM_writable,
+ JS_NewBool(ctx, flags & JS_PROP_WRITABLE),
+ JS_PROP_C_W_E) < 0)
+ goto fail;
}
if (flags & JS_PROP_HAS_ENUMERABLE) {
- JS_DefinePropertyValue(ctx, ret, JS_ATOM_enumerable,
- JS_NewBool(ctx, flags & JS_PROP_ENUMERABLE),
- JS_PROP_C_W_E);
+ if (JS_DefinePropertyValue(ctx, ret, JS_ATOM_enumerable,
+ JS_NewBool(ctx, flags & JS_PROP_ENUMERABLE),
+ JS_PROP_C_W_E) < 0)
+ goto fail;
}
if (flags & JS_PROP_HAS_CONFIGURABLE) {
- JS_DefinePropertyValue(ctx, ret, JS_ATOM_configurable,
- JS_NewBool(ctx, flags & JS_PROP_CONFIGURABLE),
- JS_PROP_C_W_E);
+ if (JS_DefinePropertyValue(ctx, ret, JS_ATOM_configurable,
+ JS_NewBool(ctx, flags & JS_PROP_CONFIGURABLE),
+ JS_PROP_C_W_E) < 0)
+ goto fail;
}
return ret;
+ fail:
+ JS_FreeValue(ctx, ret);
+ return JS_EXCEPTION;
}
/* return FALSE if not OK */
static JSValue js_proxy_revocable(JSContext *ctx, JSValueConst this_val,
int argc, JSValueConst *argv)
{
- JSValue proxy_obj, revoke_obj = JS_UNDEFINED, obj;
+ JSValue proxy_obj, revoke_obj = JS_UNDEFINED, obj = JS_UNDEFINED;
proxy_obj = js_proxy_constructor(ctx, JS_UNDEFINED, argc, argv);
if (JS_IsException(proxy_obj))
if (JS_IsException(obj))
goto fail;
// XXX: exceptions?
- JS_DefinePropertyValue(ctx, obj, JS_ATOM_proxy, proxy_obj, JS_PROP_C_W_E);
- JS_DefinePropertyValue(ctx, obj, JS_ATOM_revoke, revoke_obj, JS_PROP_C_W_E);
+ if (JS_DefinePropertyValueC(ctx, obj, JS_ATOM_proxy, proxy_obj, JS_PROP_C_W_E) < 0 ||
+ JS_DefinePropertyValueC(ctx, obj, JS_ATOM_revoke, revoke_obj, JS_PROP_C_W_E) < 0) {
+ goto fail;
+ }
+ JS_FreeValue(ctx, proxy_obj);
+ JS_FreeValue(ctx, revoke_obj);
return obj;
fail:
JS_FreeValue(ctx, proxy_obj);
JS_FreeValue(ctx, revoke_obj);
+ JS_FreeValue(ctx, obj);
return JS_EXCEPTION;
}
goto exception;
JS_FreeValue(ctx, res);
} else {
- prop = JS_DupValue(ctx, prop);
- if (JS_DefinePropertyValue(ctx, groups, key_atom, prop,
+ if (JS_DefinePropertyValueC(ctx, groups, key_atom, prop,
JS_PROP_C_W_E) < 0) {
goto exception;
}
JS_CLASS_ERROR);
if (JS_IsException(obj))
return JS_EXCEPTION;
- JS_DefinePropertyValue(ctx, obj, JS_ATOM_error, JS_DupValue(ctx, error),
- JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
- JS_DefinePropertyValue(ctx, obj, JS_ATOM_suppressed, JS_DupValue(ctx, suppressed),
- JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
+ if (JS_DefinePropertyValueC(ctx, obj, JS_ATOM_error, error,
+ JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE) < 0 ||
+ JS_DefinePropertyValueC(ctx, obj, JS_ATOM_suppressed, suppressed,
+ JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE) < 0) {
+ JS_FreeValue(ctx, obj);
+ return JS_EXCEPTION;
+ }
build_backtrace(ctx, obj, NULL, 0, 0,
JS_BACKTRACE_FLAG_SKIP_FIRST_LEVEL);
return obj;
obj = JS_NewObject(ctx);
if (JS_IsException(obj))
goto exception;
- if (JS_DefinePropertyValue(ctx, obj, JS_ATOM_promise, result_promise,
- JS_PROP_C_W_E) < 0) {
- goto exception;
- }
- result_promise = JS_UNDEFINED;
- if (JS_DefinePropertyValue(ctx, obj, JS_ATOM_resolve, resolving_funcs[0],
- JS_PROP_C_W_E) < 0) {
- goto exception;
- }
- resolving_funcs[0] = JS_UNDEFINED;
- if (JS_DefinePropertyValue(ctx, obj, JS_ATOM_reject, resolving_funcs[1],
+ if (JS_DefinePropertyValueC(ctx, obj, JS_ATOM_promise, result_promise,
+ JS_PROP_C_W_E) < 0 ||
+ JS_DefinePropertyValueC(ctx, obj, JS_ATOM_resolve, resolving_funcs[0],
+ JS_PROP_C_W_E) < 0 ||
+ JS_DefinePropertyValueC(ctx, obj, JS_ATOM_reject, resolving_funcs[1],
JS_PROP_C_W_E) < 0) {
- goto exception;
+ exception:
+ JS_FreeValue(ctx, obj);
+ obj = JS_EXCEPTION;
}
- return obj;
-exception:
JS_FreeValue(ctx, resolving_funcs[0]);
JS_FreeValue(ctx, resolving_funcs[1]);
JS_FreeValue(ctx, result_promise);
- JS_FreeValue(ctx, obj);
- return JS_EXCEPTION;
+ return obj;
}
static JSValue js_promise_try(JSContext *ctx, JSValueConst this_val,
str,
JS_PROP_C_W_E) < 0)
goto fail1;
- if (JS_DefinePropertyValue(ctx, obj,
- is_reject ? JS_ATOM_reason : JS_ATOM_value,
- JS_DupValue(ctx, argv[0]),
- JS_PROP_C_W_E) < 0) {
+ if (JS_DefinePropertyValueC(ctx, obj,
+ is_reject ? JS_ATOM_reason : JS_ATOM_value,
+ argv[0],
+ JS_PROP_C_W_E) < 0) {
fail1:
JS_FreeValue(ctx, obj);
return JS_EXCEPTION;
if (JS_DefinePropertyValue(ctx, obj, JS_ATOM_status, str,
JS_PROP_C_W_E) < 0)
goto fail_obj;
- if (JS_DefinePropertyValue(ctx, obj,
- is_reject ? JS_ATOM_reason : JS_ATOM_value,
- JS_DupValue(ctx, value),
- JS_PROP_C_W_E) < 0)
+ if (JS_DefinePropertyValueC(ctx, obj,
+ is_reject ? JS_ATOM_reason : JS_ATOM_value,
+ value,
+ JS_PROP_C_W_E) < 0)
goto fail_obj;
} else {
obj = JS_DupValue(ctx, value);
if (JS_IsException(ctx->eval_obj))
return -1;
- if (JS_DefinePropertyValue(ctx, ctx->global_obj, JS_ATOM_globalThis,
- JS_DupValue(ctx, ctx->global_obj),
- JS_PROP_CONFIGURABLE | JS_PROP_WRITABLE) < 0)
+ if (JS_DefinePropertyValueC(ctx, ctx->global_obj, JS_ATOM_globalThis,
+ ctx->global_obj,
+ JS_PROP_CONFIGURABLE | JS_PROP_WRITABLE) < 0)
return -1;
/* BigInt */
result_obj = JS_NewObject(ctx);
if (JS_DefinePropertyValue(ctx, result_obj, JS_ATOM_async,
JS_NewBool(ctx, async),
- JS_PROP_C_W_E) < 0 ||
- JS_DefinePropertyValue(ctx, result_obj, JS_ATOM_value,
- value, JS_PROP_C_W_E) < 0) {
+ JS_PROP_C_W_E) < 0) {
JS_FreeValue(ctx, result_obj);
JS_FreeValue(ctx, value);
return JS_EXCEPTION;
}
+ if (JS_DefinePropertyValue(ctx, result_obj, JS_ATOM_value,
+ value, JS_PROP_C_W_E) < 0) {
+ JS_FreeValue(ctx, result_obj);
+ return JS_EXCEPTION;
+ }
return result_obj;
}
goto fail;
/* XXX: should use alias method in JSCFunctionListEntry */ //@@@
typed_array_base_proto = JS_GetProperty(ctx, typed_array_base_func, JS_ATOM_prototype);
- if (JS_IsException(typed_array_base_proto))
+ if (JS_IsException(typed_array_base_proto)) {
+ JS_FreeValue(ctx, obj);
goto fail;
+ }
ret = JS_DefinePropertyValue(ctx, typed_array_base_proto, JS_ATOM_toString, obj,
JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
JS_FreeValue(ctx, typed_array_base_proto);