From: Dmitry Volyntsev Date: Fri, 4 May 2018 16:53:19 +0000 (+0300) Subject: Usage of njs_opaque_value_t is refactored in public API. X-Git-Url: http://git.kaiwu.me/postgresql/log/contrib/postgres_fdw/static/gitweb.js?a=commitdiff_plain;h=aae9ef21f288d4c3aa3305b4c5b4ebfabb44ec0b;p=njs.git Usage of njs_opaque_value_t is refactored in public API. --- diff --git a/nginx/ngx_http_js_module.c b/nginx/ngx_http_js_module.c index 5a5cb68f..68517e95 100644 --- a/nginx/ngx_http_js_module.c +++ b/nginx/ngx_http_js_module.c @@ -134,7 +134,7 @@ static void ngx_http_js_clear_timer(njs_external_ptr_t external, njs_host_event_t event); static void ngx_http_js_timer_handler(ngx_event_t *ev); static void ngx_http_js_handle_event(ngx_http_request_t *r, - njs_vm_event_t vm_event, njs_opaque_value_t *args, nxt_uint_t nargs); + njs_vm_event_t vm_event, njs_value_t *args, nxt_uint_t nargs); static char *ngx_http_js_include(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); @@ -666,7 +666,7 @@ ngx_http_js_content_event_handler(ngx_http_request_t *r) return; } - if (njs_vm_call(ctx->vm, func, ctx->args, 2) != NJS_OK) { + if (njs_vm_call(ctx->vm, func, njs_value_arg(ctx->args), 2) != NJS_OK) { njs_vm_retval_to_ext_string(ctx->vm, &exception); ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, @@ -776,7 +776,7 @@ ngx_http_js_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v, pending = njs_vm_pending(ctx->vm); - if (njs_vm_call(ctx->vm, func, ctx->args, 2) != NJS_OK) { + if (njs_vm_call(ctx->vm, func, njs_value_arg(ctx->args), 2) != NJS_OK) { njs_vm_retval_to_ext_string(ctx->vm, &exception); ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, @@ -859,12 +859,14 @@ ngx_http_js_init_vm(ngx_http_request_t *r) return NGX_ERROR; } - rc = njs_vm_external_create(ctx->vm, &ctx->args[0], jlcf->req_proto, r); + rc = njs_vm_external_create(ctx->vm, njs_value_arg(&ctx->args[0]), + jlcf->req_proto, r); if (rc != NXT_OK) { return NGX_ERROR; } - rc = njs_vm_external_create(ctx->vm, &ctx->args[1], jlcf->res_proto, r); + rc = njs_vm_external_create(ctx->vm, njs_value_arg(&ctx->args[1]), + jlcf->res_proto, r); if (rc != NXT_OK) { return NGX_ERROR; } @@ -1670,7 +1672,7 @@ ngx_http_js_ext_get_response(njs_vm_t *vm, njs_value_t *value, void *obj, ctx = ngx_http_get_module_ctx(r, ngx_http_js_module); - njs_vm_retval_set(ctx->vm, &ctx->args[1]); + njs_vm_retval_set(ctx->vm, njs_value_arg(&ctx->args[1])); return NJS_OK; } @@ -1988,7 +1990,8 @@ ngx_http_js_subrequest_done(ngx_http_request_t *r, void *data, ngx_int_t rc) return NGX_ERROR; } - ret = njs_vm_external_create(ctx->vm, &reply, jlcf->rep_proto, r); + ret = njs_vm_external_create(ctx->vm, njs_value_arg(&reply), + jlcf->rep_proto, r); if (ret != NXT_OK) { ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "js subrequest reply creation failed"); @@ -1996,7 +1999,7 @@ ngx_http_js_subrequest_done(ngx_http_request_t *r, void *data, ngx_int_t rc) return NGX_ERROR; } - ngx_http_js_handle_event(r->parent, vm_event, &reply, 1); + ngx_http_js_handle_event(r->parent, vm_event, njs_value_arg(&reply), 1); return NGX_OK; } @@ -2019,7 +2022,7 @@ ngx_http_js_ext_get_parent(njs_vm_t *vm, njs_value_t *value, void *obj, return NJS_ERROR; } - njs_vm_retval_set(ctx->vm, &ctx->args[0]); + njs_vm_retval_set(ctx->vm, njs_value_arg(&ctx->args[0])); return NJS_OK; } @@ -2119,7 +2122,7 @@ ngx_http_js_timer_handler(ngx_event_t *ev) static void ngx_http_js_handle_event(ngx_http_request_t *r, njs_vm_event_t vm_event, - njs_opaque_value_t *args, nxt_uint_t nargs) + njs_value_t *args, nxt_uint_t nargs) { njs_ret_t rc; nxt_str_t exception; diff --git a/nginx/ngx_stream_js_module.c b/nginx/ngx_stream_js_module.c index 80051fb4..fb216ed7 100644 --- a/nginx/ngx_stream_js_module.c +++ b/nginx/ngx_stream_js_module.c @@ -400,7 +400,7 @@ ngx_stream_js_phase_handler(ngx_stream_session_t *s, ngx_str_t *name) return NGX_ERROR; } - if (njs_vm_call(ctx->vm, func, &ctx->arg, 1) != NJS_OK) { + if (njs_vm_call(ctx->vm, func, njs_value_arg(&ctx->arg), 1) != NJS_OK) { njs_vm_retval_to_ext_string(ctx->vm, &exception); ngx_log_error(NGX_LOG_ERR, c->log, 0, "js exception: %*s", @@ -487,7 +487,7 @@ ngx_stream_js_body_filter(ngx_stream_session_t *s, ngx_chain_t *in, while (in) { ctx->buf = in->buf; - if (njs_vm_call(ctx->vm, func, &ctx->arg, 1) != NJS_OK) { + if (njs_vm_call(ctx->vm, func, njs_value_arg(&ctx->arg), 1) != NJS_OK) { njs_vm_retval_to_ext_string(ctx->vm, &exception); ngx_log_error(NGX_LOG_ERR, c->log, 0, "js exception: %*s", @@ -588,7 +588,7 @@ ngx_stream_js_variable(ngx_stream_session_t *s, ngx_stream_variable_value_t *v, pending = njs_vm_pending(ctx->vm); - if (njs_vm_call(ctx->vm, func, &ctx->arg, 1) != NJS_OK) { + if (njs_vm_call(ctx->vm, func, njs_value_arg(&ctx->arg), 1) != NJS_OK) { njs_vm_retval_to_ext_string(ctx->vm, &exception); ngx_log_error(NGX_LOG_ERR, s->connection->log, 0, @@ -671,7 +671,8 @@ ngx_stream_js_init_vm(ngx_stream_session_t *s) return NGX_ERROR; } - rc = njs_vm_external_create(ctx->vm, &ctx->arg, jscf->proto, s); + rc = njs_vm_external_create(ctx->vm, njs_value_arg(&ctx->arg), jscf->proto, + s); if (rc != NXT_OK) { return NGX_ERROR; } diff --git a/njs/njs.c b/njs/njs.c index fc5de1b9..dc5907eb 100644 --- a/njs/njs.c +++ b/njs/njs.c @@ -444,7 +444,7 @@ njs_vm_init(njs_vm_t *vm) nxt_int_t -njs_vm_call(njs_vm_t *vm, njs_function_t *function, njs_opaque_value_t *args, +njs_vm_call(njs_vm_t *vm, njs_function_t *function, njs_value_t *args, nxt_uint_t nargs) { u_char *current; @@ -460,8 +460,7 @@ njs_vm_call(njs_vm_t *vm, njs_function_t *function, njs_opaque_value_t *args, this = (njs_value_t *) &njs_value_void; - ret = njs_function_frame(vm, function, this, - (njs_value_t *) args, nargs, 0); + ret = njs_function_frame(vm, function, this, args, nargs, 0); if (nxt_slow_path(ret != NXT_OK)) { return ret; } @@ -532,7 +531,7 @@ njs_vm_pending(njs_vm_t *vm) nxt_int_t njs_vm_post_event(njs_vm_t *vm, njs_vm_event_t vm_event, - njs_opaque_value_t *args, nxt_uint_t nargs) + njs_value_t *args, nxt_uint_t nargs) { njs_event_t *event; @@ -541,12 +540,12 @@ njs_vm_post_event(njs_vm_t *vm, njs_vm_event_t vm_event, if (nargs != 0 && !event->posted) { event->nargs = nargs; event->args = nxt_mem_cache_alloc(vm->mem_cache_pool, - sizeof(njs_opaque_value_t) * nargs); + sizeof(njs_value_t) * nargs); if (nxt_slow_path(event->args == NULL)) { return NJS_ERROR; } - memcpy(event->args, args, sizeof(njs_opaque_value_t) * nargs); + memcpy(event->args, args, sizeof(njs_value_t) * nargs); } if (!event->posted) { @@ -655,7 +654,7 @@ njs_vm_retval(njs_vm_t *vm) nxt_noinline void -njs_vm_retval_set(njs_vm_t *vm, njs_opaque_value_t *value) +njs_vm_retval_set(njs_vm_t *vm, njs_value_t *value) { vm->retval = *(njs_value_t *) value; } diff --git a/njs/njs.h b/njs/njs.h index 1ab5735d..129c9668 100644 --- a/njs/njs.h +++ b/njs/njs.h @@ -30,6 +30,11 @@ typedef struct njs_extern_s njs_extern_t; typedef struct njs_function_s njs_function_t; typedef struct njs_vm_shared_s njs_vm_shared_t; +/* + * njs_opaque_value_t is the external storage type for native njs_value_t type. + * sizeof(njs_opaque_value_t) == sizeof(njs_value_t). + */ + typedef struct { uint64_t filler[2]; } njs_opaque_value_t; @@ -42,6 +47,9 @@ typedef struct { #define njs_value_assign(dst, src) \ *((njs_opaque_value_t *) dst) = *((njs_opaque_value_t *) src); +#define njs_value_arg(val) ((njs_value_t *) val) + + #define njs_vm_error(vm, fmt, ...) \ njs_value_error_set(vm, njs_vm_retval(vm), fmt, ##__VA_ARGS__) @@ -147,7 +155,7 @@ NXT_EXPORT void njs_vm_destroy(njs_vm_t *vm); NXT_EXPORT nxt_int_t njs_vm_compile(njs_vm_t *vm, u_char **start, u_char *end); NXT_EXPORT njs_vm_t *njs_vm_clone(njs_vm_t *vm, njs_external_ptr_t external); NXT_EXPORT nxt_int_t njs_vm_call(njs_vm_t *vm, njs_function_t *function, - njs_opaque_value_t *args, nxt_uint_t nargs); + njs_value_t *args, nxt_uint_t nargs); NXT_EXPORT njs_vm_event_t njs_vm_add_event(njs_vm_t *vm, njs_function_t *function, njs_host_event_t host_ev, @@ -155,23 +163,23 @@ NXT_EXPORT njs_vm_event_t njs_vm_add_event(njs_vm_t *vm, NXT_EXPORT void njs_vm_del_event(njs_vm_t *vm, njs_vm_event_t vm_event); NXT_EXPORT nxt_int_t njs_vm_pending(njs_vm_t *vm); NXT_EXPORT nxt_int_t njs_vm_post_event(njs_vm_t *vm, njs_vm_event_t vm_event, - njs_opaque_value_t *args, nxt_uint_t nargs); + njs_value_t *args, nxt_uint_t nargs); NXT_EXPORT nxt_int_t njs_vm_run(njs_vm_t *vm); NXT_EXPORT const njs_extern_t *njs_vm_external_prototype(njs_vm_t *vm, njs_external_t *external); NXT_EXPORT nxt_int_t njs_vm_external_create(njs_vm_t *vm, - njs_opaque_value_t *value, const njs_extern_t *proto, void *object); + njs_value_t *value, const njs_extern_t *proto, void *object); NXT_EXPORT nxt_int_t njs_vm_external_bind(njs_vm_t *vm, - const nxt_str_t *var_name, njs_opaque_value_t *value); + const nxt_str_t *var_name, njs_value_t *value); NXT_EXPORT void njs_disassembler(njs_vm_t *vm); NXT_EXPORT nxt_array_t *njs_vm_completions(njs_vm_t *vm, nxt_str_t *expression); NXT_EXPORT njs_function_t *njs_vm_function(njs_vm_t *vm, nxt_str_t *name); NXT_EXPORT njs_value_t *njs_vm_retval(njs_vm_t *vm); -NXT_EXPORT void njs_vm_retval_set(njs_vm_t *vm, njs_opaque_value_t *value); +NXT_EXPORT void njs_vm_retval_set(njs_vm_t *vm, njs_value_t *value); NXT_EXPORT u_char * njs_string_alloc(njs_vm_t *vm, njs_value_t *value, uint32_t size, uint32_t length); @@ -184,7 +192,7 @@ NXT_EXPORT nxt_int_t njs_value_string_copy(njs_vm_t *vm, nxt_str_t *retval, NXT_EXPORT njs_ret_t njs_vm_value_to_ext_string(njs_vm_t *vm, nxt_str_t *dst, const njs_value_t *src, nxt_uint_t handle_exception); NXT_EXPORT njs_ret_t njs_vm_retval_to_ext_string(njs_vm_t *vm, - nxt_str_t *retval); + nxt_str_t *retval); NXT_EXPORT void njs_vm_memory_error(njs_vm_t *vm); diff --git a/njs/njs_event.h b/njs/njs_event.h index ebfd8357..8db5175d 100644 --- a/njs/njs_event.h +++ b/njs/njs_event.h @@ -17,7 +17,7 @@ typedef struct { njs_function_t *function; - njs_opaque_value_t *args; + njs_value_t *args; nxt_uint_t nargs; njs_host_event_t host_event; njs_event_destructor destructor; diff --git a/njs/njs_extern.c b/njs/njs_extern.c index 8144bcf6..2a915ba9 100644 --- a/njs/njs_extern.c +++ b/njs/njs_extern.c @@ -150,11 +150,10 @@ njs_vm_external_prototype(njs_vm_t *vm, njs_external_t *external) nxt_int_t -njs_vm_external_create(njs_vm_t *vm, njs_opaque_value_t *value, +njs_vm_external_create(njs_vm_t *vm, njs_value_t *ext_val, const njs_extern_t *proto, void *object) { - void *obj; - njs_value_t *ext_val; + void *obj; if (nxt_slow_path(proto == NULL)) { return NXT_ERROR; @@ -168,8 +167,6 @@ njs_vm_external_create(njs_vm_t *vm, njs_opaque_value_t *value, memcpy(obj, &object, sizeof(void *)); - ext_val = (njs_value_t *) value; - ext_val->type = NJS_EXTERNAL; ext_val->data.truth = 1; ext_val->external.proto = proto; @@ -181,15 +178,12 @@ njs_vm_external_create(njs_vm_t *vm, njs_opaque_value_t *value, nxt_int_t njs_vm_external_bind(njs_vm_t *vm, const nxt_str_t *var_name, - njs_opaque_value_t *val) + njs_value_t *value) { nxt_int_t ret; - njs_value_t *value; njs_extern_value_t *ev; nxt_lvlhsh_query_t lhq; - value = (njs_value_t *) val; - if (nxt_slow_path(!njs_is_external(value))) { return NXT_ERROR; } diff --git a/njs/njs_shell.c b/njs/njs_shell.c index c83b1098..2b64c6b1 100644 --- a/njs/njs_shell.c +++ b/njs/njs_shell.c @@ -193,8 +193,8 @@ static nxt_int_t njs_externals_init(njs_vm_t *vm) { nxt_uint_t ret; + njs_value_t *value; const njs_extern_t *proto; - njs_opaque_value_t *value; static const nxt_str_t name = nxt_string_value("console"); diff --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c index 1bf0411e..2f241bd5 100644 --- a/njs/test/njs_unit_test.c +++ b/njs/test/njs_unit_test.c @@ -9533,7 +9533,7 @@ njs_unit_test_create_external(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, { nxt_int_t ret; nxt_str_t uri; - njs_opaque_value_t *value; + njs_value_t *value; njs_unit_test_req_t *r, *sr; if (nargs > 1) { @@ -9737,15 +9737,15 @@ njs_externals_init(njs_vm_t *vm) requests[i].mem_cache_pool = vm->mem_cache_pool; requests[i].proto = proto; - ret = njs_vm_external_create(vm, &requests[i].value, proto, - &requests[i]); + ret = njs_vm_external_create(vm, njs_value_arg(&requests[i].value), + proto, &requests[i]); if (ret != NXT_OK) { printf("njs_vm_external_create() failed\n"); return NXT_ERROR; } ret = njs_vm_external_bind(vm, &nxt_test_requests[i].name, - &requests[i].value); + njs_value_arg(&requests[i].value)); if (ret != NXT_OK) { printf("njs_vm_external_bind() failed\n"); return NXT_ERROR;