v0.4.17
Bug Fixes
-
String
===/!==comparison for concatenated strings:is_string_exprdidn't recognizeExpr::Logical(for||/??) orExpr::Conditional(ternary) as returning strings, causing variables likeprocess.env.X || ''to get stored as NaN-boxed F64 while'Bearer ' + secretwas stored as raw I64 pointer. The mixed representation madejs_jsvalue_equalsfail to recognize both as strings. Fixed all string detection functions, fixed operator precedence bug inis_dynamic_string_compare, and added NaN-boxing safety net for I64 string locals in the fallback comparison path. -
Android large exported arrays (>128 elements) null pointer SEGV: Large
number[]arrays exported from cross-module imports were null at runtime on Android (aarch64-linux-android). The stack-based array initialization created oversized stack slots in the module init function. Arrays with >128 elements now allocate directly on the heap viajs_array_alloc_with_lengthand write elements via direct memory stores, bypassing the stack entirely. -
iOS builds failed with undefined
_js_new_from_handle:is_machocheck excluded iOS so the_prefix wasn't stripped during symbol scanning, preventing stub generation for V8 interop symbols.