Skip to content

Commit

Permalink
test fix on 32bit.
Browse files Browse the repository at this point in the history
  • Loading branch information
xeioex committed Sep 17, 2024
1 parent 1e04d34 commit 45bc78a
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 46 deletions.
32 changes: 15 additions & 17 deletions nginx/ngx_http_js_module.c
Original file line number Diff line number Diff line change
Expand Up @@ -5619,7 +5619,7 @@ ngx_http_qjs_ext_set_return_value(JSContext *cx, JSValueConst this_val,
static ngx_int_t
ngx_http_qjs_subrequest_done(ngx_http_request_t *r, void *data, ngx_int_t rc)
{
ngx_js_event_t *event = data;
ngx_qjs_event_t *event = data;

JSValue reply;
JSContext *cx;
Expand Down Expand Up @@ -5676,8 +5676,7 @@ ngx_http_qjs_subrequest_done(ngx_http_request_t *r, void *data, ngx_int_t rc)
reply = JS_DupValue(cx, ngx_qjs_arg(sctx->args[0]));
}

rc = ngx_qjs_call((ngx_js_ctx_t *) ctx, event->function,
&ngx_qjs_arg(reply), 1);
rc = ngx_qjs_call((ngx_js_ctx_t *) ctx, event->function, &reply, 1);

JS_FreeValue(cx, reply);
ngx_js_del_event(ctx, event);
Expand All @@ -5689,15 +5688,15 @@ ngx_http_qjs_subrequest_done(ngx_http_request_t *r, void *data, ngx_int_t rc)


static void
ngx_http_js_subrequest_event_destructor(ngx_js_event_t *event)
ngx_http_js_subrequest_event_destructor(ngx_qjs_event_t *event)
{
JSContext *cx;

cx = event->ctx;

JS_FreeValue(cx, ngx_qjs_arg(event->function));
JS_FreeValue(cx, ngx_qjs_arg(event->args[0]));
JS_FreeValue(cx, ngx_qjs_arg(event->args[1]));
JS_FreeValue(cx, event->function);
JS_FreeValue(cx, event->args[0]);
JS_FreeValue(cx, event->args[1]);
}


Expand All @@ -5710,7 +5709,7 @@ ngx_http_qjs_ext_subrequest(JSContext *cx, JSValueConst this_val,
ngx_str_t uri, args, method_name, body_arg;
ngx_uint_t method, methods_max, has_body, detached, flags,
promise;
ngx_js_event_t *event;
ngx_qjs_event_t *event;
ngx_http_js_ctx_t *ctx;
ngx_http_request_t *r, *sr;
ngx_http_request_body_t *rb;
Expand Down Expand Up @@ -5870,32 +5869,31 @@ ngx_http_qjs_ext_subrequest(JSContext *cx, JSValueConst this_val,

promise = !!JS_IsUndefined(callback);

event = ngx_pcalloc(r->pool, sizeof(ngx_js_event_t)
+ sizeof(njs_opaque_value_t) * 2);
event = ngx_pcalloc(r->pool, sizeof(ngx_qjs_event_t)
+ sizeof(JSValue) * 2);
if (event == NULL) {
return JS_ThrowOutOfMemory(cx);
}

event->ctx = cx;
event->fd = ctx->event_id++;
event->args = (njs_opaque_value_t *) &event[1];
event->args = (JSValue *) &event[1];
event->destructor = ngx_http_js_subrequest_event_destructor;

if (promise) {
retval = JS_NewPromiseCapability(cx, &ngx_qjs_arg(event->args[0]));
retval = JS_NewPromiseCapability(cx, &event->args[0]);
if (JS_IsException(retval)) {
return JS_EXCEPTION;
}

callback = ngx_qjs_arg(event->args[0]);
callback = event->args[0];

} else {
ngx_qjs_arg(event->args[0]) = JS_UNDEFINED;
ngx_qjs_arg(event->args[1]) = JS_UNDEFINED;
event->args[0] = JS_UNDEFINED;
event->args[1] = JS_UNDEFINED;
}

JS_DupValue(cx, callback);
memcpy(&event->function, &callback, sizeof(njs_opaque_value_t));
event->function = JS_DupValue(cx, callback);

ps->handler = ngx_http_qjs_subrequest_done;
ps->data = event;
Expand Down
51 changes: 24 additions & 27 deletions nginx/ngx_js.c
Original file line number Diff line number Diff line change
Expand Up @@ -1148,7 +1148,7 @@ ngx_engine_qjs_destroy(ngx_engine_t *e, ngx_js_ctx_t *ctx,
JSRuntime *rt;
JSContext *cx;
JSClassID class_id;
ngx_js_event_t *event;
ngx_qjs_event_t *event;
ngx_js_opaque_t *opaque;
njs_rbtree_node_t *node;
ngx_pool_cleanup_t *cln;
Expand All @@ -1161,8 +1161,8 @@ ngx_engine_qjs_destroy(ngx_engine_t *e, ngx_js_ctx_t *ctx,
node = njs_rbtree_min(&ctx->waiting_events);

while (njs_rbtree_is_there_successor(&ctx->waiting_events, node)) {
event = (ngx_js_event_t *) ((u_char *) node
- offsetof(ngx_js_event_t, node));
event = (ngx_qjs_event_t *) ((u_char *) node
- offsetof(ngx_qjs_event_t, node));

if (event->destructor != NULL) {
event->destructor(event);
Expand Down Expand Up @@ -1375,7 +1375,7 @@ ngx_qjs_dump_obj(ngx_engine_t *e, JSValueConst val, ngx_str_t *dst)


ngx_int_t
ngx_qjs_call(ngx_js_ctx_t *ctx, njs_opaque_value_t fn, JSValue *argv, int argc)
ngx_qjs_call(ngx_js_ctx_t *ctx, JSValue fn, JSValue *argv, int argc)
{
int rc;
JSValue ret;
Expand All @@ -1385,7 +1385,7 @@ ngx_qjs_call(ngx_js_ctx_t *ctx, njs_opaque_value_t fn, JSValue *argv, int argc)

cx = ctx->engine->u.qjs.ctx;

ret = JS_Call(cx, ngx_qjs_arg(fn), JS_UNDEFINED, argc, argv);
ret = JS_Call(cx, fn, JS_UNDEFINED, argc, argv);
if (JS_IsException(ret)) {
ngx_qjs_exception(ctx->engine, &exception);

Expand Down Expand Up @@ -1519,20 +1519,20 @@ ngx_qjs_string(ngx_engine_t *e, JSValueConst val, ngx_str_t *dst)
static void
ngx_qjs_timer_handler(ngx_event_t *ev)
{
void *external;
JSContext *cx;
ngx_int_t rc;
ngx_js_ctx_t *ctx;
ngx_js_event_t *event;
void *external;
JSContext *cx;
ngx_int_t rc;
ngx_js_ctx_t *ctx;
ngx_qjs_event_t *event;

event = (ngx_js_event_t *) ((u_char *) ev - offsetof(ngx_js_event_t, ev));
event = (ngx_qjs_event_t *) ((u_char *) ev - offsetof(ngx_qjs_event_t, ev));

cx = event->ctx;
external = JS_GetContextOpaque(cx);
ctx = ngx_qjs_external_ctx(cx, external);

rc = ngx_qjs_call((ngx_js_ctx_t *) ctx, event->function,
(JSValue *) event->args, event->nargs);
rc = ngx_qjs_call((ngx_js_ctx_t *) ctx, event->function, event->args,
event->nargs);

ngx_js_del_event(ctx, event);

Expand All @@ -1541,7 +1541,7 @@ ngx_qjs_timer_handler(ngx_event_t *ev)


static void
ngx_qjs_clear_timer(ngx_js_event_t *event)
ngx_qjs_clear_timer(ngx_qjs_event_t *event)
{
int i;
JSContext *cx;
Expand All @@ -1552,10 +1552,10 @@ ngx_qjs_clear_timer(ngx_js_event_t *event)
ngx_del_timer(&event->ev);
}

JS_FreeValue(cx, ngx_qjs_arg(event->function));
JS_FreeValue(cx, event->function);

for (i = 0; i < (int) event->nargs; i++) {
JS_FreeValue(cx, ngx_qjs_arg(event->args[i]));
JS_FreeValue(cx, event->args[i]);
}
}

Expand All @@ -1568,7 +1568,7 @@ ngx_qjs_ext_set_timeout(JSContext *cx, JSValueConst this_val, int argc,
void *external;
uint32_t delay;
ngx_js_ctx_t *ctx;
ngx_js_event_t *event;
ngx_qjs_event_t *event;
ngx_connection_t *c;

if (!JS_IsFunction(cx, argv[0])) {
Expand All @@ -1589,19 +1589,15 @@ ngx_qjs_ext_set_timeout(JSContext *cx, JSValueConst this_val, int argc,
ctx = ngx_qjs_external_ctx(cx, external);

event = ngx_pcalloc(ngx_qjs_external_pool(cx, external),
sizeof(ngx_js_event_t)
+ sizeof(njs_opaque_value_t) * argc);
sizeof(ngx_qjs_event_t) + sizeof(JSValue) * argc);
if (event == NULL) {
return JS_ThrowOutOfMemory(cx);
}

event->ctx = cx;

JS_DupValue(cx, argv[0]);
memcpy(&event->function, &argv[0], sizeof(njs_opaque_value_t));

event->function = JS_DupValue(cx, argv[0]);
event->nargs = argc;
event->args = (njs_opaque_value_t *) &event[1];
event->args = (JSValue *) &event[1];
event->destructor = ngx_qjs_clear_timer;
event->fd = ctx->event_id++;

Expand All @@ -1613,7 +1609,7 @@ ngx_qjs_ext_set_timeout(JSContext *cx, JSValueConst this_val, int argc,

if (event->nargs != 0) {
for (i = 0; i < argc; i++) {
ngx_qjs_arg(event->args[i]) = JS_DupValue(cx, argv[n + i]);
event->args[i] = JS_DupValue(cx, argv[n + i]);
}
}

Expand All @@ -1631,7 +1627,7 @@ ngx_qjs_ext_clear_timeout(JSContext *cx, JSValueConst this_val,
{
uint32_t id;
ngx_js_ctx_t *ctx;
ngx_js_event_t event_lookup, *event;
ngx_qjs_event_t event_lookup, *event;
njs_rbtree_node_t *rb;

if (JS_ToUint32(cx, &id, argv[0]) < 0) {
Expand All @@ -1646,7 +1642,8 @@ ngx_qjs_ext_clear_timeout(JSContext *cx, JSValueConst this_val,
return JS_ThrowReferenceError(cx, "failed to find timer");
}

event = (ngx_js_event_t *) ((u_char *) rb - offsetof(ngx_js_event_t, node));
event = (ngx_qjs_event_t *) ((u_char *) rb
- offsetof(ngx_qjs_event_t, node));

ngx_js_del_event(ctx, event);

Expand Down
16 changes: 15 additions & 1 deletion nginx/ngx_js.h
Original file line number Diff line number Diff line change
Expand Up @@ -314,17 +314,31 @@ ngx_engine_t *ngx_njs_clone(ngx_js_ctx_t *ctx, ngx_js_loc_conf_t *cf,

#if (NJS_HAVE_QUICKJS)

typedef struct ngx_qjs_event_s ngx_qjs_event_t;

typedef union {
njs_opaque_value_t opaque;
JSValue value;
} ngx_qjs_value_t;

struct ngx_qjs_event_s {
void *ctx;
JSValue function;
JSValue *args;
ngx_socket_t fd;
NJS_RBTREE_NODE (node);
njs_uint_t nargs;
void (*destructor)(ngx_qjs_event_t *event);
ngx_event_t ev;
void *data;
};

#define ngx_qjs_arg(val) (((ngx_qjs_value_t *) &(val))->value)
ngx_engine_t *ngx_qjs_clone(ngx_js_ctx_t *ctx, ngx_js_loc_conf_t *cf,
void *external);
void ngx_engine_qjs_destroy(ngx_engine_t *e, ngx_js_ctx_t *ctx,
ngx_js_loc_conf_t *conf);
ngx_int_t ngx_qjs_call(ngx_js_ctx_t *ctx, njs_opaque_value_t function,
ngx_int_t ngx_qjs_call(ngx_js_ctx_t *ctx, JSValue function,
JSValue *argv, int argc);
ngx_int_t ngx_qjs_exception(ngx_engine_t *e, ngx_str_t *s);
ngx_int_t ngx_qjs_integer(JSContext *cx, JSValueConst val, ngx_int_t *n);
Expand Down
3 changes: 2 additions & 1 deletion nginx/ngx_stream_js_module.c
Original file line number Diff line number Diff line change
Expand Up @@ -2635,7 +2635,8 @@ ngx_stream_qjs_run_event(ngx_stream_session_t *s, ngx_stream_js_ctx_t *ctx,

JS_SetOpaque(argv[1], (void *) flags);

rc = ngx_qjs_call((ngx_js_ctx_t *) ctx, event->function, &argv[0], 2);
rc = ngx_qjs_call((ngx_js_ctx_t *) ctx, ngx_qjs_arg(event->function),
&argv[0], 2);
JS_FreeValue(cx, argv[0]);
JS_FreeValue(cx, argv[1]);

Expand Down

0 comments on commit 45bc78a

Please sign in to comment.