Skip to content

Commit 4bf1f07

Browse files
committed
Reduce the usage of strlen
* Improve jerry_string_sz only accept UTF-8 string(that's a rare case accept CESU-8 in c/cpp code) * The document about jerry_string_sz only support ASCII(the fact is CESU-8 before this MR), update it to support UTF-8 after this MR * Improve all _sz function to take jerry_value_t that can construct from `jerry_string_sz` * Improve JERRY_ZSTR_ARG can only accept string literal(that's UTF-8) * Add function jerry_value_list_free to free a list of jerry_value_t * All call to jerry_string/jerry_string_cesu8 in core indeed are removed, so when there is no linkage to it, code size is saved The prototype of new/improved function/macros is: ```c jerry_value_t jerry_string_cesu8 (const jerry_char_t *buffer_p, jerry_size_t buffer_size); jerry_value_t jerry_string_utf8 (const jerry_char_t *buffer_p, jerry_size_t buffer_size); #define jerry_string_sz(str) jerry_string_utf8 (JERRY_ZSTR_ARG (str)) jerry_value_t jerry_error_sz (jerry_error_t error_type, const jerry_value_t message_sz); jerry_value_t jerry_regexp_sz (const jerry_value_t pattern_sz, uint16_t flags); jerry_value_t jerry_object_delete_sz (const jerry_value_t object, const jerry_value_t key_sz); jerry_value_t jerry_object_get_sz (const jerry_value_t object, const jerry_value_t key_sz); jerry_value_t jerry_object_has_sz (const jerry_value_t object, const jerry_value_t key_sz); jerry_value_t jerry_object_set_sz (jerry_value_t object, const jerry_value_t key_sz, const jerry_value_t value); ``` Rename jerry_port_log to jerry_port_log_buffer Add buffer_size parameter for function jerry_port_log_buffer, so that jerry_port_log_buffer won't need calculate strlen when printing JerryScript-DCO-1.0-Signed-off-by: Yonggang Luo [email protected]
1 parent c509a06 commit 4bf1f07

File tree

94 files changed

+759
-779
lines changed

Some content is hidden

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

94 files changed

+759
-779
lines changed

docs/01.CONFIGURATION.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ Enabling this feature provides detailed error messages where available, like lin
155155

156156
### Logging
157157

158-
This option can be used to enable log messages during runtime. When enabled the engine will use the `jerry_port_log` port API function to print relevant log messages.
158+
This option can be used to enable log messages during runtime. When enabled the engine will use the `jerry_port_log_buffer` port API function to print relevant log messages.
159159
This feature is disabled by default.
160160

161161
| Options | |

docs/02.API-REFERENCE.md

+28-73
Original file line numberDiff line numberDiff line change
@@ -751,7 +751,6 @@ typedef void (*jerry_value_free_callback_t) (void *native_p);
751751

752752
**See also**
753753

754-
- [jerry_string_external_sz](#jerry_string_external_sz)
755754
- [jerry_string_external](#jerry_string_external)
756755
- [jerry_arraybuffer_external](#jerry_arraybuffer_external)
757756

@@ -809,7 +808,6 @@ typedef void (*jerry_external_string_free_cb_t) (jerry_char_t *string_p,
809808
**See also**
810809

811810
- [jerry_string_external_on_free](#jerry_string_external_on_free)
812-
- [jerry_string_external_sz](#jerry_string_external_sz)
813811
- [jerry_string_external](#jerry_string_external)
814812

815813
## jerry_error_object_created_cb_t
@@ -3750,7 +3748,7 @@ jerry_error_type (const jerry_value_t value);
37503748

37513749
```c
37523750
{
3753-
jerry_value_t error_obj = jerry_error_sz (JERRY_ERROR_RANGE, "error msg");
3751+
jerry_value_t error_obj = jerry_error_sz (JERRY_ERROR_RANGE, jerry_string_sz ("error msg"));
37543752
jerry_error_t error_type = jerry_error_type (error_obj);
37553753

37563754
// error_type is now JERRY_ERROR_RANGE.
@@ -3868,7 +3866,7 @@ void main(void)
38683866

38693867
jerry_error_on_created (error_object_created_callback, NULL);
38703868

3871-
jerry_value_free (jerry_error_sz (JERRY_ERROR_COMMON, "Message"));
3869+
jerry_value_free (jerry_error_sz (JERRY_ERROR_COMMON, jerry_string_sz ("Message")));
38723870

38733871
jerry_cleanup ();
38743872
} /* main */
@@ -4062,7 +4060,7 @@ throw_exception (const jerry_call_info_t *call_info_p, /**< call info */
40624060
(void) argv;
40634061
(void) argc;
40644062

4065-
jerry_value_t result_value = jerry_throw_sz (JERRY_ERROR_COMMON, "Error!");
4063+
jerry_value_t result_value = jerry_throw_sz (JERRY_ERROR_COMMON, jerry_string_sz ("Error!"));
40664064

40674065
/* Ignore calling the vm_throw_callback function. */
40684066
jerry_exception_allow_capture (result_value, false);
@@ -4353,8 +4351,8 @@ main (void)
43534351

43544352
jerry_string_external_on_free (external_string_free_callback);
43554353

4356-
const char *string_p = "This is a long external string, should not be duplicated!";
4357-
jerry_value_t external_string = jerry_string_external_sz (string_p, NULL);
4354+
#define string_p "This is a long external string, should not be duplicated!"
4355+
jerry_value_t external_string = jerry_string_external (JERRY_ZSTR_ARG (string_p), NULL);
43584356
/* The external_string_free_callback is called. */
43594357
jerry_value_free (external_string);
43604358

@@ -4367,7 +4365,6 @@ main (void)
43674365

43684366
- [jerry_external_string_free_cb_t](#jerry_external_string_free_cb_t)
43694367
- [jerry_string_user_ptr](#jerry_string_user_ptr)
4370-
- [jerry_string_external_sz](#jerry_string_external_sz)
43714368
- [jerry_string_external](#jerry_string_external)
43724369

43734370

@@ -4381,7 +4378,7 @@ Returns the user pointer assigned to an external string.
43814378
- In some cases (e.g. when the string is also a magic string registered by
43824379
[jerry_register_magic_strings](#jerry_register_magic_strings)), the
43834380
string is a normal string without a user pointer even if it is created
4384-
by [jerry_string_external_sz](#jerry_string_external_sz).
4381+
by [jerry_string_external](#jerry_string_external).
43854382

43864383
**Prototype**
43874384

@@ -4414,9 +4411,9 @@ main (void)
44144411
{
44154412
jerry_init (JERRY_INIT_EMPTY);
44164413

4417-
const char *string_p = "This is a long external string, should not be duplicated!";
4414+
#define string_p "This is a long external string, should not be duplicated!"
44184415

4419-
jerry_value_t external_string = jerry_string_external_sz (string_p, (void *) &user_value);
4416+
jerry_value_t external_string = jerry_string_external (JERRY_ZSTR_ARG (string_p), (void *) &user_value);
44204417

44214418
bool is_external;
44224419
void *user_p = jerry_string_user_ptr (external_string, &is_external);
@@ -4437,7 +4434,6 @@ main (void)
44374434
**See also**
44384435

44394436
- [jerry_string_set_external_string_free_callback](#jerry_string_set_external_string_free_callback)
4440-
- [jerry_string_external_sz](#jerry_string_external_sz)
44414437
- [jerry_string_external](#jerry_string_external)
44424438

44434439

@@ -6948,7 +6944,13 @@ jerry_error (jerry_error_t error_type, jerry_value_t message);
69486944

69496945
**Summary**
69506946

6951-
Create new JavaScript Error object, using the a zero-terminated string as the error message.
6947+
Create an Error object with the provided `message_sz` string value as the error `message`.
6948+
If the `message_sz` value is not a string, the created error will not have a `message` property.
6949+
6950+
*Note*:
6951+
Returned value must be freed with [jerry_value_free](#jerry_value_free) when it
6952+
is no longer needed.
6953+
The `message_sz` value will be freed in this function.
69526954

69536955
*Note*: Returned value must be freed with [jerry_value_free](#jerry_value_free) when it
69546956
is no longer needed.
@@ -6957,18 +6959,18 @@ is no longer needed.
69576959

69586960
```c
69596961
jerry_value_t
6960-
jerry_error_sz (jerry_error_t error_type, const char *message_p);
6962+
jerry_error_sz (jerry_error_t error_type, const jerry_value_t message_sz);
69616963
```
69626964

69636965
- `error_type` - type of the error
6964-
- `message_p` - value of 'message' property of the constructed error object
6966+
- `message_sz` - message of the error that will be free/take
69656967
- return value - constructed error object
69666968

69676969
**Example**
69686970

69696971
```c
69706972
{
6971-
jerry_value_t error_obj = jerry_error_sz (JERRY_ERROR_TYPE, "error");
6973+
jerry_value_t error_obj = jerry_error_sz (JERRY_ERROR_TYPE, jerry_string_sz ("error"));
69726974

69736975
... // usage of error_obj
69746976

@@ -7472,7 +7474,8 @@ main (void)
74727474

74737475
**Summary**
74747476

7475-
Create string from a zero-terminated ASCII string.
7477+
Create string value from the zero-terminated UTF-8 encoded literal string.
7478+
This is a macro that only accept literal string
74767479

74777480
*Note*: Returned value must be freed with [jerry_value_free](#jerry_value_free) when it
74787481
is no longer needed.
@@ -7481,17 +7484,17 @@ is no longer needed.
74817484

74827485
```c
74837486
jerry_value_t
7484-
jerry_string_sz (const char *str_p);
7487+
jerry_string_sz (literal_str);
74857488
```
74867489

7487-
- `str_p` - non-null pointer to string
7490+
- `literal_str` - An zero-terminated UTF-8 encoded literal string
74887491
- return value - created string
74897492

74907493
**Example**
74917494

74927495
```c
74937496
{
7494-
const char char_array[] = "a string";
7497+
#define char_array "a string"
74957498
jerry_value_t string_value = jerry_string_sz (char_array);
74967499

74977500
... // usage of string_value
@@ -7502,7 +7505,7 @@ jerry_string_sz (const char *str_p);
75027505

75037506
**See also**
75047507

7505-
- [jerry_string](#jerry_string)
7508+
- [jerry_string_utf8](#jerry_string_utf8)
75067509

75077510

75087511
## jerry_string
@@ -7549,54 +7552,6 @@ jerry_string (const jerry_char_t *buffer_p,
75497552
- [jerry_validate_string](#jerry_validate_string)
75507553
- [jerry_string_sz](#jerry_string_sz)
75517554

7552-
7553-
## jerry_string_external_sz
7554-
7555-
**Summary**
7556-
7557-
Create an external string from a zero-terminated ASCII string. The string buffer passed to the function
7558-
should not be modified until the free callback is called. This function can be used to avoid
7559-
the duplication of large strings.
7560-
7561-
*Note*:
7562-
- The free callback can be set by [jerry_string_external_on_free](#jerry_string_external_on_free)
7563-
- Returned value must be freed with [jerry_value_free](#jerry_value_free)
7564-
when it is no longer needed.
7565-
7566-
**Prototype**
7567-
7568-
```c
7569-
jerry_value_t
7570-
jerry_string_external_sz (const char *str_p, void *user_p);
7571-
```
7572-
7573-
- `str_p` - non-null pointer to string
7574-
- `user_p` - user pointer passed to the callback when the string is freed
7575-
- return value - value of the created string
7576-
7577-
*New in version 2.4*.
7578-
7579-
*Changed in version [[NEXT_RELEASE]]*: `free_cb` is replaced by `user_p`.
7580-
7581-
**Example**
7582-
7583-
```c
7584-
{
7585-
const char* string_p = "a large and immutable string: this is a story about ....";
7586-
jerry_value_t string_value = jerry_string_external_sz (string_p, NULL);
7587-
7588-
... // usage of string_value
7589-
7590-
jerry_value_free (string_value);
7591-
}
7592-
```
7593-
7594-
**See also**
7595-
7596-
- [jerry_string_external](#jerry_string_external)
7597-
- [jerry_string_external_on_free](#jerry_string_external_on_free)
7598-
7599-
76007555
## jerry_string_external
76017556

76027557
**Summary**
@@ -7647,7 +7602,7 @@ jerry_string_external (const jerry_char_t *str_p,
76477602
**See also**
76487603

76497604
- [jerry_validate_string](#jerry_validate_string)
7650-
- [jerry_string_external_sz](#jerry_string_external_sz)
7605+
- [jerry_string_external](#jerry_string_external)
76517606
- [jerry_string_external_on_free](#jerry_string_external_on_free)
76527607

76537608

@@ -7794,10 +7749,10 @@ jerry_regexp_sz (const jerry_char_t *pattern_p, uint16_t flags);
77947749

77957750
```c
77967751
{
7797-
jerry_char_t pattern_p = "[cgt]gggtaaa|tttaccc[acg]";
7752+
#define pattern "[cgt]gggtaaa|tttaccc[acg]"
77987753
uint16_t pattern_flags = JERRY_REGEXP_FLAG_IGNORE_CASE;
77997754

7800-
jerry_value_t regexp = jerry_regexp_sz (pattern_p, pattern_flags);
7755+
jerry_value_t regexp = jerry_regexp_sz (jerry_string_sz (pattern), pattern_flags);
78017756

78027757
...
78037758

@@ -7836,7 +7791,7 @@ jerry_regexp (const jerry_value_t pattern, uint16_t flags);
78367791
{
78377792
jerry_char_t pattern_p = "[cgt]gggtaaa|tttaccc[acg]";
78387793
jerry_size_t pattern_size = sizeof (pattern_p) - 1;
7839-
jerry_value_t pattern_str = jerry_string (pattern_p, pattern_size, JERRY_ENCODING_UTF8);
7794+
jerry_value_t pattern_str = jerry_string_utf8 (pattern_p, pattern_size);
78407795

78417796
uint16_t pattern_flags = JERRY_REGEXP_FLAG_IGNORE_CASE;
78427797

docs/03.API-EXAMPLE.md

+21-12
Original file line numberDiff line numberDiff line change
@@ -393,9 +393,17 @@ In this example the following extension methods are used:
393393

394394
In further examples this "print" handler will be used.
395395

396+
The `api-example-6.c` file should contain the following code:
397+
398+
[doctest]: # ()
399+
396400
```c
401+
#include <stdio.h>
402+
397403
#include "jerryscript.h"
404+
398405
#include "jerryscript-ext/handlers.h"
406+
#include "jerryscript-ext/properties.h"
399407

400408
int
401409
main (void)
@@ -407,7 +415,7 @@ main (void)
407415
jerry_init (JERRY_INIT_EMPTY);
408416

409417
/* Register 'print' function from the extensions to the global object */
410-
jerryx_register_global ("print", jerryx_handler_print);
418+
jerryx_register_global (jerry_string_sz ("print"), jerryx_handler_print);
411419

412420
/* Setup Global scope code */
413421
jerry_value_t parsed_code = jerry_parse (script, script_size, NULL);
@@ -470,7 +478,7 @@ main (void)
470478
jerry_init (JERRY_INIT_EMPTY);
471479

472480
/* Register 'print' function from the extensions */
473-
jerryx_register_global ("print", jerryx_handler_print);
481+
jerryx_register_global (jerry_string_sz ("print"), jerryx_handler_print);
474482

475483
/* Getting pointer to the Global object */
476484
jerry_value_t global_object = jerry_current_realm ();
@@ -729,7 +737,7 @@ main (void)
729737
jerry_init (JERRY_INIT_EMPTY);
730738
731739
/* Register 'print' function from the extensions */
732-
jerryx_register_global ("print", jerryx_handler_print);
740+
jerryx_register_global (jerry_string_sz ("print"), jerryx_handler_print);
733741
734742
while (!is_done)
735743
{
@@ -808,10 +816,8 @@ In this example (`api-example-9.c`) an object with a native function is added to
808816
#include "jerryscript-ext/handlers.h"
809817
#include "jerryscript-ext/properties.h"
810818

811-
struct my_struct
812-
{
813-
const char *msg;
814-
} my_struct;
819+
820+
jerry_string_t my_struct;
815821

816822
/**
817823
* Get a string from a native object
@@ -821,7 +827,7 @@ get_msg_handler (const jerry_call_info_t *call_info_p, /**< call information */
821827
const jerry_value_t *args_p, /**< function arguments */
822828
const jerry_length_t args_cnt) /**< number of function arguments */
823829
{
824-
return jerry_string_sz (my_struct.msg);
830+
return jerry_string_utf8 (my_struct.ptr, my_struct.size);
825831
} /* get_msg_handler */
826832

827833
int
@@ -831,10 +837,13 @@ main (void)
831837
jerry_init (JERRY_INIT_EMPTY);
832838

833839
/* Register 'print' function from the extensions */
834-
jerryx_register_global ("print", jerryx_handler_print);
840+
jerryx_register_global (jerry_string_sz ("print"), jerryx_handler_print);
835841

836842
/* Do something with the native object */
837-
my_struct.msg = "Hello, World!";
843+
{
844+
static const jerry_string_t hello = { JERRY_ZSTR_ARG ("Hello, World!") };
845+
my_struct = hello;
846+
}
838847

839848
/* Create an empty JS object */
840849
jerry_value_t object = jerry_object ();
@@ -958,7 +967,7 @@ main (void)
958967
jerry_init (JERRY_INIT_EMPTY);
959968

960969
/* Register 'print' function from the extensions */
961-
jerryx_register_global ("print", jerryx_handler_print);
970+
jerryx_register_global (jerry_string_sz ("print"), jerryx_handler_print);
962971

963972
/* Create a JS object */
964973
const jerry_char_t my_js_object[] = " \
@@ -1058,7 +1067,7 @@ main (void)
10581067
jerry_init (JERRY_INIT_EMPTY);
10591068

10601069
/* Register the print function */
1061-
jerryx_register_global ("print", jerryx_handler_print);
1070+
jerryx_register_global (jerry_string_sz ("print"), jerryx_handler_print);
10621071

10631072
/* Evaluate the script */
10641073
jerry_value_t eval_ret = jerry_eval (script, sizeof (script) - 1, JERRY_PARSE_NO_OPTS);

docs/05.PORT-API.md

+4-1
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,11 @@ void jerry_port_context_free (void);
112112
*
113113
* The implementation can decide whether error and debug messages are logged to
114114
* the console, or saved to a database or to a file.
115+
*
116+
* @param buffer_p: input buffer
117+
* @param buffer_size: data size
115118
*/
116-
void jerry_port_log (const char *message_p);
119+
void jerry_port_log_buffer (const jerry_char_t *buffer_p, jerry_size_t buffer_size);
117120
```
118121
119122
```c

docs/06.REFERENCE-COUNTING.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ jerry_value_t my_external_handler (const jerry_value_t function_obj,
135135
136136
/* If the value to be returned is needed for other purposes the
137137
* jerry_value_copy () can be used to create new references. */
138-
return jerry_string (...);
138+
return jerry_string_utf8 (...);
139139
}
140140
```
141141

docs/07.DEBUGGER.md

+2-3
Original file line numberDiff line numberDiff line change
@@ -318,9 +318,8 @@ wait_for_source_callback (const jerry_char_t *source_name_p, /**< source name */
318318
319319
jerry_parse_options_t parse_options;
320320
parse_options.options = JERRY_PARSE_HAS_SOURCE_NAME;
321-
parse_options.source_name = jerry_string ((const jerry_char_t *) source_name_p,
322-
(jerry_size_t) source_name_size,
323-
JERRY_ENCODING_UTF8);
321+
parse_options.source_name = jerry_string_utf8 ((const jerry_char_t *) source_name_p,
322+
(jerry_size_t) source_name_size);
324323
325324
jerry_value_t ret_val = jerry_parse (source_p,
326325
source_size,

0 commit comments

Comments
 (0)