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);
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,
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,
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;
}
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;
}
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");
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;
}
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;
}
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;
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",
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",
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,
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;
}
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;
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;
}
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;
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) {
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;
}
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;
#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__)
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,
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);
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);
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;
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;
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;
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;
}
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");
{
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) {
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;