Skip to content

v0.4.17

Choose a tag to compare

@proggeramlug proggeramlug released this 26 Mar 04:07
· 4572 commits to main since this release

Bug Fixes

  • String ===/!== comparison for concatenated strings: is_string_expr didn't recognize Expr::Logical (for ||/??) or Expr::Conditional (ternary) as returning strings, causing variables like process.env.X || '' to get stored as NaN-boxed F64 while 'Bearer ' + secret was stored as raw I64 pointer. The mixed representation made js_jsvalue_equals fail to recognize both as strings. Fixed all string detection functions, fixed operator precedence bug in is_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 via js_array_alloc_with_length and write elements via direct memory stores, bypassing the stack entirely.

  • iOS builds failed with undefined _js_new_from_handle: is_macho check excluded iOS so the _ prefix wasn't stripped during symbol scanning, preventing stub generation for V8 interop symbols.