int main (int argc, char **argv) { srand ((unsigned) jerry_port_get_current_time ()); if (argc <= 1 || (argc == 2 && (!strcmp ("-h", argv[1]) || !strcmp ("--help", argv[1])))) { print_help (argv[0]); return JERRY_STANDALONE_EXIT_CODE_OK; } jerry_init (JERRY_INIT_EMPTY); jerry_value_t ret_value = jerry_create_undefined (); for (int i = 1; i < argc; i++) { const char *file_name = argv[i]; size_t source_size; const jerry_char_t *source_p = read_file (file_name, &source_size); if (source_p == NULL) { ret_value = jerry_create_error (JERRY_ERROR_COMMON, (jerry_char_t *) ""); break; } else { ret_value = jerry_parse (source_p, source_size, false); if (!jerry_value_has_error_flag (ret_value)) { 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; } jerry_release_value (ret_value); ret_value = jerry_create_undefined (); } int ret_code = JERRY_STANDALONE_EXIT_CODE_OK; if (jerry_value_has_error_flag (ret_value)) { jerry_port_log (JERRY_LOG_LEVEL_ERROR, "Unhandled exception: Script Error!\n"); ret_code = JERRY_STANDALONE_EXIT_CODE_FAIL; } jerry_release_value (ret_value); jerry_cleanup (); return ret_code; } /* main */
void OnRead(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf) { iotjs_tcpwrap_t* tcp_wrap = iotjs_tcpwrap_from_handle((uv_tcp_t*)handle); // tcp handle jerry_value_t jtcp = iotjs_tcpwrap_jobject(tcp_wrap); // socket object jerry_value_t jsocket = iotjs_jval_get_property(jtcp, IOTJS_MAGIC_STRING_OWNER); IOTJS_ASSERT(jerry_value_is_object(jsocket)); // onread callback jerry_value_t jonread = iotjs_jval_get_property(jtcp, IOTJS_MAGIC_STRING_ONREAD); IOTJS_ASSERT(jerry_value_is_function(jonread)); iotjs_jargs_t jargs = iotjs_jargs_create(4); iotjs_jargs_append_jval(&jargs, jsocket); iotjs_jargs_append_number(&jargs, nread); iotjs_jargs_append_bool(&jargs, false); if (nread <= 0) { if (buf->base != NULL) { iotjs_buffer_release(buf->base); } if (nread < 0) { if (nread == UV__EOF) { iotjs_jargs_replace(&jargs, 2, jerry_create_boolean(true)); } iotjs_make_callback(jonread, jerry_create_undefined(), &jargs); } } else { jerry_value_t jbuffer = iotjs_bufferwrap_create_buffer((size_t)nread); iotjs_bufferwrap_t* buffer_wrap = iotjs_bufferwrap_from_jbuffer(jbuffer); iotjs_bufferwrap_copy(buffer_wrap, buf->base, (size_t)nread); iotjs_jargs_append_jval(&jargs, jbuffer); iotjs_make_callback(jonread, jerry_create_undefined(), &jargs); jerry_release_value(jbuffer); iotjs_buffer_release(buf->base); } iotjs_jargs_destroy(&jargs); jerry_release_value(jonread); jerry_release_value(jsocket); }
static jerry_value_t test_validator_prop3_handler (const jerry_value_t func_obj_val __attribute__((unused)), /**< function object */ const jerry_value_t this_val __attribute__((unused)), /**< this value */ const jerry_value_t args_p[], /**< arguments list */ const jerry_length_t args_cnt __attribute__((unused))) /**< arguments length */ { bool native1 = false; bool native2 = true; const char *name_p[] = { "prop1", "prop2" }; jerryx_arg_t mapping[] = { jerryx_arg_boolean (&native1, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), jerryx_arg_boolean (&native2, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), }; jerry_value_t is_ok = jerryx_arg_transform_object_properties (args_p[0], (const jerry_char_t **) name_p, ARRAY_SIZE (name_p), mapping, ARRAY_SIZE (mapping)); TEST_ASSERT (jerry_value_has_error_flag (is_ok)); TEST_ASSERT (!native1); TEST_ASSERT (native2); validator_prop_count++; jerry_release_value (is_ok); return jerry_create_undefined (); } /* test_validator_prop3_handler */
/** * The JS argument should be number, whose value is equal with the extra_info . */ static jerry_value_t my_custom_transform (jerryx_arg_js_iterator_t *js_arg_iter_p, /**< available JS args */ const jerryx_arg_t *c_arg_p) /**< the native arg */ { jerry_value_t js_arg = jerryx_arg_js_iterator_pop (js_arg_iter_p); jerry_value_t to_number = jerry_value_to_number (js_arg); if (jerry_value_has_error_flag (to_number)) { jerry_release_value (to_number); return jerry_create_error (JERRY_ERROR_TYPE, (jerry_char_t *) "It can not be converted to a number."); } int expected_num = (int) c_arg_p->extra_info; int get_num = (int) jerry_get_number_value (to_number); if (get_num != expected_num) { return jerry_create_error (JERRY_ERROR_TYPE, (jerry_char_t *) "Number value is not expected."); } return jerry_create_undefined (); } /* my_custom_transform */
static int shell_cmd_handler (char *source_buffer) { jerry_value_t ret_val; ret_val = jerry_eval ((jerry_char_t *) source_buffer, strlen (source_buffer), JERRY_PARSE_NO_OPTS); if (jerry_value_is_error (ret_val)) { /* User-friendly error messages require at least "cp" JerryScript profile. Include a message prefix in case "cp_minimal" profile is used. */ printf ("Error executing statement: "); /* Clear error flag, otherwise print call below won't produce any output. */ ret_val = jerry_get_value_from_error (ret_val, true); } if (!jerry_value_is_error (print_function)) { jerry_value_t ret_val_print = jerry_call_function (print_function, jerry_create_undefined (), &ret_val, 1); jerry_release_value (ret_val_print); } jerry_release_value (ret_val); return 0; } /* shell_cmd_handler */
static jerry_value_t test_validator_int3_handler (const jerry_value_t func_obj_val __attribute__((unused)), /**< function object */ const jerry_value_t this_val __attribute__((unused)), /**< this value */ const jerry_value_t args_p[], /**< arguments list */ const jerry_length_t args_cnt) /**< arguments length */ { int8_t num0; jerryx_arg_t mapping[] = { jerryx_arg_int8 (&num0, JERRYX_ARG_ROUND, JERRYX_ARG_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), }; jerry_value_t is_ok = jerryx_arg_transform_args (args_p, args_cnt, mapping, ARRAY_SIZE (mapping)); TEST_ASSERT (jerry_value_has_error_flag (is_ok)); jerry_release_value (is_ok); validator_int_count++; return jerry_create_undefined (); } /* test_validator_int3_handler */
jerry_value_t iotjs_uart_set_platform_config(iotjs_uart_t* uart, const jerry_value_t jconfig) { JS_GET_REQUIRED_CONF_VALUE(jconfig, uart->platform_data->device_path, IOTJS_MAGIC_STRING_DEVICE, string); return jerry_create_undefined(); }
static jerry_value_t test_validator_array2_handler (const jerry_value_t func_obj_val __attribute__((unused)), /**< function object */ const jerry_value_t this_val __attribute__((unused)), /**< this value */ const jerry_value_t args_p[], /**< arguments list */ const jerry_length_t args_cnt __attribute__((unused))) /**< arguments length */ { double native1 = 0; bool native2 = false; jerryx_arg_t item_mapping[] = { jerryx_arg_number (&native1, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), jerryx_arg_boolean (&native2, JERRYX_ARG_NO_COERCE, JERRYX_ARG_REQUIRED) }; jerry_value_t is_ok = jerryx_arg_transform_array (args_p[0], item_mapping, ARRAY_SIZE (item_mapping)); TEST_ASSERT (jerry_value_has_error_flag (is_ok)); TEST_ASSERT (native1 == 1); TEST_ASSERT (!native2); validator_array_count++; jerry_release_value (is_ok); return jerry_create_undefined (); } /* test_validator_array2_handler */
static jerry_value_t AfterSync(uv_fs_t* req, int err, const char* syscall_name) { if (err < 0) { jerry_value_t jvalue = iotjs_create_uv_exception(err, syscall_name); jerry_value_t jerror = jerry_create_error_from_value(jvalue, true); return jerror; } switch (req->fs_type) { case UV_FS_CLOSE: break; case UV_FS_OPEN: case UV_FS_READ: case UV_FS_WRITE: return jerry_create_number(err); case UV_FS_FSTAT: case UV_FS_STAT: { uv_stat_t* s = &(req->statbuf); return MakeStatObject(s); } case UV_FS_MKDIR: case UV_FS_RMDIR: case UV_FS_UNLINK: case UV_FS_RENAME: return jerry_create_undefined(); case UV_FS_SCANDIR: { int r; uv_dirent_t ent; uint32_t idx = 0; jerry_value_t ret = jerry_create_array(0); while ((r = uv_fs_scandir_next(req, &ent)) != UV_EOF) { jerry_value_t name = jerry_create_string((const jerry_char_t*)ent.name); iotjs_jval_set_property_by_index(ret, idx, name); jerry_release_value(name); idx++; } return ret; } default: { IOTJS_ASSERT(false); break; } } return jerry_create_undefined(); }
jerry_value_t iotjs_spi_set_platform_config(iotjs_spi_t* spi, const jerry_value_t jconfig) { iotjs_spi_platform_data_t* platform_data = spi->platform_data; JS_GET_REQUIRED_CONF_VALUE(jconfig, platform_data->bus, IOTJS_MAGIC_STRING_BUS, number); return jerry_create_undefined(); }
jerry_value_t iotjs_adc_set_platform_config(iotjs_adc_t* adc, const jerry_value_t jconfig) { iotjs_adc_platform_data_t* platform_data = adc->platform_data; JS_GET_REQUIRED_CONF_VALUE(jconfig, platform_data->pin, IOTJS_MAGIC_STRING_PIN, number); return jerry_create_undefined(); }
jerry_value_t iotjs_i2c_set_platform_config(iotjs_i2c_t* i2c, const jerry_value_t jconfig) { IOTJS_VALIDATED_STRUCT_METHOD(iotjs_i2c_t, i2c); iotjs_i2c_platform_data_t* platform_data = _this->platform_data; DJS_GET_REQUIRED_CONF_VALUE(jconfig, platform_data->bus, IOTJS_MAGIC_STRING_BUS, number); return jerry_create_undefined(); }
static void AfterAsync(uv_fs_t* req) { const jerry_value_t cb = *IOTJS_UV_REQUEST_JSCALLBACK(req); IOTJS_ASSERT(jerry_value_is_function(cb)); jerry_value_t jargs[2] = { 0 }; size_t jargc = 0; if (req->result < 0) { jerry_value_t jerror = iotjs_create_uv_exception(req->result, "open"); jargs[jargc++] = jerror; } else { jargs[jargc++] = jerry_create_null(); switch (req->fs_type) { case UV_FS_CLOSE: { break; } case UV_FS_OPEN: case UV_FS_READ: case UV_FS_WRITE: { jargs[jargc++] = jerry_create_number((double)req->result); break; } case UV_FS_SCANDIR: { int r; uv_dirent_t ent; uint32_t idx = 0; jargs[jargc++] = jerry_create_array(0); while ((r = uv_fs_scandir_next(req, &ent)) != UV_EOF) { jerry_value_t name = jerry_create_string((const jerry_char_t*)ent.name); iotjs_jval_set_property_by_index(jargs[1], idx, name); jerry_release_value(name); idx++; } break; } case UV_FS_FSTAT: case UV_FS_STAT: { uv_stat_t s = (req->statbuf); jargs[jargc++] = MakeStatObject(&s); break; } default: { break; } } } iotjs_invoke_callback(cb, jerry_create_undefined(), jargs, jargc); jerry_release_value(jargs[0]); jerry_release_value(jargs[1]); uv_fs_req_cleanup(req); iotjs_uv_request_destroy((uv_req_t*)req); }
jerry_value_t iotjs_module_get(const char* name) { for (unsigned i = 0; i < iotjs_module_count; i++) { if (!strcmp(name, iotjs_module_ro_data[i].name)) { if (iotjs_module_rw_data[i].jmodule == 0) { iotjs_module_rw_data[i].jmodule = iotjs_module_ro_data[i].fn_register(); } return iotjs_module_rw_data[i].jmodule; } } return jerry_create_undefined(); }
// A client socket wants to connect to this server. // Parameters: // * uv_stream_t* handle - server handle // * int status - status code static void OnConnection(uv_stream_t* handle, int status) { // Server tcp wrapper. iotjs_tcpwrap_t* tcp_wrap = iotjs_tcpwrap_from_handle((uv_tcp_t*)handle); // Tcp object jerry_value_t jtcp = iotjs_tcpwrap_jobject(tcp_wrap); // `onconnection` callback. jerry_value_t jonconnection = iotjs_jval_get_property(jtcp, IOTJS_MAGIC_STRING_ONCONNECTION); IOTJS_ASSERT(jerry_value_is_function(jonconnection)); // The callback takes two parameter // [0] status // [1] client tcp object iotjs_jargs_t args = iotjs_jargs_create(2); iotjs_jargs_append_number(&args, status); if (status == 0) { // Create client socket handle wrapper. jerry_value_t jcreate_tcp = iotjs_jval_get_property(jtcp, IOTJS_MAGIC_STRING_CREATETCP); IOTJS_ASSERT(jerry_value_is_function(jcreate_tcp)); jerry_value_t jclient_tcp = iotjs_jhelper_call_ok(jcreate_tcp, jerry_create_undefined(), iotjs_jargs_get_empty()); IOTJS_ASSERT(jerry_value_is_object(jclient_tcp)); iotjs_tcpwrap_t* tcp_wrap_client = (iotjs_tcpwrap_t*)(iotjs_jval_get_object_native_handle(jclient_tcp)); uv_stream_t* client_handle = (uv_stream_t*)(iotjs_tcpwrap_tcp_handle(tcp_wrap_client)); int err = uv_accept(handle, client_handle); if (err) { iotjs_jargs_destroy(&args); return; } iotjs_jargs_append_jval(&args, jclient_tcp); jerry_release_value(jcreate_tcp); jerry_release_value(jclient_tcp); } iotjs_make_callback(jonconnection, jtcp, &args); jerry_release_value(jonconnection); iotjs_jargs_destroy(&args); }
/* * args_p[0-2] are uint8, args_p[3-5] are int8, args_p[6-8] are uint32, args_p[9-11] are int32. */ static jerry_value_t test_validator_int1_handler (const jerry_value_t func_obj_val __attribute__((unused)), /**< function object */ const jerry_value_t this_val __attribute__((unused)), /**< this value */ const jerry_value_t args_p[], /**< arguments list */ const jerry_length_t args_cnt) /**< arguments length */ { uint8_t num0, num1, num2; int8_t num3, num4, num5; uint32_t num6, num7, num8; int32_t num9, num10, num11; jerryx_arg_t mapping[] = { jerryx_arg_uint8 (&num0, JERRYX_ARG_ROUND, JERRYX_ARG_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), jerryx_arg_uint8 (&num1, JERRYX_ARG_ROUND, JERRYX_ARG_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), jerryx_arg_uint8 (&num2, JERRYX_ARG_ROUND, JERRYX_ARG_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), jerryx_arg_int8 (&num3, JERRYX_ARG_ROUND, JERRYX_ARG_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), jerryx_arg_int8 (&num4, JERRYX_ARG_ROUND, JERRYX_ARG_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), jerryx_arg_int8 (&num5, JERRYX_ARG_ROUND, JERRYX_ARG_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), jerryx_arg_uint32 (&num6, JERRYX_ARG_ROUND, JERRYX_ARG_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), jerryx_arg_uint32 (&num7, JERRYX_ARG_ROUND, JERRYX_ARG_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), jerryx_arg_uint32 (&num8, JERRYX_ARG_ROUND, JERRYX_ARG_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), jerryx_arg_int32 (&num9, JERRYX_ARG_ROUND, JERRYX_ARG_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), jerryx_arg_int32 (&num10, JERRYX_ARG_ROUND, JERRYX_ARG_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), jerryx_arg_int32 (&num11, JERRYX_ARG_ROUND, JERRYX_ARG_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED) }; jerry_value_t is_ok = jerryx_arg_transform_args (args_p, args_cnt, mapping, ARRAY_SIZE (mapping)); TEST_ASSERT (!jerry_value_has_error_flag (is_ok)); TEST_ASSERT (num0 == 0); TEST_ASSERT (num1 == 255); TEST_ASSERT (num2 == 128); TEST_ASSERT (num3 == -128); TEST_ASSERT (num4 == 127); TEST_ASSERT (num5 == -127); TEST_ASSERT (num6 == 0); TEST_ASSERT (num7 == 4294967295); TEST_ASSERT (num8 == 65536); TEST_ASSERT (num9 == -2147483648); TEST_ASSERT (num10 == 2147483647); TEST_ASSERT (num11 == -2147483647); jerry_release_value (is_ok); validator_int_count++; return jerry_create_undefined (); } /* test_validator_int1_handler */
/** * DigitalOut#write (native JavaScript method) * * Writes a binary value to a DigitalOut. * * @param value 1 or 0, specifying whether the output pin is high or low, * respectively * @returns undefined, or an error if invalid arguments are provided. */ DECLARE_CLASS_FUNCTION(DigitalOut, write) { CHECK_ARGUMENT_COUNT(DigitalOut, write, (args_count == 1)); CHECK_ARGUMENT_TYPE_ALWAYS(DigitalOut, write, 0, number); // Extract native DigitalOut pointer uintptr_t ptr_val; jerry_get_object_native_handle(this_obj, &ptr_val); DigitalOut* native_ptr = reinterpret_cast<DigitalOut*>(ptr_val); int arg0 = jerry_get_number_value(args[0]); native_ptr->write(arg0); return jerry_create_undefined(); }
/** * Expose garbage collector to scripts. * * @return undefined. */ jerry_value_t jerryx_handler_gc (const jerry_value_t func_obj_val, /**< function object */ const jerry_value_t this_p, /**< this arg */ const jerry_value_t args_p[], /**< function arguments */ const jerry_length_t args_cnt) /**< number of function arguments */ { (void) func_obj_val; /* unused */ (void) this_p; /* unused */ jerry_gc_mode_t mode = ((args_cnt > 0 && jerry_value_to_boolean (args_p[0])) ? JERRY_GC_SEVERITY_HIGH : JERRY_GC_SEVERITY_LOW); jerry_gc (mode); return jerry_create_undefined (); } /* jerryx_handler_gc */
// Socket close result handler. void AfterClose(uv_handle_t* handle) { iotjs_handlewrap_t* wrap = iotjs_handlewrap_from_handle(handle); // tcp object. jerry_value_t jtcp = iotjs_handlewrap_jobject(wrap); // callback function. jerry_value_t jcallback = iotjs_jval_get_property(jtcp, IOTJS_MAGIC_STRING_ONCLOSE); if (jerry_value_is_function(jcallback)) { iotjs_make_callback(jcallback, jerry_create_undefined(), iotjs_jargs_get_empty()); } jerry_release_value(jcallback); }
void iotjs_binding_initialize() { jundefined = iotjs_jval_create_raw(jerry_create_undefined()); jnull = iotjs_jval_create_raw(jerry_create_null()); jtrue = iotjs_jval_create_raw(jerry_create_boolean(true)); jfalse = iotjs_jval_create_raw(jerry_create_boolean(false)); jglobal = iotjs_jval_create_raw(jerry_get_global_object()); IOTJS_ASSERT(iotjs_jval_is_object(&jglobal)); iotjs_jargs_initialize_empty(&jargs_empty); #ifdef NDEBUG assert(sizeof(iotjs_jval_t) == sizeof(jerry_value_t)); #endif }
/** * Calling jerryx_arg_transform_object_properties indirectly by * using jerryx_arg_object_properties. */ static jerry_value_t test_validator_prop2_handler (const jerry_value_t func_obj_val __attribute__((unused)), /**< function object */ const jerry_value_t this_val __attribute__((unused)), /**< this value */ const jerry_value_t args_p[], /**< arguments list */ const jerry_length_t args_cnt) /**< arguments length */ { bool native1 = false; double native2 = 0; double native3 = 3; jerryx_arg_object_props_t prop_info; const char *name_p[] = { "prop1", "prop2", "prop3" }; jerryx_arg_t prop_mapping[] = { jerryx_arg_boolean (&native1, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), jerryx_arg_number (&native2, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), jerryx_arg_number (&native3, JERRYX_ARG_COERCE, JERRYX_ARG_OPTIONAL) }; prop_info.name_p = (const jerry_char_t **) name_p; prop_info.name_cnt = 3; prop_info.c_arg_p = prop_mapping; prop_info.c_arg_cnt = 3; jerryx_arg_t mapping[] = { jerryx_arg_object_properties (&prop_info, JERRYX_ARG_OPTIONAL), }; jerry_value_t is_ok = jerryx_arg_transform_args (args_p, args_cnt, mapping, ARRAY_SIZE (mapping)); TEST_ASSERT (!jerry_value_has_error_flag (is_ok)); if (validator_prop_count == 1) { TEST_ASSERT (native1); TEST_ASSERT (native2 == 1.5); TEST_ASSERT (native3 == 3); } validator_prop_count++; return jerry_create_undefined (); } /* test_validator_prop2_handler */
static jerry_value_t test_validator_int2_handler (const jerry_value_t func_obj_val __attribute__((unused)), /**< function object */ const jerry_value_t this_val __attribute__((unused)), /**< this value */ const jerry_value_t args_p[], /**< arguments list */ const jerry_length_t args_cnt) /**< arguments length */ { int8_t num0, num1, num2, num3, num4, num5, num6, num7, num8, num9; num8 = 123; num9 = 123; jerryx_arg_t mapping[] = { jerryx_arg_int8 (&num0, JERRYX_ARG_ROUND, JERRYX_ARG_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), jerryx_arg_int8 (&num1, JERRYX_ARG_FLOOR, JERRYX_ARG_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), jerryx_arg_int8 (&num2, JERRYX_ARG_CEIL, JERRYX_ARG_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), jerryx_arg_int8 (&num3, JERRYX_ARG_ROUND, JERRYX_ARG_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), jerryx_arg_int8 (&num4, JERRYX_ARG_FLOOR, JERRYX_ARG_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), jerryx_arg_int8 (&num5, JERRYX_ARG_CEIL, JERRYX_ARG_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), jerryx_arg_int8 (&num6, JERRYX_ARG_ROUND, JERRYX_ARG_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), jerryx_arg_int8 (&num7, JERRYX_ARG_ROUND, JERRYX_ARG_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), jerryx_arg_int8 (&num8, JERRYX_ARG_ROUND, JERRYX_ARG_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), jerryx_arg_int8 (&num9, JERRYX_ARG_ROUND, JERRYX_ARG_NO_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), }; jerry_value_t is_ok = jerryx_arg_transform_args (args_p, args_cnt, mapping, ARRAY_SIZE (mapping)); TEST_ASSERT (jerry_value_has_error_flag (is_ok)); TEST_ASSERT (num0 == -2); TEST_ASSERT (num1 == -2); TEST_ASSERT (num2 == -1); TEST_ASSERT (num3 == 2); TEST_ASSERT (num4 == 1); TEST_ASSERT (num5 == 2); TEST_ASSERT (num6 == 127); TEST_ASSERT (num7 == -128); TEST_ASSERT (num8 == 127); TEST_ASSERT (num9 == 123); jerry_release_value (is_ok); validator_int_count++; return jerry_create_undefined (); } /* test_validator_int2_handler */
static void AfterShutdown(uv_shutdown_t* req, int status) { iotjs_shutdown_reqwrap_t* req_wrap = (iotjs_shutdown_reqwrap_t*)(req->data); iotjs_tcpwrap_t* tcp_wrap = (iotjs_tcpwrap_t*)(req->handle->data); IOTJS_ASSERT(req_wrap != NULL); IOTJS_ASSERT(tcp_wrap != NULL); // function onShutdown(status) jerry_value_t jonshutdown = iotjs_shutdown_reqwrap_jcallback(req_wrap); IOTJS_ASSERT(jerry_value_is_function(jonshutdown)); iotjs_jargs_t args = iotjs_jargs_create(1); iotjs_jargs_append_number(&args, status); iotjs_make_callback(jonshutdown, jerry_create_undefined(), &args); iotjs_jargs_destroy(&args); iotjs_shutdown_reqwrap_dispatched(req_wrap); }
static jerry_value_t test_validator_array1_handler (const jerry_value_t func_obj_val __attribute__((unused)), /**< function object */ const jerry_value_t this_val __attribute__((unused)), /**< this value */ const jerry_value_t args_p[], /**< arguments list */ const jerry_length_t args_cnt) /**< arguments length */ { double native1 = 0; double native2 = 0; double native3 = 0; jerryx_arg_array_items_t arr_info; jerryx_arg_t item_mapping[] = { jerryx_arg_number (&native1, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), jerryx_arg_number (&native2, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), jerryx_arg_number (&native3, JERRYX_ARG_COERCE, JERRYX_ARG_OPTIONAL) }; arr_info.c_arg_p = item_mapping; arr_info.c_arg_cnt = 3; jerryx_arg_t mapping[] = { jerryx_arg_array (&arr_info, JERRYX_ARG_OPTIONAL), }; jerry_value_t is_ok = jerryx_arg_transform_args (args_p, args_cnt, mapping, ARRAY_SIZE (mapping)); TEST_ASSERT (!jerry_value_has_error_flag (is_ok)); if (validator_array_count == 0) { TEST_ASSERT (native1 == 1); TEST_ASSERT (native2 == 2); TEST_ASSERT (native3 == 0); } validator_array_count++; return jerry_create_undefined (); } /* test_validator_array1_handler */
void AfterWrite(uv_write_t* req, int status) { iotjs_write_reqwrap_t* req_wrap = (iotjs_write_reqwrap_t*)(req->data); iotjs_tcpwrap_t* tcp_wrap = (iotjs_tcpwrap_t*)(req->handle->data); IOTJS_ASSERT(req_wrap != NULL); IOTJS_ASSERT(tcp_wrap != NULL); // Take callback function object. jerry_value_t jcallback = iotjs_write_reqwrap_jcallback(req_wrap); // Only parameter is status code. iotjs_jargs_t args = iotjs_jargs_create(1); iotjs_jargs_append_number(&args, status); // Make callback. iotjs_make_callback(jcallback, jerry_create_undefined(), &args); // Destroy args iotjs_jargs_destroy(&args); // Release request wrapper. iotjs_write_reqwrap_dispatched(req_wrap); }
// Connection request result handler. static void AfterConnect(uv_connect_t* req, int status) { iotjs_connect_reqwrap_t* req_wrap = (iotjs_connect_reqwrap_t*)(req->data); IOTJS_ASSERT(req_wrap != NULL); // Take callback function object. // function afterConnect(status) jerry_value_t jcallback = iotjs_connect_reqwrap_jcallback(req_wrap); IOTJS_ASSERT(jerry_value_is_function(jcallback)); // Only parameter is status code. iotjs_jargs_t args = iotjs_jargs_create(1); iotjs_jargs_append_number(&args, status); // Make callback. iotjs_make_callback(jcallback, jerry_create_undefined(), &args); // Destroy args iotjs_jargs_destroy(&args); // Release request wrapper. iotjs_connect_reqwrap_dispatched(req_wrap); }
/** * The handler should have following arguments: * this: with native pointer whose type is bind_a_info. * arg1: should pass the custom tranform function. */ static jerry_value_t test_validator2_handler (const jerry_value_t func_obj_val __attribute__((unused)), /**< function object */ const jerry_value_t this_val, /**< this value */ const jerry_value_t args_p[], /**< arguments list */ const jerry_length_t args_cnt) /**< arguments length */ { my_type_a_t *thing_p; jerryx_arg_t mapping[] = { /* this should has native pointer, whose type is thing_a_info */ jerryx_arg_native_pointer ((void **) &thing_p, &thing_a_info, JERRYX_ARG_REQUIRED), /* custom tranform function */ jerryx_arg_custom (NULL, 5, my_custom_transform) }; jerry_value_t is_ok = jerryx_arg_transform_this_and_args (this_val, args_p, args_cnt, mapping, ARRAY_SIZE (mapping)); if (validator2_count == 0) { TEST_ASSERT (!jerry_value_has_error_flag (is_ok)); TEST_ASSERT (thing_p == &my_thing_a); TEST_ASSERT (thing_p->x == 1); } else { TEST_ASSERT (jerry_value_has_error_flag (is_ok)); } jerry_release_value (is_ok); validator2_count++; return jerry_create_undefined (); } /* test_validator2_handler */
// This function should be able to print utf8 encoded string // as utf8 is internal string representation in Jerryscript static jerry_value_t Print(const jerry_value_t* jargv, const jerry_length_t jargc, FILE* out_fd) { JS_CHECK_ARGS(1, string); iotjs_string_t msg = JS_GET_ARG(0, string); const char* str = iotjs_string_data(&msg); unsigned str_len = iotjs_string_size(&msg); unsigned idx = 0; if (iotjs_console_out) { int level = (out_fd == stdout) ? DBGLEV_INFO : DBGLEV_ERR; iotjs_console_out(level, "%s", str); } else { for (idx = 0; idx < str_len; idx++) { if (str[idx] != 0) { fprintf(out_fd, "%c", str[idx]); } else { fprintf(out_fd, "\\u0000"); } } } iotjs_string_destroy(&msg); return jerry_create_undefined(); }
/** * Provide a 'print' implementation for scripts. * * The routine converts all of its arguments to strings and outputs them * char-by-char using jerryx_port_handler_print_char. * * The NUL character is output as "\u0000", other characters are output * bytewise. * * Note: * This implementation does not use standard C `printf` to print its * output. This allows more flexibility but also extends the core * JerryScript engine port API. Applications that want to use * `jerryx_handler_print` must ensure that their port implementation also * provides `jerryx_port_handler_print_char`. * * @return undefined - if all arguments could be converted to strings, * error - otherwise. */ jerry_value_t jerryx_handler_print (const jerry_value_t func_obj_val, /**< function object */ const jerry_value_t this_p, /**< this arg */ const jerry_value_t args_p[], /**< function arguments */ const jerry_length_t args_cnt) /**< number of function arguments */ { (void) func_obj_val; /* unused */ (void) this_p; /* unused */ static const char *null_str = "\\u0000"; jerry_value_t ret_val = jerry_create_undefined (); for (jerry_length_t arg_index = 0; jerry_value_is_undefined (ret_val) && arg_index < args_cnt; arg_index++) { jerry_value_t str_val = jerry_value_to_string (args_p[arg_index]); if (!jerry_value_is_error (str_val)) { if (arg_index != 0) { jerryx_port_handler_print_char (' '); } jerry_size_t substr_size; jerry_length_t substr_pos = 0; jerry_char_t substr_buf[256]; while ((substr_size = jerry_substring_to_char_buffer (str_val, substr_pos, substr_pos + 256, substr_buf, 256)) != 0) { #ifdef JERRY_DEBUGGER jerry_debugger_send_output (substr_buf, substr_size, JERRY_DEBUGGER_OUTPUT_OK); #endif /* JERRY_DEBUGGER */ for (jerry_size_t chr_index = 0; chr_index < substr_size; chr_index++) { char chr = (char) substr_buf[chr_index]; if (chr == '\0') { for (jerry_size_t null_index = 0; null_str[null_index] != 0; null_index++) { jerryx_port_handler_print_char (null_str[null_index]); } } else { jerryx_port_handler_print_char (chr); } } substr_pos += substr_size; } jerry_release_value (str_val); } else { ret_val = str_val; } } jerryx_port_handler_print_char ('\n'); return ret_val; } /* jerryx_handler_print */
int main (void) { jerry_init (JERRY_INIT_EMPTY); /* Render strict-equal as a function. */ jerry_value_t parse_result = jerry_parse (NULL, 0, strict_equal_source, sizeof (strict_equal_source) - 1, JERRY_PARSE_STRICT_MODE); TEST_ASSERT (!jerry_value_is_error (parse_result)); jerry_value_t strict_equal = jerry_run (parse_result); TEST_ASSERT (!jerry_value_is_error (strict_equal)); jerry_release_value (parse_result); /* Create an object and associate some native data with it. */ jerry_value_t object = jerry_create_object (); jerry_set_object_native_pointer (object, &test_data, &test_info); /* Retrieve the object by its native pointer. */ jerry_value_t found_object; TEST_ASSERT (jerry_objects_foreach_by_native_info (&test_info, find_test_object_by_data, &found_object)); jerry_value_t args[2] = {object, found_object}; /* Assert that the correct object was retrieved. */ jerry_value_t undefined = jerry_create_undefined (); jerry_value_t strict_equal_result = jerry_call_function (strict_equal, undefined, args, 2); TEST_ASSERT (jerry_value_is_boolean (strict_equal_result) && jerry_get_boolean_value (strict_equal_result)); jerry_release_value (strict_equal_result); jerry_release_value (found_object); jerry_release_value (object); /* Collect garbage. */ jerry_gc (JERRY_GC_SEVERITY_LOW); /* Attempt to retrieve the object by its native pointer again. */ TEST_ASSERT (!jerry_objects_foreach_by_native_info (&test_info, find_test_object_by_data, &found_object)); /* Create an object and set a property on it. */ object = jerry_create_object (); jerry_value_t property_name = jerry_create_string ((jerry_char_t *) "xyzzy"); jerry_value_t property_value = jerry_create_number (42); jerry_release_value (jerry_set_property (object, property_name, property_value)); jerry_release_value (property_value); /* Retrieve the object by the presence of its property, placing it at args[1]. */ args[0] = property_name; TEST_ASSERT (jerry_objects_foreach (find_test_object_by_property, args)); /* Assert that the right object was retrieved and release both the original reference to it and the retrieved one. */ args[0] = object; strict_equal_result = jerry_call_function (strict_equal, undefined, args, 2); TEST_ASSERT (jerry_value_is_boolean (strict_equal_result) && jerry_get_boolean_value (strict_equal_result)); jerry_release_value (strict_equal_result); jerry_release_value (args[0]); jerry_release_value (args[1]); /* Collect garbage. */ jerry_gc (JERRY_GC_SEVERITY_LOW); /* Attempt to retrieve the object by the presence of its property again. */ args[0] = property_name; TEST_ASSERT (!jerry_objects_foreach (find_test_object_by_property, args)); jerry_release_value (property_name); jerry_release_value (undefined); jerry_release_value (strict_equal); jerry_cleanup (); } /* main */