@@ -21,16 +21,6 @@ typedef struct {
2121} ngx_js_dict_sh_t ;
2222
2323
24- typedef struct {
25- ngx_str_node_t sn ;
26- ngx_rbtree_node_t expire ;
27- union {
28- ngx_str_t value ;
29- double number ;
30- } u ;
31- } ngx_js_dict_node_t ;
32-
33-
3424struct ngx_js_dict_s {
3525 ngx_shm_zone_t * shm_zone ;
3626 ngx_js_dict_sh_t * sh ;
@@ -46,6 +36,19 @@ struct ngx_js_dict_s {
4636};
4737
4838
39+ typedef union {
40+ ngx_str_t str ; /* NGX_JS_DICT_TYPE_STRING */
41+ double number ; /* NGX_JS_DICT_TYPE_NUMBER */
42+ } ngx_js_dict_value_t ;
43+
44+
45+ typedef struct {
46+ ngx_str_node_t sn ;
47+ ngx_rbtree_node_t expire ;
48+ ngx_js_dict_value_t value ;
49+ } ngx_js_dict_node_t ;
50+
51+
4952static njs_int_t njs_js_ext_shared_dict_capacity (njs_vm_t * vm ,
5053 njs_object_prop_t * prop , uint32_t unused , njs_value_t * value ,
5154 njs_value_t * setval , njs_value_t * retval );
@@ -1281,7 +1284,7 @@ ngx_js_dict_node_free(ngx_js_dict_t *dict, ngx_js_dict_node_t *node)
12811284 shpool = dict -> shpool ;
12821285
12831286 if (dict -> type == NGX_JS_DICT_TYPE_STRING ) {
1284- ngx_slab_free_locked (shpool , node -> u . value .data );
1287+ ngx_slab_free_locked (shpool , node -> value . str .data );
12851288 }
12861289
12871290 ngx_slab_free_locked (shpool , node );
@@ -1341,12 +1344,11 @@ ngx_js_dict_set(njs_vm_t *vm, ngx_js_dict_t *dict, ngx_str_t *key,
13411344
13421345
13431346static ngx_int_t
1344- ngx_js_dict_add ( njs_vm_t * vm , ngx_js_dict_t * dict , ngx_str_t * key ,
1345- njs_value_t * value , ngx_msec_t timeout , ngx_msec_t now )
1347+ ngx_js_dict_add_value ( ngx_js_dict_t * dict , ngx_str_t * key ,
1348+ ngx_js_dict_value_t * value , ngx_msec_t timeout , ngx_msec_t now )
13461349{
13471350 size_t n ;
13481351 uint32_t hash ;
1349- njs_str_t string ;
13501352 ngx_js_dict_node_t * node ;
13511353
13521354 if (dict -> timeout ) {
@@ -1364,18 +1366,17 @@ ngx_js_dict_add(njs_vm_t *vm, ngx_js_dict_t *dict, ngx_str_t *key,
13641366 node -> sn .str .data = (u_char * ) node + sizeof (ngx_js_dict_node_t );
13651367
13661368 if (dict -> type == NGX_JS_DICT_TYPE_STRING ) {
1367- njs_value_string_get (vm , value , & string );
1368- node -> u .value .data = ngx_js_dict_alloc (dict , string .length );
1369- if (node -> u .value .data == NULL ) {
1369+ node -> value .str .data = ngx_js_dict_alloc (dict , value -> str .len );
1370+ if (node -> value .str .data == NULL ) {
13701371 ngx_slab_free_locked (dict -> shpool , node );
13711372 return NGX_ERROR ;
13721373 }
13731374
1374- ngx_memcpy (node -> u . value .data , string . start , string . length );
1375- node -> u . value .len = string . length ;
1375+ ngx_memcpy (node -> value .str . data , value -> str . data , value -> str . len );
1376+ node -> value .str . len = value -> str . len ;
13761377
13771378 } else {
1378- node -> u .number = njs_value_number ( value ) ;
1379+ node -> value .number = value -> number ;
13791380 }
13801381
13811382 node -> sn .node .key = hash ;
@@ -1394,6 +1395,29 @@ ngx_js_dict_add(njs_vm_t *vm, ngx_js_dict_t *dict, ngx_str_t *key,
13941395}
13951396
13961397
1398+ static ngx_int_t
1399+ ngx_js_dict_add (njs_vm_t * vm , ngx_js_dict_t * dict , ngx_str_t * key ,
1400+ njs_value_t * value , ngx_msec_t timeout , ngx_msec_t now )
1401+ {
1402+ njs_str_t string ;
1403+ ngx_js_dict_value_t entry ;
1404+
1405+ if (dict -> type == NGX_JS_DICT_TYPE_STRING ) {
1406+ njs_value_string_get (vm , value , & string );
1407+
1408+ entry .str .data = string .start ;
1409+ entry .str .len = string .length ;
1410+
1411+ } else {
1412+ /* GCC complains about uninitialized entry.str.data. */
1413+ entry .str .data = NULL ;
1414+ entry .number = njs_value_number (value );
1415+ }
1416+
1417+ return ngx_js_dict_add_value (dict , key , & entry , timeout , now );
1418+ }
1419+
1420+
13971421static ngx_int_t
13981422ngx_js_dict_update (njs_vm_t * vm , ngx_js_dict_t * dict , ngx_js_dict_node_t * node ,
13991423 njs_value_t * value , ngx_msec_t timeout , ngx_msec_t now )
@@ -1409,14 +1433,14 @@ ngx_js_dict_update(njs_vm_t *vm, ngx_js_dict_t *dict, ngx_js_dict_node_t *node,
14091433 return NGX_ERROR ;
14101434 }
14111435
1412- ngx_slab_free_locked (dict -> shpool , node -> u . value .data );
1436+ ngx_slab_free_locked (dict -> shpool , node -> value . str .data );
14131437 ngx_memcpy (p , string .start , string .length );
14141438
1415- node -> u . value .data = p ;
1416- node -> u . value .len = string .length ;
1439+ node -> value . str .data = p ;
1440+ node -> value . str .len = string .length ;
14171441
14181442 } else {
1419- node -> u .number = njs_value_number (value );
1443+ node -> value .number = njs_value_number (value );
14201444 }
14211445
14221446 if (dict -> timeout ) {
@@ -1502,8 +1526,8 @@ ngx_js_dict_incr(njs_vm_t *vm, ngx_js_dict_t *dict, ngx_str_t *key,
15021526 * value = njs_value_number (init );
15031527
15041528 } else {
1505- node -> u .number += njs_value_number (delta );
1506- * value = node -> u .number ;
1529+ node -> value .number += njs_value_number (delta );
1530+ * value = node -> value .number ;
15071531
15081532 if (dict -> timeout ) {
15091533 ngx_rbtree_delete (& dict -> sh -> rbtree_expire , & node -> expire );
@@ -1568,14 +1592,14 @@ ngx_js_dict_copy_value_locked(njs_vm_t *vm, ngx_js_dict_t *dict,
15681592 type = dict -> type ;
15691593
15701594 if (type == NGX_JS_DICT_TYPE_STRING ) {
1571- ret = njs_vm_value_string_create (vm , retval , node -> u . value .data ,
1572- node -> u . value .len );
1595+ ret = njs_vm_value_string_create (vm , retval , node -> value . str .data ,
1596+ node -> value . str .len );
15731597 if (ret != NJS_OK ) {
15741598 return NGX_ERROR ;
15751599 }
15761600
15771601 } else {
1578- njs_value_number_set (retval , node -> u .number );
1602+ njs_value_number_set (retval , node -> value .number );
15791603 }
15801604
15811605 return NGX_OK ;
@@ -2625,13 +2649,13 @@ ngx_qjs_dict_copy_value_locked(JSContext *cx, ngx_js_dict_t *dict,
26252649 ngx_js_dict_node_t * node )
26262650{
26272651 if (dict -> type == NGX_JS_DICT_TYPE_STRING ) {
2628- return JS_NewStringLen (cx , (const char * ) node -> u . value .data ,
2629- node -> u . value .len );
2652+ return JS_NewStringLen (cx , (const char * ) node -> value . str .data ,
2653+ node -> value . str .len );
26302654 }
26312655
26322656 /* NGX_JS_DICT_TYPE_NUMBER */
26332657
2634- return JS_NewFloat64 (cx , node -> u .number );
2658+ return JS_NewFloat64 (cx , node -> value .number );
26352659}
26362660
26372661
@@ -2653,64 +2677,31 @@ static ngx_int_t
26532677ngx_qjs_dict_add (JSContext * cx , ngx_js_dict_t * dict , ngx_str_t * key ,
26542678 JSValue value , ngx_msec_t timeout , ngx_msec_t now )
26552679{
2656- size_t n ;
2657- uint32_t hash ;
2658- ngx_str_t string ;
2659- ngx_js_dict_node_t * node ;
2660-
2661- if (dict -> timeout ) {
2662- ngx_js_dict_expire (dict , now );
2663- }
2664-
2665- n = sizeof (ngx_js_dict_node_t ) + key -> len ;
2666- hash = ngx_crc32_long (key -> data , key -> len );
2667-
2668- node = ngx_js_dict_alloc (dict , n );
2669- if (node == NULL ) {
2670- return NGX_ERROR ;
2671- }
2672-
2673- node -> sn .str .data = (u_char * ) node + sizeof (ngx_js_dict_node_t );
2680+ ngx_int_t rc ;
2681+ ngx_js_dict_value_t entry ;
26742682
26752683 if (dict -> type == NGX_JS_DICT_TYPE_STRING ) {
2676- string .data = (u_char * ) JS_ToCStringLen (cx , & string .len , value );
2677- if (string .data == NULL ) {
2678- ngx_slab_free_locked (dict -> shpool , node );
2679- return NGX_ERROR ;
2680- }
2681-
2682- node -> u .value .data = ngx_js_dict_alloc (dict , string .len );
2683- if (node -> u .value .data == NULL ) {
2684- ngx_slab_free_locked (dict -> shpool , node );
2685- JS_FreeCString (cx , (char * ) string .data );
2684+ entry .str .data = (u_char * ) JS_ToCStringLen (cx , & entry .str .len , value );
2685+ if (entry .str .data == NULL ) {
26862686 return NGX_ERROR ;
26872687 }
26882688
2689- ngx_memcpy (node -> u .value .data , string .data , string .len );
2690- node -> u .value .len = string .len ;
2691-
2692- JS_FreeCString (cx , (char * ) string .data );
2693-
26942689 } else {
2695- if (JS_ToFloat64 (cx , & node -> u .number , value ) < 0 ) {
2696- ngx_slab_free_locked (dict -> shpool , node );
2690+ /* GCC complains about uninitialized entry.str.data. */
2691+ entry .str .data = NULL ;
2692+
2693+ if (JS_ToFloat64 (cx , & entry .number , value ) < 0 ) {
26972694 return NGX_ERROR ;
26982695 }
26992696 }
27002697
2701- node -> sn . node . key = hash ;
2698+ rc = ngx_js_dict_add_value ( dict , key , & entry , timeout , now ) ;
27022699
2703- ngx_memcpy (node -> sn .str .data , key -> data , key -> len );
2704- node -> sn .str .len = key -> len ;
2705-
2706- ngx_rbtree_insert (& dict -> sh -> rbtree , & node -> sn .node );
2707-
2708- if (dict -> timeout ) {
2709- node -> expire .key = now + timeout ;
2710- ngx_rbtree_insert (& dict -> sh -> rbtree_expire , & node -> expire );
2700+ if (dict -> type == NGX_JS_DICT_TYPE_STRING ) {
2701+ JS_FreeCString (cx , (char * ) entry .str .data );
27112702 }
27122703
2713- return NGX_OK ;
2704+ return rc ;
27142705}
27152706
27162707
@@ -2824,8 +2815,8 @@ ngx_qjs_dict_incr(JSContext *cx, ngx_js_dict_t *dict, ngx_str_t *key,
28242815 }
28252816
28262817 } else {
2827- node -> u .number += delta ;
2828- value = JS_NewFloat64 (cx , node -> u .number );
2818+ node -> value .number += delta ;
2819+ value = JS_NewFloat64 (cx , node -> value .number );
28292820
28302821 if (dict -> timeout ) {
28312822 ngx_rbtree_delete (& dict -> sh -> rbtree_expire , & node -> expire );
@@ -2912,16 +2903,16 @@ ngx_qjs_dict_update(JSContext *cx, ngx_js_dict_t *dict,
29122903 return NGX_ERROR ;
29132904 }
29142905
2915- ngx_slab_free_locked (dict -> shpool , node -> u . value .data );
2906+ ngx_slab_free_locked (dict -> shpool , node -> value . str .data );
29162907 ngx_memcpy (p , string .data , string .len );
29172908
2918- node -> u . value .data = p ;
2919- node -> u . value .len = string .len ;
2909+ node -> value . str .data = p ;
2910+ node -> value . str .len = string .len ;
29202911
29212912 JS_FreeCString (cx , (char * ) string .data );
29222913
29232914 } else {
2924- if (JS_ToFloat64 (cx , & node -> u .number , value ) < 0 ) {
2915+ if (JS_ToFloat64 (cx , & node -> value .number , value ) < 0 ) {
29252916 return NGX_ERROR ;
29262917 }
29272918 }
0 commit comments