Skip to content

Commit

Permalink
Added njs_vm_external_constructor().
Browse files Browse the repository at this point in the history
The new API allows to add new constructor/prototype pairs.
  • Loading branch information
xeioex committed Jul 3, 2023
1 parent 7d5e38c commit 40b01ac
Show file tree
Hide file tree
Showing 34 changed files with 561 additions and 187 deletions.
1 change: 1 addition & 0 deletions external/njs_crypto_module.c
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,7 @@ static njs_int_t njs_crypto_hmac_proto_id;

njs_module_t njs_crypto_module = {
.name = njs_str("crypto"),
.preinit = NULL,
.init = njs_crypto_init,
};

Expand Down
1 change: 1 addition & 0 deletions external/njs_fs_module.c
Original file line number Diff line number Diff line change
Expand Up @@ -1407,6 +1407,7 @@ static njs_int_t njs_fs_bytes_written_proto_id;

njs_module_t njs_fs_module = {
.name = njs_str("fs"),
.preinit = NULL,
.init = njs_fs_init,
};

Expand Down
1 change: 1 addition & 0 deletions external/njs_query_string_module.c
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ static njs_external_t njs_ext_query_string[] = {

njs_module_t njs_query_string_module = {
.name = njs_str("querystring"),
.preinit = NULL,
.init = njs_query_string_init,
};

Expand Down
1 change: 1 addition & 0 deletions external/njs_shell.c
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,7 @@ static njs_vm_ops_t njs_console_ops = {

njs_module_t njs_console_module = {
.name = njs_str("console"),
.preinit = NULL,
.init = njs_externals_init,
};

Expand Down
1 change: 1 addition & 0 deletions external/njs_webcrypto_module.c
Original file line number Diff line number Diff line change
Expand Up @@ -659,6 +659,7 @@ static njs_external_t njs_ext_webcrypto[] = {

njs_module_t njs_webcrypto_module = {
.name = njs_str("webcrypto"),
.preinit = NULL,
.init = njs_webcrypto_init,
};

Expand Down
1 change: 1 addition & 0 deletions external/njs_xml_module.c
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,7 @@ static njs_external_t njs_ext_xml_attr[] = {

njs_module_t njs_xml_module = {
.name = njs_str("xml"),
.preinit = NULL,
.init = njs_xml_init,
};

Expand Down
1 change: 1 addition & 0 deletions external/njs_zlib_module.c
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,7 @@ static njs_external_t njs_ext_zlib[] = {

njs_module_t njs_zlib_module = {
.name = njs_str("zlib"),
.preinit = NULL,
.init = njs_zlib_init,
};

Expand Down
1 change: 1 addition & 0 deletions nginx/ngx_http_js_module.c
Original file line number Diff line number Diff line change
Expand Up @@ -786,6 +786,7 @@ static njs_vm_meta_t ngx_http_js_metas = {

njs_module_t ngx_js_http_module = {
.name = njs_str("http"),
.preinit = NULL,
.init = ngx_js_http_init,
};

Expand Down
1 change: 1 addition & 0 deletions nginx/ngx_js.c
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,7 @@ static njs_external_t ngx_js_ext_core[] = {

njs_module_t ngx_js_ngx_module = {
.name = njs_str("ngx"),
.preinit = NULL,
.init = ngx_js_core_init,
};

Expand Down
1 change: 1 addition & 0 deletions nginx/ngx_js_fetch.c
Original file line number Diff line number Diff line change
Expand Up @@ -656,6 +656,7 @@ static njs_int_t ngx_http_js_fetch_headers_proto_id;

njs_module_t ngx_js_fetch_module = {
.name = njs_str("fetch"),
.preinit = NULL,
.init = ngx_js_fetch_init,
};

Expand Down
1 change: 1 addition & 0 deletions nginx/ngx_stream_js_module.c
Original file line number Diff line number Diff line change
Expand Up @@ -568,6 +568,7 @@ static njs_int_t ngx_stream_js_session_flags_proto_id;

njs_module_t ngx_js_stream_module = {
.name = njs_str("stream"),
.preinit = NULL,
.init = ngx_js_stream_init,
};

Expand Down
18 changes: 17 additions & 1 deletion src/njs.h
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,7 @@ typedef njs_int_t (*njs_addon_init_pt)(njs_vm_t *vm);

typedef struct {
njs_str_t name;
njs_addon_init_pt preinit;
njs_addon_init_pt init;
} njs_module_t;

Expand Down Expand Up @@ -403,6 +404,10 @@ NJS_EXPORT njs_int_t njs_vm_add_path(njs_vm_t *vm, const njs_str_t *path);

NJS_EXPORT njs_int_t njs_vm_external_prototype(njs_vm_t *vm,
const njs_external_t *definition, njs_uint_t n);
NJS_EXPORT njs_int_t njs_vm_external_constructor(njs_vm_t *vm,
const njs_str_t *name, njs_function_native_t native,
const njs_external_t *ctor_props, njs_uint_t ctor_nprops,
const njs_external_t *proto_props, njs_uint_t proto_nprops);
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,
Expand All @@ -417,6 +422,15 @@ NJS_EXPORT njs_int_t njs_value_property_set(njs_vm_t *vm, njs_value_t *value,
NJS_EXPORT uintptr_t njs_vm_meta(njs_vm_t *vm, njs_uint_t index);
NJS_EXPORT njs_vm_opt_t *njs_vm_options(njs_vm_t *vm);

NJS_EXPORT njs_int_t njs_error_constructor(njs_vm_t *vm, njs_value_t *args,
njs_uint_t nargs, njs_index_t type, njs_value_t *retval);
NJS_EXPORT njs_int_t 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);
NJS_EXPORT njs_int_t njs_object_prototype_create(njs_vm_t *vm,
njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval,
njs_value_t *retval);

NJS_EXPORT njs_function_t *njs_vm_function_alloc(njs_vm_t *vm,
njs_function_native_t native, njs_bool_t shared, njs_bool_t ctor);

Expand All @@ -433,7 +447,9 @@ NJS_EXPORT njs_function_t *njs_vm_function(njs_vm_t *vm, const njs_str_t *name);
NJS_EXPORT njs_bool_t njs_vm_constructor(njs_vm_t *vm);

NJS_EXPORT void njs_vm_throw(njs_vm_t *vm, const njs_value_t *value);
NJS_EXPORT void njs_vm_error2(njs_vm_t *vm, unsigned type, const char *fmt,
NJS_EXPORT void njs_vm_error2(njs_vm_t *vm, unsigned error_type,
const char *fmt, ...);
NJS_EXPORT void njs_vm_error3(njs_vm_t *vm, unsigned type, const char *fmt,
...);
NJS_EXPORT void njs_vm_exception_get(njs_vm_t *vm, njs_value_t *retval);
NJS_EXPORT njs_mp_t *njs_vm_memory_pool(njs_vm_t *vm);
Expand Down
2 changes: 1 addition & 1 deletion src/njs_array.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ njs_array_alloc(njs_vm_t *vm, njs_bool_t flat, 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_OBJ_TYPE_ARRAY].object;
array->object.__proto__ = njs_vm_proto(vm, NJS_OBJ_TYPE_ARRAY);
array->object.slots = NULL;
array->object.type = NJS_ARRAY;
array->object.shared = 0;
Expand Down
2 changes: 1 addition & 1 deletion src/njs_array_buffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ njs_array_buffer_alloc(njs_vm_t *vm, uint64_t size, njs_bool_t zeroing)
goto memory_error;
}

proto = &vm->prototypes[NJS_OBJ_TYPE_ARRAY_BUFFER].object;
proto = njs_vm_proto(vm, NJS_OBJ_TYPE_ARRAY_BUFFER);

njs_lvlhsh_init(&array->object.hash);
njs_lvlhsh_init(&array->object.shared_hash);
Expand Down
2 changes: 1 addition & 1 deletion src/njs_async.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ njs_async_function_frame_invoke(njs_vm_t *vm, njs_value_t *retval)
njs_value_t ctor;
njs_promise_capability_t *capability;

njs_set_function(&ctor, &vm->constructors[NJS_OBJ_TYPE_PROMISE]);
njs_set_function(&ctor, &njs_vm_ctor(vm, NJS_OBJ_TYPE_PROMISE));

capability = njs_promise_new_capability(vm, &ctor);
if (njs_slow_path(capability == NULL)) {
Expand Down
13 changes: 7 additions & 6 deletions src/njs_buffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ static njs_external_t njs_ext_buffer[] = {

njs_module_t njs_buffer_module = {
.name = njs_str("buffer"),
.preinit = NULL,
.init = njs_buffer_init,
};

Expand All @@ -147,7 +148,7 @@ njs_buffer_set(njs_vm_t *vm, njs_value_t *value, const u_char *start,

buffer = (njs_array_buffer_t *) &array[1];

proto = &vm->prototypes[NJS_OBJ_TYPE_ARRAY_BUFFER].object;
proto = njs_vm_proto(vm, NJS_OBJ_TYPE_ARRAY_BUFFER);

njs_lvlhsh_init(&buffer->object.hash);
njs_lvlhsh_init(&buffer->object.shared_hash);
Expand All @@ -161,7 +162,7 @@ njs_buffer_set(njs_vm_t *vm, njs_value_t *value, const u_char *start,
buffer->u.data = (void *) start;
buffer->size = size;

proto = &vm->prototypes[NJS_OBJ_TYPE_BUFFER].object;
proto = njs_vm_proto(vm, NJS_OBJ_TYPE_BUFFER);

array->type = NJS_OBJ_TYPE_UINT8_ARRAY;
njs_lvlhsh_init(&array->object.hash);
Expand Down Expand Up @@ -197,7 +198,7 @@ njs_buffer_alloc(njs_vm_t *vm, size_t size, njs_bool_t zeroing)
return NULL;
}

array->object.__proto__ = &vm->prototypes[NJS_OBJ_TYPE_BUFFER].object;
array->object.__proto__ = njs_vm_proto(vm, NJS_OBJ_TYPE_BUFFER);

return array;
}
Expand Down Expand Up @@ -462,7 +463,7 @@ njs_buffer_from_array_buffer(njs_vm_t *vm, njs_value_t *value,
return NJS_ERROR;
}

buffer->object.__proto__ = &vm->prototypes[NJS_OBJ_TYPE_BUFFER].object;
buffer->object.__proto__ = njs_vm_proto(vm, NJS_OBJ_TYPE_BUFFER);

buffer->offset = off;
buffer->byte_length = len;
Expand Down Expand Up @@ -943,7 +944,7 @@ njs_buffer_is_buffer(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
array = njs_buffer_slot_internal(vm, njs_arg(args, nargs, 1));

if (njs_fast_path(array != NULL && array->object.__proto__
== &vm->prototypes[NJS_OBJ_TYPE_BUFFER].object))
== njs_vm_proto(vm, NJS_OBJ_TYPE_BUFFER)))
{
is = 1;
}
Expand Down Expand Up @@ -2184,7 +2185,7 @@ njs_buffer_prototype_slice(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
}

array = njs_typed_array(retval);
array->object.__proto__ = &vm->prototypes[NJS_OBJ_TYPE_BUFFER].object;
array->object.__proto__ = njs_vm_proto(vm, NJS_OBJ_TYPE_BUFFER);

return NJS_OK;
}
Expand Down
Loading

0 comments on commit 40b01ac

Please sign in to comment.