void jerry_start () { srand ((unsigned) jerry_port_get_current_time ()); jerry_init (JERRY_INIT_EMPTY); jerry_value_t global_obj_val = jerry_get_global_object (); jerry_value_t print_func_name_val = jerry_create_string ((jerry_char_t *) "print"); print_function = jerry_get_property (global_obj_val, print_func_name_val); jerry_release_value (print_func_name_val); jerry_release_value (global_obj_val); }
iotjs_jval_t iotjs_jval_get_property(const iotjs_jval_t* jobj, const char* name) { const IOTJS_VALIDATED_STRUCT_METHOD(iotjs_jval_t, jobj); IOTJS_ASSERT(iotjs_jval_is_object(jobj)); jerry_value_t prop_name = jerry_create_string((const jerry_char_t*)(name)); jerry_value_t res = jerry_get_property(_this->value, prop_name); jerry_release_value(prop_name); if (jerry_value_has_error_flag(res)) { jerry_release_value(res); return iotjs_jval_create_copied(iotjs_jval_get_undefined()); } return iotjs_jval_create_raw(res); }
napi_status napi_get_property(napi_env env, napi_value object, napi_value key, napi_value* result) { NAPI_TRY_ENV(env); jerry_value_t jval_object = AS_JERRY_VALUE(object); jerry_value_t jval_key = AS_JERRY_VALUE(key); NAPI_TRY_TYPE(object, jval_object); NAPI_TRY_TYPE(string, jval_key); jerry_value_t jval_ret = jerry_get_property(jval_object, jval_key); jerryx_create_handle(jval_ret); if (jerry_value_is_error(jval_ret)) { jerry_release_value(jval_ret); NAPI_RETURN(napi_invalid_arg, NULL); } return napi_assign_nvalue(jval_ret, result); }
void main (void) { printf ("Jerry Compilation " __DATE__ " " __TIME__ "\n"); jerry_init (JERRY_INIT_EMPTY); jerry_value_t global_obj_val = jerry_get_global_object (); jerry_value_t print_func_name_val = jerry_create_string ((jerry_char_t *) "print"); print_function = jerry_get_property (global_obj_val, print_func_name_val); jerry_release_value (print_func_name_val); jerry_release_value (global_obj_val); if (jerry_value_has_error_flag (print_function)) { printf ("Error: could not look up print function, expression results won't be printed\n"); } shell_register_app_cmd_handler (shell_cmd_handler); shell_init ("js> ", commands); /* Don't call jerry_cleanup() here, as shell_init() returns after setting up background task to process shell input, and that task calls shell_cmd_handler(), etc. as callbacks. This processing happens in the infinite loop, so JerryScript doesn't need to be de-initialized. */ } /* main */
void main (void) { srand ((unsigned) jerry_port_get_current_time ()); uint32_t zephyr_ver = sys_kernel_version_get (); printf ("JerryScript build: " __DATE__ " " __TIME__ "\n"); printf ("JerryScript API %d.%d\n", JERRY_API_MAJOR_VERSION, JERRY_API_MINOR_VERSION); printf ("Zephyr version %d.%d.%d\n", (int)SYS_KERNEL_VER_MAJOR (zephyr_ver), (int)SYS_KERNEL_VER_MINOR (zephyr_ver), (int)SYS_KERNEL_VER_PATCHLEVEL (zephyr_ver)); zephyr_getline_init (); jerry_init (JERRY_INIT_EMPTY); register_js_function ("print", jerryx_handler_print); jerry_value_t global_obj_val = jerry_get_global_object (); jerry_value_t print_func_name_val = jerry_create_string ((jerry_char_t *) "print"); print_function = jerry_get_property (global_obj_val, print_func_name_val); jerry_release_value (print_func_name_val); jerry_release_value (global_obj_val); if (jerry_value_is_error (print_function)) { printf ("Error: could not look up print function, expression results won't be printed\n"); } while (1) { char *s; printf("js> "); fflush(stdout); s = zephyr_getline (); if (*s) { shell_cmd_handler (s); } } /* As we never retturn from REPL above, don't call jerry_cleanup() here. */ } /* main */
/** * Check whether an error is a SyntaxError or not * * @return true - if param is SyntaxError * false - otherwise */ static bool jerry_value_is_syntax_error (jerry_value_t error_value) /**< error value */ { assert (jerry_is_feature_enabled (JERRY_FEATURE_ERROR_MESSAGES)); if (!jerry_value_is_object (error_value)) { return false; } jerry_value_t prop_name = jerry_create_string ((const jerry_char_t *)"name"); jerry_value_t error_name = jerry_get_property (error_value, prop_name); jerry_release_value (prop_name); if (jerry_value_has_error_flag (error_name) || !jerry_value_is_string (error_name)) { return false; } jerry_size_t err_str_size = jerry_get_string_size (error_name); jerry_char_t err_str_buf[err_str_size]; jerry_size_t sz = jerry_string_to_char_buffer (error_name, err_str_buf, err_str_size); jerry_release_value (error_name); if (sz == 0) { return false; } if (!strcmp ((char *) err_str_buf, "SyntaxError")) { return true; } return false; } /* jerry_value_is_syntax_error */
/** * Validate the JS arguments and assign them to the native arguments. * * @return jerry undefined: all validators passed, * jerry error: a validator failed. */ jerry_value_t jerryx_arg_transform_args (const jerry_value_t *js_arg_p, /**< points to the array with JS arguments */ const jerry_length_t js_arg_cnt, /**< the count of the `js_arg_p` array */ const jerryx_arg_t *c_arg_p, /**< points to the array of validation/transformation steps */ jerry_length_t c_arg_cnt) /**< the count of the `c_arg_p` array */ { jerry_value_t ret = jerry_create_undefined (); jerryx_arg_js_iterator_t iterator = { .js_arg_p = js_arg_p, .js_arg_cnt = js_arg_cnt, .js_arg_idx = 0 }; for (; c_arg_cnt != 0 && !jerry_value_is_error (ret); c_arg_cnt--, c_arg_p++) { ret = c_arg_p->func (&iterator, c_arg_p); } return ret; } /* jerryx_arg_transform_args */ /** * Validate the this value and the JS arguments, * and assign them to the native arguments. * This function is useful to perform input validation inside external * function handlers (see jerry_external_handler_t). * @note this_val is processed as the first value, before the array of arguments. * * @return jerry undefined: all validators passed, * jerry error: a validator failed. */ jerry_value_t jerryx_arg_transform_this_and_args (const jerry_value_t this_val, /**< the this_val for the external function */ const jerry_value_t *js_arg_p, /**< points to the array with JS arguments */ const jerry_length_t js_arg_cnt, /**< the count of the `js_arg_p` array */ const jerryx_arg_t *c_arg_p, /**< points to the array of transformation steps */ jerry_length_t c_arg_cnt) /**< the count of the `c_arg_p` array */ { if (c_arg_cnt == 0) { return jerry_create_undefined (); } jerryx_arg_js_iterator_t iterator = { .js_arg_p = &this_val, .js_arg_cnt = 1, .js_arg_idx = 0 }; jerry_value_t ret = c_arg_p->func (&iterator, c_arg_p); if (jerry_value_is_error (ret)) { jerry_release_value (ret); return jerry_create_error (JERRY_ERROR_TYPE, (jerry_char_t *) "'this' validation failed."); } return jerryx_arg_transform_args (js_arg_p, js_arg_cnt, c_arg_p + 1, c_arg_cnt - 1); } /* jerryx_arg_transform_this_and_args */ /** * Validate the `obj_val`'s properties, * and assign them to the native arguments. * * @return jerry undefined: all validators passed, * jerry error: a validator failed. */ jerry_value_t jerryx_arg_transform_object_properties (const jerry_value_t obj_val,/**< the JS object */ const jerry_char_t **name_p, /**< property name list of the JS object */ const jerry_length_t name_cnt, /**< count of the name list */ const jerryx_arg_t *c_arg_p, /**< points to the array of transformation steps */ jerry_length_t c_arg_cnt) /**< the count of the `c_arg_p` array */ { if (!jerry_value_is_object (obj_val)) { return jerry_create_error (JERRY_ERROR_TYPE, (jerry_char_t *) "Not an object."); } jerry_value_t prop[name_cnt]; for (jerry_length_t i = 0; i < name_cnt; i++, name_p++) { const jerry_value_t name_str = jerry_create_string (*name_p); prop[i] = jerry_get_property (obj_val, name_str); jerry_release_value (name_str); if (jerry_value_is_error (prop[i])) { for (jerry_length_t j = 0; j < i; j++) { jerry_release_value (prop[j]); } return prop[i]; } } const jerry_value_t ret = jerryx_arg_transform_args (prop, name_cnt, c_arg_p, c_arg_cnt); for (jerry_length_t i = 0; i < name_cnt; i++) { jerry_release_value (prop[i]); } return ret; } /* jerryx_arg_transform_object_properties */ /** * Validate the items in the JS array and assign them to the native arguments. * * @return jerry undefined: all validators passed, * jerry error: a validator failed. */ jerry_value_t jerryx_arg_transform_array (const jerry_value_t array_val, /**< points to the JS array */ const jerryx_arg_t *c_arg_p, /**< points to the array of validation/transformation steps */ jerry_length_t c_arg_cnt) /**< the count of the `c_arg_p` array */ { if (!jerry_value_is_array (array_val)) { return jerry_create_error (JERRY_ERROR_TYPE, (jerry_char_t *) "Not an array."); } jerry_value_t arr[c_arg_cnt]; for (jerry_length_t i = 0; i < c_arg_cnt; i++) { arr[i] = jerry_get_property_by_index (array_val, i); if (jerry_value_is_error (arr[i])) { for (jerry_length_t j = 0; j < i; j++) { jerry_release_value (arr[j]); } return arr[i]; } } const jerry_value_t ret = jerryx_arg_transform_args (arr, c_arg_cnt, c_arg_p, c_arg_cnt); for (jerry_length_t i = 0; i < c_arg_cnt; i++) { jerry_release_value (arr[i]); } return ret; } /* jerryx_arg_transform_array */
int main (int argc, char **argv) { if (argc > JERRY_MAX_COMMAND_LINE_ARGS) { jerry_port_log (JERRY_LOG_LEVEL_ERROR, "Error: too many command line arguments: %d (JERRY_MAX_COMMAND_LINE_ARGS=%d)\n", argc, JERRY_MAX_COMMAND_LINE_ARGS); return JERRY_STANDALONE_EXIT_CODE_FAIL; } const char *file_names[JERRY_MAX_COMMAND_LINE_ARGS]; int i; int files_counter = 0; size_t max_data_bss_size, max_stack_size; jerry_get_memory_limits (&max_data_bss_size, &max_stack_size); // FIXME: // jrt_set_mem_limits (max_data_bss_size, max_stack_size); jerry_init_flag_t flags = JERRY_INIT_EMPTY; const char *exec_snapshot_file_names[JERRY_MAX_COMMAND_LINE_ARGS]; int exec_snapshots_count = 0; bool is_parse_only = false; bool is_save_snapshot_mode = false; bool is_save_snapshot_mode_for_global_or_eval = false; const char *save_snapshot_file_name_p = NULL; bool is_repl_mode = false; for (i = 1; i < argc; i++) { if (!strcmp ("-h", argv[i]) || !strcmp ("--help", argv[i])) { print_help (argv[0]); return JERRY_STANDALONE_EXIT_CODE_OK; } else if (!strcmp ("-v", argv[i]) || !strcmp ("--version", argv[i])) { jerry_port_console ("Version: \t%d.%d\n\n", JERRY_API_MAJOR_VERSION, JERRY_API_MINOR_VERSION); return JERRY_STANDALONE_EXIT_CODE_OK; } else if (!strcmp ("--mem-stats", argv[i])) { flags |= JERRY_INIT_MEM_STATS; jerry_port_default_set_log_level (JERRY_LOG_LEVEL_DEBUG); } else if (!strcmp ("--mem-stats-separate", argv[i])) { flags |= JERRY_INIT_MEM_STATS_SEPARATE; jerry_port_default_set_log_level (JERRY_LOG_LEVEL_DEBUG); } else if (!strcmp ("--parse-only", argv[i])) { is_parse_only = true; } else if (!strcmp ("--show-opcodes", argv[i])) { flags |= JERRY_INIT_SHOW_OPCODES; jerry_port_default_set_log_level (JERRY_LOG_LEVEL_DEBUG); } else if (!strcmp ("--show-regexp-opcodes", argv[i])) { flags |= JERRY_INIT_SHOW_REGEXP_OPCODES; jerry_port_default_set_log_level (JERRY_LOG_LEVEL_DEBUG); } else if (!strcmp ("--save-snapshot-for-global", argv[i]) || !strcmp ("--save-snapshot-for-eval", argv[i])) { is_save_snapshot_mode = true; is_save_snapshot_mode_for_global_or_eval = !strcmp ("--save-snapshot-for-global", argv[i]); if (save_snapshot_file_name_p != NULL) { jerry_port_log (JERRY_LOG_LEVEL_ERROR, "Error: snapshot file name already specified\n"); print_usage (argv[0]); return JERRY_STANDALONE_EXIT_CODE_FAIL; } if (++i >= argc) { jerry_port_log (JERRY_LOG_LEVEL_ERROR, "Error: no file specified for %s\n", argv[i - 1]); print_usage (argv[0]); return JERRY_STANDALONE_EXIT_CODE_FAIL; } save_snapshot_file_name_p = argv[i]; } else if (!strcmp ("--exec-snapshot", argv[i])) { if (++i >= argc) { jerry_port_log (JERRY_LOG_LEVEL_ERROR, "Error: no file specified for %s\n", argv[i - 1]); print_usage (argv[0]); return JERRY_STANDALONE_EXIT_CODE_FAIL; } assert (exec_snapshots_count < JERRY_MAX_COMMAND_LINE_ARGS); exec_snapshot_file_names[exec_snapshots_count++] = argv[i]; } else if (!strcmp ("--log-level", argv[i])) { if (++i >= argc) { jerry_port_log (JERRY_LOG_LEVEL_ERROR, "Error: no level specified for %s\n", argv[i - 1]); print_usage (argv[0]); return JERRY_STANDALONE_EXIT_CODE_FAIL; } if (strlen (argv[i]) != 1 || argv[i][0] < '0' || argv[i][0] > '3') { jerry_port_log (JERRY_LOG_LEVEL_ERROR, "Error: wrong format for %s\n", argv[i - 1]); print_usage (argv[0]); return JERRY_STANDALONE_EXIT_CODE_FAIL; } jerry_port_default_set_log_level (argv[i][0] - '0'); } else if (!strcmp ("--abort-on-fail", argv[i])) { jerry_port_default_set_abort_on_fail (true); } else if (!strncmp ("-", argv[i], 1)) { jerry_port_log (JERRY_LOG_LEVEL_ERROR, "Error: unrecognized option: %s\n", argv[i]); print_usage (argv[0]); return JERRY_STANDALONE_EXIT_CODE_FAIL; } else { file_names[files_counter++] = argv[i]; } } if (is_save_snapshot_mode) { if (files_counter != 1) { jerry_port_log (JERRY_LOG_LEVEL_ERROR, "Error: --save-snapshot argument works with exactly one script\n"); return JERRY_STANDALONE_EXIT_CODE_FAIL; } if (exec_snapshots_count != 0) { jerry_port_log (JERRY_LOG_LEVEL_ERROR, "Error: --save-snapshot and --exec-snapshot options can't be passed simultaneously\n"); return JERRY_STANDALONE_EXIT_CODE_FAIL; } } if (files_counter == 0 && exec_snapshots_count == 0) { is_repl_mode = true; } jerry_init (flags); jerry_value_t global_obj_val = jerry_get_global_object (); jerry_value_t assert_value = jerry_create_external_function (assert_handler); jerry_value_t assert_func_name_val = jerry_create_string ((jerry_char_t *) "assert"); bool is_assert_added = jerry_set_property (global_obj_val, assert_func_name_val, assert_value); jerry_release_value (assert_func_name_val); jerry_release_value (assert_value); jerry_release_value (global_obj_val); if (!is_assert_added) { jerry_port_log (JERRY_LOG_LEVEL_ERROR, "Warning: failed to register 'assert' method."); } jerry_value_t ret_value = jerry_create_undefined (); for (int i = 0; i < exec_snapshots_count; i++) { size_t snapshot_size; const uint8_t *snapshot_p = read_file (exec_snapshot_file_names[i], &snapshot_size); if (snapshot_p == NULL) { ret_value = jerry_create_error (JERRY_ERROR_COMMON, (jerry_char_t *) ""); } else { ret_value = jerry_exec_snapshot ((void *) snapshot_p, snapshot_size, true); } if (jerry_value_has_error_flag (ret_value)) { break; } } if (!jerry_value_has_error_flag (ret_value)) { for (int i = 0; i < files_counter; i++) { size_t source_size; const jerry_char_t *source_p = read_file (file_names[i], &source_size); if (source_p == NULL) { ret_value = jerry_create_error (JERRY_ERROR_COMMON, (jerry_char_t *) ""); } if (is_save_snapshot_mode) { static uint8_t snapshot_save_buffer[ JERRY_BUFFER_SIZE ]; size_t snapshot_size = jerry_parse_and_save_snapshot ((jerry_char_t *) source_p, source_size, is_save_snapshot_mode_for_global_or_eval, false, snapshot_save_buffer, JERRY_BUFFER_SIZE); if (snapshot_size == 0) { ret_value = jerry_create_error (JERRY_ERROR_COMMON, (jerry_char_t *) ""); } else { FILE *snapshot_file_p = fopen (save_snapshot_file_name_p, "w"); fwrite (snapshot_save_buffer, sizeof (uint8_t), snapshot_size, snapshot_file_p); fclose (snapshot_file_p); } } else { ret_value = jerry_parse (source_p, source_size, false); if (!jerry_value_has_error_flag (ret_value) && !is_parse_only) { jerry_value_t func_val = ret_value; ret_value = jerry_run (func_val); jerry_release_value (func_val); } } if (jerry_value_has_error_flag (ret_value)) { break; } } } if (is_repl_mode) { const char *prompt = "jerry> "; bool is_done = false; jerry_value_t global_obj_val = jerry_get_global_object (); jerry_value_t print_func_name_val = jerry_create_string ((jerry_char_t *) "print"); jerry_value_t print_function = jerry_get_property (global_obj_val, print_func_name_val); jerry_release_value (print_func_name_val); if (jerry_value_has_error_flag (print_function)) { return JERRY_STANDALONE_EXIT_CODE_FAIL; } if (!jerry_value_is_function (print_function)) { return JERRY_STANDALONE_EXIT_CODE_FAIL; } while (!is_done) { uint8_t *source_buffer_tail = buffer; size_t len = 0; jerry_port_console ("%s", prompt); /* Read a line */ while (true) { if (fread (source_buffer_tail, 1, 1, stdin) != 1 && len == 0) { is_done = true; break; } if (*source_buffer_tail == '\n') { break; } source_buffer_tail ++; len ++; } *source_buffer_tail = 0; if (len > 0) { /* Evaluate the line */ jerry_value_t ret_val_eval = jerry_eval (buffer, len, false); /* Print return value */ const jerry_value_t args[] = { ret_val_eval }; jerry_value_t ret_val_print = jerry_call_function (print_function, jerry_create_undefined (), args, 1); jerry_release_value (ret_val_print); jerry_release_value (ret_val_eval); } } jerry_release_value (global_obj_val); jerry_release_value (print_function); } int ret_code = JERRY_STANDALONE_EXIT_CODE_OK; if (jerry_value_has_error_flag (ret_value)) { jerry_value_clear_error_flag (&ret_value); jerry_value_t err_str_val = jerry_value_to_string (ret_value); jerry_char_t err_str_buf[256]; jerry_size_t err_str_size = jerry_get_string_size (err_str_val); assert (err_str_size < 256); jerry_size_t sz = jerry_string_to_char_buffer (err_str_val, err_str_buf, err_str_size); assert (sz == err_str_size); err_str_buf[err_str_size] = 0; jerry_port_log (JERRY_LOG_LEVEL_ERROR, "Script Error: unhandled exception: %s\n", err_str_buf); jerry_release_value (err_str_val); ret_code = JERRY_STANDALONE_EXIT_CODE_FAIL; } jerry_release_value (ret_value); jerry_cleanup (); return ret_code; } /* main */