Skip to content

perf: eliminate ArrayBuffer copies at the JSI boundary#49

Open
GrzywN wants to merge 1 commit intocraftzdog:masterfrom
GrzywN:master
Open

perf: eliminate ArrayBuffer copies at the JSI boundary#49
GrzywN wants to merge 1 commit intocraftzdog:masterfrom
GrzywN:master

Conversation

@GrzywN
Copy link
Copy Markdown

@GrzywN GrzywN commented Mar 18, 2026

Encoding (fromByteArray): call the raw-pointer overload of base64_encode directly with buf.data(runtime)/buf.size(runtime) instead of copying the ArrayBuffer into a temporary std::string first.

Decoding (toByteArray): introduce a minimal DecodedBuffer (jsi::MutableBuffer subclass) that takes ownership of the decoded std::string via move and returns it as jsi::ArrayBuffer(runtime, make_shared(std::move(...))). The JSI runtime holds the buffer alive via shared_ptr — no second allocation, no memcpy.

Also tighten the argument guard in base64ToArrayBuffer from 'count > 0 && !isString' to 'count == 0 || !isString' to prevent a potential out-of-bounds access when called with zero arguments.

Screenshots

Android emulator iPhone 16e simulator

Encoding (fromByteArray): call the raw-pointer overload of base64_encode
directly with buf.data(runtime)/buf.size(runtime) instead of copying the
ArrayBuffer into a temporary std::string first.

Decoding (toByteArray): introduce a minimal DecodedBuffer (jsi::MutableBuffer
subclass) that takes ownership of the decoded std::string via move and returns
it as jsi::ArrayBuffer(runtime, make_shared<DecodedBuffer>(std::move(...))).
The JSI runtime holds the buffer alive via shared_ptr — no second allocation,
no memcpy.

Also tighten the argument guard in base64ToArrayBuffer from
'count > 0 && !isString' to 'count == 0 || !isString' to prevent a potential
out-of-bounds access when called with zero arguments.
@GrzywN
Copy link
Copy Markdown
Author

GrzywN commented Mar 18, 2026

Opening new issues is broken (404 Not Found) - I created a PR with this change instead.

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