-
Notifications
You must be signed in to change notification settings - Fork 5.1k
Remove the .zig porting-reference sources #32621
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
48 commits
Select commit
Hold shift + click to select a range
495c6a7
Remove the .zig porting-reference sources
cirospaciari 24e728b
codegen: drop on-disk .zig existence checks
cirospaciari 0356580
Drop the Ban Words workflow step and 'banned' script
cirospaciari 432c094
test: retarget the broken-pipe grep to parser.rs; drop the Zig-tests …
cirospaciari c69b6b3
[autofix.ci] apply automated fixes
autofix-ci[bot] 4981c7c
codegen: restore resolved $zig() paths via a static table
robobun bf3d661
Merge remote-tracking branch 'origin/main' into ciro/rm-zig-sources
robobun ad42b11
[autofix.ci] apply automated fixes
autofix-ci[bot] a6be699
Sweep remaining scripts/ references to deleted .zig sources
robobun 4616dc0
glob-sources: declare dev_server/mod.rs as a bakeRuntime input
robobun b437502
Sweep remaining dead Zig artifacts and doc references
robobun 9e7d0a8
[autofix.ci] apply automated fixes
autofix-ci[bot] 92ddac7
ci: retrigger (darwin-26-aarch64 artifact download timeout on #64230)
robobun 06a9ab7
Merge remote-tracking branch 'origin/main' into ciro/rm-zig-sources
cirospaciari 7055cd2
Fold all remaining Zig follow-ups into this PR
robobun cf5b836
[autofix.ci] apply automated fixes
autofix-ci[bot] 07ba891
cppbind.ts: fix dangling resultFilePath reference in CI log line
robobun 51831b6
Remove stale generated .zig files accidentally committed in 07ba891
robobun d75696d
Address review: perf-trace script correctness, half-edited comments, …
robobun a03841e
Restore .gitignore entries for the legacy Generated*.zig outputs
robobun 8034036
Merge remote-tracking branch 'origin/main' into ciro/rm-zig-sources
robobun a321e6a
Merge main for #32608 s3 leak fix; address remaining review nits
robobun f32c694
codegen: remove dead Zig-emission machinery from cppbind/bindgenv2/sh…
robobun b7322e0
[autofix.ci] apply automated fixes
autofix-ci[bot] 866aafb
Sweep four more dead-Zig stragglers
robobun b922970
cppbind: port [[ZIG_EXPORT]] validation into generateRustFn; finish d…
robobun 69a13b2
[autofix.ci] apply automated fixes
autofix-ci[bot] f888622
Fix remaining half-edited comments; drop dead .gitignore/prose entries
robobun af58a93
Fix three more half-edit/dead-code residuals
robobun 0852a94
build-prefixes.js correctness: drop is_flex_2009 shim; delete generat…
robobun 087a307
[autofix.ci] apply automated fixes
autofix-ci[bot] 5d296d4
generate-perf-trace-events.sh: use awk NF instead of grep -v for blan…
robobun 47fb444
Address three review residuals: StandaloneModuleGraph half-edit, gene…
robobun ef708c3
[autofix.ci] apply automated fixes
autofix-ci[bot] 19d0be3
targets.rs: re-pad Features bitflags to match build-prefixes.js output
robobun b85c825
mime_type: finish the generate-compact-string-table comment cleanup
robobun a019c6f
build-prefixes.js: match committed targets.rs exactly; Cargo.toml hal…
robobun 0018bdd
Fix ReleaseFast and image/README.md half-edits
robobun c4f326a
perf/generated_perf_trace_events.rs: align header to script output
robobun a9b50b7
[autofix.ci] apply automated fixes
autofix-ci[bot] 099e0f6
Docs: correct image/README system_backend; fix zig fences in STREAMS/…
robobun a23032c
v8 CLAUDE/AGENTS.md: rewrite the V8API code fence to Rust
robobun 31a99ae
Docs: sweep remaining Zig prose/fences in b437502b-touched READMEs
robobun 3c136e7
v8 CLAUDE/AGENTS.md: fix stale src\bun.js\ path in dumpbin line
robobun ee6fe62
Docs: rewrite last two ```zig fences to Rust
robobun fb32581
SKILL.md: sweep remaining jsc.JSRef/jsc.Strong/Zig cross-references
robobun 962393f
js2native: rename $zig/$newZigFunction → $rust/$newRustFunction
Jarred-Sumner 46fff1c
Fix half-edits and wrong trait path from 962393f5
robobun File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
Some comments aren't visible on the classic Files Changed page.
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,131 @@ | ||
| --- | ||
| name: implementing-jsc-classes-rust | ||
| description: Creates JavaScript classes using Bun's Rust bindings generator (.classes.ts). Use when implementing new JS APIs in Rust with JSC integration, prototypes, or constructors. | ||
| --- | ||
|
|
||
| # Bun's JavaScriptCore Class Bindings Generator | ||
|
|
||
| Bridge JavaScript and Rust through `.classes.ts` definitions and Rust implementations. | ||
|
|
||
| ## Architecture | ||
|
|
||
| 1. **JavaScript Interface Definition** (`.classes.ts` files) | ||
| 2. **Rust Implementation** (`.rs` files) | ||
| 3. **Generated Code** — `src/codegen/generate-classes.ts` emits C++ + Rust into `${BUN_CODEGEN_DIR}/generated_classes.rs`, `include!`d as `crate::generated_classes` in `bun_runtime`. Run `bun bd` to regenerate. | ||
|
|
||
| ## Class Definition (.classes.ts) | ||
|
|
||
| ```typescript | ||
| export default [ | ||
| define({ | ||
| name: "Glob", | ||
| construct: true, | ||
| finalize: true, | ||
| hasPendingActivity: true, | ||
| proto: { | ||
| scan: { fn: "scan", length: 1 }, | ||
| match: { fn: "match", length: 1 }, | ||
| }, | ||
| }), | ||
| ]; | ||
| ``` | ||
|
|
||
| Options: | ||
|
|
||
| - `construct`: Has a public `new Foo()` constructor | ||
| - `finalize`: Needs cleanup beyond `Drop` (rarely — see Finalize below) | ||
| - `hasPendingActivity`: GC keep-alive while async work is in flight | ||
| - `proto`: Methods (`fn:`), getters (`getter: true`, optionally `cache: true`) | ||
| - `values: [...]`: WriteBarrier slots for JS values the native side holds (callbacks, buffers) | ||
|
|
||
| ## Rust Implementation | ||
|
|
||
| ```rust | ||
| use bun_jsc::{CallFrame, JSGlobalObject, JSValue, JsResult}; | ||
| use std::sync::atomic::{AtomicUsize, Ordering}; | ||
|
|
||
| #[bun_jsc::JsClass] | ||
| pub struct Glob { | ||
| pattern: Box<[u8]>, | ||
| has_pending_activity: AtomicUsize, | ||
| } | ||
|
|
||
| impl Glob { | ||
| pub fn constructor(global: &JSGlobalObject, frame: &CallFrame) -> JsResult<Box<Glob>> { | ||
| let arg = frame.argument(0); | ||
| let pattern = bun_core::String::from_js(arg, global)?.to_utf8_bytes().into(); | ||
| Ok(Box::new(Glob { pattern, has_pending_activity: AtomicUsize::new(0) })) | ||
| } | ||
|
|
||
| #[bun_jsc::host_fn(method)] | ||
| pub fn r#match(&self, global: &JSGlobalObject, frame: &CallFrame) -> JsResult<JSValue> { | ||
| // ... | ||
| Ok(JSValue::TRUE) | ||
| } | ||
|
|
||
| pub fn has_pending_activity(&self) -> bool { | ||
| self.has_pending_activity.load(Ordering::SeqCst) > 0 | ||
| } | ||
| } | ||
| ``` | ||
|
|
||
| ### Canonical signatures | ||
|
|
||
| | Hook | Signature | | ||
| | ------------------- | ------------------------------------------------------------------------------------ | | ||
| | constructor | `pub fn constructor(global: &JSGlobalObject, frame: &CallFrame) -> JsResult<Box<Self>>` | | ||
| | method (`fn:`) | `pub fn name(&self, global: &JSGlobalObject, frame: &CallFrame) -> JsResult<JSValue>` | | ||
| | getter | `pub fn get_x(this: &Self, global: &JSGlobalObject) -> JsResult<JSValue>` | | ||
| | finalize | `pub fn finalize(self: Box<Self>)` — or omit; the blanket `JsFinalize` just drops | | ||
| | hasPendingActivity | `pub fn has_pending_activity(&self) -> bool` | | ||
|
|
||
| A missing or mis-typed hook is a **compile error** in `cargo check -p bun_runtime` — the generated code calls the inherent method directly. | ||
|
|
||
| ## Hooking into the generated module | ||
|
|
||
| `#[bun_jsc::JsClass]` on the struct implements the `JsClass` trait (`to_js`, `from_js`, `from_js_direct`, `get_constructor`) by binding the C++ externs. Attribute knobs: `no_constructor`, `no_finalize`, `estimated_size`. | ||
|
|
||
| The codegen also emits a `js_$T` module with the cached-value accessors. Re-export it when you need `*_set_cached` / `*_get_cached` or `detach_ptr`: | ||
|
|
||
| ```rust | ||
| pub use crate::generated_classes::js_Glob as js; | ||
| // or | ||
| bun_jsc::impl_js_class_via_generated!(Archive => crate::generated_classes::js_Archive); | ||
| ``` | ||
|
|
||
| The `js_$T` module surface: | ||
|
|
||
| ```rust | ||
| pub fn from_js(value: JSValue) -> Option<NonNull<T>>; | ||
| pub fn from_js_direct(value: JSValue) -> Option<NonNull<T>>; | ||
| pub fn get_constructor(global: &JSGlobalObject) -> JSValue; | ||
| pub fn to_js(this: *mut T, global: &JSGlobalObject) -> JSValue; // ownership transfer | ||
| pub fn detach_ptr(value: JSValue); | ||
| // per cached getter / `values: [...]` entry: | ||
| pub fn <field>_set_cached(this_value: JSValue, global: &JSGlobalObject, value: JSValue); | ||
| pub fn <field>_get_cached(this_value: JSValue) -> Option<JSValue>; | ||
| ``` | ||
|
|
||
| ## Finalize | ||
|
|
||
| Most classes need nothing — `#[bun_jsc::JsClass]` wires the blanket `JsFinalize` whose default is `drop(Box<Self>)`. Override only when you must release a JS handle or defer to a heap helper: | ||
|
|
||
| ```rust | ||
| pub fn finalize(self: Box<Self>) { | ||
| bun_ptr::finalize_js_box(self, |this| this.this_value.with_mut(|v| v.finalize())); | ||
| } | ||
| ``` | ||
|
|
||
| Override with an **inherent** method, never `impl JsFinalize for T`. | ||
|
|
||
| ## Holding JS values | ||
|
|
||
| Never store raw `JSValue` in a struct field. Declare a slot in `.classes.ts` (`values: ["callback"]` or a `cache: true` getter) and read/write it through `js::callback_set_cached(this_value, global, v)` / `js::callback_get_cached(this_value)`. The slot is a `WriteBarrier` visited by the GC, so the value stays alive without a `Strong`. | ||
|
|
||
| ## Reference implementations | ||
|
|
||
| - `src/runtime/api/glob.rs` + `Glob.classes.ts` — constructor, methods, `hasPendingActivity`, default finalize | ||
| - `src/runtime/api/cron.rs` + `cron.classes.ts` — `noConstructor`, cached getter, `values: [...]`, custom finalize | ||
| - `src/runtime/image/Image.rs:56` — the `pub use crate::generated_classes::js_Image as js;` one-liner | ||
| - `src/jsc/host_fn.rs` — the host-fn adapters the codegen dispatches through | ||
| - `src/jsc_macros/lib.rs` — `#[bun_jsc::JsClass]` proc-macro source | ||
|
robobun marked this conversation as resolved.
|
||
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.