array->start = array->data;
njs_lvlhsh_init(&array->object.hash);
array->object.shared_hash = vm->shared->array_instance_hash;
- array->object.__proto__ = &vm->prototypes[NJS_PROTOTYPE_ARRAY].object;
+ array->object.__proto__ = &vm->prototypes[NJS_OBJ_TYPE_ARRAY].object;
array->object.type = NJS_ARRAY;
array->object.shared = 0;
array->object.extensible = 1;
const njs_object_init_t *njs_module_init[] = {
- &njs_fs_object_init, /* fs */
- &njs_crypto_object_init, /* crypto */
+ &njs_fs_object_init,
+ &njs_crypto_object_init,
NULL
};
&njs_syntax_error_prototype_init,
&njs_type_error_prototype_init,
&njs_uri_error_prototype_init,
+ &njs_internal_error_prototype_init,
NULL
};
prototype++;
}
- shared->prototypes[NJS_PROTOTYPE_REGEXP].regexp.pattern =
+ shared->prototypes[NJS_OBJ_TYPE_REGEXP].regexp.pattern =
shared->empty_regexp_pattern;
string_object = &shared->string_object;
{
size_t size;
njs_uint_t i;
- njs_value_t *values;
njs_object_t *object_prototype, *function_prototype, *error_prototype,
*error_constructor;
* Copy both prototypes and constructors arrays by one memcpy()
* because they are stored together.
*/
- size = NJS_PROTOTYPE_MAX * sizeof(njs_object_prototype_t)
- + NJS_CONSTRUCTOR_MAX * sizeof(njs_function_t);
+ size = (sizeof(njs_object_prototype_t) + sizeof(njs_function_t))
+ * NJS_OBJ_TYPE_MAX;
memcpy(vm->prototypes, vm->shared->prototypes, size);
- object_prototype = &vm->prototypes[NJS_PROTOTYPE_OBJECT].object;
+ object_prototype = &vm->prototypes[NJS_OBJ_TYPE_OBJECT].object;
- for (i = NJS_PROTOTYPE_ARRAY; i < NJS_PROTOTYPE_EVAL_ERROR; i++) {
+ for (i = NJS_OBJ_TYPE_ARRAY; i < NJS_OBJ_TYPE_EVAL_ERROR; i++) {
vm->prototypes[i].object.__proto__ = object_prototype;
}
- error_prototype = &vm->prototypes[NJS_PROTOTYPE_ERROR].object;
+ error_prototype = &vm->prototypes[NJS_OBJ_TYPE_ERROR].object;
- for (i = NJS_PROTOTYPE_EVAL_ERROR; i < NJS_PROTOTYPE_MAX; i++) {
+ for (i = NJS_OBJ_TYPE_EVAL_ERROR; i < NJS_OBJ_TYPE_MAX; i++) {
vm->prototypes[i].object.__proto__ = error_prototype;
}
- values = vm->scopes[NJS_SCOPE_GLOBAL];
-
- function_prototype = &vm->prototypes[NJS_PROTOTYPE_FUNCTION].object;
+ function_prototype = &vm->prototypes[NJS_OBJ_TYPE_FUNCTION].object;
- for (i = NJS_CONSTRUCTOR_OBJECT; i < NJS_CONSTRUCTOR_EVAL_ERROR; i++) {
- njs_set_function(&values[i], &vm->constructors[i]);
+ for (i = NJS_OBJ_TYPE_OBJECT; i < NJS_OBJ_TYPE_EVAL_ERROR; i++) {
vm->constructors[i].object.__proto__ = function_prototype;
}
- error_constructor = &vm->constructors[NJS_CONSTRUCTOR_ERROR].object;
+ error_constructor = &vm->constructors[NJS_OBJ_TYPE_ERROR].object;
- for (i = NJS_CONSTRUCTOR_EVAL_ERROR; i < NJS_CONSTRUCTOR_MAX; i++) {
- njs_set_function(&values[i], &vm->constructors[i]);
+ for (i = NJS_OBJ_TYPE_EVAL_ERROR; i < NJS_OBJ_TYPE_MAX; i++) {
vm->constructors[i].object.__proto__ = error_constructor;
}
njs_set_object(global, &vm->global_object);
vm->string_object = vm->shared->string_object;
- vm->string_object.__proto__ = &vm->prototypes[NJS_PROTOTYPE_STRING].object;
+ vm->string_object.__proto__ = &vm->prototypes[NJS_OBJ_TYPE_STRING].object;
return NJS_OK;
}
}
+static njs_int_t
+njs_top_level_constructor(njs_vm_t *vm, njs_object_prop_t *self,
+ njs_value_t *global, njs_value_t *setval, njs_value_t *retval)
+{
+ njs_int_t ret;
+ njs_function_t *ctor;
+ njs_object_prop_t *prop;
+ njs_lvlhsh_query_t lhq;
+
+ if (njs_slow_path(setval != NULL)) {
+ *retval = *setval;
+
+ } else {
+ ctor = &vm->constructors[self->value.data.magic16];
+
+ njs_set_function(retval, ctor);
+ }
+
+ prop = njs_object_prop_alloc(vm, &self->name, retval, 1);
+ if (njs_slow_path(prop == NULL)) {
+ return NJS_ERROR;
+ }
+
+ /* GC */
+
+ prop->value = *retval;
+ prop->enumerable = 0;
+
+ lhq.value = prop;
+ njs_string_get(&self->name, &lhq.key);
+ lhq.key_hash = self->value.data.magic32;
+ lhq.replace = 1;
+ lhq.pool = vm->mem_pool;
+ lhq.proto = &njs_object_hash_proto;
+
+ ret = njs_lvlhsh_insert(njs_object_hash(global), &lhq);
+ if (njs_slow_path(ret != NJS_OK)) {
+ njs_internal_error(vm, "lvlhsh insert/replace failed");
+ return NJS_ERROR;
+ }
+
+ return NJS_OK;
+}
+
+
static const njs_object_prop_t njs_global_this_object_properties[] =
{
/* Global constants. */
.configurable = 1,
},
+ /* Global constructors. */
+
+ {
+ .type = NJS_PROPERTY_HANDLER,
+ .name = njs_string("Object"),
+ .value = njs_prop_handler2(njs_top_level_constructor,
+ NJS_OBJ_TYPE_OBJECT, NJS_OBJECT_HASH),
+ .writable = 1,
+ .configurable = 1,
+ },
+
+ {
+ .type = NJS_PROPERTY_HANDLER,
+ .name = njs_string("Array"),
+ .value = njs_prop_handler2(njs_top_level_constructor,
+ NJS_OBJ_TYPE_ARRAY, NJS_ARRAY_HASH),
+ .writable = 1,
+ .configurable = 1,
+ },
+
+ {
+ .type = NJS_PROPERTY_HANDLER,
+ .name = njs_string("Boolean"),
+ .value = njs_prop_handler2(njs_top_level_constructor,
+ NJS_OBJ_TYPE_BOOLEAN, NJS_BOOLEAN_HASH),
+ .writable = 1,
+ .configurable = 1,
+ },
+
+ {
+ .type = NJS_PROPERTY_HANDLER,
+ .name = njs_string("Number"),
+ .value = njs_prop_handler2(njs_top_level_constructor,
+ NJS_OBJ_TYPE_NUMBER, NJS_NUMBER_HASH),
+ .writable = 1,
+ .configurable = 1,
+ },
+
+ {
+ .type = NJS_PROPERTY_HANDLER,
+ .name = njs_string("String"),
+ .value = njs_prop_handler2(njs_top_level_constructor,
+ NJS_OBJ_TYPE_STRING, NJS_STRING_HASH),
+ .writable = 1,
+ .configurable = 1,
+ },
+
+ {
+ .type = NJS_PROPERTY_HANDLER,
+ .name = njs_string("Function"),
+ .value = njs_prop_handler2(njs_top_level_constructor,
+ NJS_OBJ_TYPE_FUNCTION, NJS_FUNCTION_HASH),
+ .writable = 1,
+ .configurable = 1,
+ },
+
+ {
+ .type = NJS_PROPERTY_HANDLER,
+ .name = njs_string("RegExp"),
+ .value = njs_prop_handler2(njs_top_level_constructor,
+ NJS_OBJ_TYPE_REGEXP, NJS_REGEXP_HASH),
+ .writable = 1,
+ .configurable = 1,
+ },
+
+ {
+ .type = NJS_PROPERTY_HANDLER,
+ .name = njs_string("Date"),
+ .value = njs_prop_handler2(njs_top_level_constructor,
+ NJS_OBJ_TYPE_DATE, NJS_DATE_HASH),
+ .writable = 1,
+ .configurable = 1,
+ },
+
+ {
+ .type = NJS_PROPERTY_HANDLER,
+ .name = njs_string("Error"),
+ .value = njs_prop_handler2(njs_top_level_constructor,
+ NJS_OBJ_TYPE_ERROR, NJS_ERROR_HASH),
+ .writable = 1,
+ .configurable = 1,
+ },
+
+ {
+ .type = NJS_PROPERTY_HANDLER,
+ .name = njs_string("EvalError"),
+ .value = njs_prop_handler2(njs_top_level_constructor,
+ NJS_OBJ_TYPE_EVAL_ERROR,
+ NJS_EVAL_ERROR_HASH),
+ .writable = 1,
+ .configurable = 1,
+ },
+
+ {
+ .type = NJS_PROPERTY_HANDLER,
+ .name = njs_string("InternalError"),
+ .value = njs_prop_handler2(njs_top_level_constructor,
+ NJS_OBJ_TYPE_INTERNAL_ERROR,
+ NJS_INTERNAL_ERROR_HASH),
+ .writable = 1,
+ .configurable = 1,
+ },
+
+ {
+ .type = NJS_PROPERTY_HANDLER,
+ .name = njs_string("RangeError"),
+ .value = njs_prop_handler2(njs_top_level_constructor,
+ NJS_OBJ_TYPE_RANGE_ERROR,
+ NJS_RANGE_ERROR_HASH),
+ .writable = 1,
+ .configurable = 1,
+ },
+
+ {
+ .type = NJS_PROPERTY_HANDLER,
+ .name = njs_string("ReferenceError"),
+ .value = njs_prop_handler2(njs_top_level_constructor,
+ NJS_OBJ_TYPE_REF_ERROR, NJS_REF_ERROR_HASH),
+ .writable = 1,
+ .configurable = 1,
+ },
+
+ {
+ .type = NJS_PROPERTY_HANDLER,
+ .name = njs_string("SyntaxError"),
+ .value = njs_prop_handler2(njs_top_level_constructor,
+ NJS_OBJ_TYPE_SYNTAX_ERROR,
+ NJS_SYNTAX_ERROR_HASH),
+ .writable = 1,
+ .configurable = 1,
+ },
+
+ {
+ .type = NJS_PROPERTY_HANDLER,
+ .name = njs_string("TypeError"),
+ .value = njs_prop_handler2(njs_top_level_constructor,
+ NJS_OBJ_TYPE_TYPE_ERROR,
+ NJS_TYPE_ERROR_HASH),
+ .writable = 1,
+ .configurable = 1,
+ },
+
+ {
+ .type = NJS_PROPERTY_HANDLER,
+ .name = njs_string("URIError"),
+ .value = njs_prop_handler2(njs_top_level_constructor,
+ NJS_OBJ_TYPE_URI_ERROR,
+ NJS_URI_ERROR_HASH),
+ .writable = 1,
+ .configurable = 1,
+ },
+
+ {
+ .type = NJS_PROPERTY_HANDLER,
+ .name = njs_string("MemoryError"),
+ .value = njs_prop_handler2(njs_top_level_constructor,
+ NJS_OBJ_TYPE_MEMORY_ERROR,
+ NJS_MEMORY_ERROR_HASH),
+ .writable = 1,
+ .configurable = 1,
+ },
};
static njs_object_value_t *
-njs_crypto_object_value_alloc(njs_vm_t *vm, njs_uint_t proto)
+njs_crypto_object_value_alloc(njs_vm_t *vm, njs_object_type_t type)
{
njs_object_value_t *ov;
ov->object.shared = 0;
ov->object.extensible = 1;
- ov->object.__proto__ = &vm->prototypes[proto].object;
+ ov->object.__proto__ = &vm->prototypes[type].object;
return ov;
}
return NJS_ERROR;
}
- hash = njs_crypto_object_value_alloc(vm, NJS_PROTOTYPE_CRYPTO_HASH);
+ hash = njs_crypto_object_value_alloc(vm, NJS_OBJ_TYPE_CRYPTO_HASH);
if (njs_slow_path(hash == NULL)) {
return NJS_ERROR;
}
alg->init(&ctx->u);
alg->update(&ctx->u, key_buf, 64);
- hmac = njs_crypto_object_value_alloc(vm, NJS_PROTOTYPE_CRYPTO_HMAC);
+ hmac = njs_crypto_object_value_alloc(vm, NJS_OBJ_TYPE_CRYPTO_HMAC);
if (njs_slow_path(hmac == NULL)) {
return NJS_ERROR;
}
date->object.type = NJS_DATE;
date->object.shared = 0;
date->object.extensible = 1;
- date->object.__proto__ = &vm->prototypes[NJS_PROTOTYPE_DATE].object;
+ date->object.__proto__ = &vm->prototypes[NJS_OBJ_TYPE_DATE].object;
date->time = njs_timeclip(time);
void
-njs_error_new(njs_vm_t *vm, njs_value_t *dst, njs_prototype_t type,
+njs_error_new(njs_vm_t *vm, njs_value_t *dst, njs_object_type_t type,
u_char *start, size_t size)
{
ssize_t length;
void
-njs_error_fmt_new(njs_vm_t *vm, njs_value_t *dst, njs_prototype_t type,
+njs_error_fmt_new(njs_vm_t *vm, njs_value_t *dst, njs_object_type_t type,
const char *fmt, ...)
{
va_list args;
njs_object_t *
-njs_error_alloc(njs_vm_t *vm, njs_prototype_t type, const njs_value_t *name,
+njs_error_alloc(njs_vm_t *vm, njs_object_type_t type, const njs_value_t *name,
const njs_value_t *message)
{
njs_int_t ret;
static njs_int_t
njs_error_create(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
- njs_prototype_t type)
+ njs_object_type_t type)
{
njs_int_t ret;
njs_value_t *value;
njs_error_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
njs_index_t unused)
{
- return njs_error_create(vm, args, nargs, NJS_PROTOTYPE_ERROR);
+ return njs_error_create(vm, args, nargs, NJS_OBJ_TYPE_ERROR);
}
njs_eval_error_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
njs_index_t unused)
{
- return njs_error_create(vm, args, nargs, NJS_PROTOTYPE_EVAL_ERROR);
+ return njs_error_create(vm, args, nargs, NJS_OBJ_TYPE_EVAL_ERROR);
}
njs_internal_error_constructor(njs_vm_t *vm, njs_value_t *args,
njs_uint_t nargs, njs_index_t unused)
{
- return njs_error_create(vm, args, nargs, NJS_PROTOTYPE_INTERNAL_ERROR);
+ return njs_error_create(vm, args, nargs, NJS_OBJ_TYPE_INTERNAL_ERROR);
}
njs_range_error_constructor(njs_vm_t *vm, njs_value_t *args,
njs_uint_t nargs, njs_index_t unused)
{
- return njs_error_create(vm, args, nargs, NJS_PROTOTYPE_RANGE_ERROR);
+ return njs_error_create(vm, args, nargs, NJS_OBJ_TYPE_RANGE_ERROR);
}
njs_reference_error_constructor(njs_vm_t *vm, njs_value_t *args,
njs_uint_t nargs, njs_index_t unused)
{
- return njs_error_create(vm, args, nargs, NJS_PROTOTYPE_REF_ERROR);
+ return njs_error_create(vm, args, nargs, NJS_OBJ_TYPE_REF_ERROR);
}
njs_syntax_error_constructor(njs_vm_t *vm, njs_value_t *args,
njs_uint_t nargs, njs_index_t unused)
{
- return njs_error_create(vm, args, nargs, NJS_PROTOTYPE_SYNTAX_ERROR);
+ return njs_error_create(vm, args, nargs, NJS_OBJ_TYPE_SYNTAX_ERROR);
}
njs_type_error_constructor(njs_vm_t *vm, njs_value_t *args,
njs_uint_t nargs, njs_index_t unused)
{
- return njs_error_create(vm, args, nargs, NJS_PROTOTYPE_TYPE_ERROR);
+ return njs_error_create(vm, args, nargs, NJS_OBJ_TYPE_TYPE_ERROR);
}
njs_uri_error_constructor(njs_vm_t *vm, njs_value_t *args,
njs_uint_t nargs, njs_index_t unused)
{
- return njs_error_create(vm, args, nargs, NJS_PROTOTYPE_URI_ERROR);
+ return njs_error_create(vm, args, nargs, NJS_OBJ_TYPE_URI_ERROR);
}
njs_lvlhsh_init(&object->hash);
njs_lvlhsh_init(&object->shared_hash);
- object->__proto__ = &prototypes[NJS_PROTOTYPE_INTERNAL_ERROR].object;
+ object->__proto__ = &prototypes[NJS_OBJ_TYPE_INTERNAL_ERROR].object;
object->type = NJS_OBJECT;
object->shared = 1;
/* MemoryError has no its own prototype. */
- index = NJS_PROTOTYPE_INTERNAL_ERROR;
+ index = NJS_OBJ_TYPE_INTERNAL_ERROR;
function = njs_function(value);
proto = njs_property_prototype_create(vm, &function->object.hash,
#define njs_error(vm, fmt, ...) \
- njs_error_fmt_new(vm, &vm->retval, NJS_PROTOTYPE_ERROR, fmt, ##__VA_ARGS__)
+ njs_error_fmt_new(vm, &vm->retval, NJS_OBJ_TYPE_ERROR, fmt, ##__VA_ARGS__)
#define njs_eval_error(vm, fmt, ...) \
- njs_error_fmt_new(vm, &vm->retval, NJS_PROTOTYPE_EVAL_ERROR, fmt, \
+ njs_error_fmt_new(vm, &vm->retval, NJS_OBJ_TYPE_EVAL_ERROR, fmt, \
##__VA_ARGS__)
#define njs_internal_error(vm, fmt, ...) \
- njs_error_fmt_new(vm, &vm->retval, NJS_PROTOTYPE_INTERNAL_ERROR, fmt, \
+ njs_error_fmt_new(vm, &vm->retval, NJS_OBJ_TYPE_INTERNAL_ERROR, fmt, \
##__VA_ARGS__)
#define njs_range_error(vm, fmt, ...) \
- njs_error_fmt_new(vm, &vm->retval, NJS_PROTOTYPE_RANGE_ERROR, fmt, \
+ njs_error_fmt_new(vm, &vm->retval, NJS_OBJ_TYPE_RANGE_ERROR, fmt, \
##__VA_ARGS__)
#define njs_reference_error(vm, fmt, ...) \
- njs_error_fmt_new(vm, &vm->retval, NJS_PROTOTYPE_REF_ERROR, fmt, \
+ njs_error_fmt_new(vm, &vm->retval, NJS_OBJ_TYPE_REF_ERROR, fmt, \
##__VA_ARGS__)
#define njs_syntax_error(vm, fmt, ...) \
- njs_error_fmt_new(vm, &vm->retval, NJS_PROTOTYPE_SYNTAX_ERROR, fmt, \
+ njs_error_fmt_new(vm, &vm->retval, NJS_OBJ_TYPE_SYNTAX_ERROR, fmt, \
##__VA_ARGS__)
#define njs_type_error(vm, fmt, ...) \
- njs_error_fmt_new(vm, &vm->retval, NJS_PROTOTYPE_TYPE_ERROR, fmt, \
+ njs_error_fmt_new(vm, &vm->retval, NJS_OBJ_TYPE_TYPE_ERROR, fmt, \
##__VA_ARGS__)
#define njs_uri_error(vm, fmt, ...) \
- njs_error_fmt_new(vm, &vm->retval, NJS_PROTOTYPE_URI_ERROR, fmt, \
+ njs_error_fmt_new(vm, &vm->retval, NJS_OBJ_TYPE_URI_ERROR, fmt, \
##__VA_ARGS__)
-void njs_error_new(njs_vm_t *vm, njs_value_t *dst, njs_prototype_t type,
+void njs_error_new(njs_vm_t *vm, njs_value_t *dst, njs_object_type_t type,
u_char *start, size_t size);
void njs_noinline njs_error_fmt_new(njs_vm_t *vm, njs_value_t *dst,
- njs_prototype_t type, const char *fmt, ...);
+ njs_object_type_t type, const char *fmt, ...);
void njs_memory_error(njs_vm_t *vm);
void njs_memory_error_set(njs_vm_t *vm, njs_value_t *value);
-njs_object_t *njs_error_alloc(njs_vm_t *vm, njs_prototype_t type,
+njs_object_t *njs_error_alloc(njs_vm_t *vm, njs_object_type_t type,
const njs_value_t *name, const njs_value_t *message);
njs_int_t njs_error_constructor(njs_vm_t *vm, njs_value_t *args,
njs_uint_t nargs, njs_index_t unused);
*/
function->object.__proto__ =
- &vm->prototypes[NJS_CONSTRUCTOR_FUNCTION].object;
+ &vm->prototypes[NJS_OBJ_TYPE_FUNCTION].object;
function->object.shared_hash = vm->shared->arrow_instance_hash;
function->object.type = NJS_FUNCTION;
function->object.shared = 1;
return NJS_ERROR;
}
- error = njs_error_alloc(vm, NJS_PROTOTYPE_ERROR, NULL, &string);
+ error = njs_error_alloc(vm, NJS_OBJ_TYPE_ERROR, NULL, &string);
if (njs_slow_path(error == NULL)) {
return NJS_ERROR;
}
function->object.shared_hash = vm->shared->arrow_instance_hash;
}
- function->object.__proto__ = &vm->prototypes[NJS_PROTOTYPE_FUNCTION].object;
+ function->object.__proto__ = &vm->prototypes[NJS_OBJ_TYPE_FUNCTION].object;
function->object.type = NJS_FUNCTION;
function->object.shared = shared;
function->object.extensible = 1;
}
*copy = *function;
- copy->object.__proto__ = &vm->prototypes[NJS_PROTOTYPE_FUNCTION].object;
+ copy->object.__proto__ = &vm->prototypes[NJS_OBJ_TYPE_FUNCTION].object;
copy->object.shared = 0;
if (nesting == 0) {
#define njs_generate_syntax_error(vm, node, fmt, ...) \
- njs_parser_node_error(vm, node, NJS_PROTOTYPE_SYNTAX_ERROR, fmt, \
+ njs_parser_node_error(vm, node, NJS_OBJ_TYPE_SYNTAX_ERROR, fmt, \
##__VA_ARGS__)
return njs_generate_template_literal(vm, generator, node);
case NJS_TOKEN_THIS:
- case NJS_TOKEN_OBJECT_CONSTRUCTOR:
- case NJS_TOKEN_ARRAY_CONSTRUCTOR:
- case NJS_TOKEN_NUMBER_CONSTRUCTOR:
- case NJS_TOKEN_BOOLEAN_CONSTRUCTOR:
- case NJS_TOKEN_STRING_CONSTRUCTOR:
- case NJS_TOKEN_FUNCTION_CONSTRUCTOR:
- case NJS_TOKEN_REGEXP_CONSTRUCTOR:
- case NJS_TOKEN_DATE_CONSTRUCTOR:
- case NJS_TOKEN_ERROR_CONSTRUCTOR:
- case NJS_TOKEN_EVAL_ERROR_CONSTRUCTOR:
- case NJS_TOKEN_INTERNAL_ERROR_CONSTRUCTOR:
- case NJS_TOKEN_RANGE_ERROR_CONSTRUCTOR:
- case NJS_TOKEN_REF_ERROR_CONSTRUCTOR:
- case NJS_TOKEN_SYNTAX_ERROR_CONSTRUCTOR:
- case NJS_TOKEN_TYPE_ERROR_CONSTRUCTOR:
- case NJS_TOKEN_URI_ERROR_CONSTRUCTOR:
- case NJS_TOKEN_MEMORY_ERROR_CONSTRUCTOR:
case NJS_TOKEN_EXTERNAL:
return NJS_OK;
NJS_TOKEN_ARGUMENTS,
NJS_TOKEN_EVAL,
- NJS_TOKEN_OBJECT_CONSTRUCTOR,
- NJS_TOKEN_ARRAY_CONSTRUCTOR,
- NJS_TOKEN_BOOLEAN_CONSTRUCTOR,
- NJS_TOKEN_NUMBER_CONSTRUCTOR,
- NJS_TOKEN_STRING_CONSTRUCTOR,
- NJS_TOKEN_FUNCTION_CONSTRUCTOR,
- NJS_TOKEN_REGEXP_CONSTRUCTOR,
- NJS_TOKEN_DATE_CONSTRUCTOR,
- NJS_TOKEN_ERROR_CONSTRUCTOR,
- NJS_TOKEN_EVAL_ERROR_CONSTRUCTOR,
- NJS_TOKEN_INTERNAL_ERROR_CONSTRUCTOR,
- NJS_TOKEN_RANGE_ERROR_CONSTRUCTOR,
- NJS_TOKEN_REF_ERROR_CONSTRUCTOR,
- NJS_TOKEN_SYNTAX_ERROR_CONSTRUCTOR,
- NJS_TOKEN_TYPE_ERROR_CONSTRUCTOR,
- NJS_TOKEN_URI_ERROR_CONSTRUCTOR,
- NJS_TOKEN_MEMORY_ERROR_CONSTRUCTOR,
-
NJS_TOKEN_IMPORT,
NJS_TOKEN_EXPORT,
{ njs_str("finally"), NJS_TOKEN_FINALLY, 0 },
{ njs_str("throw"), NJS_TOKEN_THROW, 0 },
- /* Builtin functions. */
-
- { njs_str("Object"), NJS_TOKEN_OBJECT_CONSTRUCTOR, 0 },
- { njs_str("Array"), NJS_TOKEN_ARRAY_CONSTRUCTOR, 0 },
- { njs_str("Boolean"), NJS_TOKEN_BOOLEAN_CONSTRUCTOR, 0 },
- { njs_str("Number"), NJS_TOKEN_NUMBER_CONSTRUCTOR, 0 },
- { njs_str("String"), NJS_TOKEN_STRING_CONSTRUCTOR, 0 },
- { njs_str("Function"), NJS_TOKEN_FUNCTION_CONSTRUCTOR, 0 },
- { njs_str("RegExp"), NJS_TOKEN_REGEXP_CONSTRUCTOR, 0 },
- { njs_str("Date"), NJS_TOKEN_DATE_CONSTRUCTOR, 0 },
- { njs_str("Error"), NJS_TOKEN_ERROR_CONSTRUCTOR, 0 },
- { njs_str("EvalError"), NJS_TOKEN_EVAL_ERROR_CONSTRUCTOR, 0 },
- { njs_str("InternalError"), NJS_TOKEN_INTERNAL_ERROR_CONSTRUCTOR, 0 },
- { njs_str("RangeError"), NJS_TOKEN_RANGE_ERROR_CONSTRUCTOR, 0 },
- { njs_str("ReferenceError"), NJS_TOKEN_REF_ERROR_CONSTRUCTOR, 0 },
- { njs_str("SyntaxError"), NJS_TOKEN_SYNTAX_ERROR_CONSTRUCTOR, 0 },
- { njs_str("TypeError"), NJS_TOKEN_TYPE_ERROR_CONSTRUCTOR, 0 },
- { njs_str("URIError"), NJS_TOKEN_URI_ERROR_CONSTRUCTOR, 0 },
- { njs_str("MemoryError"), NJS_TOKEN_MEMORY_ERROR_CONSTRUCTOR, 0 },
-
/* Module. */
{ njs_str("import"), NJS_TOKEN_IMPORT, 0 },
}
*object = module->object;
- object->__proto__ = &vm->prototypes[NJS_PROTOTYPE_OBJECT].object;
+ object->__proto__ = &vm->prototypes[NJS_OBJ_TYPE_OBJECT].object;
object->shared = 0;
object->error_data = 0;
if (njs_fast_path(object != NULL)) {
njs_lvlhsh_init(&object->hash);
njs_lvlhsh_init(&object->shared_hash);
- object->__proto__ = &vm->prototypes[NJS_PROTOTYPE_OBJECT].object;
+ object->__proto__ = &vm->prototypes[NJS_OBJ_TYPE_OBJECT].object;
object->type = NJS_OBJECT;
object->shared = 0;
object->extensible = 1;
if (njs_fast_path(object != NULL)) {
*object = *njs_object(value);
- object->__proto__ = &vm->prototypes[NJS_PROTOTYPE_OBJECT].object;
+ object->__proto__ = &vm->prototypes[NJS_OBJ_TYPE_OBJECT].object;
object->shared = 0;
value->data.u.object = object;
return object;
function = njs_function(value);
index = function - vm->constructors;
- if (index >= 0 && index < NJS_PROTOTYPE_MAX) {
+ if (index >= 0 && index < NJS_OBJ_TYPE_MAX) {
proto = njs_property_prototype_create(vm, &function->object.hash,
&vm->prototypes[index].object);
}
njs_value_t *value, njs_value_t *setval, njs_value_t *retval)
{
int32_t index;
- njs_value_t *cons;
+ njs_value_t *cons, constructor;
njs_object_t *object;
njs_object_prototype_t *prototype;
prototype = (njs_object_prototype_t *) object;
index = prototype - vm->prototypes;
- if (index >= 0 && index < NJS_PROTOTYPE_MAX) {
+ if (index >= 0 && index < NJS_OBJ_TYPE_MAX) {
goto found;
}
found:
if (setval == NULL) {
- setval = &vm->scopes[NJS_SCOPE_GLOBAL][index];
+ njs_set_function(&constructor, &vm->constructors[index]);
+ setval = &constructor;
}
cons = njs_property_constructor_create(vm, &prototype->object.hash, setval);
'_'), '_'), 'p'), 'r'), 'o'), 't'), 'o'), '_'), '_')
+#define NJS_ARRAY_HASH \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add(NJS_DJB_HASH_INIT, \
+ 'A'), 'r'), 'r'), 'a'), 'y')
+
+
#define NJS_ARGV_HASH \
njs_djb_hash_add( \
njs_djb_hash_add( \
'a'), 'r'), 'g'), 'v')
+#define NJS_BOOLEAN_HASH \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add(NJS_DJB_HASH_INIT, \
+ 'B'), 'o'), 'o'), 'l'), 'e'), 'a'), 'n')
+
+
#define NJS_CONFIGURABLE_HASH \
njs_djb_hash_add( \
njs_djb_hash_add( \
'c'), 'o'), 'n'), 's'), 't'), 'r'), 'u'), 'c'), 't'), 'o'), 'r')
+#define NJS_DATE_HASH \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add(NJS_DJB_HASH_INIT, \
+ 'D'), 'a'), 't'), 'e')
+
+
#define NJS_ENUMERABLE_HASH \
njs_djb_hash_add( \
njs_djb_hash_add( \
'e'), 'r'), 'r'), 'n'), 'o')
+#define NJS_ERROR_HASH \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add(NJS_DJB_HASH_INIT, \
+ 'E'), 'r'), 'r'), 'o'), 'r')
+
+
#define NJS_ENCODING_HASH \
njs_djb_hash_add( \
njs_djb_hash_add( \
'e'), 'n'), 'v')
+#define NJS_EVAL_ERROR_HASH \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add(NJS_DJB_HASH_INIT, \
+ 'E'), 'v'), 'a'), 'l'), 'E'), 'r'), 'r'), 'o'), 'r')
+
+
#define NJS_FLAG_HASH \
njs_djb_hash_add( \
njs_djb_hash_add( \
'f'), 'l'), 'a'), 'g')
+#define NJS_GET_HASH \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add(NJS_DJB_HASH_INIT, \
+ 'g'), 'e'), 't')
+
+
+#define NJS_FUNCTION_HASH \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add(NJS_DJB_HASH_INIT, \
+ 'F'), 'u'), 'n'), 'c'), 't'), 'i'), 'o'), 'n')
+
+
#define NJS_INDEX_HASH \
njs_djb_hash_add( \
njs_djb_hash_add( \
'i'), 'n'), 'p'), 'u'), 't')
+#define NJS_INTERNAL_ERROR_HASH \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add(NJS_DJB_HASH_INIT, \
+ 'I'), 'n'), 't'), 'e'), 'r'), 'n'), 'a'), 'l'), \
+ 'E'), 'r'), 'r'), 'o'), 'r')
+
+
#define NJS_GROUPS_HASH \
njs_djb_hash_add( \
njs_djb_hash_add( \
'n'), 'j'), 's')
+#define NJS_NUMBER_HASH \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add(NJS_DJB_HASH_INIT, \
+ 'N'), 'u'), 'm'), 'b'), 'e'), 'r')
+
+
#define NJS_MATH_HASH \
njs_djb_hash_add( \
njs_djb_hash_add( \
'M'), 'a'), 't'), 'h')
+#define NJS_MEMORY_ERROR_HASH \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add(NJS_DJB_HASH_INIT, \
+ 'M'), 'e'), 'm'), 'o'), 'r'), 'y'), \
+ 'E'), 'r'), 'r'), 'o'), 'r')
+
+
#define NJS_MESSAGE_HASH \
njs_djb_hash_add( \
njs_djb_hash_add( \
'm'), 'o'), 'd'), 'e')
-#define NJS_SYSCALL_HASH \
- njs_djb_hash_add( \
+#define NJS_OBJECT_HASH \
njs_djb_hash_add( \
njs_djb_hash_add( \
njs_djb_hash_add( \
njs_djb_hash_add( \
njs_djb_hash_add( \
njs_djb_hash_add(NJS_DJB_HASH_INIT, \
- 's'), 'y'), 's'), 'c'), 'a'), 'l'), 'l')
+ 'O'), 'b'), 'j'), 'e'), 'c'), 't')
#define NJS_PATH_HASH \
'p'), 'r'), 'o'), 't'), 'o'), 't'), 'y'), 'p'), 'e')
+#define NJS_RANGE_ERROR_HASH \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add(NJS_DJB_HASH_INIT, \
+ 'R'), 'a'), 'n'), 'g'), 'e'), 'E'), 'r'), 'r'), 'o'), 'r')
+
+
+#define NJS_REF_ERROR_HASH \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add(NJS_DJB_HASH_INIT, \
+ 'R'), 'e'), 'f'), 'e'), 'r'), 'e'), 'n'), 'c'), 'e'), \
+ 'E'), 'r'), 'r'), 'o'), 'r')
+
+
+#define NJS_REGEXP_HASH \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add(NJS_DJB_HASH_INIT, \
+ 'R'), 'e'), 'g'), 'E'), 'x'), 'p')
+
+
+#define NJS_SET_HASH \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add(NJS_DJB_HASH_INIT, \
+ 's'), 'e'), 't')
+
+
+#define NJS_STRING_HASH \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add(NJS_DJB_HASH_INIT, \
+ 'S'), 't'), 'r'), 'i'), 'n'), 'g')
+
+
+#define NJS_SYNTAX_ERROR_HASH \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add(NJS_DJB_HASH_INIT, \
+ 'S'), 'y'), 'n'), 't'), 'a'), 'x'), \
+ 'E'), 'r'), 'r'), 'o'), 'r')
+
+
+#define NJS_SYSCALL_HASH \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add(NJS_DJB_HASH_INIT, \
+ 's'), 'y'), 's'), 'c'), 'a'), 'l'), 'l')
+
+
#define NJS_TO_JSON_HASH \
njs_djb_hash_add( \
njs_djb_hash_add( \
't'), 'o'), 'S'), 't'), 'r'), 'i'), 'n'), 'g')
-#define NJS_VALUE_HASH \
+#define NJS_TO_ISO_STRING_HASH \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
njs_djb_hash_add( \
njs_djb_hash_add( \
njs_djb_hash_add( \
njs_djb_hash_add( \
njs_djb_hash_add(NJS_DJB_HASH_INIT, \
- 'v'), 'a'), 'l'), 'u'), 'e')
+ 't'), 'o'), 'I'), 'S'), 'O'), 'S'), 't'), 'r'), 'i'), 'n'), 'g')
-#define NJS_VALUE_OF_HASH \
+#define NJS_TYPE_ERROR_HASH \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
njs_djb_hash_add( \
njs_djb_hash_add( \
njs_djb_hash_add( \
njs_djb_hash_add( \
njs_djb_hash_add( \
njs_djb_hash_add(NJS_DJB_HASH_INIT, \
- 'v'), 'a'), 'l'), 'u'), 'e'), 'O'), 'f')
+ 'T'), 'y'), 'p'), 'e'), 'E'), 'r'), 'r'), 'o'), 'r')
-#define NJS_TO_ISO_STRING_HASH \
+#define NJS_VALUE_HASH \
njs_djb_hash_add( \
njs_djb_hash_add( \
njs_djb_hash_add( \
njs_djb_hash_add( \
+ njs_djb_hash_add(NJS_DJB_HASH_INIT, \
+ 'v'), 'a'), 'l'), 'u'), 'e')
+
+
+#define NJS_VALUE_OF_HASH \
njs_djb_hash_add( \
njs_djb_hash_add( \
njs_djb_hash_add( \
njs_djb_hash_add( \
njs_djb_hash_add( \
njs_djb_hash_add(NJS_DJB_HASH_INIT, \
- 't'), 'o'), 'I'), 'S'), 'O'), 'S'), 't'), 'r'), 'i'), 'n'), 'g')
+ 'v'), 'a'), 'l'), 'u'), 'e'), 'O'), 'f')
#define NJS_WRITABABLE_HASH \
'w'), 'r'), 'i'), 't'), 'a'), 'b'), 'l'), 'e')
-#define NJS_GET_HASH \
+#define NJS_URI_ERROR_HASH \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
+ njs_djb_hash_add( \
njs_djb_hash_add( \
njs_djb_hash_add( \
- njs_djb_hash_add(NJS_DJB_HASH_INIT, \
- 'g'), 'e'), 't')
-
-
-#define NJS_SET_HASH \
njs_djb_hash_add( \
njs_djb_hash_add( \
njs_djb_hash_add(NJS_DJB_HASH_INIT, \
- 's'), 'e'), 't')
+ 'U'), 'R'), 'I'), 'e'), 'E'), 'r'), 'r'), 'o'), 'r')
#endif /* _NJS_OBJECT_HASH_H_INCLUDED_ */
static void
njs_parser_scope_error(njs_vm_t *vm, njs_parser_scope_t *scope,
- njs_prototype_t type, uint32_t line, const char *fmt, va_list args)
+ njs_object_type_t type, uint32_t line, const char *fmt, va_list args)
{
size_t width;
u_char msg[NJS_MAX_ERROR_STR];
void
njs_parser_lexer_error(njs_vm_t *vm, njs_parser_t *parser,
- njs_prototype_t type, const char *fmt, ...)
+ njs_object_type_t type, const char *fmt, ...)
{
va_list args;
void
njs_parser_node_error(njs_vm_t *vm, njs_parser_node_t *node,
- njs_prototype_t type, const char *fmt, ...)
+ njs_object_type_t type, const char *fmt, ...)
{
va_list args;
u_char *njs_parser_trace_handler(njs_trace_t *trace, njs_trace_data_t *td,
u_char *start);
void njs_parser_lexer_error(njs_vm_t *vm, njs_parser_t *parser,
- njs_prototype_t type, const char *fmt, ...);
+ njs_object_type_t type, const char *fmt, ...);
void njs_parser_node_error(njs_vm_t *vm, njs_parser_node_t *node,
- njs_prototype_t type, const char *fmt, ...);
+ njs_object_type_t type, const char *fmt, ...);
#define njs_parser_enter(vm, parser) \
#define njs_parser_syntax_error(vm, parser, fmt, ...) \
- njs_parser_lexer_error(vm, parser, NJS_PROTOTYPE_SYNTAX_ERROR, fmt, \
+ njs_parser_lexer_error(vm, parser, NJS_OBJ_TYPE_SYNTAX_ERROR, fmt, \
##__VA_ARGS__)
#define njs_parser_ref_error(vm, parser, fmt, ...) \
- njs_parser_lexer_error(vm, parser, NJS_PROTOTYPE_REF_ERROR, fmt, \
+ njs_parser_lexer_error(vm, parser, NJS_OBJ_TYPE_REF_ERROR, fmt, \
##__VA_ARGS__)
* NJS_TOKEN_FUNCTION_CALL,
* NJS_TOKEN_FUNCTION_EXPRESSION,
* NJS_TOKEN_OPEN_PARENTHESIS,
- * NJS_TOKEN_OBJECT_CONSTRUCTOR,
- * NJS_TOKEN_ARRAY_CONSTRUCTOR,
- * NJS_TOKEN_BOOLEAN_CONSTRUCTOR,
- * NJS_TOKEN_NUMBER_CONSTRUCTOR,
- * NJS_TOKEN_STRING_CONSTRUCTOR,
- * NJS_TOKEN_FUNCTION_CONSTRUCTOR,
- * NJS_TOKEN_REGEXP_CONSTRUCTOR,
* NJS_TOKEN_EVAL.
*/
func = njs_parser_node_new(vm, parser, NJS_TOKEN_FUNCTION_CALL);
break;
- case NJS_TOKEN_OBJECT_CONSTRUCTOR:
- node->index = NJS_INDEX_OBJECT;
- break;
-
- case NJS_TOKEN_ARRAY_CONSTRUCTOR:
- node->index = NJS_INDEX_ARRAY;
- break;
-
- case NJS_TOKEN_BOOLEAN_CONSTRUCTOR:
- node->index = NJS_INDEX_BOOLEAN;
- break;
-
- case NJS_TOKEN_NUMBER_CONSTRUCTOR:
- node->index = NJS_INDEX_NUMBER;
- break;
-
- case NJS_TOKEN_STRING_CONSTRUCTOR:
- node->index = NJS_INDEX_STRING;
- break;
-
- case NJS_TOKEN_FUNCTION_CONSTRUCTOR:
- node->index = NJS_INDEX_FUNCTION;
- break;
-
- case NJS_TOKEN_REGEXP_CONSTRUCTOR:
- node->index = NJS_INDEX_REGEXP;
- break;
-
- case NJS_TOKEN_DATE_CONSTRUCTOR:
- node->index = NJS_INDEX_DATE;
- break;
-
- case NJS_TOKEN_ERROR_CONSTRUCTOR:
- node->index = NJS_INDEX_OBJECT_ERROR;
- break;
-
- case NJS_TOKEN_EVAL_ERROR_CONSTRUCTOR:
- node->index = NJS_INDEX_OBJECT_EVAL_ERROR;
- break;
-
- case NJS_TOKEN_INTERNAL_ERROR_CONSTRUCTOR:
- node->index = NJS_INDEX_OBJECT_INTERNAL_ERROR;
- break;
-
- case NJS_TOKEN_RANGE_ERROR_CONSTRUCTOR:
- node->index = NJS_INDEX_OBJECT_RANGE_ERROR;
- break;
-
- case NJS_TOKEN_REF_ERROR_CONSTRUCTOR:
- node->index = NJS_INDEX_OBJECT_REF_ERROR;
- break;
-
- case NJS_TOKEN_SYNTAX_ERROR_CONSTRUCTOR:
- node->index = NJS_INDEX_OBJECT_SYNTAX_ERROR;
- break;
-
- case NJS_TOKEN_TYPE_ERROR_CONSTRUCTOR:
- node->index = NJS_INDEX_OBJECT_TYPE_ERROR;
- break;
-
- case NJS_TOKEN_URI_ERROR_CONSTRUCTOR:
- node->index = NJS_INDEX_OBJECT_URI_ERROR;
- break;
-
- case NJS_TOKEN_MEMORY_ERROR_CONSTRUCTOR:
- node->index = NJS_INDEX_OBJECT_MEMORY_ERROR;
- break;
-
case NJS_TOKEN_ARGUMENTS:
njs_thread_log_debug("JS: arguments");
if (njs_fast_path(regexp != NULL)) {
njs_lvlhsh_init(®exp->object.hash);
njs_lvlhsh_init(®exp->object.shared_hash);
- regexp->object.__proto__ = &vm->prototypes[NJS_PROTOTYPE_REGEXP].object;
+ regexp->object.__proto__ = &vm->prototypes[NJS_OBJ_TYPE_REGEXP].object;
regexp->object.type = NJS_REGEXP;
regexp->object.shared = 0;
regexp->object.extensible = 1;
va_end(args);
}
- njs_error_new(vm, value, NJS_PROTOTYPE_ERROR, buf, p - buf);
+ njs_error_new(vm, value, NJS_OBJ_TYPE_ERROR, buf, p - buf);
}
/* MemoryError is a nonextensible internal error. */
- if (njs_has_prototype(vm, src, NJS_PROTOTYPE_INTERNAL_ERROR)
+ if (njs_has_prototype(vm, src, NJS_OBJ_TYPE_INTERNAL_ERROR)
&& !njs_object(src)->extensible)
{
njs_string_get(&njs_string_memory_error, dst);
#define NJS_SCOPE_SHIFT 4
#define NJS_SCOPE_MASK ((uintptr_t) ((1 << NJS_SCOPE_SHIFT) - 1))
-#define NJS_INDEX_CACHE NJS_SCOPE_GLOBAL
-
#define NJS_INDEX_NONE ((njs_index_t) 0)
#define NJS_INDEX_ERROR ((njs_index_t) -1)
#define NJS_INDEX_THIS ((njs_index_t) (0 | NJS_SCOPE_ARGUMENTS))
typedef enum {
- NJS_PROTOTYPE_OBJECT = 0,
- NJS_PROTOTYPE_ARRAY,
- NJS_PROTOTYPE_BOOLEAN,
- NJS_PROTOTYPE_NUMBER,
- NJS_PROTOTYPE_STRING,
- NJS_PROTOTYPE_FUNCTION,
- NJS_PROTOTYPE_REGEXP,
- NJS_PROTOTYPE_DATE,
- NJS_PROTOTYPE_CRYPTO_HASH,
- NJS_PROTOTYPE_CRYPTO_HMAC,
- NJS_PROTOTYPE_ERROR,
- NJS_PROTOTYPE_EVAL_ERROR,
- NJS_PROTOTYPE_INTERNAL_ERROR,
- NJS_PROTOTYPE_RANGE_ERROR,
- NJS_PROTOTYPE_REF_ERROR,
- NJS_PROTOTYPE_SYNTAX_ERROR,
- NJS_PROTOTYPE_TYPE_ERROR,
- NJS_PROTOTYPE_URI_ERROR,
-#define NJS_PROTOTYPE_MAX (NJS_PROTOTYPE_URI_ERROR + 1)
-} njs_prototype_t;
+ NJS_OBJ_TYPE_OBJECT = 0,
+ NJS_OBJ_TYPE_ARRAY,
+ NJS_OBJ_TYPE_BOOLEAN,
+ NJS_OBJ_TYPE_NUMBER,
+ NJS_OBJ_TYPE_STRING,
+ NJS_OBJ_TYPE_FUNCTION,
+ NJS_OBJ_TYPE_REGEXP,
+ NJS_OBJ_TYPE_DATE,
+ NJS_OBJ_TYPE_CRYPTO_HASH,
+ NJS_OBJ_TYPE_CRYPTO_HMAC,
+ NJS_OBJ_TYPE_ERROR,
+ NJS_OBJ_TYPE_EVAL_ERROR,
+ NJS_OBJ_TYPE_INTERNAL_ERROR,
+ NJS_OBJ_TYPE_RANGE_ERROR,
+ NJS_OBJ_TYPE_REF_ERROR,
+ NJS_OBJ_TYPE_SYNTAX_ERROR,
+ NJS_OBJ_TYPE_TYPE_ERROR,
+ NJS_OBJ_TYPE_URI_ERROR,
+ NJS_OBJ_TYPE_MEMORY_ERROR,
+#define NJS_OBJ_TYPE_MAX (NJS_OBJ_TYPE_MEMORY_ERROR + 1)
+} njs_object_type_t;
#define njs_primitive_prototype_index(type) \
- (NJS_PROTOTYPE_BOOLEAN + ((type) - NJS_BOOLEAN))
-
-
-#define njs_error_prototype_index(type) \
- (NJS_PROTOTYPE_ERROR + ((type) - NJS_OBJECT_ERROR))
+ (NJS_OBJ_TYPE_BOOLEAN + ((type) - NJS_BOOLEAN))
#define njs_prototype_type(index) \
(index + NJS_OBJECT)
-enum njs_constructor_e {
- NJS_CONSTRUCTOR_OBJECT = NJS_PROTOTYPE_OBJECT,
- NJS_CONSTRUCTOR_ARRAY = NJS_PROTOTYPE_ARRAY,
- NJS_CONSTRUCTOR_BOOLEAN = NJS_PROTOTYPE_BOOLEAN,
- NJS_CONSTRUCTOR_NUMBER = NJS_PROTOTYPE_NUMBER,
- NJS_CONSTRUCTOR_STRING = NJS_PROTOTYPE_STRING,
- NJS_CONSTRUCTOR_FUNCTION = NJS_PROTOTYPE_FUNCTION,
- NJS_CONSTRUCTOR_REGEXP = NJS_PROTOTYPE_REGEXP,
- NJS_CONSTRUCTOR_DATE = NJS_PROTOTYPE_DATE,
- NJS_CONSTRUCTOR_CRYPTO_HASH = NJS_PROTOTYPE_CRYPTO_HASH,
- NJS_CONSTRUCTOR_CRYPTO_HMAC = NJS_PROTOTYPE_CRYPTO_HMAC,
- NJS_CONSTRUCTOR_ERROR = NJS_PROTOTYPE_ERROR,
- NJS_CONSTRUCTOR_EVAL_ERROR = NJS_PROTOTYPE_EVAL_ERROR,
- NJS_CONSTRUCTOR_INTERNAL_ERROR = NJS_PROTOTYPE_INTERNAL_ERROR,
- NJS_CONSTRUCTOR_RANGE_ERROR = NJS_PROTOTYPE_RANGE_ERROR,
- NJS_CONSTRUCTOR_REF_ERROR = NJS_PROTOTYPE_REF_ERROR,
- NJS_CONSTRUCTOR_SYNTAX_ERROR = NJS_PROTOTYPE_SYNTAX_ERROR,
- NJS_CONSTRUCTOR_TYPE_ERROR = NJS_PROTOTYPE_TYPE_ERROR,
- NJS_CONSTRUCTOR_URI_ERROR = NJS_PROTOTYPE_URI_ERROR,
- /* MemoryError has no its own prototype. */
- NJS_CONSTRUCTOR_MEMORY_ERROR,
-#define NJS_CONSTRUCTOR_MAX (NJS_CONSTRUCTOR_MEMORY_ERROR + 1)
-};
-
-
enum njs_object_e {
NJS_OBJECT_THIS = 0,
NJS_OBJECT_NJS,
#define njs_scope_index(value, type) \
((njs_index_t) (((value) << NJS_SCOPE_SHIFT) | (type)))
+
#define njs_global_scope_index(value) \
- ((njs_index_t) (((value) << NJS_SCOPE_SHIFT) | NJS_SCOPE_GLOBAL))
-
-
-#define NJS_INDEX_OBJECT njs_global_scope_index(NJS_CONSTRUCTOR_OBJECT)
-#define NJS_INDEX_ARRAY njs_global_scope_index(NJS_CONSTRUCTOR_ARRAY)
-#define NJS_INDEX_BOOLEAN njs_global_scope_index(NJS_CONSTRUCTOR_BOOLEAN)
-#define NJS_INDEX_NUMBER njs_global_scope_index(NJS_CONSTRUCTOR_NUMBER)
-#define NJS_INDEX_STRING njs_global_scope_index(NJS_CONSTRUCTOR_STRING)
-#define NJS_INDEX_FUNCTION \
- njs_global_scope_index(NJS_CONSTRUCTOR_FUNCTION)
-#define NJS_INDEX_REGEXP njs_global_scope_index(NJS_CONSTRUCTOR_REGEXP)
-#define NJS_INDEX_DATE njs_global_scope_index(NJS_CONSTRUCTOR_DATE)
-#define NJS_INDEX_OBJECT_ERROR njs_global_scope_index(NJS_CONSTRUCTOR_ERROR)
-#define NJS_INDEX_OBJECT_EVAL_ERROR \
- njs_global_scope_index(NJS_CONSTRUCTOR_EVAL_ERROR)
-#define NJS_INDEX_OBJECT_INTERNAL_ERROR \
- njs_global_scope_index(NJS_CONSTRUCTOR_INTERNAL_ERROR)
-#define NJS_INDEX_OBJECT_RANGE_ERROR \
- njs_global_scope_index(NJS_CONSTRUCTOR_RANGE_ERROR)
-#define NJS_INDEX_OBJECT_REF_ERROR \
- njs_global_scope_index(NJS_CONSTRUCTOR_REF_ERROR)
-#define NJS_INDEX_OBJECT_SYNTAX_ERROR \
- njs_global_scope_index(NJS_CONSTRUCTOR_SYNTAX_ERROR)
-#define NJS_INDEX_OBJECT_TYPE_ERROR \
- njs_global_scope_index(NJS_CONSTRUCTOR_TYPE_ERROR)
-#define NJS_INDEX_OBJECT_URI_ERROR \
- njs_global_scope_index(NJS_CONSTRUCTOR_URI_ERROR)
-#define NJS_INDEX_OBJECT_MEMORY_ERROR \
- njs_global_scope_index(NJS_CONSTRUCTOR_MEMORY_ERROR)
-
-#define NJS_INDEX_GLOBAL_OBJECT njs_global_scope_index(NJS_CONSTRUCTOR_MAX)
-#define NJS_INDEX_GLOBAL_OBJECT_OFFSET \
- njs_scope_index(NJS_CONSTRUCTOR_MAX, 0)
-
-#define NJS_INDEX_GLOBAL_RETVAL \
- njs_global_scope_index(NJS_CONSTRUCTOR_MAX + 1)
-#define NJS_INDEX_GLOBAL_OFFSET njs_scope_index(NJS_CONSTRUCTOR_MAX + 1, 0)
+ (njs_scope_index(value, NJS_SCOPE_GLOBAL))
+
+
+#define NJS_INDEX_GLOBAL_OBJECT njs_global_scope_index(0)
+#define NJS_INDEX_GLOBAL_OBJECT_OFFSET njs_scope_index(0, 0)
+
+
+#define NJS_INDEX_GLOBAL_RETVAL njs_global_scope_index(1)
+#define NJS_INDEX_GLOBAL_OFFSET njs_scope_index(1, 0)
#define njs_scope_offset(index) \
* they are copied from njs_vm_shared_t by single memcpy()
* in njs_builtin_objects_clone().
*/
- njs_object_prototype_t prototypes[NJS_PROTOTYPE_MAX];
- njs_function_t constructors[NJS_CONSTRUCTOR_MAX];
+ njs_object_prototype_t prototypes[NJS_OBJ_TYPE_MAX];
+ njs_function_t constructors[NJS_OBJ_TYPE_MAX];
njs_mp_t *mem_pool;
* The prototypes and constructors arrays must be togther because they are
* copied to njs_vm_t by single memcpy() in njs_builtin_objects_clone().
*/
- njs_object_prototype_t prototypes[NJS_PROTOTYPE_MAX];
- njs_function_t constructors[NJS_CONSTRUCTOR_MAX];
+ njs_object_prototype_t prototypes[NJS_OBJ_TYPE_MAX];
+ njs_function_t constructors[NJS_OBJ_TYPE_MAX];
njs_regexp_pattern_t *empty_regexp_pattern;
};
"}"
"fibo(32).length");
+ static njs_str_t json = njs_str(
+ "JSON.parse('{\"a\":123, \"XXX\":[3,4,null]}').a");
+
+ static njs_str_t for_loop = njs_str(
+ "var i; for (i = 0; i < 100000000; i++); i");
+
+ static njs_str_t while_loop = njs_str(
+ "var i = 0; while (i < 100000000) { i++ }; i");
+
static njs_str_t fibo_result = njs_str("3524578");
+ static njs_str_t json_result = njs_str("123");
+ static njs_str_t loop_result = njs_str("100000000");
if (argc > 1) {
return njs_unit_test_benchmark(&script, &result,
"nJSVM clone/destroy", 1000000);
+ case 'j':
+ return njs_unit_test_benchmark(&json, &json_result,
+ "JSON.parse", 1000000);
+
+ case 'f':
+ return njs_unit_test_benchmark(&for_loop, &loop_result,
+ "for loop 100M", 1);
+
+ case 'w':
+ return njs_unit_test_benchmark(&while_loop, &loop_result,
+ "while loop 100M", 1);
+
case 'n':
return njs_unit_test_benchmark(&fibo_number, &fibo_result,
"fibobench numbers", 1);
{ njs_str("function f(undefined,NaN, Infinity){ return undefined + NaN + Infinity}; f('x', 'y', 'z')"),
njs_str("xyz") },
+ { njs_str("(function (Object, Array, Boolean){ return Object + Array + Boolean})('x', 'y', 'z')"),
+ njs_str("xyz") },
+
/* Recursive factorial. */
{ njs_str("function f(a) {"
/* NativeErrors. */
{ njs_str(
+ "var global = this;"
"function isValidNativeError(e) {"
" var inst;"
" var proto = Object.getPrototypeOf(e) === Error;"
" var name_prop = Object.getOwnPropertyDescriptor(e.prototype, 'message');"
" name_prop = name_prop.writable && !name_prop.enumerable && name_prop.configurable;"
" var own_proto_ctor = e.prototype.hasOwnProperty('constructor');"
+ " var props = Object.getOwnPropertyDescriptor(global, e.prototype.name);"
+ " props = props.writable && !props.enumerable && props.configurable;"
+ " var same = e === global[e.prototype.name];"
""
" return proto && proto2 && iproto && iproto2 "
" && tpof && ctor && msg && name && name2 && name3 && name4 "
- " && name_prop && own_proto_ctor;"
+ " && name_prop && own_proto_ctor && props && same;"
"};"
"["
" EvalError,"
{ njs_str("Array.length"),
njs_str("1") },
+ { njs_str("delete this.Array; Array"),
+ njs_str("ReferenceError: \"Array\" is not defined in 1") },
+
{ njs_str("Array.__proto__ === Function.prototype"),
njs_str("true") },
{ njs_str("delete this.JSON; JSON"),
njs_str("ReferenceError: \"JSON\" is not defined in 1") },
+ /* Top-level constructors. */
+
+ { njs_str(
+ "var global = this;"
+ "function isValidConstructor(c) {"
+ " var props = Object.getOwnPropertyDescriptor(global, c.name);"
+ " props = props.writable && !props.enumerable && props.configurable;"
+ " var same = c === global[c.name];"
+ ""
+ " return props && same;"
+ "};"
+ "Object.getOwnPropertyNames(global)"
+ ".filter((k)=>(global[k] && global[k].prototype && global[k].prototype.constructor))"
+ ".map(k=>global[k])"
+ ".every(c => isValidConstructor(c))"),
+ njs_str("true") },
+
/* JSON.parse() */
{ njs_str("JSON.parse('null')"),
njs_test {
{"O\t"
- "O\a*bject"}
- {".\t\t"
+ "O\a*bject."}
+ {"\t\t"
"Object.create*Object.isSealed"}
}