details: https://hg.nginx.org/njs/rev/446a1cb64a6a branches: changeset: 1927:446a1cb64a6a user: Dmitry Volyntsev <xei...@nginx.com> date: Wed Aug 10 20:04:40 2022 -0700 description: Stream: improved flags argument for s.on() callback methods.
diffstat: nginx/ngx_js.c | 25 +++++++++++++++++ nginx/ngx_js.h | 4 ++ nginx/ngx_stream_js_module.c | 64 +++++++++++++++++++++++++++++++------------ src/njs.h | 1 + src/njs_extern.c | 2 +- 5 files changed, 77 insertions(+), 19 deletions(-) diffs (182 lines): diff -r 358e048185d8 -r 446a1cb64a6a nginx/ngx_js.c --- a/nginx/ngx_js.c Wed Aug 10 20:03:54 2022 -0700 +++ b/nginx/ngx_js.c Wed Aug 10 20:04:40 2022 -0700 @@ -263,6 +263,31 @@ ngx_js_ext_constant(njs_vm_t *vm, njs_ob njs_int_t +ngx_js_ext_flags(njs_vm_t *vm, njs_object_prop_t *prop, + njs_value_t *value, njs_value_t *setval, njs_value_t *retval) +{ + uintptr_t data; + + data = (uintptr_t) njs_vm_external(vm, NJS_PROTO_ID_ANY, value); + if (data == 0) { + njs_value_undefined_set(retval); + return NJS_DECLINED; + } + + data = data & (uintptr_t) njs_vm_prop_magic32(prop); + + switch (njs_vm_prop_magic16(prop)) { + case NGX_JS_BOOLEAN: + default: + njs_value_boolean_set(retval, data); + break; + } + + return NJS_OK; +} + + +njs_int_t ngx_js_ext_boolean(njs_vm_t *vm, njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval, njs_value_t *retval) { diff -r 358e048185d8 -r 446a1cb64a6a nginx/ngx_js.h --- a/nginx/ngx_js.h Wed Aug 10 20:03:54 2022 -0700 +++ b/nginx/ngx_js.h Wed Aug 10 20:04:40 2022 -0700 @@ -19,6 +19,8 @@ #define NGX_JS_DEPRECATED 1 #define NGX_JS_STRING 2 #define NGX_JS_BUFFER 4 +#define NGX_JS_BOOLEAN 8 +#define NGX_JS_NUMBER 16 #define ngx_js_buffer_type(btype) ((btype) & ~NGX_JS_DEPRECATED) @@ -80,6 +82,8 @@ njs_int_t ngx_js_ext_uint(njs_vm_t *vm, njs_value_t *value, njs_value_t *setval, njs_value_t *retval); njs_int_t ngx_js_ext_constant(njs_vm_t *vm, njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval, njs_value_t *retval); +njs_int_t ngx_js_ext_flags(njs_vm_t *vm, njs_object_prop_t *prop, + njs_value_t *value, njs_value_t *setval, njs_value_t *retval); njs_int_t ngx_js_ext_boolean(njs_vm_t *vm, njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval, njs_value_t *retval); diff -r 358e048185d8 -r 446a1cb64a6a nginx/ngx_stream_js_module.c --- a/nginx/ngx_stream_js_module.c Wed Aug 10 20:03:54 2022 -0700 +++ b/nginx/ngx_stream_js_module.c Wed Aug 10 20:04:40 2022 -0700 @@ -493,6 +493,30 @@ static njs_external_t ngx_stream_js_ext }; +static njs_external_t ngx_stream_js_ext_session_flags[] = { + + { + .flags = NJS_EXTERN_PROPERTY | NJS_EXTERN_SYMBOL, + .name.symbol = NJS_SYMBOL_TO_STRING_TAG, + .u.property = { + .value = "Stream Flags", + } + }, + + { + .flags = NJS_EXTERN_PROPERTY, + .name.string = njs_str("last"), + .enumerable = 1, + .u.property = { + .handler = ngx_js_ext_flags, + .magic16 = NGX_JS_BOOLEAN, + .magic32 = 0x00000001, + } + }, + +}; + + static njs_vm_ops_t ngx_stream_js_ops = { ngx_stream_js_set_timer, ngx_stream_js_clear_timer, @@ -525,6 +549,7 @@ static ngx_stream_filter_pt ngx_stream_ static njs_int_t ngx_stream_js_session_proto_id; +static njs_int_t ngx_stream_js_session_flags_proto_id; static ngx_int_t @@ -923,14 +948,12 @@ static njs_int_t ngx_stream_js_run_event(ngx_stream_session_t *s, ngx_stream_js_ctx_t *ctx, ngx_stream_js_ev_t *event) { - size_t len; - u_char *p; - njs_int_t ret; - ngx_buf_t *b; - ngx_connection_t *c; - njs_opaque_value_t last_key, last; - - static const njs_str_t last_str = njs_str("last"); + size_t len; + u_char *p; + njs_int_t ret; + ngx_buf_t *b; + uintptr_t flags; + ngx_connection_t *c; if (event->ev == NULL) { return NJS_OK; @@ -957,16 +980,12 @@ ngx_stream_js_run_event(ngx_stream_sessi return ret; } - njs_vm_value_string_set(ctx->vm, njs_value_arg(&last_key), last_str.start, - last_str.length); - - njs_value_boolean_set(njs_value_arg(&last), b && b->last_buf); - - ret = njs_vm_object_alloc(ctx->vm, njs_value_arg(&ctx->args[2]), - njs_value_arg(&last_key), - njs_value_arg(&last), NULL); + flags = b && b->last_buf; + + ret = njs_vm_external_create(ctx->vm, njs_value_arg(&ctx->args[2]), + ngx_stream_js_session_flags_proto_id, (void *) flags, 0); if (ret != NJS_OK) { - return ret; + return NGX_ERROR; } njs_vm_post_event(ctx->vm, event->ev, njs_value_arg(&ctx->args[1]), 2); @@ -1787,7 +1806,16 @@ ngx_stream_js_init_conf_vm(ngx_conf_t *c njs_nitems(ngx_stream_js_ext_session)); if (ngx_stream_js_session_proto_id < 0) { ngx_log_error(NGX_LOG_EMERG, cf->log, 0, - "failed to add js request proto"); + "failed to add js session proto"); + return NGX_ERROR; + } + + ngx_stream_js_session_flags_proto_id = njs_vm_external_prototype(conf->vm, + ngx_stream_js_ext_session_flags, + njs_nitems(ngx_stream_js_ext_session_flags)); + if (ngx_stream_js_session_flags_proto_id < 0) { + ngx_log_error(NGX_LOG_EMERG, cf->log, 0, + "failed to add js session flags proto"); return NGX_ERROR; } diff -r 358e048185d8 -r 446a1cb64a6a src/njs.h --- a/src/njs.h Wed Aug 10 20:03:54 2022 -0700 +++ b/src/njs.h Wed Aug 10 20:04:40 2022 -0700 @@ -155,6 +155,7 @@ struct njs_external_s { struct { const char value[15]; /* NJS_STRING_SHORT + 1. */ njs_prop_handler_t handler; + uint16_t magic16; uint32_t magic32; } property; diff -r 358e048185d8 -r 446a1cb64a6a src/njs_extern.c --- a/src/njs_extern.c Wed Aug 10 20:03:54 2022 -0700 +++ b/src/njs_extern.c Wed Aug 10 20:04:40 2022 -0700 @@ -92,7 +92,7 @@ njs_external_add(njs_vm_t *vm, njs_arr_t prop->type = NJS_PROPERTY_HANDLER; prop->value.type = NJS_INVALID; prop->value.data.truth = 1; - prop->value.data.magic16 = 0; + prop->value.data.magic16 = external->u.property.magic16; prop->value.data.magic32 = external->u.property.magic32; prop->value.data.u.prop_handler = external->u.property.handler; _______________________________________________ nginx-devel mailing list -- nginx-devel@nginx.org To unsubscribe send an email to nginx-devel-le...@nginx.org