void iotjs_jhandler_throw(iotjs_jhandler_t* jhandler, const iotjs_jval_t* err) { IOTJS_VALIDATED_STRUCT_METHOD(iotjs_jhandler_t, jhandler); #ifndef NDEBUG IOTJS_ASSERT(_this->finished == false); #endif iotjs_jval_destroy(&_this->jret); _this->jret = iotjs_jval_create_copied(err); jerry_value_set_error_flag(&_this->jret.unsafe.value); #ifndef NDEBUG _this->finished = true; #endif }
static jerry_value_t AfterSync(uv_fs_t* req, int err, const char* syscall_name) { if (err < 0) { jerry_value_t jerror = iotjs_create_uv_exception(err, syscall_name); jerry_value_set_error_flag(&jerror); 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(); }
int main (void) { TEST_INIT (); jerry_init (JERRY_INIT_EMPTY); jerry_value_t global = jerry_get_global_object (); jerry_value_t callback_name = jerry_create_string ((jerry_char_t *) "callback"); jerry_value_t func = jerry_create_external_function (callback_func); jerry_value_t res = jerry_set_property (global, callback_name, func); TEST_ASSERT (!jerry_value_is_error (res)); jerry_release_value (res); jerry_release_value (func); jerry_release_value (callback_name); jerry_release_value (global); const char *inf_loop_code_src_p = ("while(true) {\n" " with ({}) {\n" " try {\n" " callback();\n" " } catch (e) {\n" " } finally {\n" " }\n" " }\n" "}"); jerry_value_t parsed_code_val = jerry_parse (NULL, 0, (jerry_char_t *) inf_loop_code_src_p, strlen (inf_loop_code_src_p), JERRY_PARSE_NO_OPTS); TEST_ASSERT (!jerry_value_is_error (parsed_code_val)); res = jerry_run (parsed_code_val); TEST_ASSERT (jerry_value_is_abort (res)); jerry_release_value (res); jerry_release_value (parsed_code_val); inf_loop_code_src_p = ("function f() {" " while(true) {\n" " with ({}) {\n" " try {\n" " callback();\n" " } catch (e) {\n" " } finally {\n" " }\n" " }\n" " }" "}\n" "function g() {\n" " for (a in { x:5 })\n" " f();\n" "}\n" "\n" "with({})\n" " f();\n"); parsed_code_val = jerry_parse (NULL, 0, (jerry_char_t *) inf_loop_code_src_p, strlen (inf_loop_code_src_p), JERRY_PARSE_NO_OPTS); TEST_ASSERT (!jerry_value_is_error (parsed_code_val)); res = jerry_run (parsed_code_val); TEST_ASSERT (jerry_value_is_abort (res)); jerry_release_value (res); jerry_release_value (parsed_code_val); /* Test flag overwrites. */ jerry_value_t value = jerry_create_string ((jerry_char_t *) "Error description"); TEST_ASSERT (!jerry_value_is_abort (value)); TEST_ASSERT (!jerry_value_is_error (value)); jerry_value_set_abort_flag (&value); TEST_ASSERT (jerry_value_is_abort (value)); TEST_ASSERT (jerry_value_is_error (value)); jerry_value_set_error_flag (&value); TEST_ASSERT (!jerry_value_is_abort (value)); TEST_ASSERT (jerry_value_is_error (value)); jerry_value_set_abort_flag (&value); TEST_ASSERT (jerry_value_is_abort (value)); TEST_ASSERT (jerry_value_is_error (value)); jerry_release_value (value); jerry_cleanup (); return 0; } /* main */