]> git.kaiwu.me - njs.git/commitdiff
Refactored $262 object as external.
authorDmitry Volyntsev <xeioex@nginx.com>
Sat, 6 May 2023 03:08:55 +0000 (20:08 -0700)
committerDmitry Volyntsev <xeioex@nginx.com>
Sat, 6 May 2023 03:08:55 +0000 (20:08 -0700)
This allows to decouple $262 object which is only needed
for tests from the njs core.

auto/cc
auto/help
auto/options
src/njs_builtin.c
src/njs_vm.h
src/test/njs_externals_test.c
src/test/njs_externals_test.h
src/test/njs_unit_test.c

diff --git a/auto/cc b/auto/cc
index c8b1b0761a2bfc81b0480aa31723ebada9e26092..8a615ec4a88ef1fbd0f8fdf9bcf592489c073957 100644 (file)
--- a/auto/cc
+++ b/auto/cc
@@ -185,9 +185,5 @@ if [ "$NJS_DEBUG_GENERATOR" = "YES" ]; then
         njs_define=NJS_DEBUG_GENERATOR . auto/define
 fi
 
-if [ "$NJS_TEST262" = "YES" ]; then
-        njs_define=NJS_TEST262 . auto/define
-fi
-
 # Stop on error exit status again.
 set -e
index 9aee09f582291ac860c238206b3b5ac84382f34d..5452b279fefa615207494b9c2a6b5de1d36eb032 100644 (file)
--- a/auto/help
+++ b/auto/help
@@ -55,6 +55,4 @@ default: "$NJS_DEBUG_MEMORY"
 default: "$NJS_DEBUG_OPCODE"
   --debug-generator=YES     enables generator debug, \
 default: "$NJS_DEBUG_GENERATOR"
-  --test262=YES             enables test262 extentions, \
-default: "$NJS_TEST262"
 END
index 7e2d7b2b41aec7442f2b1f589b4f8e152836e904..e5fd9cee181f80d3fa7b3f960262331983a0670d 100644 (file)
@@ -13,7 +13,6 @@ NJS_DEBUG_GENERATOR=NO
 
 NJS_ADDRESS_SANITIZER=NO
 NJS_ADDR2LINE=NO
-NJS_TEST262=YES
 
 NJS_OPENSSL=YES
 NJS_LIBXML2=YES
@@ -47,7 +46,6 @@ do
         --debug-memory=*)                NJS_DEBUG_MEMORY="$value"           ;;
         --debug-opcode=*)                NJS_DEBUG_OPCODE="$value"           ;;
         --debug-generator=*)             NJS_DEBUG_GENERATOR="$value"        ;;
-        --test262=*)                     NJS_TEST262="$value"                ;;
 
         --no-openssl)                    NJS_OPENSSL=NO                      ;;
         --no-libxml2)                    NJS_LIBXML2=NO                      ;;
index fba1fb23348f710e718cc5687ddc0f2567d0fe85..e09c9898b2d83d1a49e02c3b49b98cf5549ded2d 100644 (file)
@@ -35,9 +35,6 @@ static njs_int_t njs_env_hash_init(njs_vm_t *vm, njs_lvlhsh_t *hash,
 static const njs_object_init_t  njs_global_this_init;
 static const njs_object_init_t  njs_njs_object_init;
 static const njs_object_init_t  njs_process_object_init;
-#ifdef NJS_TEST262
-static const njs_object_init_t  njs_262_object_init;
-#endif
 
 
 static const njs_object_init_t  *njs_object_init[] = {
@@ -46,9 +43,6 @@ static const njs_object_init_t  *njs_object_init[] = {
     &njs_process_object_init,
     &njs_math_object_init,
     &njs_json_object_init,
-#ifdef NJS_TEST262
-    &njs_262_object_init,
-#endif
     NULL
 };
 
@@ -1690,49 +1684,3 @@ static const njs_object_init_t  njs_process_object_init = {
     njs_process_object_properties,
     njs_nitems(njs_process_object_properties),
 };
-
-
-#if (NJS_TEST262)
-
-static njs_int_t
-njs_262_detach_array_buffer(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
-    njs_index_t unused, njs_value_t *retval)
-{
-    njs_value_t         *value;
-    njs_array_buffer_t  *buffer;
-
-    value = njs_arg(args, nargs, 1);
-    if (njs_slow_path(!njs_is_array_buffer(value))) {
-        njs_type_error(vm, "\"this\" is not an ArrayBuffer");
-        return NJS_ERROR;
-    }
-
-    buffer = njs_array_buffer(value);
-    buffer->u.data = NULL;
-    buffer->size = 0;
-
-    njs_set_null(retval);
-
-    return NJS_OK;
-}
-
-static const njs_object_prop_t  njs_262_object_properties[] =
-{
-    {
-        .type = NJS_PROPERTY,
-        .name = njs_wellknown_symbol(NJS_SYMBOL_TO_STRING_TAG),
-        .u.value = njs_string("$262"),
-        .configurable = 1,
-    },
-
-    NJS_DECLARE_PROP_LNATIVE("detachArrayBuffer", njs_262_detach_array_buffer,
-                             2, 0),
-};
-
-
-static const njs_object_init_t  njs_262_object_init = {
-    njs_262_object_properties,
-    njs_nitems(njs_262_object_properties),
-};
-
-#endif
index 695dcf7b550e8c215f876fa0d150731d0004a44d..84fb68465cfa42d9afc8cf77c793f025d35ff875 100644 (file)
@@ -95,9 +95,6 @@ enum njs_object_e {
     NJS_OBJECT_PROCESS,
     NJS_OBJECT_MATH,
     NJS_OBJECT_JSON,
-#ifdef NJS_TEST262
-    NJS_OBJECT_262,
-#endif
     NJS_OBJECT_MAX
 };
 
index 80f27a9f091068dad4cb6f5260b216b7fb46ee5b..e31bee931222829f09982e68214aee89941d01ba 100644 (file)
@@ -547,6 +547,53 @@ njs_unit_test_constructor(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
 }
 
 
+static njs_int_t
+njs_262_detach_array_buffer(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
+    njs_index_t unused, njs_value_t *retval)
+{
+    njs_value_t         *value;
+    njs_array_buffer_t  *buffer;
+
+    value = njs_arg(args, nargs, 1);
+    if (njs_slow_path(!njs_is_array_buffer(value))) {
+        njs_type_error(vm, "\"this\" is not an ArrayBuffer");
+        return NJS_ERROR;
+    }
+
+    buffer = njs_array_buffer(value);
+    buffer->u.data = NULL;
+    buffer->size = 0;
+
+    njs_set_null(retval);
+
+    return NJS_OK;
+}
+
+
+static njs_external_t  njs_unit_test_262_external[] = {
+
+    {
+        .flags = NJS_EXTERN_PROPERTY | NJS_EXTERN_SYMBOL,
+        .name.symbol = NJS_SYMBOL_TO_STRING_TAG,
+        .u.property = {
+            .value = "$262",
+        }
+    },
+
+    {
+        .flags = NJS_EXTERN_METHOD,
+        .name.string = njs_str("detachArrayBuffer"),
+        .writable = 1,
+        .configurable = 1,
+        .enumerable = 1,
+        .u.method = {
+            .native = njs_262_detach_array_buffer,
+        }
+    },
+
+};
+
+
 static njs_external_t  njs_unit_test_r_c[] = {
 
     {
@@ -930,6 +977,37 @@ njs_externals_init_internal(njs_vm_t *vm, njs_unit_test_req_init_t *init,
 }
 
 
+njs_int_t
+njs_externals_262_init(njs_vm_t *vm)
+{
+    njs_int_t           ret, proto_id;
+    njs_opaque_value_t  value;
+
+    static const njs_str_t  dollar_262 = njs_str("$262");
+
+    proto_id = njs_vm_external_prototype(vm, njs_unit_test_262_external,
+                                       njs_nitems(njs_unit_test_262_external));
+    if (njs_slow_path(proto_id < 0)) {
+        njs_printf("njs_vm_external_prototype() failed\n");
+        return NJS_ERROR;
+    }
+
+    ret = njs_vm_external_create(vm, njs_value_arg(&value), proto_id, NULL, 1);
+    if (njs_slow_path(ret != NJS_OK)) {
+        njs_printf("njs_vm_external_create() failed\n");
+        return NJS_ERROR;
+    }
+
+    ret = njs_vm_bind(vm, &dollar_262, njs_value_arg(&value), 1);
+    if (njs_slow_path(ret != NJS_OK)) {
+        njs_printf("njs_vm_bind() failed\n");
+        return NJS_ERROR;
+    }
+
+    return NJS_OK;
+}
+
+
 njs_int_t
 njs_externals_shared_init(njs_vm_t *vm)
 {
index 305ea706d3d74063d880094f526b2ec85b19e005..6c7f35a247b12e4bce498a7c236e641bc628b6ea 100644 (file)
@@ -25,6 +25,7 @@ typedef struct {
 
 
 njs_int_t njs_externals_shared_init(njs_vm_t *vm);
+njs_int_t njs_externals_262_init(njs_vm_t *vm);
 njs_int_t njs_externals_init(njs_vm_t *vm);
 njs_int_t njs_external_env_init(njs_external_env_t *env);
 njs_int_t njs_external_call(njs_vm_t *vm, const njs_str_t *fname,
index 522af156d2a32c87f2e4cc97204f14e8f734b77d..a83cf7cf989287911194964821bb4ef47181eef1 100644 (file)
@@ -6559,12 +6559,10 @@ static njs_unit_test_t  njs_test[] =
               "           return a.map(q=>q/2).join('|') === '3|2|1'})"),
       njs_str("true") },
 
-#ifdef NJS_TEST262
     { njs_str("const arr = new Uint8Array([1,2,3]);"
               "const sep = {toString(){$262.detachArrayBuffer(arr.buffer); return ','}};"
               "arr.join(sep)"),
       njs_str("TypeError: detached buffer") },
-#endif
 
     { njs_str("Uint8Array.prototype.reduce.call(1)"),
       njs_str("TypeError: this is not a typed array") },
@@ -22519,12 +22517,6 @@ static njs_unit_test_t  njs_externals_test[] =
     { njs_str("$r2.uri == 'αβγ' && $r2.uri === 'αβγ'"),
       njs_str("true") },
 
-#if (NJS_TEST262)
-#define N262 "$262,"
-#else
-#define N262 ""
-#endif
-
 #if (NJS_HAVE_OPENSSL)
 #define NCRYPTO "crypto,"
 #else
@@ -22532,7 +22524,7 @@ static njs_unit_test_t  njs_externals_test[] =
 #endif
 
     { njs_str("Object.keys(this).sort()"),
-      njs_str(N262 "$r,$r2,$r3,$shared,ExternalConstructor," NCRYPTO "global,njs,process") },
+      njs_str("$262,$r,$r2,$r3,$shared,ExternalConstructor," NCRYPTO "global,njs,process") },
 
     { njs_str("Object.getOwnPropertySymbols($r2)[0] == Symbol.toStringTag"),
       njs_str("true") },
@@ -23195,14 +23187,12 @@ static njs_unit_test_t  njs_backtraces_test[] =
               "    at Math.max (native)\n"
               "    at main (:1)\n") },
 
-#ifdef NJS_TEST262
     { njs_str("var ab = new ArrayBuffer(1);"
               "$262.detachArrayBuffer(ab);"
               "ab.byteLength"),
       njs_str("TypeError: detached buffer\n"
               "    at ArrayBuffer.prototype.byteLength (native)\n"
               "    at main (:1)\n") },
-#endif
 
     { njs_str("Object.prototype()"),
       njs_str("TypeError: (intermediate value)[\"prototype\"] is not a function\n"
@@ -23674,6 +23664,11 @@ njs_unit_test(njs_unit_test_t tests[], size_t num, njs_str_t *name,
             goto done;
         }
 
+        ret = njs_externals_262_init(vm);
+        if (ret != NJS_OK) {
+            goto done;
+        }
+
         if (opts->externals) {
             ret = njs_externals_shared_init(vm);
             if (ret != NJS_OK) {
@@ -23808,6 +23803,11 @@ njs_interactive_test(njs_unit_test_t tests[], size_t num, njs_str_t *name,
             goto done;
         }
 
+        ret = njs_externals_262_init(vm);
+        if (ret != NJS_OK) {
+            goto done;
+        }
+
         if (opts->externals) {
             ret = njs_externals_shared_init(vm);
             if (ret != NJS_OK) {