Skip to content

fix(js): use FixedArray at the JS FFI boundary - #4

Open
hackwaly wants to merge 1 commit into
bit-vcs:mainfrom
hackwaly:fix/js-ffi-fixedarray
Open

hackwaly wants to merge 1 commit into
bit-vcs:mainfrom
hackwaly:fix/js-ffi-fixedarray

Conversation

@hackwaly

Copy link
Copy Markdown

Hi! I'm @hackwaly, a MoonBit core developer.

We deprecated Array at the JavaScript FFI boundary ahead of the planned change
to Array's runtime layout, and I'm going through the ecosystem to help packages
migrate before that lands. This PR does that for this repo.

Disclosure: AI assistance was used to scan the ecosystem for affected
declarations and prepare this patch. I reviewed the resulting diff. Please
double-check anything that looks off.

Background

On the JS backend, Array[T] and FixedArray[T] are both plain JS arrays today.
This migration removes reliance on that shared representation: once Array's
runtime layout changes, an extern "js" declared in terms of Array will no
longer line up with the plain arrays JavaScript produces or expects. FixedArray
is the representation we ask FFI code to use.

moon check --target js reports Warning: [0020] Warning (deprecated): Using 'Array' in JavaScript FFI is deprecated. Use 'FixedArray' instead. for the
declarations below.

Changes

Each migrated FFI keeps its JavaScript body unchanged. The boundary now uses
FixedArray, and a thin wrapper keeps the original signature and converts, so no
call site and no public signature changes.

Declarations touched: fs_readdir_ffi, node_readdir_safe_ffi, scan_readdir_ffi, idb_fs_list_ffi, r2_list_ffi

Files:

  • src/core/fs_storage.mbt
  • src/core/git_loader.mbt
  • src/core/idb_git_fs.mbt
  • src/core/r2_storage.mbt

Warning

This checkout does not build cleanly before this change either.

On the base commit, moon check --target js already reports 15 errors. After
this change it reports 15 — the same set. I verified this by running the
identical command on the unmodified base commit, so the migration introduces no
new diagnostics.

14 of them are inside .mooncakes/ (dependency/toolchain mismatch); the rest
are in this repository's own code.

So if this PR shows as failing, that is pre-existing and not something this change
brings in. I'm opening it anyway because the migration itself is independent of
that breakage — feel free to park it until the build is green again, and I'll
rebase.

Scope note: the compiler's [0020] check only inspects the direct parameter and
return types of an extern "js" declaration. An Array hidden behind a struct
field crosses the same boundary without a warning; I checked this repository for
that pattern too and found none.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant