static const njs_value_t join_string = njs_string("join");
- if (njs_is_object(&args[0])) {
+ if (njs_is_object(njs_argument(args, 0))) {
njs_object_property_init(&lhq, &join_string, NJS_JOIN_HASH);
- ret = njs_object_property(vm, &args[0], &lhq, &value);
+ ret = njs_object_property(vm, njs_object(njs_argument(args, 0)), &lhq,
+ &value);
if (njs_slow_path(ret == NJS_ERROR)) {
return ret;
static const njs_value_t to_iso_string = njs_string("toISOString");
- if (njs_is_object(&args[0])) {
+ if (njs_is_object(njs_argument(args, 0))) {
njs_object_property_init(&lhq, &to_iso_string, NJS_TO_ISO_STRING_HASH);
- ret = njs_object_property(vm, &args[0], &lhq, &value);
+ ret = njs_object_property(vm, njs_object(njs_argument(args, 0)), &lhq,
+ &value);
if (njs_slow_path(ret == NJS_ERROR)) {
return ret;
size_t length;
u_char *p;
njs_int_t ret;
+ njs_object_t *error_object;
njs_value_t value1, value2;
njs_value_t *name_value, *message_value;
njs_string_prop_t name, message;
static const njs_value_t default_name = njs_string("Error");
+ njs_assert(njs_is_object(error));
+
if (want_stack) {
ret = njs_error_stack(vm, njs_value_arg(error), retval);
if (njs_slow_path(ret == NJS_ERROR)) {
}
}
+ error_object = njs_object(error);
+
njs_object_property_init(&lhq, &njs_string_name, NJS_NAME_HASH);
- ret = njs_object_property(vm, error, &lhq, &value1);
+ ret = njs_object_property(vm, error_object, &lhq, &value1);
if (njs_slow_path(ret == NJS_ERROR)) {
return ret;
lhq.key_hash = NJS_MESSAGE_HASH;
lhq.key = njs_str_value("message");
- ret = njs_object_property(vm, error, &lhq, &value2);
+ ret = njs_object_property(vm, error_object, &lhq, &value2);
if (njs_slow_path(ret == NJS_ERROR)) {
return ret;
njs_int_t
njs_error_to_string(njs_vm_t *vm, njs_value_t *retval, const njs_value_t *error)
{
+ if (njs_slow_path(!njs_is_object(error))) {
+ njs_type_error(vm, "\"error\" is not an object");
+ return NJS_ERROR;
+ }
+
return njs_error_to_string2(vm, retval, error, 1);
}
static const njs_value_t to_json_string = njs_string("toJSON");
- njs_object_property_init(&lhq, &to_json_string, NJS_TO_JSON_HASH);
+ if (njs_is_object(value)) {
+ njs_object_property_init(&lhq, &to_json_string, NJS_TO_JSON_HASH);
- ret = njs_object_property(vm, value, &lhq, &retval);
+ ret = njs_object_property(vm, njs_object(value), &lhq, &retval);
- if (njs_slow_path(ret == NJS_ERROR)) {
- return NULL;
+ if (njs_slow_path(ret == NJS_ERROR)) {
+ return NULL;
+ }
+
+ return njs_is_function(&retval) ? njs_function(&retval) : NULL;
}
- return njs_is_function(&retval) ? njs_function(&retval) : NULL;
+ return NULL;
}
njs_object_t *proto);
njs_object_prop_t *njs_object_prop_alloc(njs_vm_t *vm, const njs_value_t *name,
const njs_value_t *value, uint8_t attributes);
-njs_int_t njs_object_property(njs_vm_t *vm, const njs_value_t *value,
+njs_int_t njs_object_property(njs_vm_t *vm, njs_object_t *object,
njs_lvlhsh_query_t *lhq, njs_value_t *retval);
njs_object_prop_t *njs_object_property_add(njs_vm_t *vm, njs_value_t *object,
njs_value_t *key, njs_bool_t replace);
njs_int_t
-njs_object_property(njs_vm_t *vm, const njs_value_t *value,
- njs_lvlhsh_query_t *lhq, njs_value_t *retval)
+njs_object_property(njs_vm_t *vm, njs_object_t *object, njs_lvlhsh_query_t *lhq,
+ njs_value_t *retval)
{
njs_int_t ret;
- njs_object_t *object;
+ njs_value_t value;
njs_object_prop_t *prop;
- object = njs_object(value);
-
do {
ret = njs_lvlhsh_find(&object->hash, lhq);
return NJS_OK;
}
- return njs_function_apply(vm, njs_prop_getter(prop), value, 1, retval);
+ njs_set_object(&value, object);
+
+ return njs_function_apply(vm, njs_prop_getter(prop), &value, 1, retval);
}
njs_int_t ret;
njs_bool_t data, accessor;
njs_value_t value;
+ njs_object_t *desc_object;
njs_function_t *getter, *setter;
njs_object_prop_t *prop;
njs_lvlhsh_query_t lhq;
accessor = 0;
getter = NJS_PROP_PTR_UNSET;
setter = NJS_PROP_PTR_UNSET;
+ desc_object = njs_object(desc);
njs_object_property_init(&lhq, &get_string, NJS_GET_HASH);
- ret = njs_object_property(vm, desc, &lhq, &value);
+ ret = njs_object_property(vm, desc_object, &lhq, &value);
if (njs_slow_path(ret == NJS_ERROR)) {
return NULL;
}
lhq.key = njs_str_value("set");
lhq.key_hash = NJS_SET_HASH;
- ret = njs_object_property(vm, desc, &lhq, &value);
+ ret = njs_object_property(vm, desc_object, &lhq, &value);
if (njs_slow_path(ret == NJS_ERROR)) {
return NULL;
}
lhq.key = njs_str_value("value");
lhq.key_hash = NJS_VALUE_HASH;
- ret = njs_object_property(vm, desc, &lhq, &value);
+ ret = njs_object_property(vm, desc_object, &lhq, &value);
if (njs_slow_path(ret == NJS_ERROR)) {
return NULL;
}
lhq.key = njs_str_value("writable");
lhq.key_hash = NJS_WRITABABLE_HASH;
- ret = njs_object_property(vm, desc, &lhq, &value);
+ ret = njs_object_property(vm, desc_object, &lhq, &value);
if (njs_slow_path(ret == NJS_ERROR)) {
return NULL;
}
lhq.key = njs_str_value("enumerable");
lhq.key_hash = NJS_ENUMERABLE_HASH;
- ret = njs_object_property(vm, desc, &lhq, &value);
+ ret = njs_object_property(vm, desc_object, &lhq, &value);
if (njs_slow_path(ret == NJS_ERROR)) {
return NULL;
}
lhq.key = njs_str_value("configurable");
lhq.key_hash = NJS_CONFIGURABLE_HASH;
- ret = njs_object_property(vm, desc, &lhq, &value);
+ ret = njs_object_property(vm, desc_object, &lhq, &value);
if (njs_slow_path(ret == NJS_ERROR)) {
return NULL;
}
lhq.key_hash = hashes[hint];
lhq.key = names[hint];
- ret = njs_object_property(vm, value, &lhq, &method);
+ ret = njs_object_property(vm, njs_object(value), &lhq, &method);
if (njs_slow_path(ret == NJS_ERROR)) {
return ret;
"sq(function () { return 3 })" ENTER),
njs_str("9") },
+ { njs_str("var e = Error(); e.name = {}; e" ENTER),
+ njs_str("[object Object]") },
+
/* Temporary indexes */
{ njs_str("var a = [1,2,3], i; for (i in a) {Object.seal({});}" ENTER),