
语言运行时嵌入式物联网编译器【免费下载链接】jerryscriptUltra-lightweight JavaScript engine for the Internet of Things.项目地址https://gitcode.com/gh_mirrors/je/jerryscript点击查看免费下载本篇指南以 JerryScript 官方迁移文档docs/16.MIGRATION-GUIDE.md为主体完整梳理从 1.0 到 2.0 版本间的 API 变更包括被删除/重命名的头文件、类型、函数与配置宏并为每一项变更提供Before1.0 写法与After2.0 写法的可直接编译对照代码。读者完成后将能够识别并修复旧代码中的全部破坏性 API 调用、正确使用新的错误处理与原生指针Native Pointer机制、迁移快照生成与 GC 调用方式并了解 2.x 到 3.x 的 API 大规模重命名背景。所有新 API 的完整签名可对照 docs/02.API-REFERENCE.md 查阅。1. 迁移背景与总体思路JerryScript 1.0 与 2.0 之间的主要变化集中在API 函数的移除与签名调整上。开发团队在设计 2.0 时遵循了一个重要原则尽量最小化 API 函数与类型的变动。因此绝大多数变更都是一对一的替换关系每个被移除或修改的 API 方法都可以在本指南中找到对应的before/after代码示例迁移成本被控制在可接受的范围内。迁移工作的总思路可以概括为三步对照速查表先使用第 2 节的短列表快速定位项目中用到了哪些已删除/已重命名的符号逐项替换对每个符号按第 36 节的 before/after 示例进行替换处理新 API 与 Port API根据需要补充实现新版本引入的功能如 Promise、TypedArray、多原生指针并更新移植层Port API的时区函数。2. 删除/重命名清单速查2.1 头文件变更被删除的头文件jerry-internal.h—— 该内部头文件在 2.0 中不再对外暴露相关内部实现被收纳进核心源码目录。被重命名的头文件旧名称1.0新名称2.0jerry-api.hjerryscript.hjerry-port.hjerryscript-port.h在 2.0 中主头文件为 jerry-core/include/jerryscript.h它聚合了 jerryscript-core.h核心 API、jerryscript-snapshot.h快照 API等子头文件移植层头文件为 jerryscript-port.h。2.2 删除的 API 类型旧类型1.0替换方案2.0jerry_char_ptr_t直接使用jerry_char_t *jerry_object_free_callback_tjerry_object_native_info_t结构化原生信息描述jerry_char_t在 jerryscript-types.h 中定义为uint8_t其指针形式jerry_char_t *即取代了 1.0 中冗余的jerry_char_ptr_t别名。2.3 删除的 API 方法及替换目标被删除方法1.0替换方法2.0jerry_get_memory_limits移除内存信息获取方式改为通过上下文/配置管理jerry_get_object_native_handlejerry_get_object_native_pointerjerry_set_object_native_handlejerry_set_object_native_pointerjerry_value_set_abort_flagjerry_create_abort_from_valuejerry_value_has_abort_flagjerry_value_is_abortjerry_value_set_error_flagjerry_create_error_from_valuejerry_value_has_error_flagjerry_value_is_errorjerry_value_clear_error_flagjerry_get_value_from_errorjerry_get_value_without_error_flagjerry_get_value_from_errorjerry_parse_and_save_snapshotjerry_generate_snapshotjerry_parse_and_save_function_snapshotjerry_generate_function_snapshot2.4 删除的配置宏以下配置宏在 2.0 中被移除CONFIG_MEM_DATA_LIMIT_MINUS_HEAP_SIZECONFIG_MEM_STACK_LIMITCONFIG_VM_STACK_FRAME_INLINED_VALUES_NUMBERCONFIG_ECMA_GLOBAL_ENVIRONMENT_DECLARATIVE同时所有CONFIG_..系列宏统一改名为JERRY_前缀格式。当前版本的完整可配置宏清单可以在 jerry-core/config.h 中查看例如内存上限JERRY_MEM_HEAP_LIMIT、特性开关JERRY_ESNEXT、JERRY_DEBUGGER等。在 3.0 中这些宏进一步演进为JERRY_BUILTIN_*、JERRY_GC_*等细分命名。迁移时凡是代码中出现的CONFIG_前缀宏都需要改为对应的JERRY_前缀形式。3. 错误处理函数的迁移重点错误处理是 1.0 → 2.0 中最重要的 API 变更区域。1.0 时代通过修改标志位的方式在jerry_value_t上就地打上/清除错误与 abort 标记2.0 改为显式构造错误/abort 值返回值所有权语义更清晰。3.1jerry_value_set_abort_flag→jerry_create_abort_from_value新函数jerry_create_abort_from_value的第二个参数bool take_ownership控制调用后第一个参数value是否仍然可用传true调用后原value的所有权转移给新的 abort 值原变量不得再使用只需释放 abort传false调用后abort与value都可用两者都需要单独释放。Before1.0{ jerry_value_t value; // create or acquire value // ... jerry_value_set_abort_flag (value); jerry_release_value (value); }After2.0转移所有权{ jerry_value_t value; // create or acquire value // ... jerry_value_t abort jerry_create_abort_from_value (value, true); // using the value variable after release is invalid jerry_release_value (abort); }After2.0保留原值{ jerry_value_t value; ... // create or acquire value jerry_value_t abort jerry_create_abort_from_value (value, false); // both abort and value can be used and must be released when they are no longer needed jerry_release_value (abort); jerry_release_value (value); }3.2jerry_value_has_abort_flag→jerry_value_is_abort仅改名为jerry_value_is_abort参数与返回值语义不变。该函数在 jerryscript-core.h 中声明为bool jerry_value_is_abort (const jerry_value_t value);。Before{ jerry_value_t value; // create or acquire value // ... if (jerry_value_has_abort_flag (value)) { // ... } jerry_release_value (value); }After{ jerry_value_t value; // create or acquire value // ... if (jerry_value_is_abort (value)) { // ... } jerry_release_value (value); }3.3jerry_value_set_error_flag→jerry_create_error_from_value替换逻辑与jerry_create_abort_from_value完全对称第二个参数同样控制value的所有权转移。文档中该函数参考 API Reference。Before{ jerry_value_t value; // create or acquire value // ... jerry_value_set_error_flag (value); jerry_release_value (value); }After转移所有权{ jerry_value_t value; // create or acquire value // ... jerry_value_t error jerry_create_error_from_value (value, true); // using the value variable after release is invalid jerry_release_value (error); }After保留原值{ jerry_value_t value; // create or acquire value // ... jerry_value_t error jerry_create_error_from_value (value, false); // both error and value can be used and must be released when they are no longer needed jerry_release_value (error); jerry_release_value (value); }3.4jerry_value_has_error_flag→jerry_value_is_error同名替换声明见 jerryscript-core.hbool jerry_value_is_error (const jerry_value_t value);。Before{ jerry_value_t value; // create or acquire value // ... if (jerry_value_has_error_flag (value)) { // ... } jerry_release_value (value); }After{ jerry_value_t value; // create or acquire value // ... if (jerry_value_is_error (value)) { // ... } jerry_release_value (value); }3.5jerry_value_clear_error_flag与jerry_get_value_without_error_flag→jerry_get_value_from_error这两个 1.0 函数在 2.0 中被合并为单一的jerry_get_value_from_error。注意其第二个参数控制是否在取出真实值的同时释放传入的错误值。Before{ jerry_value_t value; // create or acquire value // ... jerry_value_set_error_flag (value); jerry_value_clear_error_flag (value); // or jerry_value_t real_value jerry_get_value_without_error_flag (value); jerry_release_value (value); jerry_release_value (real_value); }After{ jerry_value_t value; // create or acquire value // ... jerry_value_t error jerry_create_error_from_value (value, true); jerry_value_t real_value jerry_get_value_from_error (error, true); jerry_release_value (real_value); }所有权小结2.0 的错误处理 API 围绕jerry_value_t的所有权转移设计了统一的二参数模式。迁移时最容易出错的地方是第二个参数传错导致双重释放或内存泄漏建议在替换时逐条核对true表示调用方不再持有原值false表示双方都需要释放。4. 其他被修改的函数4.1jerry_register_magic_strings类型从jerry_char_ptr_t改为jerry_char_t *该函数用于注册魔法字符串magic strings即在源码中高频出现、被静态化存储以节省内存的字符串常量。变更点是第一个参数的基础类型由jerry_char_ptr_t改为jerry_char_t *。当前仓库中的声明为 jerryscript-core.hvoid jerry_register_magic_strings (const jerry_char_t *const *ext_strings_p, uint32_t count, const jerry_length_t *lengths_p);注意两个前提条件两个版本通用数组必须是static的因为该函数不会复制字符串内容字符串条目必须先按长度升序排序再按字典序排序。Before{ // must be static, because jerry_register_magic_strings does not copy // the items must be sorted by size at first, then lexicographically static const jerry_char_ptr_t magic_string_items[] { (const jerry_char_ptr_t) magicstring1, (const jerry_char_ptr_t) magicstring2, (const jerry_char_ptr_t) magicstring3 }; uint32_t num_magic_string_items (uint32_t) (sizeof (magic_string_items) / sizeof (jerry_char_ptr_t)); // must be static, because jerry_register_magic_strings does not copy static const jerry_length_t magic_string_lengths[] { 12, 12, 12 }; jerry_register_magic_strings (magic_string_items, num_magic_string_items, magic_string_lengths); }After{ // must be static, because jerry_register_magic_strings does not copy // the items must be sorted by size at first, then lexicographically static const jerry_char_t *magic_string_items[] { (const jerry_char_t *) magicstring1, (const jerry_char_t *) magicstring2, (const jerry_char_t *) magicstring3 }; uint32_t num_magic_string_items (uint32_t) (sizeof (magic_string_items) / sizeof (jerry_char_t *)); // must be static, because jerry_register_magic_strings does not copy static const jerry_length_t magic_string_lengths[] { 12, 12, 12 }; jerry_register_magic_strings (magic_string_items, num_magic_string_items, magic_string_lengths); }4.2jerry_parse_and_save_snapshot→jerry_generate_snapshot快照Snapshot是 JerryScript 的核心特性之一将源码预先编译为字节码缓冲运行时直接加载省去解析时间非常适合物联网场景。2.0 的新函数以返回值报告生成结果若生成过程中出现问题如语法错误则返回错误对象若成功则返回一个数字值其数值即快照的字节数。底层实现在 jerry-snapshot.c 的jerry_generate_snapshot中完整签名见 jerryscript-snapshot.h。Before{ static uint32_t global_mode_snapshot_buffer[256]; const jerry_char_t *code_to_snapshot_p (const jerry_char_t *) (function () { return string from snapshot; }) ();; size_t global_mode_snapshot_size jerry_parse_and_save_snapshot (code_to_snapshot_p, strlen ((const char *) code_to_snapshot_p), true, false, global_mode_snapshot_buffer, sizeof (global_mode_snapshot_buffer) / sizeof (uint32_t)); // use global_mode_snapshot_buffer }After{ static uint32_t global_mode_snapshot_buffer[256]; const jerry_char_t *code_to_snapshot_p (const jerry_char_t *) (function () { return string from snapshot; }) ();; jerry_value_t generate_result; generate_result jerry_generate_snapshot (NULL, 0, code_to_snapshot_p, strlen ((const char *) code_to_snapshot_p), global_mode_snapshot_buffer, sizeof (global_mode_snapshot_buffer) / sizeof (uint32_t)); if (jerry_value_is_error (generate_result)) { // There was a problem during snapshot generation, for example there is a SyntaxError. // Use the generate_result to check the error. } else { size_t snapshot_size (size_t) jerry_get_number_value (generate_result); // use global_mode_snapshot_buffer } jerry_release_value (generate_result); }新签名在开头多出的两个参数NULL, 0分别对应预编译的代码值与生成选项直接传NULL, 0表示传入的是原始源码而非预编译结果。4.3jerry_parse_and_save_function_snapshot→jerry_generate_function_snapshot函数快照用于将单个函数含参数列表预编译为快照。与上一个函数相同的错误返回约定错误对象表示失败数字值表示快照字节数。Before{ static uint32_t func_snapshot_buffer[1024]; const jerry_char_t *args_p (const jerry_char_t *) a, b; const jerry_char_t *src_p (const jerry_char_t *) return a b;; size_t func_snapshot_size jerry_parse_and_save_function_snapshot (src_p, strlen ((const char *) src_p), args_p, strlen ((const char *) args_p), false, func_snapshot_buffer, sizeof (func_snapshot_buffer) / sizeof (uint32_t)); // check function_snapshot_size and use func_snapshot_buffer }After{ static uint32_t func_snapshot_buffer[1024]; const jerry_char_t *args_p (const jerry_char_t *) a, b; const jerry_char_t *src_p (const jerry_char_t *) return a b;; jerry_value_t generate_result; generate_result jerry_generate_function_snapshot (NULL, 0, src_p, strlen ((const char *) src_p), args_p, strlen ((const char *) args_p), 0, func_snapshot_buffer, sizeof (func_snapshot_buffer) / sizeof (uint32_t)); if (jerry_value_is_error (generate_result)) { // There was a problem during snapshot generation, for example there is a SyntaxError. // Use the generate_result to check the error. } else { size_t snapshot_size (size_t) jerry_get_number_value (generate_result); // use func_snapshot_buffer } jerry_release_value (generate_result) }4.4jerry_gc新增压力参数jerry_gc_mode_tjerry_gc被修改为接收一个表示GC 压力pressure的参数。当前仓库中该接口已演进为 jerryscript-core.h 的void jerry_heap_gc (jerry_gc_mode_t mode);压力枚举jerry_gc_mode_t定义在 jerryscript-types.htypedef enum { JERRY_GC_PRESSURE_LOW, /** free unused objects, but keep memory */ JERRY_GC_PRESSURE_HIGH /** free as much memory as possible */ } jerry_gc_mode_t;JERRY_GC_PRESSURE_LOW仅释放不再使用的对象尽量保留内存以备复用适合常规时机调用JERRY_GC_PRESSURE_HIGH尽可能多地释放内存适合内存告急时调用。Before{ jerry_gc (); }After{ jerry_gc (JERRY_GC_PRESSURE_LOW); }说明jerry_gc_mode_t的两个取值在 3.0 中被重命名为JERRY_GC_PRESSURE_LOW/HIGH的细分枚举即上文 jerryscript-types.h 中展示的形式2.0 时期对应为JERRY_GC_PRESSURE_NONE与JERRY_GC_PRESSURE_HIGH等命名迁移时以当前头文件为准。4.5jerry_eval第三个参数从bool改为jerry_parse_opts_tjerry_eval的第三个参数由布尔值改为解析选项位掩码jerry_parse_opts_t以支持更丰富的解析行为如JERRY_PARSE_STRICT_MODE、JERRY_PARSE_MODULE等。当前声明为 jerryscript-core.hjerry_value_t jerry_eval (const jerry_char_t *source_p, size_t source_size, uint32_t flags);其中JERRY_PARSE_NO_OPTS 0无任何选项定义在 jerryscript-types.h。Beforeconst jerry_char_t *str_to_eval (const jerry_char_t *) 1 1; jerry_value_t ret_val jerry_eval (str_to_eval, strlen ((const char *) str_to_eval), false);Afterconst jerry_char_t *str_to_eval (const jerry_char_t *) 1 1; jerry_value_t ret_val jerry_eval (str_to_eval, strlen ((const char *) str_to_eval), JERRY_PARSE_NO_OPTS);原false对应的就是JERRY_PARSE_NO_OPTS若原来传true严格模式则改为JERRY_PARSE_STRICT_MODE。5. Port API 迁移时区处理5.1jerry_port_get_time_zone→jerry_port_get_local_time_zone_adjustment1.0 的移植层时区接口存在设计缺陷即使宿主系统具备完善的时区能力旧接口也无法正确处理时区问题背景见 JerryScript 官方 issue #1661。2.0 将接口改为基于 Unix 毫秒时间戳计算本地时区偏移的新形式新函数为jerry_port_get_local_time_zone_adjustment完整描述见 docs/05.PORT-API.md。当前仓库的 Unix 移植实现位于 jerry-port/unix/jerry-port-unix-date.cWindows 实现位于 jerry-port/win/jerry-port-win-date.c。下面是两个版本的默认实现对照Before1.0bool jerry_port_get_time_zone (jerry_time_zone_t *tz_p) { struct timeval tv; struct timezone tz; /* gettimeofday may not fill tz, so zero-initializing */ tz.tz_minuteswest 0; tz.tz_dsttime 0; if (gettimeofday (tv, tz) ! 0) { return false; } tz_p-offset tz.tz_minuteswest; tz_p-daylight_saving_time tz.tz_dsttime 0 ? 1 : 0; return true; } /* jerry_port_get_time_zone */After2.0double jerry_port_get_local_time_zone_adjustment (double unix_ms, bool is_utc) { struct tm tm; time_t now (time_t) (unix_ms / 1000); localtime_r (now, tm); if (!is_utc) { now - tm.tm_gmtoff; localtime_r (now, tm); } return ((double) tm.tm_gmtoff) * 1000; } /* jerry_port_get_local_time_zone_adjustment */新函数签名中unix_msUnix 毫秒时间戳is_utc指示当前处理的日期时间是否以 UTC 表示用于决定是否需要在计算前把本地时间先还原为 UTC 再求偏移返回值本地时区相对 UTC 的偏移量单位为毫秒。6. 原生指针Native Pointer机制迁移1.0 中每个jerry_value_t对象只能关联一个原生句柄native handle且回调类型为简单的jerry_object_free_callback_t。2.0 中该机制被重新设计允许为同一个 JS 对象注册多个原生信息native info每个原生信息通过jerry_object_native_info_t结构体描述并作为后续读写操作的类型标签进行区分。涉及的三处替换旧1.0新2.0jerry_object_free_callback_t回调类型jerry_object_native_info_t结构体含free_cb成员jerry_get_object_native_handlejerry_get_object_native_pointerjerry_set_object_native_handlejerry_set_object_native_pointer当前仓库中jerry_object_native_info_t及相关操作jerry_object_get_native_ptr、jerry_object_has_native_ptr、jerry_object_delete_native_ptr声明见 jerryscript-core.h。Before1.0struct { int data; } my_info; static void handler_construct_freecb (uintptr_t native_p) { // Invoked when the JS object is released and the // native data should be freed. struct my_info *info (struct my_info *) native_p; free (info); } void demo (void) { jerry_value_t this_val; // create or acquire this_val // ... struct my_info *info (struct my_info *) malloc (sizeof (struct my_info)); info-data 11; // setting the native handle jerry_set_object_native_handle (this_val, (uintptr_t) info, handler_construct_freecb); // ... // reading back the native handle uintptr_t ptr (uintptr_t) NULL; bool is_ok jerry_get_object_native_handle (this_val, ptr); if (is_ok) { struct my_info *obj_info (struct my_info *) ptr; // use obj_info } }After2.0struct { int data; } my_info; static void handler_construct_freecb (void *native_p) { // Invoked when the JS object is released and the // native data should be freed. struct my_info *info (struct my_info *) native_p; free (info); } static const jerry_object_native_info_t my_info_type_info { .free_cb handler_construct_freecb }; void demo (void) { jerry_value_t this_val; // create or acquire this_val // ... struct my_info *info (struct my_info *) malloc (sizeof (struct my_info)); info-data 11; // setting the native handle jerry_set_object_native_pointer (this_val, info, my_info_type_info); // ... // reading back the native handle pointed by the my_info_type_info variable void *ptr NULL; bool has_p jerry_get_object_native_pointer (this_val, ptr, my_info_type_info); if (has_p) { struct my_info *obj_info (struct my_info *) ptr; // use obj_info } }迁移要点回调签名uintptr_t native_p改为void *native_p不再需要整数与指针之间的强制转换类型信息原来的裸回调改为static const jerry_object_native_info_t结构体{ .free_cb ... }该结构体同时充当该原生数据的身份标识读写参数set/get都新增一个my_info_type_info参数用于指定操作哪个原生信息从而支持同一对象挂载多份不同类型原生数据。7. 2.0 新增的 API 函数清单2.0 同时引入了一批新 API覆盖新的内置对象与能力。以下是迁移文档中的完整清单各函数详细签名见 docs/02.API-REFERENCE.md 对应小节。7.1 内置对象相关ArrayBufferjerry_create_arraybufferjerry_create_arraybuffer_external基于外部内存创建 ArrayBuffer适合零拷贝场景jerry_get_arraybuffer_pointerDataViewjerry_create_dataviewjerry_value_is_dataviewjerry_get_dataview_bufferJSONjerry_json_parsejerry_json_stringifyNumberjerry_create_number_infinityjerry_create_number_nanPromisejerry_run_all_enqueued_jobs驱动 Promise 微任务队列需在事件循环中调用jerry_create_promisejerry_resolve_or_reject_promisejerry_value_is_promiseRegExpjerry_create_regexpjerry_create_regexp_szStringUTF-8 相关jerry_substring_to_utf8_char_bufferjerry_get_utf8_string_sizejerry_get_utf8_string_lengthjerry_create_string_from_utf8jerry_create_string_sz_from_utf8Symboljerry_create_symboljerry_get_symbol_descriptive_stringjerry_value_is_symbolTypedArrayjerry_create_typedarrayjerry_create_typedarray_for_arraybufferjerry_create_typedarray_for_arraybuffer_szjerry_get_typedarray_typejerry_get_typedarray_lengthjerry_get_typedarray_bufferjerry_value_is_typedarray7.2 实例与内存管理JerryScript 实例jerry_create_context创建独立上下文支持多实例隔离jerry_get_context_data获取上下文私有数据内存管理jerry_heap_allocjerry_heap_free多实例能力是 2.0 的重要架构升级jerry_create_context允许在一个进程内创建多个相互隔离的引擎实例。当前仓库的上下文实现可参考 jerry-core/jcontext/jcontext.c 与 jerry-core/jcontext/jcontext.h。7.3 JavaScript 值操作二元运算jerry_binary_operation错误处理jerry_get_error_typejerry_get_backtrace获取当前错误/异常的调用栈回溯原生指针jerry_delete_object_native_pointer删除对象上某个原生信息jerry_objects_foreach_by_native_info遍历所有挂载了指定原生信息的对象属性操作jerry_delete_property_by_indexjerry_objects_foreach遍历堆上所有对象7.4 调试器DebuggerAPIjerry_debugger_is_connectedjerry_debugger_stopjerry_debugger_continuejerry_debugger_stop_at_breakpointjerry_debugger_wait_for_client_sourcejerry_debugger_send_outputjerry_debugger_send_log这些函数需要开启JERRY_DEBUGGER特性并配合调试器客户端使用协议说明见 docs/07.DEBUGGER.md客户端参考实现位于 jerry-debugger/ 目录如jerry_client_main.py。7.5 其他新函数jerry_is_feature_enabled运行时查询某特性是否编译启用可配合 docs/01.CONFIGURATION.md 中的特性开关使用jerry_parse_and_save_literals保存解析过程中收集的字符串字面量供魔法字符串注册使用jerry_set_vm_exec_stop_callback设置 VM 执行停止回调用于实现执行超时/中断控制7.6 新增 Port API 函数jerry_port_normalize_pathjerry_port_read_sourcejerry_port_release_sourcejerry_port_print_charjerry_port_get_current_contextjerry_port_fataljerry_port_sleepjerry_port_print_byte这些函数的默认实现分布在 jerry-port/common/如jerry-port-io.c、jerry-port-process.c、jerry-port-fs.c与各平台目录jerry-port/unix/、jerry-port/win/详见 docs/05.PORT-API.md。8. 从 2.x 迁移到 3.x 的补充说明JerryScript 3.0 最显著的变化是一次更大规模的 API 重命名绝大多数 API 函数在 3.0 中被改名以统一命名风格例如jerry_get_global_object等 2.x 函数在 3.0 中改名原 2.x 名称仅在旧版本中有效。API Reference 中为每个此类函数都标注了Renamed in version 3.0, it was previously known asxxxin earlier versions形式的迁移提示。如果你同时需要从 1.0 迁移到 3.x建议采用两步迁移策略先按本文第 26 节完成 1.0 → 2.0 的破坏性变更替换错误处理、原生指针、快照、GC、eval、时区 Port API再对照 docs/02.API-REFERENCE.md 中的 Renamed in version 3.0 提示将函数名批量更新到 3.x 命名。这样每次只处理一类变更出错时更容易定位。另外由于配置宏在 1.0 → 2.0 经历了CONFIG_→JERRY_前缀统一3.0 又对特性宏做了细分如JERRY_BUILTIN_*系列在迁移构建系统时请以 jerry-core/config.h 中的当前宏定义与默认值为准。9. 迁移自检清单完成迁移后建议按以下清单逐项验证头文件已更新为#include jerryscript.h与#include jerryscript-port.h不再引用jerry-api.h、jerry-port.h、jerry-internal.h源码中不存在jerry_char_ptr_t、jerry_object_free_callback_t等旧类型错误处理统一使用jerry_create_abort_from_value/jerry_create_error_from_value/jerry_get_value_from_error并核对每个调用的take_ownership参数所有CONFIG_前缀宏已改为JERRY_前缀快照生成调用已切换到jerry_generate_snapshot/jerry_generate_function_snapshot并检查返回值是否为错误对象jerry_gc已传入JERRY_GC_PRESSURE_LOW或 HIGH参数jerry_eval的第三参数已由bool改为jerry_parse_opts_t枚举移植层已实现jerry_port_get_local_time_zone_adjustment并删除旧jerry_port_get_time_zone原生数据读写已改用jerry_object_native_info_t与jerry_(get|set)_object_native_pointer三参数形式编译通过且通过tools/run-tests.py运行单元测试tests/unit-core/验证引擎行为无回归。完成以上步骤后你的代码即与 2.0 及以上版本的 JerryScript API 兼容。若需要了解每个新 API 的完整参数与返回值语义请继续阅读 docs/02.API-REFERENCE.mdAPI 参考、docs/05.PORT-API.md移植层参考与 docs/04.INTERNALS.md内部实现原理。赞分享语言运行时嵌入式物联网编译器【免费下载链接】jerryscriptUltra-lightweight JavaScript engine for the Internet of Things.项目地址https://gitcode.com/gh_mirrors/je/jerryscript点击查看免费下载相关推荐Cropper.js 2.0 迁移指南从1.0到2.0的全面升级解析Cropper.js 2.0 迁移指南从1.0到2.0的全面升级解析 前言 Cropper.js 2.0 是一次重大的架构升级采用了全新的组件化设计理念。本前端UI组件图像处理Doctrine Lexer 升级指南Token API 变更与 2.0→3.0 迁移实战Doctrine Lexer 升级指南Token API 变更与 2.0→3.0 迁移实战 本指南基于仓库根目录的 UPGRADE.md https://li后端开发工具JSZip 升级指南从 2.x 到 3.0 的 API 全面迁移实战JSZip 升级指南从 2.x 到 3.0 的 API 全面迁移实战 这篇升级指南面向正在使用 JSZip 2.x乃至 1.x并希望迁移到 3.x 的开发开发工具上一篇如何用APatch解锁Android内核级Root权限技术实践指南下一篇72小时专属学习GPT-Neo-1.3B工业级微调指南从数据清洗到部署全流程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考