]> git.kaiwu.me - njs.git/commitdiff
Allowing to create external objects with NULL external pointer.
authorDmitry Volyntsev <xeioex@nginx.com>
Fri, 13 Aug 2021 12:20:46 +0000 (12:20 +0000)
committerDmitry Volyntsev <xeioex@nginx.com>
Fri, 13 Aug 2021 12:20:46 +0000 (12:20 +0000)
src/njs_extern.c
src/test/njs_unit_test.c

index dec5ae4ef7e188ed8a70157b01c2c3adf79e59f3..8536996e305be0eb28a778f5afd6158fdd7e3c2d 100644 (file)
@@ -179,12 +179,6 @@ njs_external_prop_handler(njs_vm_t *vm, njs_object_prop_t *self,
         *retval = *setval;
 
     } else {
-        external = njs_vm_external(vm, NJS_PROTO_ID_ANY, value);
-        if (njs_slow_path(external == NULL)) {
-            njs_value_undefined_set(retval);
-            return NJS_OK;
-        }
-
         ov = njs_mp_alloc(vm->mem_pool, sizeof(njs_object_value_t));
         if (njs_slow_path(ov == NULL)) {
             njs_memory_error(vm);
@@ -203,6 +197,8 @@ njs_external_prop_handler(njs_vm_t *vm, njs_object_prop_t *self,
         ov->object.__proto__ = &vm->prototypes[NJS_OBJ_TYPE_OBJECT].object;
         ov->object.slots = slots;
 
+        external = njs_vm_external(vm, NJS_PROTO_ID_ANY, value);
+
         njs_set_data(&ov->value, external, njs_value_external_tag(value));
         njs_set_object_value(retval, ov);
     }
index 66c80022dbecdb28faa030e3ea97aaf2af0f8724..811c4488d163e30c66bc3f7d533ea141ef3fd38f 100644 (file)
@@ -20862,7 +20862,8 @@ static njs_unit_test_t  njs_shared_test[] =
       njs_str("false") },
 
     { njs_str("isFin()"),
-      njs_str("ReferenceError: \"isFin\" is not defined") },
+      njs_str("ReferenceError: \"isFin\" is not defined\n"
+              "    at main (:1)\n") },
 
     { njs_str("isNaN(function(){})"),
       njs_str("true") },
@@ -20918,6 +20919,11 @@ static njs_unit_test_t  njs_shared_test[] =
 
     { njs_str("$r.bind('XXX', 37); XXX"),
       njs_str("37") },
+
+    { njs_str("var fs = require('fs'); fs.readFileSync()"),
+      njs_str("TypeError: \"path\" must be a string or Buffer\n"
+              "    at fs.readFileSync (native)\n"
+              "    at main (:1)\n") },
 };
 
 
@@ -21403,6 +21409,7 @@ typedef struct {
     njs_bool_t  module;
     njs_uint_t  repeat;
     njs_bool_t  unsafe;
+    njs_bool_t  backtrace;
 } njs_opts_t;
 
 
@@ -21456,6 +21463,7 @@ njs_unit_test(njs_unit_test_t tests[], size_t num, njs_str_t *name,
 
         options.module = opts->module;
         options.unsafe = opts->unsafe;
+        options.backtrace = opts->backtrace;
 
         vm = njs_vm_create(&options);
         if (vm == NULL) {
@@ -22829,7 +22837,7 @@ static njs_test_suite_t  njs_suites[] =
       njs_unit_test },
 
     { njs_str("shared"),
-      { .externals = 1, .repeat = 128, .unsafe = 1 },
+      { .externals = 1, .repeat = 128, .unsafe = 1, .backtrace = 1 },
       njs_shared_test,
       njs_nitems(njs_shared_test),
       njs_unit_test },