]> git.kaiwu.me - njs.git/commitdiff
Added generic handler for external objects.
authorDmitry Volyntsev <xeioex@nginx.com>
Sat, 20 Aug 2022 05:03:06 +0000 (22:03 -0700)
committerDmitry Volyntsev <xeioex@nginx.com>
Sat, 20 Aug 2022 05:03:06 +0000 (22:03 -0700)
src/njs.h
src/njs_extern.c

index dab26023a7ecca301518db04083136170dae7546..1342403804fc20bb7e18d3397e3fd581df079ef6 100644 (file)
--- a/src/njs.h
+++ b/src/njs.h
@@ -139,6 +139,13 @@ typedef enum {
 } njs_extern_flag_t;
 
 
+typedef enum {
+    NJS_EXTERN_TYPE_INT = 0,
+    NJS_EXTERN_TYPE_UINT = 1,
+    NJS_EXTERN_TYPE_VALUE = 2,
+} njs_extern_type_t;
+
+
 struct njs_external_s {
     njs_extern_flag_t               flags;
 
@@ -361,6 +368,9 @@ NJS_EXPORT njs_int_t njs_vm_external_create(njs_vm_t *vm, njs_value_t *value,
     njs_int_t proto_id, njs_external_ptr_t external, njs_bool_t shared);
 NJS_EXPORT njs_external_ptr_t njs_vm_external(njs_vm_t *vm,
     njs_int_t proto_id, const njs_value_t *value);
+NJS_EXPORT njs_int_t njs_external_property(njs_vm_t *vm,
+    njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval,
+    njs_value_t *retval);
 NJS_EXPORT uintptr_t njs_vm_meta(njs_vm_t *vm, njs_uint_t index);
 
 NJS_EXPORT njs_function_t *njs_vm_function_alloc(njs_vm_t *vm,
index e9e8ac2c9c8f35e0b830fab6c188004bc20fe71d..3665b42e7a88d88ad9020ec34136886ed85f0e6e 100644 (file)
@@ -343,3 +343,39 @@ njs_value_external_tag(const njs_value_t *value)
 
     return -1;
 }
+
+
+njs_int_t
+njs_external_property(njs_vm_t *vm, njs_object_prop_t *prop, njs_value_t *value,
+    njs_value_t *setval, njs_value_t *retval)
+{
+    char        *p;
+    njs_int_t   i;
+    njs_uint_t  ui;
+
+    p = njs_vm_external(vm, NJS_PROTO_ID_ANY, value);
+    if (p == NULL) {
+        njs_value_undefined_set(retval);
+        return NJS_DECLINED;
+    }
+
+    switch (njs_vm_prop_magic16(prop)) {
+    case NJS_EXTERN_TYPE_INT:
+        i = *(njs_int_t *) (p + njs_vm_prop_magic32(prop));
+        njs_value_number_set(retval, i);
+        break;
+
+    case NJS_EXTERN_TYPE_UINT:
+        ui = *(njs_uint_t *) (p + njs_vm_prop_magic32(prop));
+        njs_value_number_set(retval, ui);
+        break;
+
+    case NJS_EXTERN_TYPE_VALUE:
+    default:
+        njs_value_assign(retval,
+                         (njs_value_t *) (p + njs_vm_prop_magic32(prop)));
+
+    }
+
+    return NJS_OK;
+}