Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions external/njs_shell.c
Original file line number Diff line number Diff line change
Expand Up @@ -2702,6 +2702,8 @@ njs_engine_qjs_destroy(njs_engine_t *engine)
njs_queue_link_t *link;
njs_rejected_promise_t *rejected_promise;

qjs_call_exit_hook(engine->u.qjs.ctx);

console = JS_GetRuntimeOpaque(engine->u.qjs.rt);

if (console->rejected_promises != NULL) {
Expand Down
50 changes: 16 additions & 34 deletions nginx/ngx_http_js_module.c
Original file line number Diff line number Diff line change
Expand Up @@ -1609,7 +1609,7 @@ static ngx_int_t
ngx_http_js_init_vm(ngx_http_request_t *r, njs_int_t proto_id)
{
ngx_http_js_ctx_t *ctx;
ngx_pool_cleanup_t *cln;
ngx_http_cleanup_t *cln;
ngx_http_js_loc_conf_t *jlcf;

jlcf = ngx_http_get_module_loc_conf(r, ngx_http_js_module);
Expand Down Expand Up @@ -1644,7 +1644,7 @@ ngx_http_js_init_vm(ngx_http_request_t *r, njs_int_t proto_id)
"http js vm clone %s: %p from: %p", jlcf->engine->name,
ctx->engine, jlcf->engine);

cln = ngx_pool_cleanup_add(r->pool, 0);
cln = ngx_http_cleanup_add(r, 0);
if (cln == NULL) {
return NGX_ERROR;
}
Expand Down Expand Up @@ -5173,7 +5173,7 @@ ngx_http_qjs_ext_internal_redirect(JSContext *cx, JSValueConst this_val,
"internalRedirect cannot be called while filtering");
}

if (ngx_qjs_string(cx, argv[0], &ctx->redirect_uri) != NGX_OK) {
if (ngx_qjs_string(cx, r->pool, argv[0], &ctx->redirect_uri) != NGX_OK) {
return JS_EXCEPTION;
}

Expand Down Expand Up @@ -5452,7 +5452,7 @@ ngx_http_qjs_ext_return(JSContext *cx, JSValueConst this_val,
ctx = ngx_http_get_module_ctx(r, ngx_http_js_module);

if (status < NGX_HTTP_BAD_REQUEST || !JS_IsNullOrUndefined(argv[1])) {
if (ngx_qjs_string(cx, argv[1], &body) != NGX_OK) {
if (ngx_qjs_string(cx, r->pool, argv[1], &body) != NGX_OK) {
return JS_ThrowOutOfMemory(cx);
}

Expand Down Expand Up @@ -5557,7 +5557,7 @@ ngx_http_qjs_ext_send(JSContext *cx, JSValueConst this_val,
ll = &out;

for (n = 0; n < (ngx_uint_t) argc; n++) {
if (ngx_qjs_string(cx, argv[n], &s) != NGX_OK) {
if (ngx_qjs_string(cx, r->pool, argv[n], &s) != NGX_OK) {
return JS_ThrowTypeError(cx, "failed to convert arg");
}

Expand Down Expand Up @@ -5905,7 +5905,7 @@ ngx_http_qjs_ext_subrequest(JSContext *cx, JSValueConst this_val,
"the primary request");
}

if (ngx_qjs_string(cx, argv[0], &uri) != NGX_OK) {
if (ngx_qjs_string(cx, r->pool, argv[0], &uri) != NGX_OK) {
return JS_ThrowTypeError(cx, "failed to convert uri arg");
}

Expand All @@ -5931,7 +5931,7 @@ ngx_http_qjs_ext_subrequest(JSContext *cx, JSValueConst this_val,
arg = argv[1];

if (JS_IsString(arg)) {
if (ngx_qjs_string(cx, arg, &args) != NGX_OK) {
if (ngx_qjs_string(cx, r->pool, arg, &args) != NGX_OK) {
return JS_ThrowTypeError(cx, "failed to convert args");
}

Expand All @@ -5952,7 +5952,7 @@ ngx_http_qjs_ext_subrequest(JSContext *cx, JSValueConst this_val,
}

if (!JS_IsUndefined(value)) {
rc = ngx_qjs_string(cx, value, &args);
rc = ngx_qjs_string(cx, r->pool, value, &args);
JS_FreeValue(cx, value);

if (rc != NGX_OK) {
Expand All @@ -5976,7 +5976,7 @@ ngx_http_qjs_ext_subrequest(JSContext *cx, JSValueConst this_val,
}

if (!JS_IsUndefined(value)) {
rc = ngx_qjs_string(cx, value, &method_name);
rc = ngx_qjs_string(cx, r->pool, value, &method_name);
JS_FreeValue(cx, value);

if (rc != NGX_OK) {
Expand All @@ -6003,7 +6003,7 @@ ngx_http_qjs_ext_subrequest(JSContext *cx, JSValueConst this_val,
}

if (!JS_IsUndefined(value)) {
rc = ngx_qjs_string(cx, value, &body_arg);
rc = ngx_qjs_string(cx, r->pool, value, &body_arg);
JS_FreeValue(cx, value);

if (rc != NGX_OK) {
Expand Down Expand Up @@ -6397,7 +6397,7 @@ ngx_http_qjs_variables_set_property(JSContext *cx, JSValueConst obj,
return -1;
}

if (ngx_qjs_string(cx, value, &s) != NGX_OK) {
if (ngx_qjs_string(cx, r->pool, value, &s) != NGX_OK) {
return -1;
}

Expand Down Expand Up @@ -6876,7 +6876,7 @@ ngx_http_qjs_headers_out_handler(JSContext *cx, ngx_http_request_t *r,
}
}

rc = ngx_qjs_string(cx, v, &s);
rc = ngx_qjs_string(cx, r->pool, v, &s);

if (qjs_is_array(cx, *value)) {
JS_FreeValue(cx, v);
Expand Down Expand Up @@ -6908,16 +6908,7 @@ ngx_http_qjs_headers_out_handler(JSContext *cx, ngx_http_request_t *r,
h->key.data = p;
h->key.len = name->len;

p = ngx_pnalloc(r->pool, s.len);
if (p == NULL) {
h->hash = 0;
(void) JS_ThrowOutOfMemory(cx);
return -1;
}

ngx_memcpy(p, s.data, s.len);

h->value.data = p;
h->value.data = s.data;
h->value.len = s.len;
h->hash = 1;

Expand Down Expand Up @@ -6977,7 +6968,7 @@ ngx_http_qjs_headers_out_special_handler(JSContext *cx, ngx_http_request_t *r,
setval = JS_UNDEFINED;
}

rc = ngx_qjs_string(cx, setval, &s);
rc = ngx_qjs_string(cx, r->pool, setval, &s);

if (value != NULL && qjs_is_array(cx, *value)) {
JS_FreeValue(cx, setval);
Expand Down Expand Up @@ -7046,16 +7037,7 @@ ngx_http_qjs_headers_out_special_handler(JSContext *cx, ngx_http_request_t *r,
}

if (h != NULL) {
p = ngx_pnalloc(r->pool, s.len);
if (p == NULL) {
h->hash = 0;
(void) JS_ThrowOutOfMemory(cx);
return -1;
}

ngx_memcpy(p, s.data, s.len);

h->value.data = p;
h->value.data = s.data;
h->value.len = s.len;
h->hash = 1;
}
Expand Down Expand Up @@ -7212,7 +7194,7 @@ ngx_http_qjs_headers_out_content_type(JSContext *cx, ngx_http_request_t *r,
setval = *value;
}

rc = ngx_qjs_string(cx, setval, &s);
rc = ngx_qjs_string(cx, r->pool, setval, &s);

if (qjs_is_array(cx, *value)) {
JS_FreeValue(cx, setval);
Expand Down
15 changes: 12 additions & 3 deletions nginx/ngx_js.c
Original file line number Diff line number Diff line change
Expand Up @@ -1130,6 +1130,7 @@ ngx_engine_qjs_destroy(ngx_engine_t *e, ngx_js_ctx_t *ctx,
uint32_t i, length;
ngx_str_t exception;
JSRuntime *rt;
JSValue ret;
JSContext *cx;
JSClassID class_id;
JSMemoryUsage stats;
Expand All @@ -1142,6 +1143,13 @@ ngx_engine_qjs_destroy(ngx_engine_t *e, ngx_js_ctx_t *ctx,
cx = e->u.qjs.ctx;

if (ctx != NULL) {
ret = qjs_call_exit_hook(cx);
if (JS_IsException(ret)) {
ngx_qjs_exception(e, &exception);
ngx_log_error(NGX_LOG_ERR, ctx->log, 0,
"js exit hook exception: %V", &exception);
}

node = njs_rbtree_min(&ctx->waiting_events);

while (njs_rbtree_is_there_successor(&ctx->waiting_events, node)) {
Expand Down Expand Up @@ -1462,7 +1470,8 @@ ngx_qjs_integer(JSContext *cx, JSValueConst val, ngx_int_t *n)


ngx_int_t
ngx_qjs_string(JSContext *cx, JSValueConst val, ngx_str_t *dst)
ngx_qjs_string(JSContext *cx, ngx_pool_t *pool, JSValueConst val,
ngx_str_t *dst)
{
size_t len, byte_offset, byte_length;
u_char *start;
Expand Down Expand Up @@ -1496,7 +1505,7 @@ ngx_qjs_string(JSContext *cx, JSValueConst val, ngx_str_t *dst)
start += byte_offset;
dst->len = byte_length;

dst->data = njs_mp_alloc(e->pool, dst->len);
dst->data = ngx_pnalloc(pool, dst->len);
if (dst->data == NULL) {
return NGX_ERROR;
}
Expand All @@ -1513,7 +1522,7 @@ ngx_qjs_string(JSContext *cx, JSValueConst val, ngx_str_t *dst)
return NGX_ERROR;
}

start = njs_mp_alloc(e->pool, len);
start = ngx_pnalloc(pool, len);
if (start == NULL) {
JS_FreeCString(cx, str);
return NGX_ERROR;
Expand Down
40 changes: 22 additions & 18 deletions nginx/ngx_js.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@

#define ngx_js_buffer_type(btype) ((btype) & ~NGX_JS_DEPRECATED)

#if (NJS_HAVE_QUICKJS)
/*
* This static table solves the problem of a native QuickJS approach
* which uses a static variables of type JSClassID and JS_NewClassID() to
Expand All @@ -47,23 +48,25 @@
* are loaded dynamically.
*/

#define NGX_QJS_CLASS_ID_OFFSET (QJS_CORE_CLASS_ID_LAST)
#define NGX_QJS_CLASS_ID_CONSOLE (NGX_QJS_CLASS_ID_OFFSET + 1)
#define NGX_QJS_CLASS_ID_HTTP_REQUEST (NGX_QJS_CLASS_ID_OFFSET + 2)
#define NGX_QJS_CLASS_ID_HTTP_PERIODIC (NGX_QJS_CLASS_ID_OFFSET + 3)
#define NGX_QJS_CLASS_ID_HTTP_VARS (NGX_QJS_CLASS_ID_OFFSET + 4)
#define NGX_QJS_CLASS_ID_HTTP_HEADERS_IN (NGX_QJS_CLASS_ID_OFFSET + 5)
#define NGX_QJS_CLASS_ID_HTTP_HEADERS_OUT (NGX_QJS_CLASS_ID_OFFSET + 6)
#define NGX_QJS_CLASS_ID_STREAM_SESSION (NGX_QJS_CLASS_ID_OFFSET + 7)
#define NGX_QJS_CLASS_ID_STREAM_PERIODIC (NGX_QJS_CLASS_ID_OFFSET + 8)
#define NGX_QJS_CLASS_ID_STREAM_FLAGS (NGX_QJS_CLASS_ID_OFFSET + 9)
#define NGX_QJS_CLASS_ID_STREAM_VARS (NGX_QJS_CLASS_ID_OFFSET + 10)
#define NGX_QJS_CLASS_ID_SHARED (NGX_QJS_CLASS_ID_OFFSET + 11)
#define NGX_QJS_CLASS_ID_SHARED_DICT (NGX_QJS_CLASS_ID_OFFSET + 12)
#define NGX_QJS_CLASS_ID_SHARED_DICT_ERROR (NGX_QJS_CLASS_ID_OFFSET + 13)
#define NGX_QJS_CLASS_ID_FETCH_HEADERS (NGX_QJS_CLASS_ID_OFFSET + 14)
#define NGX_QJS_CLASS_ID_FETCH_REQUEST (NGX_QJS_CLASS_ID_OFFSET + 15)
#define NGX_QJS_CLASS_ID_FETCH_RESPONSE (NGX_QJS_CLASS_ID_OFFSET + 16)
enum {
NGX_QJS_CLASS_ID_CONSOLE = QJS_CORE_CLASS_ID_LAST,
NGX_QJS_CLASS_ID_HTTP_REQUEST,
NGX_QJS_CLASS_ID_HTTP_PERIODIC,
NGX_QJS_CLASS_ID_HTTP_VARS,
NGX_QJS_CLASS_ID_HTTP_HEADERS_IN,
NGX_QJS_CLASS_ID_HTTP_HEADERS_OUT,
NGX_QJS_CLASS_ID_STREAM_SESSION,
NGX_QJS_CLASS_ID_STREAM_PERIODIC,
NGX_QJS_CLASS_ID_STREAM_FLAGS,
NGX_QJS_CLASS_ID_STREAM_VARS,
NGX_QJS_CLASS_ID_SHARED,
NGX_QJS_CLASS_ID_SHARED_DICT,
NGX_QJS_CLASS_ID_SHARED_DICT_ERROR,
NGX_QJS_CLASS_ID_FETCH_HEADERS,
NGX_QJS_CLASS_ID_FETCH_REQUEST,
NGX_QJS_CLASS_ID_FETCH_RESPONSE,
};
#endif


typedef struct ngx_js_loc_conf_s ngx_js_loc_conf_t;
Expand Down Expand Up @@ -351,7 +354,8 @@ ngx_int_t ngx_qjs_call(JSContext *cx, 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);
ngx_int_t ngx_qjs_string(JSContext *cx, JSValueConst val, ngx_str_t *str);
ngx_int_t ngx_qjs_string(JSContext *cx, ngx_pool_t *pool, JSValueConst val,
ngx_str_t *dst);

JSValue ngx_qjs_ext_fetch(JSContext *cx, JSValueConst this_val, int argc,
JSValueConst *argv);
Expand Down
Loading