]> git.kaiwu.me - njs.git/commitdiff
Moving constructors to global object.
authorDmitry Volyntsev <xeioex@nginx.com>
Thu, 31 Oct 2019 15:17:31 +0000 (18:17 +0300)
committerDmitry Volyntsev <xeioex@nginx.com>
Thu, 31 Oct 2019 15:17:31 +0000 (18:17 +0300)
25 files changed:
src/njs_array.c
src/njs_builtin.c
src/njs_crypto.c
src/njs_date.c
src/njs_error.c
src/njs_error.h
src/njs_extern.c
src/njs_fs.c
src/njs_function.c
src/njs_generator.c
src/njs_lexer.h
src/njs_lexer_keyword.c
src/njs_module.c
src/njs_object.c
src/njs_object_hash.h
src/njs_parser.c
src/njs_parser.h
src/njs_parser_expression.c
src/njs_parser_terminal.c
src/njs_regexp.c
src/njs_vm.c
src/njs_vm.h
src/test/njs_benchmark.c
src/test/njs_unit_test.c
test/njs_expect_test.exp

index 06021bbf3707f078d88fcdb643192693a7f77806..26ee0841909f89391e7f28d24aa0deb760524860 100644 (file)
@@ -63,7 +63,7 @@ njs_array_alloc(njs_vm_t *vm, uint64_t length, uint32_t spare)
     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;
index 4f0734168793776b636783ce10c6ff71174681e9..e479cc9f6760529435ad567ff425c25552eb6c02 100644 (file)
@@ -39,8 +39,8 @@ const njs_object_init_t  *njs_object_init[] = {
 
 
 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
 };
 
@@ -64,6 +64,7 @@ const njs_object_init_t  *njs_prototype_init[] = {
     &njs_syntax_error_prototype_init,
     &njs_type_error_prototype_init,
     &njs_uri_error_prototype_init,
+    &njs_internal_error_prototype_init,
     NULL
 };
 
@@ -324,7 +325,7 @@ njs_builtin_objects_create(njs_vm_t *vm)
         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;
@@ -453,7 +454,6 @@ njs_builtin_objects_clone(njs_vm_t *vm, njs_value_t *global)
 {
     size_t        size;
     njs_uint_t    i;
-    njs_value_t   *values;
     njs_object_t  *object_prototype, *function_prototype, *error_prototype,
                   *error_constructor;
 
@@ -461,36 +461,32 @@ njs_builtin_objects_clone(njs_vm_t *vm, njs_value_t *global)
      * 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;
     }
 
@@ -501,7 +497,7 @@ njs_builtin_objects_clone(njs_vm_t *vm, njs_value_t *global)
     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;
 }
@@ -1090,6 +1086,51 @@ njs_top_level_object(njs_vm_t *vm, njs_object_prop_t *self,
 }
 
 
+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. */
@@ -1264,6 +1305,167 @@ static const njs_object_prop_t  njs_global_this_object_properties[] =
         .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,
+    },
 };
 
 
index 1851a27a3d5c25ee03c4f3836d79d0701a1134bd..c02796a70e6bf5b717262c1d8f4be824c46dff37 100644 (file)
@@ -122,7 +122,7 @@ static njs_crypto_enc_t *njs_crypto_encoding(njs_vm_t *vm,
 
 
 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;
 
@@ -135,7 +135,7 @@ njs_crypto_object_value_alloc(njs_vm_t *vm, njs_uint_t proto)
         ov->object.shared = 0;
         ov->object.extensible = 1;
 
-        ov->object.__proto__ = &vm->prototypes[proto].object;
+        ov->object.__proto__ = &vm->prototypes[type].object;
         return ov;
     }
 
@@ -166,7 +166,7 @@ njs_crypto_create_hash(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
         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;
     }
@@ -431,7 +431,7 @@ njs_crypto_create_hmac(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     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;
     }
index 8951590f19e529a42dab50212af5e4aa62856352..0470880b2d46e946b551f466b943f602b59739d1 100644 (file)
@@ -257,7 +257,7 @@ njs_date_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
         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);
 
index 831bdf98cc2ace546e77b2f654fa7d707031c90c..0e17b88c93ab438d6c746223fabbe5a1975b0470 100644 (file)
@@ -13,7 +13,7 @@ static const njs_value_t  njs_error_name_string = njs_string("name");
 
 
 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;
@@ -41,7 +41,7 @@ njs_error_new(njs_vm_t *vm, njs_value_t *dst, njs_prototype_t type,
 
 
 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;
@@ -60,7 +60,7 @@ njs_error_fmt_new(njs_vm_t *vm, njs_value_t *dst, njs_prototype_t type,
 
 
 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;
@@ -136,7 +136,7 @@ memory_error:
 
 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;
@@ -169,7 +169,7 @@ njs_int_t
 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);
 }
 
 
@@ -211,7 +211,7 @@ njs_int_t
 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);
 }
 
 
@@ -253,7 +253,7 @@ njs_int_t
 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);
 }
 
 
@@ -295,7 +295,7 @@ njs_int_t
 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);
 }
 
 
@@ -337,7 +337,7 @@ njs_int_t
 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);
 }
 
 
@@ -379,7 +379,7 @@ njs_int_t
 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);
 }
 
 
@@ -421,7 +421,7 @@ njs_int_t
 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);
 }
 
 
@@ -463,7 +463,7 @@ njs_int_t
 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);
 }
 
 
@@ -512,7 +512,7 @@ njs_memory_error_set(njs_vm_t *vm, njs_value_t *value)
 
     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;
 
@@ -554,7 +554,7 @@ njs_memory_error_prototype_create(njs_vm_t *vm, njs_object_prop_t *prop,
 
     /* 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,
index efc580c00c9cf1e02893f5feb4f7edc54d8d4132..8ef7d5f73f2145fc62f70e4a38b1816b5565f9e0 100644 (file)
@@ -9,38 +9,38 @@
 
 
 #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);
index 0850e8e3037a903dd194837a16a63af1a4c26399..af33d7cbdbcd693170051ab34bc219f13fe62dcb 100644 (file)
@@ -106,7 +106,7 @@ njs_vm_external_add(njs_vm_t *vm, njs_lvlhsh_t *hash, njs_external_t *external,
              */
 
             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;
index f2a053b86cd8850d22afd06ef393cb99a5430f84..07a809dbb413a0958c45d8f0333874467efd02bf 100644 (file)
@@ -1028,7 +1028,7 @@ njs_fs_error(njs_vm_t *vm, const char *syscall, const char *description,
         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;
     }
index 9e2ef4c8f90e4369f743f1933d0f7ceb8eb8f058..ad2b02c001b334c40900d724ec9a7ddcbf49f1a8 100644 (file)
@@ -46,7 +46,7 @@ njs_function_alloc(njs_vm_t *vm, njs_function_lambda_t *lambda,
         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;
@@ -122,7 +122,7 @@ njs_function_copy(njs_vm_t *vm, njs_function_t *function)
     }
 
     *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) {
index 948bf277e0e0265bd30bc2284e7d4dfb96477115..1794101fda68a984eb5ffcc48fed4283516c9f8e 100644 (file)
@@ -247,7 +247,7 @@ static njs_int_t njs_generate_function_debug(njs_vm_t *vm,
 
 
 #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__)
 
 
@@ -417,23 +417,6 @@ njs_generate(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node)
         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;
 
index 1ae6bf52d55cd69e1a51bdd73f787cf34849ce62..7890e03d935162aeea4dfd205c34cae509505ebf 100644 (file)
@@ -171,24 +171,6 @@ typedef enum {
     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,
 
index dbd8902929be664cd67e9191ff404cf037154cc2..f5b329dfac65c200cebf8005efa24eff55265b96 100644 (file)
@@ -47,26 +47,6 @@ static const njs_keyword_t  njs_keywords[] = {
     { 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 },
index ecad60f9faa1c2aeb47d4f8976aff4d8c88360c9..61a2bb6573612312f703edad0f6c76b5f194388c 100644 (file)
@@ -537,7 +537,7 @@ njs_module_require(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
         }
 
         *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;
 
index 6b3de94afef881e30a6955f61db31cf00866dc5b..87b7ab9911f873cb7f41aa3f9c38b5ca0743073e 100644 (file)
@@ -39,7 +39,7 @@ njs_object_alloc(njs_vm_t *vm)
     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;
@@ -68,7 +68,7 @@ njs_object_value_copy(njs_vm_t *vm, njs_value_t *value)
 
     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;
@@ -1605,7 +1605,7 @@ njs_object_prototype_create(njs_vm_t *vm, njs_object_prop_t *prop,
     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);
     }
@@ -1928,7 +1928,7 @@ njs_object_prototype_create_constructor(njs_vm_t *vm, njs_object_prop_t *prop,
     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;
 
@@ -1939,7 +1939,7 @@ njs_object_prototype_create_constructor(njs_vm_t *vm, njs_object_prop_t *prop,
             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;
             }
 
@@ -1959,7 +1959,8 @@ njs_object_prototype_create_constructor(njs_vm_t *vm, njs_object_prop_t *prop,
 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);
index 34508078d46e3bc7ba133a3fd9602f4609eb02d6..011e6df0a7cd54d1d4c55a0862cab1840a9d523c 100644 (file)
         '_'), '_'), '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_ */
index 01a0f6466f127daddb8d534ec7253a71477bedad..992ea7a889af63272af80ec28f877c82ae28b593 100644 (file)
@@ -2300,7 +2300,7 @@ njs_parser_trace_handler(njs_trace_t *trace, njs_trace_data_t *td,
 
 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];
@@ -2333,7 +2333,7 @@ njs_parser_scope_error(njs_vm_t *vm, njs_parser_scope_t *scope,
 
 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;
 
@@ -2350,7 +2350,7 @@ njs_parser_lexer_error(njs_vm_t *vm, njs_parser_t *parser,
 
 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;
 
index 7d0d46e37552dc4ddebdda2a3269d945aedda35f..1404f7e97563865d8c91a6a28be08d27995dfa79 100644 (file)
@@ -109,9 +109,9 @@ njs_token_t njs_parser_unexpected_token(njs_vm_t *vm, njs_parser_t *parser,
 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)                                          \
@@ -155,12 +155,12 @@ void njs_parser_node_error(njs_vm_t *vm, njs_parser_node_t *node,
 
 
 #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__)
 
 
index ab59c4aa0b2b9ddd41ddee0325e7cf258d0d7a48..7997b21004a01369d93d73120534cf1d9cc60983 100644 (file)
@@ -829,13 +829,6 @@ njs_parser_call(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token,
          * 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);
index 71dd55dc87db32f34aee71ec9bbbab77c6b86b18..c8f43f4c662d2b28928749ac168e148273462aac 100644 (file)
@@ -256,74 +256,6 @@ njs_parser_reference(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token,
 
         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");
 
index e11d4705f9da605f63ee30fcb2631a798532d8b8..9df0c57f8ec53ed3e959da3ed043af38dfed8b54 100644 (file)
@@ -708,7 +708,7 @@ njs_regexp_alloc(njs_vm_t *vm, njs_regexp_pattern_t *pattern)
     if (njs_fast_path(regexp != NULL)) {
         njs_lvlhsh_init(&regexp->object.hash);
         njs_lvlhsh_init(&regexp->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;
index 6ff811add90b62d07472426c5f6c128fb3a27972..b69345d482975c1ad9c9d570cdddbfeedf337354 100644 (file)
@@ -596,7 +596,7 @@ njs_vm_value_error_set(njs_vm_t *vm, njs_value_t *value, const char *fmt, ...)
         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);
 }
 
 
@@ -940,7 +940,7 @@ njs_vm_value_to_string(njs_vm_t *vm, njs_str_t *dst, const njs_value_t *src)
 
         /* 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);
index 86f9758bc47ee8db6a937e5c237aec1f2bf999d0..5475b515748ca2e53f459f7c231ace275856b0fc 100644 (file)
@@ -68,8 +68,6 @@ typedef enum {
 #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))
@@ -82,65 +80,37 @@ typedef enum {
 
 
 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,
@@ -154,44 +124,17 @@ enum njs_object_e {
 #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)                                               \
@@ -249,8 +192,8 @@ struct njs_vm_s {
      * 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;
 
@@ -316,8 +259,8 @@ struct njs_vm_shared_s {
      * 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;
 };
index 4692eb1d7122bb0e5631d64c01f4d98f7be7083b..b85f66f6b8f5f08070d471ca8142669f4b27c408 100644 (file)
@@ -140,7 +140,18 @@ main(int argc, char **argv)
         "}"
         "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) {
@@ -150,6 +161,18 @@ main(int argc, char **argv)
             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);
index d2bfc2f281ebe0044f1dbf8749337a0c24c7f7e3..390f4624e064ee1104bc2553f50d8add351deacd 100644 (file)
@@ -7313,6 +7313,9 @@ static njs_unit_test_t  njs_test[] =
     { 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) {"
@@ -8713,6 +8716,7 @@ static njs_unit_test_t  njs_test[] =
     /* NativeErrors. */
 
     { njs_str(
+        "var global = this;"
         "function isValidNativeError(e) {"
         "   var inst;"
         "   var proto = Object.getPrototypeOf(e) === Error;"
@@ -8729,10 +8733,13 @@ static njs_unit_test_t  njs_test[] =
         "   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,"
@@ -9538,6 +9545,9 @@ static njs_unit_test_t  njs_test[] =
     { 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") },
 
@@ -13264,6 +13274,23 @@ static njs_unit_test_t  njs_test[] =
     { 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')"),
index 0559baace666a17ecec0201eae2f398279117c65..991f5ead2cf9213c020be33725c3b15bfd85eb48 100644 (file)
@@ -101,8 +101,8 @@ njs_test {
 
 njs_test {
     {"O\t"
-     "O\a*bject"}
-    {".\t\t"
+     "O\a*bject."}
+    {"\t\t"
      "Object.create*Object.isSealed"}
 }