Skip to content

Commit b28e50b

Browse files
Refactored working with built-in strings, symbols and small integers.
- Implemented atom IDs for strings, symbols and small numbers, enabling equality checks via ID comparison - Optimized string operations for faster property lookups and comparisons - Removed short string inlining from njs_value_t structure Performance improvements (arewefastyet/benchmarks/v8-v7 benchmark): - Richards: +57% (631 → 989) - Crypto: +7% (1445 → 1551) - RayTrace: +37% (562 → 772) - NavierStokes: +20% (2062 → 2465) - Overall score: +29% (1014 → 1307) In collaboration with Dmitry Volyntsev.
1 parent 6a08264 commit b28e50b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

70 files changed

+4704
-5258
lines changed

auto/sources

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ NJS_LIB_SRCS=" \
1919
src/njs_utils.c \
2020
src/njs_chb.c \
2121
src/njs_value.c \
22+
src/njs_atom.c \
2223
src/njs_vm.c \
2324
src/njs_vmcode.c \
2425
src/njs_lexer.c \
25-
src/njs_lexer_keyword.c \
2626
src/njs_parser.c \
2727
src/njs_variable.c \
2828
src/njs_scope.c \

external/njs_crypto_module.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ njs_hash_prototype_update(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
362362
return NJS_ERROR;
363363
}
364364

365-
njs_value_string_get(njs_value_arg(&result), &data);
365+
njs_value_string_get(vm, njs_value_arg(&result), &data);
366366

367367
} else if (njs_value_is_buffer(value)) {
368368
ret = njs_value_buffer_get(vm, value, &data);
@@ -526,7 +526,7 @@ njs_crypto_create_hmac(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
526526
return NJS_ERROR;
527527
}
528528

529-
njs_value_string_get(njs_value_arg(&result), &key);
529+
njs_value_string_get(vm, njs_value_arg(&result), &key);
530530

531531
} else if (njs_value_is_buffer(value)) {
532532
ret = njs_value_buffer_get(vm, value, &key);
@@ -589,7 +589,7 @@ njs_crypto_algorithm(njs_vm_t *vm, njs_value_t *value)
589589
return NULL;
590590
}
591591

592-
njs_value_string_get(value, &name);
592+
njs_value_string_get(vm, value, &name);
593593

594594
for (e = &njs_hash_algorithms[0]; e->name.length != 0; e++) {
595595
if (njs_strstr_eq(&name, &e->name)) {
@@ -618,7 +618,7 @@ njs_crypto_encoding(njs_vm_t *vm, njs_value_t *value)
618618
return &njs_encodings[0];
619619
}
620620

621-
njs_value_string_get(value, &name);
621+
njs_value_string_get(vm, value, &name);
622622

623623
for (e = &njs_encodings[1]; e->name.length != 0; e++) {
624624
if (njs_strstr_eq(&name, &e->name)) {

external/njs_fs_module.c

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,8 @@ static njs_int_t njs_fs_write_file(njs_vm_t *vm, njs_value_t *args,
180180
njs_uint_t nargs, njs_index_t calltype, njs_value_t *retval);
181181

182182
static njs_int_t njs_fs_constant(njs_vm_t *vm, njs_object_prop_t *prop,
183-
njs_value_t *value, njs_value_t *setval, njs_value_t *retval);
183+
uint32_t unused, njs_value_t *value, njs_value_t *setval,
184+
njs_value_t *retval);
184185

185186
static njs_int_t njs_fs_dirent_constructor(njs_vm_t *vm, njs_value_t *args,
186187
njs_uint_t nargs, njs_index_t unused, njs_value_t *retval);
@@ -190,7 +191,8 @@ static njs_int_t njs_fs_dirent_test(njs_vm_t *vm, njs_value_t *args,
190191
static njs_int_t njs_fs_stats_test(njs_vm_t *vm, njs_value_t *args,
191192
njs_uint_t nargs, njs_index_t testtype, njs_value_t *retval);
192193
static njs_int_t njs_fs_stats_prop(njs_vm_t *vm, njs_object_prop_t *prop,
193-
njs_value_t *value, njs_value_t *setval, njs_value_t *retval);
194+
uint32_t unused, njs_value_t *value, njs_value_t *setval,
195+
njs_value_t *retval);
194196
static njs_int_t njs_fs_stats_create(njs_vm_t *vm, struct stat *st,
195197
njs_value_t *retval);
196198

@@ -1966,7 +1968,7 @@ njs_fs_readdir(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
19661968

19671969

19681970
if (njs_value_is_string(njs_value_arg(&encode))) {
1969-
njs_value_string_get(njs_value_arg(&encode), &s);
1971+
njs_value_string_get(vm, njs_value_arg(&encode), &s);
19701972

19711973
} else {
19721974
s.length = 0;
@@ -2111,7 +2113,7 @@ njs_fs_readlink(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
21112113
encoding = NULL;
21122114

21132115
if (njs_value_is_string(njs_value_arg(&encode))) {
2114-
njs_value_string_get(njs_value_arg(&encode), &s);
2116+
njs_value_string_get(vm, njs_value_arg(&encode), &s);
21152117

21162118
} else {
21172119
s.length = 0;
@@ -2203,7 +2205,7 @@ njs_fs_realpath(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
22032205
encoding = NULL;
22042206

22052207
if (njs_value_is_string(njs_value_arg(&encode))) {
2206-
njs_value_string_get(njs_value_arg(&encode), &s);
2208+
njs_value_string_get(vm, njs_value_arg(&encode), &s);
22072209

22082210
} else {
22092211
s.length = 0;
@@ -2610,7 +2612,7 @@ njs_fs_write(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
26102612
return NJS_ERROR;
26112613
}
26122614

2613-
njs_value_string_get(njs_value_arg(&result), &data);
2615+
njs_value_string_get(vm, njs_value_arg(&result), &data);
26142616

26152617
goto process;
26162618
}
@@ -2790,7 +2792,7 @@ njs_fs_write_file(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
27902792
return NJS_ERROR;
27912793
}
27922794

2793-
njs_value_string_get(njs_value_arg(&result), &content);
2795+
njs_value_string_get(vm, njs_value_arg(&result), &content);
27942796
}
27952797

27962798
flags = njs_fs_flags(vm, njs_value_arg(&flag), O_CREAT | O_WRONLY);
@@ -3213,7 +3215,7 @@ njs_fs_path(njs_vm_t *vm, char storage[NJS_MAX_PATH + 1], njs_value_t *src,
32133215
njs_int_t ret;
32143216

32153217
if (njs_value_is_string(src)) {
3216-
njs_value_string_get(src, &str);
3218+
njs_value_string_get(vm, src, &str);
32173219

32183220
} else if (njs_value_is_buffer(src)) {
32193221
ret = njs_value_buffer_get(vm, src, &str);
@@ -3261,7 +3263,7 @@ njs_fs_flags(njs_vm_t *vm, njs_value_t *value, int default_flags)
32613263
return -1;
32623264
}
32633265

3264-
njs_value_string_get(value, &flags);
3266+
njs_value_string_get(vm, value, &flags);
32653267

32663268
for (fl = &njs_flags_table[0]; fl->name.length != 0; fl++) {
32673269
if (njs_strstr_eq(&flags, &fl->name)) {
@@ -3651,8 +3653,8 @@ njs_fs_stats_test(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
36513653

36523654

36533655
static njs_int_t
3654-
njs_fs_stats_prop(njs_vm_t *vm, njs_object_prop_t *prop, njs_value_t *value,
3655-
njs_value_t *setval, njs_value_t *retval)
3656+
njs_fs_stats_prop(njs_vm_t *vm, njs_object_prop_t *prop, uint32_t unused,
3657+
njs_value_t *value, njs_value_t *setval, njs_value_t *retval)
36563658
{
36573659
double v;
36583660
njs_int_t ret;
@@ -3870,8 +3872,8 @@ njs_fs_bytes_written_create(njs_vm_t *vm, int bytes, njs_value_t *buffer,
38703872

38713873

38723874
njs_int_t
3873-
njs_fs_constant(njs_vm_t *vm, njs_object_prop_t *prop, njs_value_t *value,
3874-
njs_value_t *setval, njs_value_t *retval)
3875+
njs_fs_constant(njs_vm_t *vm, njs_object_prop_t *prop, uint32_t unused,
3876+
njs_value_t *value, njs_value_t *setval, njs_value_t *retval)
38753877
{
38763878
njs_value_number_set(retval, njs_vm_prop_magic32(prop));
38773879

external/njs_query_string_module.c

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -294,8 +294,8 @@ njs_query_string_append(njs_vm_t *vm, njs_value_t *object, const u_char *key,
294294
}
295295
}
296296

297-
ret = njs_value_property(vm, object, njs_value_arg(&name),
298-
njs_value_arg(&retval));
297+
ret = njs_value_property_val(vm, object, njs_value_arg(&name),
298+
njs_value_arg(&retval));
299299

300300
if (ret == NJS_OK) {
301301
if (njs_value_is_array(njs_value_arg(&retval))) {
@@ -331,8 +331,8 @@ njs_query_string_append(njs_vm_t *vm, njs_value_t *object, const u_char *key,
331331
njs_value_assign(&value, &array);
332332
}
333333

334-
return njs_value_property_set(vm, object, njs_value_arg(&name),
335-
njs_value_arg(&value));
334+
return njs_value_property_val_set(vm, object, njs_value_arg(&name),
335+
njs_value_arg(&value));
336336
}
337337

338338

@@ -383,7 +383,7 @@ njs_query_string_parse(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
383383
string = njs_arg(args, nargs, 1);
384384

385385
if (njs_value_is_string(string)) {
386-
njs_value_string_get(string, &str);
386+
njs_value_string_get(vm, string, &str);
387387

388388
} else {
389389
str = njs_str_value("");
@@ -399,8 +399,8 @@ njs_query_string_parse(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
399399
return ret;
400400
}
401401

402-
if (njs_string_length(njs_value_arg(&val_sep)) != 0) {
403-
njs_value_string_get(njs_value_arg(&val_sep), &sep);
402+
if (njs_value_string_length(vm, njs_value_arg(&val_sep)) != 0) {
403+
njs_value_string_get(vm, njs_value_arg(&val_sep), &sep);
404404
}
405405
}
406406

@@ -411,8 +411,8 @@ njs_query_string_parse(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
411411
return ret;
412412
}
413413

414-
if (njs_string_length(njs_value_arg(&val_eq)) != 0) {
415-
njs_value_string_get(njs_value_arg(&val_eq), &eq);
414+
if (njs_value_string_length(vm, njs_value_arg(&val_eq)) != 0) {
415+
njs_value_string_get(vm, njs_value_arg(&val_eq), &eq);
416416
}
417417
}
418418

@@ -614,7 +614,7 @@ njs_query_string_encoder_call(njs_vm_t *vm, njs_chb_t *chain,
614614
}
615615

616616
if (njs_fast_path(njs_query_string_is_native_encoder(encoder))) {
617-
njs_value_string_get(string, &str);
617+
njs_value_string_get(vm, string, &str);
618618
return njs_query_string_encode(chain, &str);
619619
}
620620

@@ -631,7 +631,7 @@ njs_query_string_encoder_call(njs_vm_t *vm, njs_chb_t *chain,
631631
}
632632
}
633633

634-
njs_value_string_get(njs_value_arg(&retval), &str);
634+
njs_value_string_get(vm, njs_value_arg(&retval), &str);
635635

636636
njs_chb_append_str(chain, &str);
637637

@@ -705,8 +705,8 @@ njs_query_string_stringify(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
705705
return ret;
706706
}
707707

708-
if (njs_string_length(arg) > 0) {
709-
njs_value_string_get(arg, &sep);
708+
if (njs_value_string_length(vm, arg) > 0) {
709+
njs_value_string_get(vm, arg, &sep);
710710
}
711711
}
712712

@@ -717,8 +717,8 @@ njs_query_string_stringify(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
717717
return ret;
718718
}
719719

720-
if (njs_string_length(arg) > 0) {
721-
njs_value_string_get(arg, &eq);
720+
if (njs_value_string_length(vm, arg) > 0) {
721+
njs_value_string_get(vm, arg, &eq);
722722
}
723723
}
724724

@@ -764,8 +764,8 @@ njs_query_string_stringify(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
764764
}
765765

766766
for (n = 0; n < keys_length; n++, string++) {
767-
ret = njs_value_property(vm, object, njs_value_arg(string),
768-
njs_value_arg(&value));
767+
ret = njs_value_property_val(vm, object, njs_value_arg(string),
768+
njs_value_arg(&value));
769769
if (njs_slow_path(ret == NJS_ERROR)) {
770770
goto failed;
771771
}
@@ -775,9 +775,9 @@ njs_query_string_stringify(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
775775

776776
for (i = 0; i < len; i++) {
777777
njs_value_number_set(njs_value_arg(&key), i);
778-
ret = njs_value_property(vm, njs_value_arg(&value),
779-
njs_value_arg(&key),
780-
njs_value_arg(&result));
778+
ret = njs_value_property_val(vm, njs_value_arg(&value),
779+
njs_value_arg(&key),
780+
njs_value_arg(&result));
781781
if (njs_slow_path(ret == NJS_ERROR)) {
782782
goto failed;
783783
}
@@ -839,7 +839,7 @@ njs_query_string_escape(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
839839
string = njs_value_arg(&value);
840840
}
841841

842-
njs_value_string_get(string, &str);
842+
njs_value_string_get(vm, string, &str);
843843

844844
NJS_CHB_MP_INIT(&chain, njs_vm_memory_pool(vm));
845845

@@ -876,7 +876,7 @@ njs_query_string_unescape(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
876876
string = njs_value_arg(&value);
877877
}
878878

879-
njs_value_string_get(string, &str);
879+
njs_value_string_get(vm, string, &str);
880880

881881
return njs_query_string_decode(vm, retval, str.start, str.length);
882882
}

external/njs_shell.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1585,8 +1585,9 @@ njs_engine_njs_complete(njs_engine_t *engine, njs_str_t *expression)
15851585
return NULL;
15861586
}
15871587

1588-
ret = njs_value_property(vm, njs_value_arg(&value), njs_value_arg(&key),
1589-
njs_value_arg(&retval));
1588+
ret = njs_value_property_val(vm, njs_value_arg(&value),
1589+
njs_value_arg(&key),
1590+
njs_value_arg(&retval));
15901591
if (njs_slow_path(ret != NJS_OK)) {
15911592
if (ret == NJS_DECLINED && !global) {
15921593
goto done;
@@ -3664,11 +3665,11 @@ njs_ext_console_time(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
36643665
return ret;
36653666
}
36663667

3667-
njs_value_string_get(value, &name);
3668+
njs_value_string_get(vm, value, &name);
36683669
}
36693670

36703671
} else {
3671-
njs_value_string_get(value, &name);
3672+
njs_value_string_get(vm, value, &name);
36723673
}
36733674

36743675
if (njs_console_time(console, &name) != NJS_OK) {
@@ -3713,11 +3714,11 @@ njs_ext_console_time_end(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
37133714
return ret;
37143715
}
37153716

3716-
njs_value_string_get(value, &name);
3717+
njs_value_string_get(vm, value, &name);
37173718
}
37183719

37193720
} else {
3720-
njs_value_string_get(value, &name);
3721+
njs_value_string_get(vm, value, &name);
37213722
}
37223723

37233724
njs_console_time_end(console, &name, ns);

0 commit comments

Comments
 (0)