Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions crates/perry-api-manifest/src/entries.rs
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,9 @@ pub const NATIVE_MODULES: &[&str] = &[
"v8",
"vm",
"process",
// Bare `perry` builtin — embedded-asset introspection (#5731):
// `embeddedFiles`, `readEmbedded`, `isStandaloneExecutable`.
"perry",
"perry/tui",
"perry/yoga",
"perry/ui",
Expand Down Expand Up @@ -206,6 +209,9 @@ pub const RUNTIME_ONLY_MODULES: &[&str] = &[
"dns",
"dns/promises",
"process",
// #5731 — `perry` embed API is served entirely from perry-runtime
// (registry + fs interception); no perry-stdlib surface needed.
"perry",
"perry/ui",
"perry/system",
"perry/widget",
Expand Down
14 changes: 14 additions & 0 deletions crates/perry-api-manifest/src/entries/part_1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1347,6 +1347,20 @@ pub(crate) const API_MANIFEST_PART_1: &[ApiEntry] = &[
],
TypeSpec::Any,
),
// #5731 — `perry` embedded-asset API for standalone executables.
// `readEmbedded(path)` returns the bytes of an asset baked in via
// `perry compile --embed`; `embeddedFiles` / `isStandaloneExecutable`
// are value (property) exports resolved at read time.
method_sig(
"perry",
"readEmbedded",
false,
None,
&[p_str("path")],
TypeSpec::Buffer,
),
method_sig("perry", "embeddedFiles", false, None, &[], TypeSpec::Any),
property("perry", "isStandaloneExecutable"),
method_sig(
"perry/thread",
"parallelMap",
Expand Down
24 changes: 24 additions & 0 deletions crates/perry-codegen/src/lower_call/native_table/thread_lodash.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,30 @@
use super::*;

pub(super) const THREAD_LODASH_ROWS: &[NativeModSig] = &[
// ========== perry (embedded-asset API, #5731) ==========
// `readEmbedded(path)` takes the NaN-boxed path string as-is (decoded
// runtime-side via `decode_path_value`, like the fs APIs) and returns a
// `*mut BufferHeader` (NaN-boxed POINTER → a `Buffer`).
NativeModSig {
module: "perry",
has_receiver: false,
method: "readEmbedded",
class_filter: None,
runtime: "js_perry_read_embedded",
args: &[NA_F64],
ret: NR_PTR,
},
// `embeddedFiles()` — zero-arg, returns a fresh `*mut ArrayHeader` of
// `{ name, size, type }` objects (NaN-boxed POINTER by NR_PTR).
NativeModSig {
module: "perry",
has_receiver: false,
method: "embeddedFiles",
class_filter: None,
runtime: "js_perry_embedded_files",
args: &[],
ret: NR_PTR,
},
// ========== perry/thread (parallelMap, parallelFilter, spawn) ==========
// Runtime expects both args as NaN-boxed f64 values and returns the same
// — no unboxing/reboxing needed on either side. Closure is a POINTER_TAG'd
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,12 @@ pub(crate) fn declare_third_party(module: &mut LlModule) {
module.declare_function("js_ads_banner_destroy", VOID, &[DOUBLE]);
module.declare_function("js_ads_request_consent", I64, &[]);

// ========== perry embedded-asset API (#5731) ==========
// readEmbedded(path) → *mut BufferHeader (returned as I64 pointer).
module.declare_function("js_perry_read_embedded", I64, &[DOUBLE]);
// embeddedFiles() → *mut ArrayHeader (returned as I64 pointer).
module.declare_function("js_perry_embedded_files", I64, &[]);

// ========== perry/thread (parallelMap, parallelFilter, spawn) ==========
module.declare_function("js_thread_parallel_map", DOUBLE, &[DOUBLE, DOUBLE]);
module.declare_function("js_thread_parallel_filter", DOUBLE, &[DOUBLE, DOUBLE]);
Expand Down
Loading
Loading