Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
f7d2f84
Mark bytecode embedded in a compiled executable as persistent so JSC …
Jarred-Sumner Aug 23, 2026
0cc77af
[autofix.ci] apply automated fixes
autofix-ci[bot] Aug 23, 2026
a324bf0
Standalone modules come through the builtin path: mark their bytecode…
Jarred-Sumner Aug 23, 2026
648960c
Record each embedded module's source hash at build time so loading it…
Jarred-Sumner Aug 23, 2026
28e2abf
Pin WebKit#494 head (per-block checksums)
Jarred-Sumner Aug 23, 2026
a858d77
Pin WebKit#494 head
Jarred-Sumner Aug 23, 2026
6c249b8
Merge remote-tracking branch 'origin/main' into claude/bytecode-cache…
Jarred-Sumner Aug 23, 2026
d73aa70
[autofix.ci] apply automated fixes
autofix-ci[bot] Aug 23, 2026
e300c28
Pin WebKit#494 head (cpuid fix)
Jarred-Sumner Aug 23, 2026
fb82aa3
Pin WebKit#494 head
Jarred-Sumner Aug 23, 2026
53b434b
Pin WebKit#494 head
Jarred-Sumner Aug 23, 2026
4365029
Pin WebKit#494 head
Jarred-Sumner Aug 23, 2026
8418a9e
ci: retrigger (WebKit preview 738c4bc9 published)
Jarred-Sumner Aug 23, 2026
897a92c
bun-build-compile test: size the payload check off the source, not an…
Jarred-Sumner Aug 23, 2026
6f683bb
bun-build-compile residency test: include the mapping's smaps fields …
Jarred-Sumner Aug 23, 2026
e61ee8f
Drop the payload-residency test: Rss of a just-written executable's m…
Jarred-Sumner Aug 23, 2026
517e48b
Bump WebKit to 024831d80fa0 (bytecode cache: borrow, region layout, c…
Jarred-Sumner Aug 23, 2026
2de1d82
Remove stray comment left from the dropped residency test
Jarred-Sumner Aug 23, 2026
4861e28
ResolvedSource: say explicitly when bytecode_cache is never freed (ex…
Jarred-Sumner Aug 23, 2026
2384d71
Mark compile-cache bytecode static on the other two paths that use it
Jarred-Sumner Aug 23, 2026
909fa9d
Bump WebKit to 62f427b86ffb (bytecode cache: arrays-first records, st…
Jarred-Sumner Aug 23, 2026
7aa74fd
Bump WebKit to fc1a8df1bba4 (bytecode cache: inline short strings, al…
Jarred-Sumner Aug 23, 2026
fa6967c
bun build --compile --bytecode: embed bytecode for the internal modul…
Jarred-Sumner Aug 24, 2026
a85069f
[autofix.ci] apply automated fixes
autofix-ci[bot] Aug 24, 2026
6a80255
clippy: safety comment placement
Jarred-Sumner Aug 24, 2026
a004f52
clippy: raw borrows for FFI out-params
Jarred-Sumner Aug 24, 2026
0199849
clippy: FFI accessor writing out-params is unsafe extern
Jarred-Sumner Aug 24, 2026
7161059
[autofix.ci] apply automated fixes
autofix-ci[bot] Aug 24, 2026
4d0a023
Bump WebKit to aff53044c546 (bytecode cache: builtin function entries…
Jarred-Sumner Aug 24, 2026
c815d63
Review: atomic counter, WebCore::bunVM, overflow-safe bounds check, t…
Jarred-Sumner Aug 24, 2026
edcdf3f
[autofix.ci] apply automated fixes
autofix-ci[bot] Aug 24, 2026
0fa8e4b
bunVM is at global scope
Jarred-Sumner Aug 24, 2026
0fbe69a
Review: skip internal-module bytecode when cross-compiling (the targe…
Jarred-Sumner Aug 24, 2026
69d4338
[autofix.ci] apply automated fixes
autofix-ci[bot] Aug 24, 2026
ef7ea14
clippy: is_none_or
Jarred-Sumner Aug 24, 2026
63751e8
Merge remote-tracking branch 'origin/main' into claude/bytecode-cache…
Jarred-Sumner Aug 24, 2026
cfbc61a
[autofix.ci] apply automated fixes
autofix-ci[bot] Aug 24, 2026
bf8365d
Merge origin/main into claude/bytecode-cache-borrow
Jarred-Sumner Aug 24, 2026
0e1a0d0
Bump WebKit to ab29fdebb46292014bf2db3171fa49ab88d83e0e
Jarred-Sumner Aug 24, 2026
708d0e8
Review: compact chunk names get a '_' prefix so they cannot collide w…
Jarred-Sumner Aug 24, 2026
75f57b6
[autofix.ci] apply automated fixes
autofix-ci[bot] Aug 24, 2026
5f9ba2d
bun build --compile --bytecode: one shared string table across every …
Jarred-Sumner Aug 24, 2026
60b62b3
clippy: ptr cast
Jarred-Sumner Aug 24, 2026
245d0ba
Review: own the EncoderStringTable with a Drop guard so an early retu…
Jarred-Sumner Aug 24, 2026
511a3f6
ci: retrigger (WebKit 5803c87d release is published)
Jarred-Sumner Aug 24, 2026
c718748
Internal-module bytecode shares the build's EncoderStringTable; bump …
Jarred-Sumner Aug 24, 2026
e739e5d
Bump WebKit to c148a12dd82b (skip per-region checksums for persistent…
Jarred-Sumner Aug 24, 2026
22432d8
Merge branch 'main' into claude/bytecode-cache-borrow
Jarred-Sumner Aug 24, 2026
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
2 changes: 1 addition & 1 deletion scripts/build/deps/webkit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* for local mode. Override via `--webkit-version=<hash>` to test a branch.
* From https://github.com/oven-sh/WebKit releases.
*/
export const WEBKIT_VERSION = "aea1f010b69783c0fc1ff24ff663691abe642c16";
export const WEBKIT_VERSION = "c148a12dd82b9d88ea81d9d93840194f56490a61";

/**
* WebKit (JavaScriptCore) — the JS engine.
Expand Down
2 changes: 2 additions & 0 deletions src/bundler/LinkerContext.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1249,6 +1249,7 @@ impl From<BunError> for LinkError {

pub struct LinkerOptions {
pub(crate) generate_bytecode_cache: bool,
pub(crate) generate_internal_module_bytecode: bool,
pub(crate) output_format: Format,
pub(crate) ignore_dce_annotations: bool,
pub(crate) emit_dce_annotations: bool,
Expand Down Expand Up @@ -1288,6 +1289,7 @@ impl Default for LinkerOptions {
fn default() -> Self {
Self {
generate_bytecode_cache: false,
generate_internal_module_bytecode: false,
output_format: Format::Esm,
ignore_dce_annotations: false,
emit_dce_annotations: true,
Expand Down
62 changes: 61 additions & 1 deletion src/bundler/bundle_v2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1398,6 +1398,9 @@ pub mod bv2_impl {
}
}

/// Opaque `JSC::EncoderStringTable` — one instance shared by every chunk's `encodeCodeBlock` in a `--compile --bytecode` build.
pub(crate) enum EncoderStringTable {}

unsafe extern "Rust" {
/// Defined `#[no_mangle]` in `bun_jsc::cached_bytecode`. Generic
/// "generate JSC bytecode off the main JS thread" helper — marks the
Expand All @@ -1409,7 +1412,21 @@ pub mod bv2_impl {
format: crate::options_impl::Format,
source: &[u8],
source_provider_url: &bun_core::String,
external_strings: Option<core::ptr::NonNull<EncoderStringTable>>,
) -> Option<Box<[u8]>>;

/// Defined `#[no_mangle]` in `bun_jsc::cached_bytecode`: (registry id, bytecode) for the internal modules named
/// by `specifiers` plus their static requires.
safe fn __bun_jsc_generate_internal_module_bytecode(
specifiers: &[&[u8]],
depth: u32,
external_strings: Option<core::ptr::NonNull<EncoderStringTable>>,
) -> Vec<(u32, Box<[u8]>)>;

safe fn __bun_jsc_encoder_string_table_new() -> core::ptr::NonNull<EncoderStringTable>;
safe fn __bun_jsc_encoder_string_table_take(
table: core::ptr::NonNull<EncoderStringTable>,
) -> Box<[u8]>;
}

unsafe extern "Rust" {
Expand Down Expand Up @@ -1447,8 +1464,49 @@ pub mod bv2_impl {
format: crate::options_impl::Format,
source: &[u8],
source_provider_url: &bun_core::String,
external_strings: Option<core::ptr::NonNull<EncoderStringTable>>,
) -> Option<Box<[u8]>> {
__bun_jsc_generate_cached_bytecode(format, source, source_provider_url)
__bun_jsc_generate_cached_bytecode(
format,
source,
source_provider_url,
external_strings,
)
}

/// Owns a `JSC::EncoderStringTable` for one link; `take()` serializes and frees it, `Drop` frees it on early return.
pub(crate) struct EncoderStringTableHandle(Option<core::ptr::NonNull<EncoderStringTable>>);

impl EncoderStringTableHandle {
#[inline]
pub(crate) fn new() -> Self {
Self(Some(__bun_jsc_encoder_string_table_new()))
}
#[inline]
pub(crate) fn get(&self) -> Option<core::ptr::NonNull<EncoderStringTable>> {
self.0
}
#[inline]
pub(crate) fn take(mut self) -> Box<[u8]> {
__bun_jsc_encoder_string_table_take(self.0.take().expect("taken once"))
}
}

impl Drop for EncoderStringTableHandle {
fn drop(&mut self) {
if let Some(table) = self.0.take() {
drop(__bun_jsc_encoder_string_table_take(table));
}
}
}
Comment on lines +1495 to +1501

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 EncoderStringTableHandle::Drop calls __bun_jsc_encoder_string_table_take(table) and drops the result — but _take does EncoderStringTable::serialize(table) (walk the WTF hash map, copy every interned string into a fresh Vec<u8>, box it) before destroy(table), so the error path this guard exists for allocates and immediately discards the whole serialized buffer. Add a thin #[no_mangle] __bun_jsc_encoder_string_table_destroy wrapper over EncoderStringTable::destroy in CachedBytecode.rs, declare it in bundle_v2::dispatch, and call that from Drop instead. Error-path-only wasted allocation; no correctness impact.

Extended reasoning...

What the issue is

The Drop impl added at src/bundler/bundle_v2.rs:1494-1500 (in response to the earlier leak review) frees the C++ JSC::EncoderStringTable on early return by calling the only teardown symbol declared in bundle_v2::dispatch:

impl Drop for EncoderStringTableHandle {
    fn drop(&mut self) {
        if let Some(table) = self.0.take() {
            drop(__bun_jsc_encoder_string_table_take(table));
        }
    }
}

But __bun_jsc_encoder_string_table_take (CachedBytecode.rs:163-167) is not a plain destructor — it serializes first:

pub(crate) fn __bun_jsc_encoder_string_table_take(table: NonNull<EncoderStringTable>) -> Box<[u8]> {
    let bytes = EncoderStringTable::serialize(table).into_boxed_slice();
    EncoderStringTable::destroy(table);
    bytes
}

EncoderStringTable::serialize calls Bun__EncoderStringTable__serialize (ZigSourceProvider.cpp), which does table->serialize() — walking the WTF hash map and copying every interned string into a Vector<uint8_t> — then extend_from_slices that into a Rust Vec<u8>, then .into_boxed_slice(). On the Drop path that entire Box<[u8]> is immediately dropped.

The specific code path

The handle is created in generate_chunks_in_parallel (generateChunksInParallel.rs:622-624) whenever generate_bytecode_cache && compile_mode.is_executable(). On the success tail, .take() consumes the handle (nulling self.0) so Drop is a no-op. Drop only does work when an Err propagates between creation and the tail — e.g. intermediate_output.code(...)? or output_files.insert_for_sourcemap_or_bytecode(f)? returning Err after some chunks have already interned strings into the table.

Why existing code doesn't prevent it

bundle_v2::dispatch declares only two EncoderStringTable externs — _new and _take — so _take is the only teardown symbol reachable from that crate. EncoderStringTable::destroy exists in bun_jsc (and the C++ Bun__EncoderStringTable__destroy is already defined in ZigSourceProvider.cpp), but there is no #[no_mangle] Rust wrapper for bun_bundler to link against, so the author reused _take as the simplest available fix to the earlier leak review.

Step-by-step proof

  1. Bun.build({ compile: { outfile }, bytecode: true }) → external_string_table = Some(EncoderStringTableHandle::new()); self.0 = Some(ptr) where ptr points at a heap-allocated JSC::EncoderStringTable.
  2. Chunk 0 encodes bytecode successfully; encodeCodeBlock(..., externalStrings) interns N strings (potentially many MB across a large bundle) into *ptr.
  3. Chunk 1's intermediate_output.code(...)? returns Err(e); ? propagates.
  4. external_string_table: Option<EncoderStringTableHandle> is dropped → EncoderStringTableHandle::drop runs with self.0 = Some(ptr).
  5. __bun_jsc_encoder_string_table_take(ptr) → serialize(ptr) walks the hash map, allocates a Vector<uint8_t> on the C++ side, copies every string, then extend_from_slice copies again into a Rust Vec, then into_boxed_slice() → destroy(ptr).
  6. The returned Box<[u8]> is immediately drop()ped — the serialization work and both allocations were pure waste.

Impact

Zero correctness impact — no leak, no UAF, no observable behavior change. Error-path-only (an Err propagated mid-link during a --compile --bytecode build), happens once per failing build, and the CLI case exits immediately anyway. The only case where it accumulates is repeated failing Bun.build({ compile, bytecode }) calls in a long-lived process, and even there it's a transient allocation, not a leak. This is a minor efficiency point.

Fix

Add one #[no_mangle] wrapper in src/jsc/CachedBytecode.rs next to _take:

#[unsafe(no_mangle)]
pub(crate) fn __bun_jsc_encoder_string_table_destroy(table: NonNull<EncoderStringTable>) {
    EncoderStringTable::destroy(table);
}

declare it in the unsafe extern "Rust" block in bundle_v2::dispatch, and change Drop to:

impl Drop for EncoderStringTableHandle {
    fn drop(&mut self) {
        if let Some(table) = self.0.take() {
            __bun_jsc_encoder_string_table_destroy(table);
        }
    }
}


#[inline]
pub(crate) fn generate_internal_module_bytecode(
specifiers: &[&[u8]],
depth: u32,
external_strings: Option<core::ptr::NonNull<EncoderStringTable>>,
) -> Vec<(u32, Box<[u8]>)> {
__bun_jsc_generate_internal_module_bytecode(specifiers, depth, external_strings)
}

/// CYCLEBREAK GENUINE: `JSBundleCompletionTask` — the
Expand Down Expand Up @@ -2914,6 +2972,8 @@ pub mod bv2_impl {
this.linker.options.target = this.transpiler.options.target;
this.linker.options.output_format = this.transpiler.options.output_format;
this.linker.options.generate_bytecode_cache = this.transpiler.options.bytecode;
this.linker.options.generate_internal_module_bytecode =
this.transpiler.options.bytecode && this.transpiler.options.compile_target_is_host;
this.linker.options.compile_mode = this.transpiler.options.compile_mode;
this.linker.options.metafile = this.transpiler.options.metafile;
// SAFETY: same `'a`-owned `Transpiler` field as `banner` above.
Expand Down
9 changes: 9 additions & 0 deletions src/bundler/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,13 @@ pub mod options {
Bytecode,
#[strum(serialize = "module_info")]
ModuleInfo,
/// Ahead-of-time bytecode for an internal module (node:fs etc.) a --compile executable uses; `dest_path` is the
/// InternalModuleRegistry id in decimal.
#[strum(serialize = "builtin-bytecode")]
BuiltinBytecode,
/// The one shared string table every chunk's bytecode references by ordinal (`EncoderStringTable::serialize`).
#[strum(serialize = "bytecode-string-table")]
BytecodeStringTable,
#[strum(serialize = "metafile-json")]
MetafileJson,
#[strum(serialize = "metafile-markdown")]
Expand All @@ -280,6 +287,8 @@ pub mod options {
OutputKind::Sourcemap
| OutputKind::Bytecode
| OutputKind::ModuleInfo
| OutputKind::BuiltinBytecode
| OutputKind::BytecodeStringTable
| OutputKind::MetafileJson
| OutputKind::MetafileMarkdown
)
Expand Down
133 changes: 123 additions & 10 deletions src/bundler/linker_context/generateChunksInParallel.rs
Original file line number Diff line number Diff line change
Expand Up @@ -364,6 +364,7 @@ pub(crate) fn generate_chunks_in_parallel<const IS_DEV_SERVER: bool>(
let mut duplicates_map: StringArrayHashMap<DuplicateEntry> = StringArrayHashMap::default();

let mut chunk_visit_map = AutoBitSet::init_empty(chunks.len())?;
let mut compact_chunk_index: usize = 0;

// Compute the final hashes of each chunk, then use those to create the final
// paths of each chunk. This can technically be done in parallel but it
Expand All @@ -383,16 +384,38 @@ pub(crate) fn generate_chunks_in_parallel<const IS_DEV_SERVER: bool>(
chunk.template.placeholder.hash = Some(hash.digest());

let mut rel_path: Vec<u8> = Vec::new();
// Use the byte-writer (`PathTemplate::print`) directly —
// routing through `Display`/`write!` goes via `from_utf8_lossy`,
// which would replace non-UTF-8 dir bytes with U+FFFD and corrupt
// the output path.
// Disk output sanitizes leading `..`; `--compile` keeps it so
// runtime bunfs references to out-of-root entrypoints resolve.
chunk
.template
.print(&mut rel_path, !c.options.compile_mode.is_executable())
// Inside an executable nobody sees chunk file names, and every importer embeds them: number them instead of
// `chunk-<hash>` when the default naming is in effect.
if c.options.compile_mode.is_executable()
&& !chunk.entry_point.is_entry_point()
&& matches!(
&*chunk.template.data,
b"./chunk-[hash].[ext]"
| b"./[name]-[hash].[ext]"
| b"[name]-[hash].[ext]"
| b"chunk-[hash].[ext]"
)
{
write!(
&mut rel_path,
"./_{}.{}",
compact_chunk_index,
bstr::BStr::new(&chunk.template.placeholder.ext)
)
.expect("write to Vec<u8>");
compact_chunk_index += 1;
Comment thread
claude[bot] marked this conversation as resolved.
} else {
// Use the byte-writer (`PathTemplate::print`) directly —
// routing through `Display`/`write!` goes via `from_utf8_lossy`,
// which would replace non-UTF-8 dir bytes with U+FFFD and corrupt
// the output path.
// Disk output sanitizes leading `..`; `--compile` keeps it so
// runtime bunfs references to out-of-root entrypoints resolve.
chunk
.template
.print(&mut rel_path, !c.options.compile_mode.is_executable())
.expect("write to Vec<u8>");
}
path::resolve_path::platform_to_posix_in_place::<u8>(&mut rel_path);

if path_names_map.get_or_put(&rel_path)?.found_existing {
Expand Down Expand Up @@ -596,6 +619,9 @@ pub(crate) fn generate_chunks_in_parallel<const IS_DEV_SERVER: bool>(
let resolver = c.resolver.expect("resolver set in load()");
let root_path: &[u8] = &resolver.opts.output_dir;
let is_standalone = c.options.compile_mode.is_standalone_html();
let external_string_table = (c.options.generate_bytecode_cache
&& c.options.compile_mode.is_executable())
.then(crate::bundle_v2::dispatch::EncoderStringTableHandle::new);
let more_than_one_output = !is_standalone
&& (c.parse_graph().additional_output_files.len() > 0
|| c.options.generate_bytecode_cache
Expand Down Expand Up @@ -1058,6 +1084,7 @@ pub(crate) fn generate_chunks_in_parallel<const IS_DEV_SERVER: bool>(
c.options.output_format,
&code_result.buffer,
&source_provider_url,
external_string_table.as_ref().and_then(|table| table.get()),
) {
let source_provider_url_str = source_provider_url.to_utf8();
debug!(
Expand Down Expand Up @@ -1316,7 +1343,93 @@ pub(crate) fn generate_chunks_in_parallel<const IS_DEV_SERVER: bool>(
return Ok(result);
}

Ok(output_files.take())
let mut result = output_files.take();
if c.options.generate_internal_module_bytecode && c.options.compile_mode.is_executable() {
append_internal_module_bytecode(
c,
&mut result,
external_string_table.as_ref().and_then(|t| t.get()),
);
}
if let Some(table) = external_string_table {
let bytes = table.take();
debug!("Bytecode external string table: {} bytes", bytes.len());
result.push(options::OutputFile::init(options::OutputFileInit {
output_path: b".bytecode-strings".to_vec().into_boxed_slice(),
input_path: Box::default(),
input_loader: Loader::File,
hash: None,
output_kind: options::OutputKind::BytecodeStringTable,
loader: Loader::File,
size: Some(bytes.len()),
display_size: bytes.len() as u32,
data: options::OutputFileData::Buffer { data: bytes },
side: None,
entry_point_index: None,
is_executable: false,
..Default::default()
}));
}
Ok(result)
}

/// `--compile --bytecode`: the executable also carries ahead-of-time bytecode for the internal modules (node:fs, …) the
/// bundle imports, so their first `require` decodes instead of parsing. One `OutputKind::BuiltinBytecode` per module;
/// StandaloneModuleGraph::to_bytes lays them out and InternalModuleRegistry picks them up by id.
fn append_internal_module_bytecode(
c: &LinkerContext,
output_files: &mut Vec<options::OutputFile>,
external_strings: Option<core::ptr::NonNull<crate::bundle_v2::dispatch::EncoderStringTable>>,
) {
let import_records = c.graph.ast.items_import_records();
let mut specifiers: Vec<&[u8]> = Vec::new();
for source_index in &c.graph.reachable_files {
let Some(records) = import_records.get(source_index.get() as usize) else {
continue;
};
for record in records.as_slice() {
if record.source_index.is_valid() || record.path.text.is_empty() {
continue;
}
let text: &[u8] = record.path.text;
let is_builtin = record.tag == bun_ast::ImportRecordTag::Builtin
|| text.starts_with(b"node:")
|| text.starts_with(b"bun:")
|| bun_resolve_builtins::HardcodedModule::Alias::has(
text,
crate::options::Target::Bun,
Default::default(),
);
if is_builtin && !specifiers.contains(&text) {
specifiers.push(text);
}
}
}
if specifiers.is_empty() {
return;
}
for (id, bytecode) in crate::bundle_v2::dispatch::generate_internal_module_bytecode(
&specifiers,
u32::MAX,
external_strings,
) {
debug!("Internal module bytecode {}: {} bytes", id, bytecode.len());
output_files.push(options::OutputFile::init(options::OutputFileInit {
output_path: id.to_string().into_bytes().into_boxed_slice(),
input_path: Box::default(),
input_loader: Loader::Js,
hash: None,
output_kind: options::OutputKind::BuiltinBytecode,
loader: Loader::File,
size: Some(bytecode.len()),
display_size: bytecode.len() as u32,
data: options::OutputFileData::Buffer { data: bytecode },
side: None,
entry_point_index: None,
is_executable: false,
..Default::default()
}));
}
}

/// Position of each chunk in the order a `--compile` executable is expected to
Expand Down
1 change: 1 addition & 0 deletions src/bundler/linker_context/writeOutputFilesToDisk.rs
Original file line number Diff line number Diff line change
Expand Up @@ -405,6 +405,7 @@ pub(crate) fn write_output_files_to_disk(
c.options.output_format,
&code_result.buffer,
&source_provider_url,
None,
) {
let source_provider_url_str = source_provider_url.to_utf8();
debug!(
Expand Down
5 changes: 5 additions & 0 deletions src/bundler/options.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1285,6 +1285,9 @@ pub struct BundleOptions<'a> {
pub ignore_dce_annotations: bool,
pub emit_dce_annotations: bool,
pub bytecode: bool,
/// `--compile --bytecode` for another platform: the executable's internal-module sources (and their bytecode) are that
/// platform's, not this one's, so don't embed bytecode generated from ours.
pub compile_target_is_host: bool,

pub code_coverage: bool,
pub debugger: bool,
Expand Down Expand Up @@ -1475,6 +1478,7 @@ impl<'a> BundleOptions<'a> {
ignore_dce_annotations: self.ignore_dce_annotations,
emit_dce_annotations: self.emit_dce_annotations,
bytecode: self.bytecode,
compile_target_is_host: self.compile_target_is_host,
code_coverage: self.code_coverage,
debugger: self.debugger,
compile_mode: self.compile_mode,
Expand Down Expand Up @@ -1719,6 +1723,7 @@ impl<'a> BundleOptions<'a> {
ignore_dce_annotations: false,
emit_dce_annotations: false,
bytecode: false,
compile_target_is_host: true,
code_coverage: false,
debugger: false,
compile_mode: CompileMode::None,
Expand Down
Loading
Loading