From ef7b6d18e286a2fcaef036bde3d33305e6845ead Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralph=20K=C3=BCpper?= Date: Mon, 3 Aug 2026 14:35:49 +0200 Subject: [PATCH 1/2] fix(native-backend): construct invoke/landingpad/personality in the in-process reader (#7302) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #7305 made every try-containing (and every async) function carry a personality clause and invoke/landingpad instructions, which the in-process LLVM reader could not build — so it bailed such modules to the textual path. spike.ts is async, so native construction stopped activating and the job's own liveness assertion failed. The gate was right; the bail was the bug. Adds personality-clause parsing + set_personality_function, invoke construction (value and void forms, sharing the call path's callsite-typed semantics), and landingpad construction for Perry's single catch-all shape. Deletes the module-level bail and has_eh_personality. Verified against LLVM 22.1.4: liveness restored, spike.ts and 3-unit batch.ts emit byte-identical objects on both paths, and a full try/catch/finally program runs identically under native construction. Gate hardened with a tracked EH corpus test (which asserts the corpus still contains invoke/landingpad/personality) and an EH arm in the workflow. --- .github/workflows/llvm-inprocess.yml | 17 + changelog.d/7306-native-backend-invoke.md | 42 + crates/perry-codegen/src/codegen/mod.rs | 11 - crates/perry-codegen/src/dialect.rs | 167 +- crates/perry-codegen/src/module.rs | 9 - crates/perry-codegen/src/native_emit.rs | 10 +- experiments/llvm-inprocess-spike/eh_text.ll | 6020 +++++++++++++++++++ 7 files changed, 6250 insertions(+), 26 deletions(-) create mode 100644 changelog.d/7306-native-backend-invoke.md create mode 100644 experiments/llvm-inprocess-spike/eh_text.ll diff --git a/.github/workflows/llvm-inprocess.yml b/.github/workflows/llvm-inprocess.yml index 4e76b87185..078d9736aa 100644 --- a/.github/workflows/llvm-inprocess.yml +++ b/.github/workflows/llvm-inprocess.yml @@ -85,6 +85,7 @@ jobs: # the tracked .ll corpora would otherwise green vacuously. echo "$out" | grep -q "dialect::tests::corpus_spike ... ok" echo "$out" | grep -q "dialect::tests::corpus_batch_kernel ... ok" + echo "$out" | grep -q "dialect::tests::corpus_exception_handling ... ok" echo "$out" | grep -q "inprocess::tests::rs4gc_schedules_in_process ... ok" - name: Native-mode smoke — liveness, behavior parity, object-byte verdicts @@ -109,3 +110,19 @@ jobs: PERRY_LLVM_INPROCESS=diff PERRY_CODEGEN_UNITS=3 "$BIN" \ benchmarks/app-patterns/kernels/batch.ts -o /tmp/batch_diff 2> /tmp/diffu.err grep -q "ir-diff. OK.*3 units" /tmp/diffu.err + + # #7302: exception handling. try/catch lowers to invoke/landingpad + # with a personality on the define, so a reader that cannot build + # those forms silently loses every try-containing module to the + # textual path — which is exactly how this arm went red once the + # EH migration landed. Assert the EH program takes the native path + # AND behaves identically. + EH=test-files/test_gap_7302_invoke_eh_paths.ts + "$BIN" "$EH" -o /tmp/eh_text + /tmp/eh_text > /tmp/eh_text.out + PERRY_LLVM_INPROCESS=native "$BIN" "$EH" -o /tmp/eh_native 2> /tmp/eh_native.err + grep -q "in-process LLVM backend active" /tmp/eh_native.err + /tmp/eh_native > /tmp/eh_native.out + cmp /tmp/eh_text.out /tmp/eh_native.out + PERRY_LLVM_INPROCESS=diff "$BIN" "$EH" -o /tmp/eh_diff 2> /tmp/eh_diff.err + grep -q "ir-diff. OK" /tmp/eh_diff.err diff --git a/changelog.d/7306-native-backend-invoke.md b/changelog.d/7306-native-backend-invoke.md new file mode 100644 index 0000000000..6f2675b101 --- /dev/null +++ b/changelog.d/7306-native-backend-invoke.md @@ -0,0 +1,42 @@ +### In-process LLVM backend: construct `invoke`/`landingpad`/personality (#7302 follow-up) + +The exception-lowering migration (#7302/#7305) made every `try`-containing +function — and every `async` function, via the rejection boundary — carry a +`personality` clause and `invoke`/`landingpad` instructions. The in-process +LLVM reader (`dialect.rs`, #7301) could not construct those forms, so #7305 +routed such modules to the textual path with a module-level bail. That bail +turned the `native-backend` job red: its subject (`spike.ts`) is async, so +native construction never activated and the job's own liveness assertion — +`grep "in-process LLVM backend active"` — correctly failed. + +Fixed properly rather than by narrowing the gate: + +- `parse_header` lifts the `personality ptr @NAME` clause out of the define's + attribute list and `begin` applies it via `set_personality_function` + (previously the attribute loop hit `personality` and bailed as an unknown + attribute). +- New `invoke` construction (value and void forms), sharing the callsite-typed, + call-through-pointer semantics of the existing `call` path and adding the + normal/unwind edges. +- New `landingpad` construction for the one shape Perry emits — a catch-all + `{ ptr, i32 } catch ptr null` whose result is unused (the thrown value comes + from the runtime's rooted TLS slot). Any other shape bails loudly. +- The module-level bail and its `has_eh_personality` helper are deleted; the + per-function textual path in `native_emit` now feeds the reader rather than + falling back to clang. + +Verified locally against LLVM 22.1.4: liveness assertion restored, `spike.ts` +and the 3-unit `batch.ts` arms emit **byte-identical objects** on both paths, +and a full try/catch/finally program compiles through native construction with +output identical to the textual path. + +Gate hardening (so this class of regression is caught by the gate that owns +it, not by a downstream merge): + +- `dialect::tests::corpus_exception_handling` round-trips a tracked + try/catch/finally corpus (`eh_text.ll`) through native construction and the + LLVM verifier, and asserts the corpus still *contains* invoke edges, a + landing pad, and the personality clause — a corpus that lost its EH forms + would otherwise keep passing while testing nothing. +- The `native-backend` workflow gains an EH arm: liveness + behavior parity + + object-byte diff verdict on a try/catch program, alongside the async spike. diff --git a/crates/perry-codegen/src/codegen/mod.rs b/crates/perry-codegen/src/codegen/mod.rs index a48cfab87e..3f41e6135f 100644 --- a/crates/perry-codegen/src/codegen/mod.rs +++ b/crates/perry-codegen/src/codegen/mod.rs @@ -2654,11 +2654,6 @@ fn try_native_units( target: Option<&str>, module_prefix: &str, ) -> Option>> { - // Invoke-EH (#7302): see try_native_construction — textual path for - // try/catch modules until the native reader learns invoke. - if llmod.has_eh_personality() { - return None; - } match crate::native_emit::native_mode() { crate::native_emit::NativeMode::Off => None, crate::native_emit::NativeMode::Native => Some( @@ -2691,12 +2686,6 @@ fn try_native_construction( target: Option<&str>, module_prefix: &str, ) -> Option>> { - // Invoke-EH (#7302): the native line reader does not know - // `invoke`/`landingpad`/`catchswitch` yet — modules with try/catch take - // the textual path. Follow-up tracked on #7301. - if llmod.has_eh_personality() { - return None; - } match crate::native_emit::native_mode() { crate::native_emit::NativeMode::Off => None, crate::native_emit::NativeMode::Native => Some(crate::native_emit::compile_module_native( diff --git a/crates/perry-codegen/src/dialect.rs b/crates/perry-codegen/src/dialect.rs index c6e81dad96..ad3260c36e 100644 --- a/crates/perry-codegen/src/dialect.rs +++ b/crates/perry-codegen/src/dialect.rs @@ -156,6 +156,9 @@ struct ParsedHeader { /// (type token, `%name`) per parameter. params: Vec<(String, String)>, attr_str: String, + /// `personality ptr @NAME` clause, if the define carries one (#7302: + /// every function containing try/catch does). + personality: Option, } fn parse_header(header: &str) -> Result { @@ -201,7 +204,25 @@ fn parse_header(header: &str) -> Result { let name = unquote(&after[..paren]); let close = rmatch_paren(after, paren)?; let params_str = &after[paren + 1..close]; - let attr_str = after[close + 1..].trim().to_string(); + let mut attr_str = after[close + 1..].trim().to_string(); + // `personality ptr @NAME` sits with the fn attributes on the define + // line; lift it out so the attribute loop only sees real attributes. + let mut personality = None; + if let Some(pos) = attr_str.find("personality ") { + let tail = attr_str[pos..].to_string(); + attr_str = attr_str[..pos].trim_end().to_string(); + let pname = tail + .trim_start_matches("personality ") + .trim() + .trim_start_matches("ptr ") + .trim() + .trim_start_matches('@') + .trim(); + if pname.is_empty() { + bail!("malformed personality clause: {tail}"); + } + personality = Some(unquote(pname)); + } let mut params = Vec::new(); for p in split_top_level(params_str) { @@ -220,6 +241,7 @@ fn parse_header(header: &str) -> Result { name, params, attr_str, + personality, }) } @@ -257,6 +279,12 @@ impl<'ctx, 'm> FnReader<'ctx, 'm> { bail!("duplicate define of @{}", h.name); } let param_names: Vec = h.params.iter().map(|(_, n)| n.clone()).collect(); + if let Some(pname) = &h.personality { + let pf = module + .get_function(pname) + .ok_or_else(|| anyhow!("personality @{pname} not declared"))?; + func.set_personality_function(pf); + } let attr_str = h.attr_str; for a in attr_str.split_whitespace() { match a { @@ -425,6 +453,8 @@ impl<'ctx, 'm> FnReader<'ctx, 'm> { "call" | "tail call" => self .call(Some(dst), rest)? .ok_or_else(|| anyhow!("call with result had void type"))?, + "invoke" => return self.invoke(Some(dst), rest).map(|_| ()), + "landingpad" => return self.landingpad(dst, rest), "getelementptr" => self.gep(dst, rest)?, "select" => { // `select i1 C, T A, T B` @@ -506,6 +536,7 @@ impl<'ctx, 'm> FnReader<'ctx, 'm> { Ok(()) } "call" | "tail call" => self.call(None, rest).map(|_| ()), + "invoke" => self.invoke(None, rest).map(|_| ()), "switch" => self.switch(rest), "unreachable" => { self.builder.build_unreachable().map_err(be)?; @@ -753,6 +784,114 @@ impl<'ctx, 'm> FnReader<'ctx, 'm> { } } + /// `[%r =] invoke TY @callee(ARGS) to label %CONT unwind label %PAD` + /// (#7302). Shares the callsite-typed, call-through-pointer semantics + /// of [`call`]; the only additions are the two edges. + fn invoke(&mut self, dst: Option<&str>, rest: &str) -> Result>> { + let to_pos = rest + .rfind(" to label %") + .ok_or_else(|| anyhow!("invoke without `to label`"))?; + let head = &rest[..to_pos]; + let edges = &rest[to_pos + " to label %".len()..]; + let (cont_label, unwind_label) = edges + .split_once(" unwind label %") + .ok_or_else(|| anyhow!("invoke without `unwind label`"))?; + let cont = self.block(cont_label.trim()); + let pad = self.block(unwind_label.trim()); + + let callee_pos = head + .find(['@', '%']) + .ok_or_else(|| anyhow!("invoke without callee"))?; + let sig_str = head[..callee_pos].trim().trim_end_matches('*').trim(); + let after = &head[callee_pos..]; + let paren = after + .find('(') + .ok_or_else(|| anyhow!("invoke missing arg list"))?; + let callee = &after[..paren]; + let close = rmatch_paren(after, paren)?; + let args_str = &after[paren + 1..close]; + + // `build_indirect_invoke` takes basic values (not metadata enums + // like the call path), so collect both shapes once. + let mut args: Vec = Vec::new(); + let mut arg_types: Vec = Vec::new(); + for a in split_top_level(args_str) { + let (aty, atok) = ty_and_val(&a)?; + let ty = basic_type(self.ctx, aty)?; + args.push(self.val(ty, atok)?); + arg_types.push(ty.into()); + } + + let name = dst.map(|d| d.trim_start_matches('%')).unwrap_or(""); + let fn_ty = indirect_fn_type(self.ctx, sig_str, &arg_types)?; + let callee_ptr = if let Some(fname) = callee.strip_prefix('@') { + let n = unquote(fname); + let f = match self.module.get_function(&n) { + Some(f) => f, + None if n.starts_with("llvm.") => self.module.add_function(&n, fn_ty, None), + None => bail!("invoke of undeclared @{n}"), + }; + f.as_global_value().as_pointer_value() + } else { + self.val(self.ctx.ptr_type(AddressSpace::default()).into(), callee)? + .into_pointer_value() + }; + let site = self + .builder + .build_indirect_invoke(fn_ty, callee_ptr, &args, cont, pad, name) + .map_err(be)?; + // An invoke terminates its block; the emitted text continues in + // the inline continuation label, which arrives as the next line. + match site.try_as_basic_value() { + inkwell::values::ValueKind::Basic(v) => { + if let Some(d) = dst { + self.vals.insert(d.trim().to_string(), v); + } + Ok(Some(v)) + } + _ => Ok(None), + } + } + + /// `%r = landingpad { ptr, i32 } catch ptr null` (#7302). Perry emits + /// exactly one shape — a catch-all pad whose `{ptr, i32}` result is + /// unused (the thrown value comes from the runtime's rooted TLS slot), + /// so anything else is a dialect drift and bails loudly. + fn landingpad(&mut self, dst: &str, rest: &str) -> Result<()> { + let body = rest.trim(); + let clause_pos = body + .find("catch") + .ok_or_else(|| anyhow!("landingpad without a catch clause: {body}"))?; + let ty_tok = body[..clause_pos].trim(); + if ty_tok.replace(' ', "") != "{ptr,i32}" { + bail!("unexpected landingpad type `{ty_tok}`"); + } + if body[clause_pos..].replace(' ', "") != "catchptrnull" { + bail!("unexpected landingpad clauses `{}`", &body[clause_pos..]); + } + let pf = self + .func + .get_personality_function() + .ok_or_else(|| anyhow!("landingpad in a function with no personality"))?; + let ptr_ty = self.ctx.ptr_type(AddressSpace::default()); + let exc_ty = self + .ctx + .struct_type(&[ptr_ty.into(), self.ctx.i32_type().into()], false); + let null = ptr_ty.const_null(); + let v = self + .builder + .build_landing_pad( + exc_ty, + pf, + &[null.into()], + false, + dst.trim_start_matches('%'), + ) + .map_err(be)?; + self.vals.insert(dst.trim().to_string(), v); + Ok(()) + } + fn call_asm(&mut self, rest: &str) -> Result<()> { // `sideeffect "ASM", "CONSTR"()` — the only asm perry emits is the // empty barrier, but parse the strings properly anyway. @@ -1978,6 +2117,32 @@ mod tests { )); } + /// #7302: a try/catch/finally corpus — invoke edges, landing pads, + /// the personality clause on the define, and the inline continuation + /// labels an invoke split leaves behind. Without this the reader's EH + /// support would be exercised only by the async spike, which has one + /// shape (the async rejection boundary) and no nesting. + #[test] + fn corpus_exception_handling() { + let path = concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../experiments/llvm-inprocess-spike/eh_text.ll" + ); + // Assert the subject is LIVE: a corpus that lost its EH forms would + // still round-trip, and would silently stop testing invoke. + let text = std::fs::read_to_string(path).expect("eh corpus readable"); + assert!( + text.matches("invoke ").count() >= 20, + "eh corpus has no invoke edges left" + ); + assert!(text.contains("landingpad"), "eh corpus has no landing pad"); + assert!( + text.contains("personality ptr @perry_eh_personality"), + "eh corpus lost its personality clause" + ); + corpus_roundtrip(path); + } + #[test] fn corpus_batch_kernel() { corpus_roundtrip(concat!( diff --git a/crates/perry-codegen/src/module.rs b/crates/perry-codegen/src/module.rs index 21330acef0..23c8ca383e 100644 --- a/crates/perry-codegen/src/module.rs +++ b/crates/perry-codegen/src/module.rs @@ -262,15 +262,6 @@ impl LlModule { )); } - /// Invoke-EH (#7302): true when any function in this module carries a - /// personality (i.e. contains try/catch landing pads or SEH funclets). - /// The native-construction backend (exp/llvm-inprocess) bails to the - /// textual path for these modules until its line reader learns - /// `invoke`/`landingpad`/`catchswitch`. - pub fn has_eh_personality(&self) -> bool { - self.functions.iter().any(|f| f.personality.is_some()) - } - /// Invoke-EH (#7302): declare the personality routine referenced by /// every `define ... personality ptr @perry_eh_personality`. Declared /// varargs — the symbol is only ever *named* on define lines and in the diff --git a/crates/perry-codegen/src/native_emit.rs b/crates/perry-codegen/src/native_emit.rs index 03c4327ae8..0048cc0a9f 100644 --- a/crates/perry-codegen/src/native_emit.rs +++ b/crates/perry-codegen/src/native_emit.rs @@ -101,11 +101,11 @@ fn stream_functions<'ctx>( let mut stream = crate::dialect::FnStream::begin(context, module, &header) .map_err(|e| anyhow!("native IR construction failed in @{}: {:#}", f.name, e))?; if f.personality.is_some() { - // The invoke-EH phi-predecessor rewrite needs whole-function - // analysis, and the line reader does not know - // invoke/landingpad; keep the materialized-text path for - // try-containing functions (#7302 — module-level dispatch bails - // even earlier, this is belt-and-braces for direct callers). + // The invoke-EH phi-predecessor rewrite (#7302) needs + // whole-function analysis and therefore text; the line reader + // DOES understand invoke/landingpad, so this path constructs + // natively from the rewritten text rather than falling back to + // clang. let fn_text = f.to_ir(); for line in fn_text.lines().skip(1) { stream.line(line).map_err(|e| { diff --git a/experiments/llvm-inprocess-spike/eh_text.ll b/experiments/llvm-inprocess-spike/eh_text.ll new file mode 100644 index 0000000000..6dea9bf928 --- /dev/null +++ b/experiments/llvm-inprocess-spike/eh_text.ll @@ -0,0 +1,6020 @@ +; Generated by perry-codegen +target triple = "arm64-apple-macosx15.0.0" + +@test_gap_7302_invoke_eh_paths_ts_.str.0.bytes = private unnamed_addr constant [5 x i8] c"boom\00" +@test_gap_7302_invoke_eh_paths_ts_.str.1.bytes = private unnamed_addr constant [8 x i8] c"caught:\00" +@test_gap_7302_invoke_eh_paths_ts_.str.2.bytes = private unnamed_addr constant [8 x i8] c"message\00" +@test_gap_7302_invoke_eh_paths_ts_.str.3.bytes = private unnamed_addr constant [1 x i8] c"\00" +@test_gap_7302_invoke_eh_paths_ts_.str.4.bytes = private unnamed_addr constant [2 x i8] c"T\00" +@test_gap_7302_invoke_eh_paths_ts_.str.5.bytes = private unnamed_addr constant [2 x i8] c"x\00" +@test_gap_7302_invoke_eh_paths_ts_.str.6.bytes = private unnamed_addr constant [2 x i8] c"t\00" +@test_gap_7302_invoke_eh_paths_ts_.str.7.bytes = private unnamed_addr constant [2 x i8] c"C\00" +@test_gap_7302_invoke_eh_paths_ts_.str.8.bytes = private unnamed_addr constant [2 x i8] c"F\00" +@test_gap_7302_invoke_eh_paths_ts_.str.9.bytes = private unnamed_addr constant [6 x i8] c"inner\00" +@test_gap_7302_invoke_eh_paths_ts_.str.10.bytes = private unnamed_addr constant [7 x i8] c"outer:\00" +@test_gap_7302_invoke_eh_paths_ts_.str.11.bytes = private unnamed_addr constant [5 x i8] c"|ret\00" +@test_gap_7302_invoke_eh_paths_ts_.str.12.bytes = private unnamed_addr constant [13 x i8] c"finally-ran:\00" +@test_gap_7302_invoke_eh_paths_ts_.str.13.bytes = private unnamed_addr constant [2 x i8] c"a\00" +@test_gap_7302_invoke_eh_paths_ts_.str.14.bytes = private unnamed_addr constant [2 x i8] c"b\00" +@test_gap_7302_invoke_eh_paths_ts_.str.15.bytes = private unnamed_addr constant [11 x i8] c"cf-finally\00" +@test_gap_7302_invoke_eh_paths_ts_.str.16.bytes = private unnamed_addr constant [14 x i8] c"outer-caught:\00" +@test_gap_7302_invoke_eh_paths_ts_.str.17.bytes = private unnamed_addr constant [5 x i8] c"bump\00" +@test_gap_7302_invoke_eh_paths_ts_.str.18.bytes = private unnamed_addr constant [8 x i8] c"keep-me\00" +@test_gap_7302_invoke_eh_paths_ts_.str.19.bytes = private unnamed_addr constant [11 x i8] c"tf-finally\00" +@test_gap_7302_invoke_eh_paths_ts_.str.20.bytes = private unnamed_addr constant [14 x i8] c"repropagated:\00" +@.str.0 = private unnamed_addr constant [6 x i8] c"basic\00" +@.str.1 = private unnamed_addr constant [8 x i8] c"finBoth\00" +@.str.2 = private unnamed_addr constant [14 x i8] c"nestedRethrow\00" +@.str.3 = private unnamed_addr constant [9 x i8] c"retInTry\00" +@.str.4 = private unnamed_addr constant [17 x i8] c"catchFinallyFail\00" +@.str.5 = private unnamed_addr constant [15 x i8] c"volatileHazard\00" +@.str.6 = private unnamed_addr constant [23 x i8] c"tryFinallyRepropagates\00" +@.str.7 = private unnamed_addr constant [131 x i8] c"function basic(): string {\0A try {\0A throw new Error(\22boom\22);\0A } catch (e) {\0A return \22caught:\22 + (e as Error).message;\0A }\0A}\00" +@.str.8 = private unnamed_addr constant [206 x i8] c"function finBoth(x: boolean): string {\0A let log = \22\22;\0A try {\0A log += \22T\22;\0A if (x) throw new Error(\22x\22);\0A log += \22t\22;\0A } catch {\0A log += \22C\22;\0A } finally {\0A log += \22F\22;\0A }\0A return log;\0A}\00" +@.str.9 = private unnamed_addr constant [222 x i8] c"function nestedRethrow(): string {\0A try {\0A try {\0A throw new Error(\22inner\22);\0A } catch (e) {\0A throw new Error(\22outer:\22 + (e as Error).message);\0A }\0A } catch (e2) {\0A return (e2 as Error).message;\0A }\0A}\00" +@.str.10 = private unnamed_addr constant [170 x i8] c"function retInTry(): string {\0A let log = \22\22;\0A try {\0A log += \22T\22;\0A return log + \22|ret\22;\0A } finally {\0A log += \22F\22;\0A console.log(\22finally-ran:\22 + log);\0A }\0A}\00" +@.str.11 = private unnamed_addr constant [254 x i8] c"function catchFinallyFail(): string {\0A try {\0A try {\0A throw new Error(\22a\22);\0A } catch {\0A throw new Error(\22b\22);\0A } finally {\0A console.log(\22cf-finally\22);\0A }\0A } catch (e) {\0A return \22outer-caught:\22 + (e as Error).message;\0A }\0A}\00" +@.str.12 = private unnamed_addr constant [218 x i8] c"function volatileHazard(): number {\0A let acc = 0;\0A for (let i = 0; i < 100; i++) {\0A acc += i;\0A }\0A try {\0A acc = 4141;\0A acc += 800;\0A throw new Error(\22bump\22);\0A } catch {\0A acc += 1;\0A }\0A return acc;\0A}\00" +@.str.13 = private unnamed_addr constant [224 x i8] c"function tryFinallyRepropagates(): string {\0A try {\0A try {\0A throw new Error(\22keep-me\22);\0A } finally {\0A console.log(\22tf-finally\22);\0A }\0A } catch (e) {\0A return \22repropagated:\22 + (e as Error).message;\0A }\0A}\00" + +@perry_null_guard_zero = internal global i32 0 +@PERRY_CLASS_FIELD_INLINE_GUARD_DISABLED = external global i8 +@PERRY_ARRAY_INDEX_FAST_PATH_INVALIDATED = external global i8 +@PERRY_INCREMENTAL_MARK_BARRIER_ACTIVE_COUNT = external global i32 +@PERRY_TA_KIND_CACHE = external global [64 x i64] +@PERRY_TA_VIEW_GUARD = external global i64 +@perry_ic_1 = private global [8 x i64] zeroinitializer +@perry_ic_3 = private global [8 x i64] zeroinitializer +@perry_ic_5 = private global [8 x i64] zeroinitializer +@perry_ic_7 = private global [8 x i64] zeroinitializer +@perry_ic_9 = private global [8 x i64] zeroinitializer +@test_gap_7302_invoke_eh_paths_ts_.str.0.handle = internal global double 0.0 +@test_gap_7302_invoke_eh_paths_ts_.str.1.handle = internal global double 0.0 +@test_gap_7302_invoke_eh_paths_ts_.str.2.handle = internal global double 0.0 +@test_gap_7302_invoke_eh_paths_ts_.str.3.handle = internal global double 0.0 +@test_gap_7302_invoke_eh_paths_ts_.str.4.handle = internal global double 0.0 +@test_gap_7302_invoke_eh_paths_ts_.str.5.handle = internal global double 0.0 +@test_gap_7302_invoke_eh_paths_ts_.str.6.handle = internal global double 0.0 +@test_gap_7302_invoke_eh_paths_ts_.str.7.handle = internal global double 0.0 +@test_gap_7302_invoke_eh_paths_ts_.str.8.handle = internal global double 0.0 +@test_gap_7302_invoke_eh_paths_ts_.str.9.handle = internal global double 0.0 +@test_gap_7302_invoke_eh_paths_ts_.str.10.handle = internal global double 0.0 +@test_gap_7302_invoke_eh_paths_ts_.str.11.handle = internal global double 0.0 +@test_gap_7302_invoke_eh_paths_ts_.str.12.handle = internal global double 0.0 +@test_gap_7302_invoke_eh_paths_ts_.str.13.handle = internal global double 0.0 +@test_gap_7302_invoke_eh_paths_ts_.str.14.handle = internal global double 0.0 +@test_gap_7302_invoke_eh_paths_ts_.str.15.handle = internal global double 0.0 +@test_gap_7302_invoke_eh_paths_ts_.str.16.handle = internal global double 0.0 +@test_gap_7302_invoke_eh_paths_ts_.str.17.handle = internal global double 0.0 +@test_gap_7302_invoke_eh_paths_ts_.str.18.handle = internal global double 0.0 +@test_gap_7302_invoke_eh_paths_ts_.str.19.handle = internal global double 0.0 +@test_gap_7302_invoke_eh_paths_ts_.str.20.handle = internal global double 0.0 + +declare void @js_gc_init() +declare void @js_typed_feedback_maybe_dump_trace() +declare void @js_stdlib_init_dispatch() +declare void @perry_app_group_init(ptr, i32) +declare void @perry_macos_bundle_chdir() +declare i32 @perry_i18n_locale_index_for(i64, i32) +declare void @perry_i18n_init(ptr, ptr, i32, i32) +declare void @perry_i18n_set_currencies(ptr, i32) +declare i32 @perry_i18n_plural_category(i32, double) +declare void @js_register_function_name(ptr, ptr, i32) +declare void @js_register_function_source(ptr, ptr, i32) +declare void @js_console_log_dynamic(double) +declare void @js_console_log_number(double) +declare void @js_console_error_dynamic(double) +declare void @js_console_error_number(double) +declare void @js_console_warn_dynamic(double) +declare void @js_console_warn_number(double) +declare void @js_console_dir_with_options(double, double) +declare double @js_console_method_by_value(double) +declare double @js_nanbox_string(i64) +declare double @js_nanbox_pointer(i64) #2 +declare i64 @js_nanbox_get_pointer(double) #2 +declare double @js_native_handle_new_owned(i64, i64, i32, i32, ptr, ptr, i64) +declare double @js_native_handle_new_borrowed(i64, i64, i32, i32, ptr, i64) +declare i64 @js_native_handle_unwrap(double, i64, i32, i32, i32) +declare i64 @js_string_from_bytes(ptr, i32) +declare i64 @js_string_from_wtf8_bytes(ptr, i32) +declare i32 @js_is_truthy(double) #3 +declare double @js_native_abi_check_f64(double) +declare i32 @js_typed_f64_arg_guard(double) #2 +declare double @js_typed_f64_arg_to_raw(double) +declare i32 @js_typed_i32_arg_guard(double) #2 +declare i32 @js_typed_i32_arg_to_raw(double) #2 +declare i32 @js_typed_i1_arg_guard(double) #2 +declare i32 @js_typed_i1_arg_to_raw(double) #2 +declare i32 @js_typed_string_arg_guard(double) #2 +declare i64 @js_typed_string_arg_to_raw(double) +declare float @js_native_abi_check_f32(double) +declare i32 @js_native_abi_check_i32(double) +declare i64 @js_native_abi_check_i64(double) +declare i32 @js_native_abi_check_u32(double) +declare i64 @js_native_abi_check_u64(double) +declare i64 @js_native_abi_check_usize(double) +declare i64 @js_native_abi_check_string_ptr(double) +declare i64 @js_native_abi_check_ptr(double) +declare ptr @js_native_abi_check_buffer_data_ptr(double) +declare i64 @js_native_abi_check_buffer_byte_len(double) +declare i64 @js_native_abi_check_promise(double) +declare i64 @js_native_abi_check_pod_object(double) +declare double @js_date_now() +declare void @js_gc_register_global_root(i64) +declare i64 @js_string_concat(i64, i64) +declare double @js_string_concat_box(double, double) +declare i64 @js_jsvalue_to_string(double) +declare i64 @js_jsvalue_to_string_method(double) +declare i64 @js_jsvalue_to_string_coerce(double) +declare i64 @js_string_concat_value(i64, double) +declare i64 @js_value_concat_string(double, i64) +declare i64 @js_string_concat_chain(i64, i32) +declare i64 @js_string_append(i64, i64) +declare i32 @js_string_index_of(i64, i64) +declare i32 @js_string_index_of_from(i64, i64, i32) +declare i32 @js_string_position_to_index(double) +declare i64 @js_string_slice(i64, i32, i32) +declare i64 @js_string_substring(i64, i32, i32) +declare i64 @js_string_substr(i64, double, double) +declare i64 @js_string_split(i64, i64) +declare i64 @js_string_split_n(i64, i64, i32) +declare double @js_string_split_part_value(i64, i64, i32) +declare double @js_string_split_part_utf16_length(i64, i64, i32) +declare double @js_string_to_upper_case_split_part_utf16_length(i64, i64, i32) +declare i32 @js_string_to_upper_case_index_of(i64, i64) +declare i64 @js_string_split_value(i64, double, double) +declare double @js_math_trunc(double) +declare double @js_math_round(double) +declare double @js_math_sign(double) +declare double @js_math_imul(double, double) +declare double @js_math_pow(double, double) +declare double @llvm.sqrt.f64(double) +declare double @llvm.floor.f64(double) +declare double @llvm.ceil.f64(double) +declare double @llvm.fabs.f64(double) +declare double @llvm.copysign.f64(double, double) +declare void @llvm.assume(i1) +declare i16 @llvm.bswap.i16(i16) +declare i32 @llvm.bswap.i32(i32) +declare i64 @llvm.bswap.i64(i64) +declare i32 @llvm.aarch64.fjcvtzs(double) +declare void @llvm.memset.p0.i64(ptr, i8, i64, i1) +declare void @llvm.memmove.p0.p0.i64(ptr, ptr, i64, i1) +declare i64 @js_json_stringify(double, i32) +declare i64 @js_map_alloc(i32) +declare i64 @js_text_encoder_encode_into_llvm(double, double) +declare i64 @js_value_typeof(double) +declare i32 @js_string_starts_with(i64, i64) +declare i32 @js_string_ends_with(i64, i64) +declare i64 @js_string_search_value_to_string(double, i32) +declare i32 @js_string_starts_with_at(i64, i64, i32) +declare i32 @js_string_ends_with_at(i64, i64, i32) +declare i64 @js_closure_alloc(ptr, i32) +declare i64 @js_closure_alloc_singleton(ptr) +declare i64 @js_closure_alloc_with_captures_singleton(ptr, i32, ptr) +declare void @js_closure_set_capture_bits(i64, i32, i64) +declare i64 @js_closure_get_capture_bits(i64, i32) +declare void @js_closure_set_capture_f64(i64, i32, double) +declare double @js_closure_get_capture_f64(i64, i32) +declare void @js_register_closure_rest(ptr, i32) +declare void @js_register_closure_synthetic_arguments(ptr, i32) +declare void @js_register_closure_rest_and_arguments(ptr, i32) +declare void @js_register_closure_arity(ptr, i32) +declare void @js_register_closure_length(ptr, i32) +declare void @js_register_closure_arrow_function(ptr) +declare void @js_register_closure_strict_function(ptr) +declare void @js_register_closure_async_function(ptr) +declare void @js_register_closure_generator_function(ptr) +declare void @js_register_closure_async_generator_function(ptr) +declare i64 @js_closure_unbox_callee_checked(double) +declare i64 @js_closure_unbox_callee_checked_rebind(double, double) +declare double @js_closure_call0(i64) +declare double @js_closure_call1(i64, double) +declare double @js_closure_call2(i64, double, double) +declare double @js_closure_call3(i64, double, double, double) +declare double @js_closure_call4(i64, double, double, double, double) +declare double @js_closure_call5(i64, double, double, double, double, double) +declare double @js_closure_call6(i64, double, double, double, double, double, double) +declare double @js_closure_call7(i64, double, double, double, double, double, double, double) +declare double @js_closure_call8(i64, double, double, double, double, double, double, double, double) +declare double @js_closure_call9(i64, double, double, double, double, double, double, double, double, double) +declare double @js_closure_call10(i64, double, double, double, double, double, double, double, double, double, double) +declare double @js_closure_call11(i64, double, double, double, double, double, double, double, double, double, double, double) +declare double @js_closure_call12(i64, double, double, double, double, double, double, double, double, double, double, double, double) +declare double @js_closure_call13(i64, double, double, double, double, double, double, double, double, double, double, double, double, double) +declare double @js_closure_call14(i64, double, double, double, double, double, double, double, double, double, double, double, double, double, double) +declare double @js_closure_call15(i64, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double) +declare double @js_closure_call16(i64, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double) +declare i64 @js_array_map(i64, i64) +declare void @js_array_map_discard(i64, i64) +declare i64 @js_array_filter(i64, i64) +declare i64 @js_array_concat(i64, i64) +declare i64 @js_array_concat_new(i64, i64) +declare i64 @js_error_new() +declare i64 @js_error_new_with_message(i64) +declare i64 @js_error_new_from_value(double) +declare i64 @js_error_new_kind_from_value(i32, double) +declare i64 @js_error_new_with_cause_from_value(double, double) +declare i64 @js_error_new_kind_with_options_from_value(i32, double, double) +declare double @js_assert_assertion_error_ctor(double) +declare double @js_assert_assert_ctor(double) +declare void @js_throw_type_error_property_access(i32, ptr, i64) +declare void @js_throw_type_error_not_a_function(ptr, i64, ptr, i64) +declare void @js_throw_error_with_code(ptr, i64, ptr, i64, i32) +declare i64 @js_map_set(i64, double, double) +declare i64 @js_map_set_string_number(i64, i64, double) +declare i64 @js_map_set_string_key(i64, i64, double) +declare i64 @js_map_set_string_i32(i64, i64, i32) +declare i64 @js_map_set_string_u32(i64, i64, i32) +declare i64 @js_map_set_string_f32(i64, i64, float) +declare i64 @js_map_set_string_bool(i64, i64, i32) +declare i64 @js_map_set_string_string(i64, i64, i64) +declare i64 @js_map_set_number_key(i64, double, double) +declare double @js_map_get(i64, double) +declare double @js_map_get_string_key(i64, i64) +declare double @js_map_get_number_key(i64, double) +declare i32 @js_map_has(i64, double) +declare i32 @js_map_has_string_key(i64, i64) +declare i32 @js_map_has_number_key(i64, double) +declare i32 @js_map_delete(i64, double) +declare i32 @js_map_delete_string_key(i64, i64) +declare i32 @js_map_delete_number_key(i64, double) +declare i64 @js_object_keys(i64) +declare i64 @js_object_keys_value(double) +declare i64 @js_for_in_keys_value(double) +declare double @js_is_finite(double) +declare i32 @js_is_undefined_or_bare_nan(double) +declare double @js_math_min_array(i64) +declare double @js_math_max_array(i64) +declare double @js_math_min2(double, double) +declare double @js_math_max2(double, double) +declare i64 @js_string_coerce(double) +declare i64 @js_string_coerce_method_this(double, ptr, i64) +declare i64 @js_array_slice(i64, i32, i32) +declare i64 @js_array_slice_values(i64, double, double) +declare double @js_array_shift_f64(i64) +declare i64 @js_set_alloc(i32) +declare i64 @js_set_from_array(i64) +declare i64 @js_set_from_iterable(double) +declare i64 @js_map_from_array(i64) +declare i64 @js_map_from_iterable(double) +declare double @js_object_has_property(double, double) +declare double @js_in_operator(double, double) +declare double @js_private_brand_check(double, i32, ptr, i32) +declare double @js_private_guard(double, i32, ptr, i32, i32, i32) +declare double @js_fs_to_unix_timestamp(double) +declare i32 @js_fs_write_file_sync(double, double) +declare i32 @js_fs_write_file_sync_options(double, double, double) +declare i32 @js_fs_append_file_sync(double, double) +declare i32 @js_fs_append_file_sync_options(double, double, double) +declare i32 @js_fs_exists_sync(double) +declare i64 @js_fs_read_file_sync(double) +declare double @js_fs_read_file_dispatch(double, double) +declare double @js_fs_open_as_blob(double, double) +declare double @js_fs_promises_read_file(double, double) +declare double @js_fs_promises_write_file(double, double, double) +declare double @js_fs_promises_append_file(double, double, double) +declare double @js_fs_promises_mkdir(double, double) +declare double @js_fs_promises_rmdir(double, double) +declare i32 @js_fs_mkdir_sync(double) +declare i32 @js_fs_mkdir_sync_options(double, double) +declare i32 @js_fs_unlink_sync(double) +declare double @js_fs_readdir_sync(double, double) +declare double @js_fs_stat_sync(double) +declare double @js_fs_stat_sync_options(double, double) +declare double @js_fs_lstat_sync(double) +declare double @js_fs_lstat_sync_options(double, double) +declare i32 @js_fs_rename_sync(double, double) +declare i32 @js_fs_copy_file_sync(double, double) +declare i32 @js_fs_copy_file_sync_flags(double, double, double) +declare i32 @js_fs_cp_sync(double, double) +declare i32 @js_fs_cp_sync_options(double, double, double) +declare i32 @js_fs_chmod_sync(double, double) +declare i32 @js_fs_chown_sync(double, double, double) +declare i32 @js_fs_lchown_sync(double, double, double) +declare i32 @js_fs_lchmod_sync(double, double) +declare i32 @js_fs_truncate_sync(double, double) +declare i32 @js_fs_ftruncate_sync(double, double) +declare i32 @js_fs_fsync_sync(double) +declare i32 @js_fs_fdatasync_sync(double) +declare i32 @js_fs_fchmod_sync(double, double) +declare i32 @js_fs_fchown_sync(double, double, double) +declare double @js_fs_fstat_sync(double) +declare double @js_fs_fstat_sync_options(double, double) +declare i32 @js_fs_utimes_sync(double, double, double) +declare i32 @js_fs_lutimes_sync(double, double, double) +declare i32 @js_fs_futimes_sync(double, double, double) +declare double @js_fs_readv_sync(double, double, double) +declare double @js_fs_writev_sync(double, double, double) +declare double @js_fs_statfs_sync(double) +declare double @js_fs_statfs_sync_options(double, double) +declare double @js_fs_opendir_sync(double) +declare double @js_fs_glob_sync(double) +declare double @js_fs_glob_sync_options(double, double) +declare i32 @js_fs_link_sync(double, double) +declare i32 @js_fs_symlink_sync(double, double) +declare double @js_fs_symlink_callback(double, double, double, double) +declare i64 @js_fs_readlink_sync(double) +declare i64 @js_fs_readlink_sync_options(double, double) +declare double @js_fs_readlink_dispatch(double, double) +declare double @js_fs_open_sync(double, double) +declare i32 @js_fs_close_sync(double) +declare double @js_fs_read_sync(double, double, double, double, double) +declare double @js_fs_read_sync_options(double, double, double) +declare double @js_fs_write_sync(double, double) +declare double @js_fs_write_string_sync_options(double, double, double) +declare double @js_fs_write_buffer_sync(double, double, double, double, double) +declare double @js_fs_write_sync_options_dispatch(double, double, double) +declare i32 @js_fs_access_sync(double) +declare i32 @js_fs_access_sync_mode(double, double) +declare double @js_fs_access_sync_throw(double) +declare double @js_fs_access_sync_throw_mode(double, double) +declare i64 @js_fs_realpath_sync(double) +declare double @js_fs_realpath_dispatch(double, double) +declare i64 @js_fs_mkdtemp_sync(double) +declare i64 @js_fs_mkdtemp_sync_options(double, double) +declare double @js_fs_mkdtemp_dispatch(double, double) +declare double @js_fs_mkdtemp_disposable_sync(double, double) +declare i32 @js_fs_rmdir_sync(double) +declare i32 @js_fs_rmdir_sync_options(double, double) +declare i32 @js_fs_rm_recursive(double) +declare i32 @js_fs_rm_recursive_options(double, double) +declare double @js_fs_create_write_stream(double, double) +declare double @js_fs_create_read_stream(double, double) +declare double @js_fs_utf8_stream_new(double) +declare double @js_fs_utf8_stream_call_without_new(double) +declare double @js_fs_utf8_stream_write(double, double) +declare double @js_fs_utf8_stream_flush(double, double) +declare double @js_fs_utf8_stream_flush_sync(double) +declare double @js_fs_utf8_stream_end(double, double) +declare double @js_fs_utf8_stream_destroy(double) +declare double @js_fs_utf8_stream_reopen(double, double) +declare double @js_fs_utf8_stream_on(double, double, double) +declare double @js_fs_utf8_stream_once(double, double, double) +declare double @js_fs_utf8_stream_off(double, double, double) +declare double @js_fs_utf8_stream_remove_all(double, double) +declare double @js_fs_utf8_stream_listener_count(double, double) +declare double @js_fs_utf8_stream_emit(double, double, double) +declare double @js_fs_read_file_callback(double, double, double) +declare double @js_fs_stats_is_file(double) +declare double @js_fs_stats_is_directory(double) +declare i64 @js_fs_read_file_binary(double) +declare double @js_number_coerce(double) +declare double @js_math_to_number(double) +declare i64 @js_set_add(i64, double) +declare i64 @js_set_add_string(i64, i64) +declare i64 @js_set_add_number(i64, double) +declare i64 @js_set_add_i32(i64, i32) +declare i64 @js_set_add_u32(i64, i32) +declare i64 @js_set_add_f32(i64, float) +declare i64 @js_set_add_bool(i64, i32) +declare i32 @js_set_has(i64, double) +declare i32 @js_set_has_string(i64, i64) +declare i32 @js_set_has_number(i64, double) +declare i32 @js_set_has_i32(i64, i32) +declare i32 @js_set_has_u32(i64, i32) +declare i32 @js_set_has_f32(i64, float) +declare i32 @js_set_has_bool(i64, i32) +declare i32 @js_set_delete(i64, double) +declare i32 @js_set_delete_string(i64, i64) +declare i32 @js_set_delete_number(i64, double) +declare i32 @js_set_delete_i32(i64, i32) +declare i32 @js_set_delete_u32(i64, i32) +declare i32 @js_set_delete_f32(i64, float) +declare i32 @js_set_delete_bool(i64, i32) +declare i32 @js_set_size(i64) +declare i64 @js_set_union(i64, double) +declare i64 @js_set_intersection(i64, double) +declare i64 @js_set_difference(i64, double) +declare i64 @js_set_symmetric_difference(i64, double) +declare i32 @js_set_is_subset_of(i64, double) +declare i32 @js_set_is_superset_of(i64, double) +declare i32 @js_set_is_disjoint_from(i64, double) +declare i64 @js_string_to_lower_case(i64) +declare i64 @js_string_to_upper_case(i64) +declare i64 @js_string_to_locale_lower_case(i64, double) +declare i64 @js_string_to_locale_upper_case(i64, double) +declare void @js_string_validate_collator_args(double, double) +declare i64 @js_string_trim(i64) +declare i64 @js_string_trim_start(i64) +declare i64 @js_string_trim_end(i64) +declare i64 @js_string_big(i64) +declare i64 @js_string_blink(i64) +declare i64 @js_string_bold(i64) +declare i64 @js_string_fixed(i64) +declare i64 @js_string_italics(i64) +declare i64 @js_string_small(i64) +declare i64 @js_string_strike(i64) +declare i64 @js_string_sub(i64) +declare i64 @js_string_sup(i64) +declare i64 @js_string_anchor(i64, i64) +declare i64 @js_string_link(i64, i64) +declare i64 @js_string_fontcolor(i64, i64) +declare i64 @js_string_fontsize(i64, i64) +declare i64 @js_string_char_at(i64, i32) +declare double @js_string_index_get(i64, double) +declare double @js_string_index_get_boxed(double, double) +declare i32 @js_string_index_to_i32(double) +declare i32 @js_string_end_index_to_i32(double, i32) +declare double @js_dyn_index_get(double, double) +declare double @js_dyn_index_set(double, double, double) +declare i64 @js_string_to_char_array(i64) +declare i64 @js_string_repeat(i64, double) +declare i64 @js_string_replace_string(i64, i64, i64) +declare i64 @js_string_replace_all_string(i64, i64, i64) +declare i32 @js_string_equals(i64, i64) +declare i32 @js_string_compare(i64, i64) +declare i32 @js_jsvalue_equals(double, double) +declare i32 @js_string_compare_value(double, double) +declare i64 @js_jsvalue_to_string_radix(double, double) +declare double @js_math_random() +declare double @js_webassembly_validate(double) +declare double @js_webassembly_compile(double) +declare double @js_webassembly_module_new(double) +declare double @js_webassembly_module_exports(double) +declare double @js_webassembly_module_imports(double) +declare double @js_webassembly_module_custom_sections(double, double) +declare double @js_webassembly_instantiate(double, double) +declare double @js_wasi_emit_warning() +declare double @js_webassembly_call_export_0(double, double) +declare double @js_webassembly_call_export_1(double, double, double) +declare double @js_webassembly_call_export_2(double, double, double, double) +declare double @js_webassembly_call_export_3(double, double, double, double, double) +declare double @js_webassembly_call_export_4(double, double, double, double, double, double) +declare void @js_console_log_spread(i64) +declare void @js_console_info_spread(i64) +declare void @js_console_debug_spread(i64) +declare void @js_console_error_spread(i64) +declare void @js_console_warn_spread(i64) +declare double @js_util_format(i64) +declare double @js_util_format_with_options(double, i64) +declare double @js_util_inspect(double, double) +declare double @js_util_debuglog(double, double) +declare double @js_util_diff(double, double) +declare double @js_util_inherits(double, double) +declare double @js_util_is_deep_strict_equal(double, double) +declare double @js_util_strip_vt_control_characters(double) +declare double @js_util_style_text(double, double, double) +declare double @js_util_get_call_sites(double, double) +declare double @js_util_promisify(double) +declare double @js_util_callbackify(double) +declare double @js_util_deprecate(double, double, double) +declare double @js_util_aborted(double, double) +declare double @js_util_transferable_abort_controller() +declare double @js_util_transferable_abort_signal(double) +declare double @js_util_parse_args(double) +declare double @js_boxed_number_new(double) +declare double @js_boxed_string_new(double, i32) +declare double @js_boxed_boolean_new(double) +declare double @js_util_types_is_arguments_object(double) +declare double @js_util_types_is_promise(double) +declare double @js_util_types_is_big_int_object(double) +declare double @js_util_types_is_symbol_object(double) +declare double @js_util_types_is_array_buffer(double) +declare double @js_util_types_is_shared_array_buffer(double) +declare double @js_util_types_is_any_array_buffer(double) +declare double @js_util_types_is_array_buffer_view(double) +declare double @js_util_types_is_data_view(double) +declare double @js_util_types_is_typed_array(double) +declare double @js_util_types_is_uint8_array(double) +declare double @js_util_types_is_int8_array(double) +declare double @js_util_types_is_int16_array(double) +declare double @js_util_types_is_uint16_array(double) +declare double @js_util_types_is_int32_array(double) +declare double @js_util_types_is_uint32_array(double) +declare double @js_util_types_is_float16_array(double) +declare double @js_util_types_is_float32_array(double) +declare double @js_util_types_is_float64_array(double) +declare double @js_util_types_is_uint8_clamped_array(double) +declare double @js_util_types_is_big_int64_array(double) +declare double @js_util_types_is_big_uint64_array(double) +declare double @js_util_types_is_map(double) +declare double @js_util_types_is_weak_map(double) +declare double @js_util_types_is_set(double) +declare double @js_util_types_is_weak_set(double) +declare double @js_util_types_is_date(double) +declare double @js_util_types_is_reg_exp(double) +declare double @js_util_types_is_async_function(double) +declare double @js_util_types_is_generator_function(double) +declare double @js_util_types_is_generator_object(double) +declare double @js_util_types_is_native_error(double) +declare double @js_util_types_is_number_object(double) +declare double @js_util_types_is_string_object(double) +declare double @js_util_types_is_boolean_object(double) +declare double @js_util_types_is_boxed_primitive(double) +declare double @js_util_types_is_external(double) +declare double @js_util_types_is_module_namespace_object(double) +declare double @js_util_types_is_key_object(double) +declare double @js_util_types_is_crypto_key(double) +declare double @js_util_types_is_proxy(double) +declare double @js_util_types_is_map_iterator(double) +declare double @js_util_types_is_set_iterator(double) +declare double @js_data_view_new(double, double, double) +declare double @js_data_view_get_direct(double, double, double, i32, i32) +declare double @js_data_view_set_direct(double, double, double, double, i32, i32) +declare i64 @js_getenv(i64) +declare double @js_getenv_value(i64) +declare void @js_setenv(i64, double) +declare void @js_removeenv(i64) +declare double @js_process_exit_code_get() +declare double @js_process_exit_code_set(double) +declare void @js_console_table(double) +declare void @js_console_table_with_properties(double, double) +declare void @js_console_trace(double) +declare void @js_console_trace_spread(i64) +declare i64 @js_process_cwd() +declare i64 @js_process_argv() +declare double @js_process_pid() +declare double @js_process_ppid() +declare double @js_process_uptime() +declare i64 @js_process_version() +declare double @js_process_versions() +declare double @js_process_memory_usage() +declare double @js_bigint_as_int_n_call(double, double) +declare double @js_bigint_as_uint_n_call(double, double) +declare double @js_v8_serialize(double) +declare double @js_v8_deserialize(double) +declare double @js_v8_get_heap_statistics() +declare double @js_v8_get_heap_code_statistics() +declare double @js_v8_get_heap_space_statistics() +declare double @js_v8_cached_data_version_tag() +declare double @js_v8_get_heap_snapshot(double) +declare double @js_v8_write_heap_snapshot(double, double) +declare double @js_v8_gc_profiler_new() +declare double @js_v8_gc_profiler_start(double) +declare double @js_v8_gc_profiler_stop(double) +declare double @js_v8_gc_profiler_report() +declare double @js_v8_serializer_new(double) +declare double @js_v8_deserializer_new(double) +declare double @js_v8_noop_undefined() +declare double @js_v8_is_building_snapshot() +declare double @js_v8_namespace(ptr, i64) +declare double @js_v8_throw_not_building_snapshot() +declare double @js_v8_promise_hook_register() +declare double @js_v8_promise_hooks_on_init(double) +declare double @js_v8_promise_hooks_on_before(double) +declare double @js_v8_promise_hooks_on_after(double) +declare double @js_v8_promise_hooks_on_settled(double) +declare double @js_v8_promise_hooks_create_hook(double) +declare double @js_process_thread_cpu_usage(double) +declare double @js_process_available_memory() +declare double @js_process_constrained_memory() +declare double @js_process_source_maps_enabled() +declare double @js_process_set_source_maps_enabled(double) +declare double @js_process_has_uncaught_exception_capture_callback() +declare double @js_process_set_uncaught_exception_capture_callback(double) +declare double @js_process_add_uncaught_exception_capture_callback(double) +declare double @js_process_getuid() +declare double @js_process_geteuid() +declare double @js_process_getgid() +declare double @js_process_getegid() +declare void @js_process_emit_warning(double, double, double) +declare double @js_process_cpu_usage(double) +declare double @js_process_resource_usage() +declare double @js_process_active_resources_info() +declare double @js_process_env() +declare double @js_process_hrtime_bigint() +declare double @js_process_hrtime(double) +declare double @js_process_title() +declare void @js_process_set_title(double) +declare void @js_process_chdir(i64) +declare void @js_process_chdir_jsv(double) +declare double @js_process_kill(double, double) +declare void @js_process_exit(double) +declare void @js_process_abort() +declare double @js_process_umask() +declare double @js_process_umask_set(double) +declare double @js_process_on(i64, i64) +declare double @js_process_add_listener(i64, i64) +declare double @js_process_once(i64, i64) +declare double @js_process_prepend_listener(i64, i64) +declare double @js_process_prepend_once_listener(i64, i64) +declare double @js_process_emit(i64, i64) +declare void @js_process_emit_before_exit(double) +declare void @js_process_run_finalization_exit() +declare void @js_trace_events_flush_output() +declare void @js_promise_report_unhandled_rejections() +declare i32 @js_process_pending_exit_code() +declare void @js_gc_release_current_thread_collection_side_allocations() +declare double @js_process_remove_listener(i64, i64) +declare double @js_process_off(i64, i64) +declare double @js_process_remove_all_listeners(i64) +declare double @js_process_listener_count(i64, i64) +declare i64 @js_process_listeners(i64) +declare i64 @js_process_raw_listeners(i64) +declare i64 @js_process_event_names() +declare double @js_process_set_max_listeners(double) +declare double @js_process_get_max_listeners() +declare double @js_process_get_builtin_module(double) +declare double @js_process_get_builtin_module_devirt(double) +declare double @js_process_execve(double, double, double) +declare double @js_module_is_builtin(double) +declare double @js_module_find_package_json(double, double) +declare double @js_module_register(double, double, double) +declare double @js_module_register_hooks(double) +declare void @js_process_next_tick(i64, i64) +declare double @js_process_stdin() +declare double @js_process_stdout() +declare double @js_process_stderr() +declare double @js_readline_set_raw_mode(double) +declare void @js_readline_stdin_on(i64, i64) +declare double @js_readline_stdin_remove_listener(i64, i64) +declare double @js_readline_stdin_pause() +declare double @js_readline_stdin_resume() +declare double @js_readline_stdin_unref() +declare double @js_readline_stdin_ref() +declare double @js_readline_stdin_destroy() +declare double @js_tty_isatty(double) +declare double @js_tty_read_stream_new(double) +declare double @js_tty_write_stream_new(double) +declare double @js_wasi_constructor_call(double) +declare double @js_process_stdin_isatty() +declare double @js_process_stdout_isatty() +declare double @js_process_stderr_isatty() +declare double @js_process_stdout_columns() +declare double @js_process_stdout_rows() +declare double @js_process_stdout_on(i64, i64) +declare i64 @js_os_platform() +declare i64 @js_os_arch() +declare i64 @js_os_type() +declare i64 @js_os_release() +declare i64 @js_os_hostname() +declare i64 @js_os_eol() +declare double @js_os_available_parallelism() +declare i64 @js_os_endianness() +declare i64 @js_os_dev_null() +declare i64 @js_os_machine() +declare i64 @js_os_loadavg() +declare i64 @js_os_version() +declare i64 @js_box_alloc_bits(i64) +declare i64 @js_box_get_bits(i64) +declare void @js_box_set_bits(i64, i64) +declare i64 @js_box_alloc(double) +declare double @js_box_get(i64) +declare void @js_box_set(i64, double) +declare i64 @js_i32_box_alloc(i32) +declare i32 @js_i32_box_get(i64) +declare void @js_i32_box_set(i64, i32) +declare i64 @js_bool_box_alloc(i32) +declare i32 @js_bool_box_get(i64) +declare void @js_bool_box_set(i64, i32) +declare i64 @js_arguments_object_alloc(double, double, i32) +declare void @js_arguments_object_map_index(i64, i32, i64) +declare i64 @js_array_like_to_array(double) +declare i32 @js_object_get_class_id(i64) +declare i64 @js_object_alloc_with_parent(i32, i32, i32) +declare i64 @js_object_alloc_class_with_keys(i32, i32, i32, ptr, i32) +declare i64 @js_object_alloc_class_dynamic_parent(i32, i32, ptr, i32) +declare i64 @js_object_alloc_class_inline_keys(i32, i32, i32, i64) +declare i64 @js_build_class_keys_array(i32, i32, ptr, i32) +declare ptr @js_inline_arena_state() +declare ptr @js_inline_arena_slow_alloc(ptr, i64, i64) +declare i32 @js_object_delete_field(i64, i64) +declare i32 @js_object_delete_field_value(double, i64) +declare i32 @js_object_delete_dynamic_value(double, double) +declare double @js_delete_result(i32, i32) +declare i64 @js_eq(i64, i64) +declare i64 @js_loose_eq(i64, i64) +declare i64 @js_number_to_fixed(double, double) +declare i64 @js_string_replace_regex(i64, i64, i64) +declare i64 @js_string_replace_all_regex(i64, i64, i64) +declare double @js_array_at(i64, double) +declare double @js_date_get_time(double) +declare double @js_date_get_full_year(double) +declare double @js_date_get_month(double) +declare double @js_date_get_date(double) +declare double @js_date_get_day(double) +declare double @js_date_get_hours(double) +declare double @js_date_get_minutes(double) +declare double @js_date_get_seconds(double) +declare double @js_date_get_milliseconds(double) +declare double @js_date_get_utc_day(double) +declare double @js_date_get_utc_full_year(double) +declare double @js_date_get_utc_month(double) +declare double @js_date_get_utc_date(double) +declare double @js_date_get_utc_hours(double) +declare double @js_date_get_utc_minutes(double) +declare double @js_date_get_utc_seconds(double) +declare double @js_date_get_utc_milliseconds(double) +declare double @js_date_value_of(double) +declare double @js_date_get_timezone_offset(double) +declare double @js_date_coerce_number(double) +declare double @js_rel_lt(double, double) +declare double @js_rel_le(double, double) +declare double @js_rel_gt(double, double) +declare double @js_rel_ge(double, double) +declare i64 @js_date_to_string(double) +declare i64 @js_date_to_iso_string(double) +declare i64 @js_date_to_iso_string_or_throw(double) +declare double @js_date_new_from_timestamp(double) +declare double @js_date_new_from_value(double) +declare i32 @js_array_indexOf_f64(i64, double) +declare i64 @js_array_indexOf_jsvalue(i64, double, double, i32) +declare i64 @js_array_last_index_of_jsvalue(i64, double, double, i32) +declare i32 @js_array_includes_f64(i64, double) +declare i32 @js_array_includes_jsvalue(i64, double, double, i32) +declare i32 @js_map_size(i64) +declare void @js_map_clear(i64) +declare void @js_set_clear(i64) +declare i64 @js_map_entries(i64) +declare i64 @js_map_keys(i64) +declare i64 @js_map_values(i64) +declare double @js_map_entry_key_at(i64, i32) +declare double @js_map_entry_value_at(i64, i32) +declare double @js_map_find_key_index(double, double) +declare double @js_set_find_value_index(double, double) +declare void @js_map_foreach(i64, double, double) +declare void @js_set_foreach(i64, double, double) +declare i64 @js_map_entries_iter_obj(i64) +declare i64 @js_map_keys_iter_obj(i64) +declare i64 @js_map_values_iter_obj(i64) +declare i64 @js_set_values_iter_obj(i64) +declare i64 @js_set_keys_iter_obj(i64) +declare i64 @js_set_entries_iter_obj(i64) +declare i64 @js_set_to_array(i64) +declare double @js_set_value_at(i64, i32) +declare i64 @js_array_splice(i64, i32, i32, ptr, i32, ptr) +declare i32 @js_array_splice_delete_count(double) +declare double @js_parse_int(i64, double) +declare double @js_parse_float(i64) +declare double @js_array_reduce(i64, i64, i32, double) +declare double @js_array_reduce_right(i64, i64, i32, double) +declare i64 @js_array_sort_default(i64) +declare i64 @js_array_reverse(i64) +declare double @js_array_reverse_value(double) +declare i64 @js_array_flat(i64) +declare i64 @js_array_flat_depth(i64, double) +declare i64 @js_array_flatMap(i64, i64) +declare i64 @js_array_sort_with_comparator(i64, i64) +declare i64 @js_validate_array_comparator(double) +declare i64 @js_validate_array_callback(double) +declare i64 @js_validate_array_map_callback(i64, double) +declare i64 @js_array_to_reversed(i64) +declare i64 @js_array_to_sorted_default(i64) +declare i64 @js_array_to_sorted_with_comparator(i64, i64) +declare i64 @js_array_to_spliced(i64, double, double, ptr, i32) +declare i64 @js_array_with(i64, double, double) +declare i64 @js_array_copy_within(i64, double, double, i32, double) +declare double @js_array_copy_within_value(double, double, double, i32, double) +declare i64 @js_regexp_new(i64, i64) +declare i64 @js_regexp_construct(double, double) +declare i64 @js_regexp_construct_call(double, double) +declare i32 @js_regexp_test(i64, i64) +declare double @js_regexp_escape(double) +declare i64 @js_get_string_pointer_unified(double) +declare i32 @js_switch_strict_equals(double, double) +declare i64 @js_value_to_str_ptr_for_ffi(double) +declare void @js_string_addref(i64) +declare void @js_string_addref_if_heap_string(double) +declare i64 @js_bigint_from_string(ptr, i32) +declare i64 @js_bigint_from_f64(double) +declare i64 @js_bigint_from_i128_parts(i64, i64) +declare i32 @js_bigint_cmp(i64, i64) +declare double @js_dynamic_add(double, double) +declare double @js_to_numeric(double) +declare double @js_numeric_step(double, i32) +declare double @js_dynamic_string_or_number_add(double, double) +declare double @js_dynamic_sub(double, double) +declare double @js_dynamic_mul(double, double) +declare double @js_dynamic_div(double, double) +declare double @js_dynamic_mod(double, double) +declare double @js_dynamic_bitand(double, double) +declare double @js_dynamic_bitor(double, double) +declare double @js_dynamic_bitxor(double, double) +declare double @js_dynamic_shl(double, double) +declare double @js_dynamic_shr(double, double) +declare double @js_dynamic_bitnot(double) +declare double @js_dynamic_pow(double, double) +declare double @js_dynamic_ushr(double, double) +declare double @js_instanceof(double, i32) +declare double @js_instanceof_dynamic(double, double) +declare double @js_instanceof_noncallable_rhs() +declare void @js_register_class_extends_error(i32) +declare void @js_register_class_extends_data_view(i32) +declare void @js_register_class_id(i32) +declare void @js_register_class_name(i32, ptr, i32) +declare void @js_register_anon_shape_class_id(i32) +declare double @js_get_global_this_builtin_value(ptr, i64) +declare double @js_promise_static_function_value(ptr, i64) +declare double @js_builtin_prototype_method_value(ptr, i64, ptr, i64) +declare void @js_register_class_parent(i32, i32) +declare void @js_register_class_parent_dynamic(i32, double) +declare double @js_get_dynamic_parent_value(i32) +declare void @js_class_register_capture_values(i32, ptr, i64) +declare void @js_class_object_refresh_capture_values(double, i64, double) +declare void @js_tdz_suppress_begin() +declare void @js_tdz_suppress_end() +declare double @js_class_capture_value(i32, i32) +declare double @js_class_capture_value_for_receiver(double, i32, i32) +declare double @js_class_capture_value_or(i32, i32, double) +declare double @js_param_or_class_capture_value(double, i32, i32) +declare void @js_super_construct_apply(i32, double, double) +declare double @js_super_method_call_dynamic(i32, ptr, i64, double, ptr, i64) +declare double @js_super_method_call_dynamic_apply(i32, ptr, i64, double, double) +declare i64 @js_array_push_spread_any(i64, double) +declare i32 @js_set_function_prototype(double, double) +declare void @js_register_prototype_method(i32, ptr, i64, double) +declare i32 @js_register_function_prototype_method(double, ptr, i64, double) +declare double @js_new_function_construct(double, ptr, i64) +declare double @js_function_ctor_from_strings(ptr, i64) +declare double @js_new_function_construct_apply(double, double) +declare double @js_throw_not_a_constructor() +declare double @js_new_target_value() +declare double @js_get_function_prototype_method(double, ptr, i64) +declare double @js_function_prototype_value_for_read(double) +declare i64 @js_typeerror_new(i64) +declare i64 @js_rangeerror_new(i64) +declare i64 @js_syntaxerror_new(i64) +declare i64 @js_referenceerror_new(i64) +declare double @js_throw_symbol_constructor_type_error() +declare double @js_throw_bigint_constructor_type_error() +declare double @js_throw_strict_eval_arguments_syntax_error() +declare double @js_throw_eval_syntax_error(double) +declare double @js_throw_restricted_function_property_assignment() +declare double @js_throw_math_constructor_type_error() +declare double @js_throw_json_constructor_type_error() +declare double @js_webcrypto_illegal_constructor() +declare double @js_throw_type_error_const_assignment(double) +declare double @js_throw_reference_error_unresolvable_assignment(double) +declare double @js_throw_reference_error_unresolved_get() +declare double @js_with_implicit_unset() +declare double @js_with_implicit_read(double, double) +declare double @js_iterator_result_validate(double) +declare double @js_global_get_or_throw_unresolved(double) +declare double @js_module_ambient_require() +declare double @js_module_ambient_require_apply(double) +declare double @js_module_dynamic_import_fallback(double) +declare double @js_module_dynamic_import_deferred(double, double) +declare double @js_module_create_require_devirt(double) +declare double @js_global_get_optional(double) +declare double @js_global_update(double, double, double) +declare double @js_global_assign_existing_or_throw(double, double) +declare double @js_throw_reference_error_this_before_super() +declare double @js_throw_reference_error_super_delete() +declare double @js_throw_reference_error_unresolved_assignment() +declare i64 @js_evalerror_new(i64) +declare i64 @js_urierror_new(i64) +declare i64 @js_weakmap_new() +declare i64 @js_weakset_new() +declare double @js_weakmap_init_iterable(double, double) +declare double @js_weakset_init_iterable(double, double) +declare double @js_weakmap_set(double, double, double) +declare double @js_weakmap_get(double, double) +declare double @js_weakmap_has(double, double) +declare double @js_weakmap_delete(double, double) +declare double @js_weakset_add(double, double) +declare double @js_weakset_has(double, double) +declare double @js_weakset_delete(double, double) +declare double @js_weak_throw_primitive() +declare i64 @js_buffer_from_string(i64, i32) +declare i32 @js_encoding_tag_from_value(double) +declare i64 @js_value_to_string_with_encoding(double, i32) +declare i64 @js_value_to_string_with_encoding_or_radix(double, i32, double) +declare i64 @js_object_values(i64) +declare i64 @js_object_values_value(double) +declare i64 @js_object_entries(i64) +declare i64 @js_object_entries_value(double) +declare i64 @js_path_join(i64, i64) +declare i64 @js_path_win32_join(i64, i64) +declare i64 @js_path_win32_dirname(i64) +declare i64 @js_path_win32_basename(i64) +declare i64 @js_path_win32_basename_ext(i64, i64) +declare i64 @js_path_win32_extname(i64) +declare i32 @js_path_win32_is_absolute(i64) +declare i64 @js_path_win32_normalize(i64) +declare i64 @js_path_win32_parse(i64) +declare i64 @js_path_win32_format(double) +declare i64 @js_path_win32_relative(i64, i64) +declare i64 @js_path_win32_relative_checked(double, double) +declare i64 @js_path_win32_resolve(i64) +declare i64 @js_path_win32_resolve_join(i64, i64) +declare i64 @js_path_win32_to_namespaced_path(i64) +declare double @js_path_win32_to_namespaced_path_value(double) +declare i32 @js_path_win32_matches_glob(i64, i64) +declare i64 @js_path_win32_sep_get() +declare i64 @js_path_win32_delimiter_get() +declare i64 @js_path_dirname(i64) +declare i64 @js_path_resolve(i64) +declare i64 @js_path_relative(i64, i64) +declare i64 @js_path_relative_checked(double, double) +declare i64 @js_path_to_namespaced_path(i64) +declare double @js_path_to_namespaced_path_value(double) +declare i32 @js_path_matches_glob(i64, i64) +declare i64 @js_path_resolve_join(i64, i64) +declare double @js_object_from_entries(double) +declare i64 @js_string_match(i64, i64) +declare i64 @js_string_match_all(i64, i64) +declare i64 @js_string_match_all_value(i64, double) +declare double @llvm.log.f64(double) +declare double @llvm.log2.f64(double) +declare double @llvm.log10.f64(double) +declare double @llvm.exp.f64(double) +declare double @llvm.sin.f64(double) +declare double @llvm.cos.f64(double) +declare i64 @js_path_basename(i64) +declare i64 @js_path_basename_ext(i64, i64) +declare i64 @js_path_extname(i64) +declare i64 @js_path_sep_get() +declare i64 @js_path_delimiter_get() +declare i64 @js_path_parse(i64) +declare i64 @js_json_parse(i64) +declare i64 @js_json_text_to_string(double) +declare double @js_json_raw_json(double) +declare double @js_json_is_raw_json(double) +declare i64 @js_json_parse_or_null(i64) +declare i64 @js_json_parse_typed_array(i64, i64, i32, i32) +declare i64 @js_date_to_date_string(double) +declare i64 @js_date_to_time_string(double) +declare i64 @js_date_to_utc_string(double) +declare i64 @js_date_to_locale_date_string(double) +declare i64 @js_date_to_locale_time_string(double) +declare i64 @js_date_to_json(double) +declare i64 @js_regexp_exec(i64, i64) +declare i64 @js_number_to_precision(double, double) +declare i64 @js_number_to_exponential(double, double) +declare double @js_date_new() +declare double @js_number_is_integer(double) +declare double @js_number_is_nan(double) +declare double @js_number_is_safe_integer(double) +declare double @js_date_parse(i64) +declare double @js_date_utc(ptr, i32) +declare double @js_date_new_local_components(double, double, double, double, double, double, double) +declare double @js_date_apply_setter(double, i32, i32, ptr, i32) +declare double @js_math_clz32(double) +declare double @js_math_cbrt(double) +declare double @js_math_fround(double) +declare double @js_math_f16round(double) +declare double @js_math_sinh(double) +declare double @js_math_cosh(double) +declare double @js_math_tanh(double) +declare double @js_math_asinh(double) +declare double @js_math_acosh(double) +declare double @js_math_atanh(double) +declare double @js_math_hypot(double, double) +declare double @js_object_is(double, double) +declare i64 @js_path_normalize(i64) +declare i64 @js_path_format(double) +declare i32 @js_path_is_absolute(i64) +declare i64 @js_encode_uri(double) +declare i64 @js_decode_uri(double) +declare i64 @js_encode_uri_component(double) +declare i64 @js_decode_uri_component(double) +declare i64 @js_text_encoder_new() +declare i64 @js_text_decoder_new(double, double, double) +declare i64 @js_text_encoder_encode_llvm(double) +declare i64 @js_text_decoder_decode_llvm(double, double) +declare i64 @js_text_decoder_encoding(double) +declare double @js_text_decoder_fatal(double) +declare double @js_text_decoder_ignore_bom(double) +declare void @js_queue_microtask(i64) +declare void @js_queue_next_tick(i64) +declare void @js_queue_next_tick_args(i64, ptr, i32) +declare void @js_drain_queued_microtasks() +declare i64 @js_uint8array_from_array(i64) +declare i64 @js_uint8array_alloc(i32) +declare i64 @js_uint8array_new(double) +declare i64 @js_uint8array_view(double, double, double) +declare i64 @js_typed_array_new_empty(i32, i32) +declare i64 @js_typed_array_new_from_array(i32, i64) +declare i64 @js_typed_array_new(i32, double) +declare i64 @js_typed_array_view(i32, double, double, double) +declare i32 @js_typed_array_length(i64) +declare double @js_typed_array_get(i64, i32) +declare i32 @js_typed_array_read_int32(i64, i32) +declare double @js_typed_array_read_f64(i64, i32) +declare double @js_typed_array_index_get_dynamic(i64, double) +declare double @js_typed_array_at(i64, double) +declare void @js_typed_array_set(i64, i32, double) +declare double @js_typed_array_index_set_dynamic(i64, double, double) +declare i32 @js_uint8array_get(i64, i32) +declare double @js_uint8array_index_get_value(i64, i32) +declare void @js_uint8array_set(i64, i32, i32) +declare i64 @js_native_arena_alloc(i64) +declare i64 @js_native_arena_view(i64, i32, i64, i64) +declare i64 @js_native_pod_view(i64, i64, i64, i64, i64, i64) +declare ptr @js_native_abi_check_pod_view_data_ptr(double, i64) +declare i64 @js_native_abi_check_pod_view_record_count(double, i64) +declare void @js_native_arena_dispose(i64) +declare void @js_native_memory_fill_u32(i64, double) +declare void @js_native_memory_copy(i64, i64) +declare i64 @js_typed_array_to_reversed(i64) +declare i64 @js_typed_array_to_sorted_default(i64) +declare i64 @js_typed_array_to_sorted_with_comparator(i64, i64) +declare i64 @js_typed_array_with(i64, double, double) +declare double @js_typed_array_find_last(i64, i64) +declare double @js_typed_array_find_last_index(i64, i64) +declare double @js_typed_array_set_from(i64, double, double) +declare i64 @js_typed_array_subarray(i64, i32, double, i32, double) +declare double @js_object_has_own(double, double) +declare double @js_object_property_is_enumerable(double, double) +declare double @js_object_define_getter(double, double, double) +declare double @js_object_define_setter(double, double, double) +declare double @js_object_lookup_getter(double, double) +declare double @js_object_lookup_setter(double, double) +declare double @js_object_get_own_field_or_undef(double, ptr, i64) +declare double @js_unresolved_namespace_stub() +declare double @js_node_submodule_export_as_function(ptr, i32, ptr, i32) +declare double @js_node_submodule_namespace_member(ptr, i32, ptr, i32) +declare double @js_node_submodule_namespace(ptr, i32) +declare void @js_node_submod_install_vm() +declare void @js_node_submod_install_timers() +declare void @js_node_submod_install_timers_promises() +declare void @js_node_submod_install_fs_promises() +declare void @js_node_submod_install_readline_promises() +declare void @js_node_submod_install_stream_promises() +declare void @js_node_submod_install_stream_consumers() +declare void @js_node_submod_install_stream_web() +declare void @js_node_submod_install_hono_jsx_server() +declare void @js_node_submod_install_hono_jsx_streaming() +declare void @js_node_submod_install_sys() +declare void @js_node_submod_install_diagnostics_channel() +declare void @js_node_submod_install_trace_events() +declare void @js_node_submod_install_test() +declare void @js_node_submod_install_test_reporters() +declare void @js_node_submod_install_all() +declare void @js_node_submod_enable_install_all() +declare double @js_unresolved_default_call() +declare double @js_get_global_this() +declare double @js_module_top_this() +declare double @js_global_or_console_property_by_name(i64) +declare void @js_class_register_static_symbol(i32, double, double) +declare void @js_register_class_computed_method(i64, double, i64, i64, i64, i64) +declare void @js_register_class_computed_accessor(i64, double, i64, i64, i64) +declare void @js_class_register_static_field(i32, ptr, i64, double) +declare double @js_object_define_property(double, double, double) +declare double @js_object_get_own_property_descriptor(double, double) +declare double @js_object_get_own_property_descriptors(double) +declare double @js_object_get_own_property_names(double) +declare double @js_symbol_new(double) +declare double @js_symbol_new_empty() +declare double @js_symbol_for(double) +declare double @js_symbol_computed_member(double, double) +declare double @js_symbol_key_for(double) +declare double @js_symbol_description(double) +declare i64 @js_symbol_to_string(double) +declare i32 @js_symbol_equals(double, double) +declare i32 @js_is_symbol(double) +declare i64 @js_object_get_own_property_symbols(double) +declare double @js_object_set_symbol_property(double, double, double) +declare double @js_to_property_key(double) +declare double @js_object_set_property_key(double, double, double) +declare double @js_object_get_property_key(double, double) +declare double @js_object_set_property_key_method(double, double, double) +declare double @js_object_super_get(double, double, double) +declare double @js_object_super_put_value_set(double, double, double, double, i32) +declare double @js_object_super_call(double, double, double, ptr, i64) +declare double @js_object_literal_infer_computed_function_name(double, double) +declare double @js_object_get_symbol_property(double, double) +declare double @js_object_create(double) +declare double @js_object_create_with_props(double, double) +declare double @js_object_freeze(double) +declare double @js_object_seal(double) +declare double @js_object_prevent_extensions(double) +declare void @js_object_copy_own_fields(i64, double) +declare double @js_object_assign_validate_target(double) +declare double @js_object_assign_one(double, double) +declare double @js_string_at(i64, i32) +declare double @js_string_code_point_at(i64, i32) +declare i64 @js_string_from_code_point(double) +declare i64 @js_string_raw(double, double) +declare i64 @js_string_from_char_code(double) +declare i64 @js_string_from_char_code_array(double) +declare double @js_string_char_code_at(i64, i32) +declare i32 @js_string_last_index_of(i64, i64) +declare i32 @js_string_last_index_of_from(i64, i64, double, i32) +declare double @js_string_locale_compare(i64, i64) +declare double @js_string_locale_compare_opts(i64, i64, double) +declare i64 @js_string_normalize(i64, double) +declare i64 @js_string_pad_start(i64, double, i64) +declare i64 @js_string_pad_end(i64, double, i64) +declare i64 @js_string_pad_fill(double) +declare double @js_string_is_well_formed(i64) +declare i64 @js_string_to_well_formed(i64) +declare i32 @js_string_search_regex(i64, i64) +declare i32 @js_string_search_value(i64, double) +declare i64 @js_string_match_value(i64, double) +declare double @js_regexp_exec_get_index() +declare i64 @js_regexp_exec_get_groups() +declare double @js_regexp_get_last_index(i64) +declare void @js_regexp_set_last_index(i64, double) +declare i64 @js_regexp_get_source(i64) +declare i64 @js_regexp_get_flags(i64) +declare i64 @js_string_replace_regex_named(i64, i64, i64) +declare i64 @js_string_replace_all_regex_named(i64, i64, i64) +declare i64 @js_string_replace_string_fn(i64, i64, double) +declare i64 @js_string_replace_string_dyn(i64, i64, double) +declare i64 @js_string_replace_all_string_dyn(i64, i64, double) +declare i64 @js_string_replace_regex_dyn(i64, i64, double) +declare i64 @js_string_replace_all_regex_dyn(i64, i64, double) +declare i64 @js_string_replace_search_dyn(i64, double, double) +declare i64 @js_string_replace_all_search_dyn(i64, double, double) +declare i64 @js_string_replace_all_string_fn(i64, i64, double) +declare i64 @js_string_replace_regex_fn(i64, i64, double) +declare i64 @js_string_replace_all_regex_fn(i64, i64, double) +declare double @js_structured_clone(double) +declare double @js_structured_clone_with_options(double, double) +declare double @js_generator_attach_prototype(double, i32) +declare double @js_generator_attach_closure_prototype(double, i64) +declare i64 @js_weakref_new(double) +declare double @js_weakref_deref(double) +declare i64 @js_finreg_new(double) +declare double @js_finreg_register(double, double, double, double) +declare double @js_finreg_unregister(double, double) +declare i64 @js_atob(double) +declare i64 @js_btoa(double) +declare double @js_object_is_frozen(double) +declare double @js_object_is_sealed(double) +declare double @js_object_is_extensible(double) +declare i64 @js_aggregateerror_new(i64, i64) +declare i64 @js_error_new_with_cause(i64, double) +declare i64 @js_aggregateerror_new_full(double, i64, double) +declare i64 @js_error_new_kind_with_options(i32, i64, double) +declare double @js_error_is_error(double) +declare i64 @js_error_get_errors(i64) +declare i64 @js_crypto_sha256(i64) +declare i64 @js_crypto_sha256_bytes(i64) +declare i64 @js_crypto_md5(i64) +declare i64 @js_crypto_hmac_sha256(i64, i64) +declare i64 @js_crypto_hmac_sha256_bytes(i64, i64) +declare void @js_runtime_validate_string_arg(double, ptr, i32) +declare void @js_set_call_location(ptr, i64, i32) +declare void @js_runtime_validate_crypto_key_arg(double, ptr, i32) +declare void @js_runtime_validate_integer_arg(double, ptr, i32, double, double) +declare i64 @js_crypto_pbkdf2_bytes(i64, i64, double, double, i64) +declare double @js_crypto_pbkdf2_async_alg(i64, i64, double, double, i64, double) +declare i64 @js_crypto_argon2_sync(i64, double) +declare double @js_crypto_argon2_async(i64, double, double) +declare i64 @js_crypto_encapsulate(double) +declare double @js_crypto_encapsulate_async(double, double) +declare i64 @js_crypto_decapsulate(double, double) +declare double @js_crypto_decapsulate_async(double, double, double) +declare i64 @js_crypto_hkdf_bytes_alg(i64, i64, i64, i64, double) +declare double @js_crypto_hkdf_async_alg(i64, i64, i64, i64, double, double) +declare i64 @js_crypto_scrypt_bytes(i64, i64, double, i64) +declare double @js_crypto_scrypt_async(i64, i64, double, double) +declare i64 @js_crypto_sign_rsa_sha256(i64, i64, double) +declare double @js_crypto_sign_async(i64, i64, double, double) +declare double @js_crypto_verify_rsa_sha256(i64, i64, double, i64) +declare double @js_crypto_verify_async(i64, i64, double, i64, double) +declare i64 @js_crypto_public_encrypt(i64, i64) +declare i64 @js_crypto_private_decrypt(i64, i64) +declare i64 @js_crypto_private_encrypt(i64, i64) +declare i64 @js_crypto_public_decrypt(i64, i64) +declare i64 @js_crypto_create_public_key(i64) +declare i64 @js_crypto_create_private_key_value(double) +declare i64 @js_crypto_create_public_key_value(double) +declare i64 @js_crypto_generate_key_pair_sync_rsa(double) +declare i64 @js_crypto_generate_key_pair_sync_ec_p256(double) +declare i64 @js_crypto_generate_key_pair_sync_ed25519(double) +declare i64 @js_crypto_generate_key_pair_sync_x25519(double) +declare double @js_crypto_generate_key_pair_async(i64, double, double) +declare i64 @js_crypto_diffie_hellman(double) +declare double @js_crypto_get_cipher_info(double, double) +declare i64 @js_crypto_get_curves() +declare i64 @js_crypto_secure_heap_used() +declare i64 @js_crypto_random_bytes_buffer(double) +declare double @js_crypto_random_bytes_async(double, double) +declare i64 @js_crypto_random_uuid(double) +declare i64 @js_crypto_random_uuidv7() +declare double @js_crypto_random_int(double, double) +declare double @js_crypto_random_int_async(double, double, double) +declare double @js_crypto_timing_safe_equal(double, double) +declare i64 @js_crypto_get_hashes() +declare i64 @js_crypto_get_ciphers() +declare double @js_crypto_generate_prime_sync(double, double) +declare double @js_crypto_generate_prime_async(double, double, double) +declare double @js_crypto_check_prime_sync(double, double) +declare double @js_crypto_check_prime_async(double, double, double) +declare i64 @js_crypto_create_secret_key(i64, i64) +declare i64 @js_crypto_generate_key_sync(i64, double) +declare double @js_crypto_generate_key_async(i64, double, double) +declare i64 @js_webcrypto_digest(double, double) +declare i64 @js_webcrypto_import_key(double, double, double, double, double) +declare i64 @js_webcrypto_export_key(double, double) +declare i64 @js_webcrypto_sign(double, double, double) +declare i64 @js_webcrypto_verify(double, double, double, double) +declare i64 @js_webcrypto_derive_bits(double, double, double) +declare i64 @js_webcrypto_derive_key(double, double, double, double, double) +declare i64 @js_webcrypto_encrypt(double, double, double) +declare i64 @js_webcrypto_decrypt(double, double, double) +declare i64 @js_webcrypto_generate_key(double, double, double) +declare i64 @js_webcrypto_wrap_key(double, double, double, double) +declare i64 @js_webcrypto_unwrap_key(double, double, double, double, double, double, double) +declare i64 @js_zlib_create_brotli_decompress(double) +declare double @js_crypto_random_fill_sync(double, double, double) +declare double @js_crypto_random_fill_async(double, double, double, double) +declare double @js_crypto_create_hash(i64) +declare double @js_crypto_create_hash_options(i64, double) +declare double @js_crypto_x509_new(i64) +declare double @js_crypto_certificate_verify_spkac(double) +declare double @js_crypto_certificate_export_public_key(double) +declare double @js_crypto_certificate_export_challenge(double) +declare double @js_crypto_create_sign(i64) +declare double @js_crypto_create_verify(i64) +declare double @js_crypto_create_ecdh(i64) +declare double @js_crypto_create_diffie_hellman(double, double, double) +declare double @js_crypto_get_diffie_hellman(double) +declare double @js_crypto_ecdh_convert_key(double, double, double, double, double) +declare double @js_crypto_create_hmac(i64, i64) +declare i64 @js_buffer_alloc(i32, i32) +declare i64 @js_buffer_alloc_fill_value(i32, double, i32) +declare i64 @js_array_buffer_new(i32) +declare i64 @js_shared_array_buffer_new(i32) +declare i64 @js_array_buffer_new_value(double) +declare i64 @js_shared_array_buffer_new_value(double) +declare i64 @js_json_stringify_full(double, double, double) +declare i64 @js_json_parse_with_reviver(i64, i64) +declare double @js_array_find(i64, i64) +declare i32 @js_array_findIndex(i64, i64) +declare double @js_array_find_last(i64, i64) +declare i32 @js_array_find_last_index(i64, i64) +declare double @js_array_some(i64, i64) +declare double @js_array_every(i64, i64) +declare i32 @js_promise_state(i64) +declare double @js_promise_value(i64) +declare double @js_promise_reason(i64) +declare i32 @js_value_is_promise(double) +declare double @js_assimilate_thenable(double) +declare i32 @js_promise_run_microtasks() +declare i32 @js_promise_run_microtasks_event_loop() +declare i32 @js_promise_run_microtasks_await_loop() +declare i32 @js_await_loop_tick_timers() +declare void @js_mark_entry_module_esm() +declare i32 @js_promise_run_promise_jobs() +declare void @js_run_stdlib_pump() +declare void @js_sleep_ms(double) +declare void @js_wait_for_event() +declare i32 @js_event_loop_host_driven() +declare void @js_unsettled_top_level_await_exit() +declare void @js_throw(double) +declare void @js_eh_try_push() +declare i32 @perry_eh_personality(...) +declare void @js_try_end() +declare double @js_get_exception() +declare void @js_clear_exception() +declare i32 @js_has_exception() +declare void @js_enter_finally() +declare void @js_leave_finally() +declare double @js_await_any_promise(double) +declare i64 @js_promise_new() +declare i64 @js_promise_new_with_executor(i64) +declare i32 @js_timer_tick() +declare i32 @js_timer_tick_if_refed() +declare i32 @js_callback_timer_tick() +declare i32 @js_interval_timer_tick() +declare i32 @js_timer_has_pending() +declare i32 @js_callback_timer_has_pending() +declare i32 @js_interval_timer_has_pending() +declare i32 @js_stdlib_has_active_handles() +declare i32 @js_microtasks_pending() +declare i64 @js_timer_validate_callback(double, i32) +declare i64 @js_set_timeout_callback(i64, double) +declare i64 @js_set_timeout_callback_args(i64, double, ptr, i32) +declare i64 @js_set_immediate_callback(i64) +declare i64 @js_set_immediate_callback_args(i64, ptr, i32) +declare i64 @setInterval(i64, double) +declare i64 @js_set_interval_callback_args(i64, double, ptr, i32) +declare void @clearTimeout(i64) +declare void @clearInterval(i64) +declare void @clearImmediate(i64) +declare void @js_clear_timeout_value(double) +declare void @js_clear_interval_value(double) +declare void @js_clear_immediate_value(double) +declare i64 @js_buffer_from_array(i64) +declare i64 @js_buffer_from_arraybuffer_slice(i64, i32, i32) +declare i32 @js_buffer_length(i64) +declare i32 @js_buffer_get(i64, i32) +declare double @js_buffer_index_get_value(i64, i32) +declare ptr @js_native_buffer_data_ptr(double) +declare i64 @js_native_buffer_byte_len(double) +declare void @js_console_time(i64) +declare void @js_console_time_end(i64) +declare void @js_console_time_log(i64) +declare void @js_console_time_value(double) +declare void @js_console_time_end_value(double) +declare void @js_console_time_log_value(double) +declare void @js_console_time_log_spread(double, i64) +declare void @js_console_count(i64) +declare void @js_console_count_reset(i64) +declare void @js_console_count_value(double) +declare void @js_console_count_reset_value(double) +declare double @js_console_new(double) +declare double @js_console_new2(double, double) +declare void @js_console_group_begin() +declare void @js_console_group_end() +declare void @js_console_clear() +declare void @js_console_noop() +declare double @js_native_call_method(double, ptr, i64, ptr, i64) +declare double @js_native_call_method_by_id(double, i64, ptr, i64) +declare double @js_native_call_method_apply(double, ptr, i64, i64) +declare double @js_native_call_method_apply_by_id(double, i64, i64) +declare double @js_native_call_method_str_key(double, i64, ptr, i64) +declare double @js_native_call_method_value(double, double, ptr, i64) +declare double @js_native_call_method_value_apply(double, double, i64) +declare void @js_promise_resolve(i64, double) +declare void @js_promise_reject(i64, double) +declare void @js_promise_mark_internally_handled(i64) +declare i64 @js_promise_resolved(double) +declare i64 @js_async_fn_result(double) +declare i64 @js_promise_rejected(double) +declare double @js_create_namespace(i32, ptr, ptr, ptr) +declare i64 @js_promise_then(i64, i64, i64) +declare i64 @js_promise_resolved_then(double, i64, i64) +declare i64 @js_promise_finally(i64, i64) +declare double @js_promise_then_checked(double, double, double) +declare double @js_promise_catch_checked(double, double) +declare double @js_promise_finally_checked(double, double) +declare i64 @js_promise_closure_arg(double) +declare i64 @js_promise_all(i64) +declare i64 @js_promise_race(i64) +declare i64 @js_promise_any(i64) +declare i64 @js_promise_all_settled(i64) +declare i64 @js_promise_all_iterable(double) +declare i64 @js_promise_race_iterable(double) +declare i64 @js_promise_any_iterable(double) +declare i64 @js_promise_all_settled_iterable(double) +declare i64 @js_promise_with_resolvers() +declare i64 @js_promise_try(double, i64) +declare i64 @js_array_unshift_f64(i64, double) +declare i64 @js_array_unshift_variadic(i64, ptr, i32) +declare i64 @js_array_entries(i64) +declare i64 @js_array_keys(i64) +declare i64 @js_array_values(i64) +declare i64 @js_array_entries_iter_obj(i64) +declare i64 @js_array_keys_iter_obj(i64) +declare i64 @js_array_values_iter_obj(i64) +declare double @js_response_new(i64, double, i64, double) +declare i64 @js_response_body_init_ptr(double) +declare double @js_headers_new() +declare double @js_headers_set(double, i64, i64) +declare double @js_headers_append(double, i64, i64) +declare i64 @js_headers_get(double, i64) +declare double @js_headers_get_set_cookie(double) +declare double @js_headers_has(double, i64) +declare double @js_headers_delete(double, i64) +declare double @js_headers_for_each(double, double) +declare double @js_headers_keys(double) +declare double @js_headers_values(double) +declare double @js_headers_entries(double) +declare double @js_headers_init_from_value(double, double) +declare double @js_headers_method_value(double, i64, i64) +declare double @js_request_new(i64, i64, i64, double, i64, i64, i64, i64, i64, i64, i64, double, i64, double) +declare double @js_request_new_from_init(i64, double) +declare i64 @js_request_get_url(double) +declare i64 @js_request_input_to_url(double) +declare i64 @js_request_get_method(double) +declare double @js_request_get_body(double) +declare double @js_request_body_used(double) +declare i64 @js_request_get_destination(double) +declare i64 @js_request_get_referrer(double) +declare i64 @js_request_get_referrer_policy(double) +declare i64 @js_request_get_mode(double) +declare i64 @js_request_get_credentials(double) +declare i64 @js_request_get_cache(double) +declare i64 @js_request_get_redirect(double) +declare i64 @js_request_get_integrity(double) +declare double @js_request_get_keepalive(double) +declare i64 @js_request_get_duplex(double) +declare double @js_request_get_signal(double) +declare double @js_request_get_headers(double) +declare i64 @js_request_text(double) +declare i64 @js_request_json(double) +declare i64 @js_request_array_buffer(double) +declare i64 @js_request_blob(double) +declare i64 @js_request_bytes(double) +declare i64 @js_request_form_data(double) +declare double @js_request_clone(double) +declare double @js_fetch_response_status(double) +declare i64 @js_fetch_response_status_text(double) +declare double @js_fetch_response_ok(double) +declare i64 @js_fetch_response_type(double) +declare i64 @js_fetch_response_url(double) +declare double @js_fetch_response_redirected(double) +declare double @js_response_body_used(double) +declare i64 @js_fetch_response_text(double) +declare i64 @js_fetch_response_json(double) +declare double @js_response_get_headers(double) +declare double @js_response_clone(double) +declare i64 @js_response_array_buffer(double) +declare i64 @js_response_blob(double) +declare i64 @js_response_bytes(double) +declare i64 @js_response_form_data(double) +declare double @js_form_data_new() +declare double @js_form_data_append(double, double, double) +declare double @js_form_data_set(double, double, double) +declare double @js_form_data_delete(double, i64) +declare double @js_form_data_get(double, i64) +declare double @js_form_data_get_all(double, i64) +declare double @js_form_data_has(double, i64) +declare double @js_form_data_entries(double) +declare double @js_form_data_keys(double) +declare double @js_form_data_values(double) +declare double @js_form_data_for_each(double, double) +declare double @js_blob_size(double) +declare i64 @js_blob_type(double) +declare i64 @js_blob_array_buffer(double) +declare i64 @js_blob_bytes(double) +declare i64 @js_blob_text(double) +declare double @js_blob_slice(double, double, double, i64) +declare double @js_blob_new(double, double) +declare double @js_file_new(double, double, double, double) +declare i64 @js_file_name(double) +declare double @js_file_last_modified(double) +declare i64 @js_url_create_object_url(double) +declare void @js_url_revoke_object_url(double) +declare double @js_buffer_resolve_object_url(double) +declare double @js_response_static_json(double, double, i64, double) +declare double @js_response_static_redirect(i64, double) +declare double @js_response_static_error() +declare double @js_blob_stream(double) +declare double @js_response_body(double) +declare double @js_readable_stream_new(double, double, double, double) +declare double @js_readable_stream_new_with_source_type(double, double, double, double, double) +declare double @js_readable_stream_new_with_strategy_and_source_type(double, double, double, double, double) +declare double @js_readable_stream_new_from_source_object(double, double) +declare double @js_readable_stream_get_reader(double) +declare double @js_readable_stream_get_reader_with_options(double, double) +declare double @js_readable_stream_get_byob_reader(double) +declare double @js_readable_stream_controller_byob_request(double) +declare double @js_readable_stream_from_iterable(double) +declare double @js_readable_stream_locked(double) +declare i64 @js_readable_stream_cancel(double, double) +declare double @js_readable_stream_tee(double) +declare i64 @js_readable_stream_pipe_to(double, double, double) +declare double @js_readable_stream_pipe_through(double, double, double) +declare double @js_readable_stream_pipe_through_validate(double, double, double, double) +declare double @js_readable_stream_controller_enqueue(double, double) +declare double @js_readable_stream_controller_close(double) +declare double @js_readable_stream_controller_error(double, double) +declare double @js_readable_stream_controller_desired_size(double) +declare i64 @js_reader_read(double) +declare i64 @js_reader_read_with_view(double, double) +declare double @js_reader_release_lock(double) +declare i64 @js_reader_closed(double) +declare i64 @js_reader_cancel(double, double) +declare double @js_writable_stream_new(double, double, double, double, double) +declare double @js_writable_stream_new_with_sink_type(double, double, double, double, double, double) +declare double @js_writable_stream_new_from_sink_object(double, double) +declare double @js_writable_stream_throw_invalid_sink() +declare double @js_writable_stream_get_writer(double) +declare double @js_writable_stream_locked(double) +declare i64 @js_writable_stream_close(double) +declare i64 @js_writable_stream_abort(double, double) +declare i64 @js_writer_write(double, double) +declare i64 @js_writer_close(double) +declare i64 @js_writer_abort(double, double) +declare double @js_writer_release_lock(double) +declare i64 @js_writer_closed(double) +declare i64 @js_writer_ready(double) +declare double @js_writer_desired_size(double) +declare double @js_transform_stream_new(double, double, double, double, double) +declare double @js_transform_stream_new_from_transformer_object(double, double, double) +declare double @js_transform_stream_readable(double) +declare double @js_transform_stream_writable(double) +declare double @js_text_encoding_stream_new() +declare double @js_text_encoder_stream_new() +declare double @js_text_decoder_stream_new() +declare double @js_stream_web_text_encoder_stream_new() +declare double @js_stream_web_text_decoder_stream_new(double, double) +declare double @js_stream_web_compression_stream_new(double) +declare double @js_stream_web_decompression_stream_new(double) +declare double @js_streams_strategy_high_water_mark(double) +declare double @js_count_queuing_strategy_new(double) +declare double @js_byte_length_queuing_strategy_new(double) +declare double @js_stream_unwrap_handle(double) +declare double @js_readable_stream_subclass_init(double, double, double, double, double) +declare double @js_writable_stream_subclass_init(double, double, double, double, double) +declare double @js_transform_stream_subclass_init(double, double, double, double) +declare double @js_request_subclass_init(double, double, double) +declare double @js_response_subclass_init(double, double, double) +declare double @js_fetch_or_value_super(double, double, ptr, i64) +declare i64 @js_abort_controller_new() +declare i64 @js_abort_controller_signal(i64) +declare void @js_abort_controller_abort(i64) +declare void @js_abort_controller_abort_reason(i64, double) +declare void @js_abort_signal_add_listener(i64, double, double) +declare i64 @js_abort_signal_timeout(double) +declare i64 @js_abort_signal_abort(double) +declare i64 @js_abort_signal_any(i64) +declare double @js_abort_signal_throw_if_aborted(i64) +declare i64 @js_event_target_new() +declare i64 @js_event_new(double, double, i32) +declare double @js_event_subclass_init(double, double, double, i32, i32) +declare i64 @js_custom_event_new(double, double, i32) +declare i64 @js_dom_exception_new(double, double) +declare double @js_dom_exception_subclass_init(double, double, double) +declare void @js_event_target_add_event_listener(i64, i64, i64) +declare void @js_event_target_add_event_listener_with_options(i64, i64, i64, double) +declare void @js_event_target_remove_event_listener(i64, i64, i64) +declare void @js_event_target_remove_event_listener_with_options(i64, i64, i64, double) +declare double @js_event_target_dispatch_event(i64, double) +declare i32 @js_event_target_is_event_target(i64) +declare i64 @js_event_target_get_event_listeners(i64, i64) +declare double @js_event_target_get_max_listeners(i64) +declare i32 @js_event_target_set_max_listeners(i64, double) +declare double @js_message_channel_new() +declare double @js_message_port_constructor_error() +declare double @js_broadcast_channel_new(double) +declare i64 @js_array_alloc(i32) +declare i64 @js_tagged_template_register_raw(i64, i64) +declare i64 @js_tagged_template_get_or_init(i64, i64, i64) +declare i64 @js_template_raw(i64) +declare i64 @js_array_create() +declare i64 @js_array_constructor_single(double) +declare i64 @js_array_alloc_literal(i32) +declare i64 @js_array_from_values(ptr, i32) +declare i64 @js_array_push_f64(i64, double) +declare void @js_array_push_guard(i64) +declare i64 @js_array_push_hole(i64) +declare i64 @js_array_numeric_push_f64_unboxed(i64, double) +declare i64 @js_array_push_spread_f64(i64, i64) +declare double @js_array_get_f64(i64, i32) +declare double @js_array_get_index_or_string(i64, double) +declare double @js_array_numeric_get_f64_unboxed(i64, i32) +declare void @js_array_set_f64(i64, i32, double) +declare i32 @js_array_numeric_set_f64_unboxed(i64, i32, double) +declare i64 @js_array_set_f64_extend(i64, i32, double) +declare i64 @js_array_set_f64_extend_strict(i64, i32, double) +declare i64 @js_array_fill_f64_const_extend(i64, i32, double) +declare i64 @js_array_fill_f64_iota_extend(i64, i32) +declare i64 @js_array_fill_f64_const_len_extend(i64, double) +declare i64 @js_array_fill_f64_iota_len_extend(i64) +declare i64 @js_array_numeric_range_add(double, double, double, double) +declare i64 @js_array_numeric_range_add_len(double, double, double) +declare i64 @js_array_set_string_key(i64, i64, double) +declare i64 @js_array_set_index_or_string(i64, double, double) +declare i64 @js_array_mark_arguments_object(i64) +declare i32 @js_array_mark_numeric_f64_layout(i64) +declare i32 @js_array_is_numeric_f64_layout(i64) +declare void @js_array_clear_numeric_layout(i64) +declare double @js_array_numeric_value_to_raw_f64(double) #4 +declare double @js_array_refresh_local_head(double) +declare void @js_array_note_numeric_write(i64, i64) +declare i32 @js_array_length(i64) +declare double @js_array_is_array(double) +declare double @js_value_length_f64(double) +declare nonnull ptr @js_shadow_frame_enter(i32) +declare i64 @js_shadow_frame_push(i32) +declare void @js_shadow_frame_pop(i64) +declare void @js_shadow_slot_set(i32, i64) +declare void @js_shadow_slot_bind(i32, ptr) +declare void @js_gc_write_barriers_emitted(i32) +declare i32 @js_gc_temp_root_push(i64) +declare i64 @js_gc_temp_root_get(i32) +declare void @js_gc_temp_root_set(i32, i64) +declare void @js_gc_temp_root_truncate(i32) +declare void @js_array_push_f64_temp_rooted(i32, double) +declare void @js_gc_loop_safepoint() +declare void @js_write_barrier(i64, i64) +declare void @js_write_barrier_slot(i64, i64, i64) +declare void @js_write_barrier_root_nanbox(i64) +declare void @js_write_barrier_root_heap_word(i64) +declare void @js_gc_note_slot_layout(i64, i32, i64) +declare void @js_gc_note_slot_layout_aware(i64, i32, i64, i64) +declare void @js_gc_init_typed_shape_layout(i64, i32, ptr, i32, ptr, i32) +declare void @js_gc_init_unboxed_object_layout(i64, i32, i64, i64) +declare double @js_array_pop_f64(i64) +declare i64 @js_array_join(i64, i64) +declare i64 @js_array_join_value(i64, double) +declare void @js_array_forEach(i64, i64) +declare i64 @js_array_fill(i64, double) +declare i64 @js_array_fill_range(i64, double, double, double) +declare double @js_array_fill_generic(double, double, i32, double, i32, double) +declare i32 @js_array_delete(i64, i32) +declare void @js_array_set_length(i64, double) +declare void @js_array_set_length_strict(i64, double) +declare i64 @js_array_clone(i64) +declare i64 @js_array_from_value(double) +declare i64 @js_array_from_arraylike_holey_value(double) +declare double @js_iterator_from(double) +declare i64 @js_array_from_mapped(double, double, double) +declare i64 @js_array_concat_variadic(i64, ptr, i32) +declare double @js_arraylike_forEach(double, double, double) +declare double @js_arraylike_map(double, double, double) +declare double @js_arraylike_filter(double, double, double) +declare double @js_arraylike_some(double, double, double) +declare double @js_arraylike_every(double, double, double) +declare double @js_arraylike_find(double, double, double) +declare double @js_arraylike_findIndex(double, double, double) +declare double @js_arraylike_findLast(double, double, double) +declare double @js_arraylike_findLastIndex(double, double, double) +declare double @js_arraylike_reduce(double, double, i32, double) +declare double @js_arraylike_reduceRight(double, double, i32, double) +declare double @js_arraylike_indexOf(double, double, double, i32) +declare double @js_arraylike_lastIndexOf(double, double, double, i32) +declare double @js_arraylike_includes(double, double, double, i32) +declare double @js_arraylike_at(double, double) +declare double @js_arraylike_join(double, double) +declare double @js_arraylike_slice(double, double, i32, double, i32) +declare double @js_arraylike_sort(double, double) +declare double @js_arraylike_splice(double, ptr, i32) +declare double @js_arraylike_concat(double, ptr, i32) +declare double @js_arraylike_pop(double) +declare double @js_arraylike_shift(double) +declare double @js_arraylike_push(double, ptr, i32) +declare double @js_arraylike_unshift(double, ptr, i32) +declare i64 @js_array_clone_for_spread(double) +declare i64 @js_array_spread_append(i64, double) +declare i64 @js_iterator_to_array(double) +declare double @js_iterator_next_result(double) +declare double @js_iterator_close_if_not_done(double, double) +declare double @js_iterator_rest_to_array(double, double) +declare double @js_get_iterator(double) +declare double @js_get_async_iterator(double) +declare double @js_for_of_to_array(double) +declare i64 @js_object_alloc(i32, i32) +declare double @js_object_coerce(double) +declare void @js_object_mark_class(i64) +declare void @js_class_object_pin_parent(i64, i32) +declare i64 @js_object_alloc_with_shape(i32, i32, ptr, i32) +declare void @js_object_set_field(i64, i32, i64) +declare void @js_object_set_unboxed_f64_field(i64, i32, double) +declare double @js_object_get_unboxed_f64_field(i64, i32) +declare void @js_object_set_field_by_name(i64, i64, double) +declare void @js_object_set_field_by_property_id(i64, i64, double) +declare void @js_object_set_field_by_name_nonenum(i64, i64, double) +declare void @js_error_subclass_default_init(double, double, i64) +declare void @js_object_set_field_by_name_nonconfigurable(i64, i64, double) +declare void @js_error_apply_cause_to_object(i64, double) +declare i32 @js_with_has_binding(double, i64) +declare double @js_with_get_binding(double, i64) +declare double @js_with_set_binding(double, i64, double, i32) +declare i32 @js_with_delete_binding(double, i64) +declare i32 @js_pod_scalar_write_compatible(double, i32) +declare void @js_typed_feedback_register_site(i64, i32, ptr, i64, ptr, i64, ptr, i64, ptr, i64, ptr, i64, ptr, i64) +declare void @js_typed_feedback_record_guard_pass(i64) +declare void @js_typed_feedback_record_guard_fail(i64) +declare void @js_typed_feedback_record_fallback_call(i64) +declare void @js_typed_feedback_observe_property_get(i64, i64, i64) +declare void @js_typed_feedback_observe_property_set(i64, i64, i64) +declare double @js_typed_feedback_object_get_field_by_name_f64(i64, i64, i64) +declare void @js_typed_feedback_object_set_field_by_name(i64, i64, i64, double) +declare void @js_typed_feedback_object_set_field_by_name_fast(i64, i64, i64, double) +declare i32 @js_typed_feedback_class_field_set_guard(i64, double, i32, i64, i64, i32, double, i32) +declare void @js_class_field_set_fallback(i64, i64, i64, double) +declare void @js_class_field_set_ic(i64, double, i32, i64, i64, i32, double, i32) +declare i32 @js_typed_feedback_class_field_get_guard(i64, double, i32, i64, i64, i32, i32) +declare double @js_class_field_get_ic(i64, double, i32, i64, i64, i32, i32) +declare double @js_typed_feedback_native_call_method(i64, double, ptr, i64, ptr, i64) +declare double @js_typed_feedback_native_call_method_by_id(i64, double, i64, ptr, i64) +declare double @js_typed_feedback_native_call_method_apply(i64, double, ptr, i64, i64) +declare double @js_typed_feedback_native_call_method_apply_by_id(i64, double, i64, i64) +declare i32 @js_typed_feedback_method_direct_call_guard(i64, double, i32, i64, ptr, i64, ptr) +declare i32 @js_method_direct_shape_guard(double, i32, i64) +declare i32 @js_typed_feedback_closure_direct_call_guard(i64, double, ptr, i32, i32) +declare void @js_typed_feedback_object_set_unboxed_f64_field(i64, i64, i32, i64, double) +declare double @js_typed_feedback_observe_helper_return(i64, double) +declare void @js_object_set_index_polymorphic(i64, double, double) +declare double @js_object_get_index_polymorphic(i64, double) +declare double @js_object_get_field_by_name_f64(i64, i64) +declare double @js_object_get_field_by_name_boxed(double, i64) +declare double @js_object_get_field_by_property_id_f64(i64, i64) +declare double @js_native_module_property_by_name(ptr, i64, ptr, i64) +declare double @js_create_native_module_namespace(ptr, i64) +declare void @js_nm_install_assert() +declare void @js_nm_install_async_hooks() +declare void @js_nm_install_bigint() +declare void @js_nm_install_buffer() +declare void @js_nm_install_bun() +declare void @js_nm_install_bun_ffi() +declare void @js_nm_install_child_process() +declare void @js_nm_install_cluster() +declare void @js_nm_install_console() +declare void @js_nm_install_crypto() +declare void @js_nm_install_dgram() +declare void @js_nm_install_dns() +declare void @js_nm_install_domain() +declare void @js_nm_install_events() +declare void @js_nm_install_fs() +declare void @js_nm_install_http() +declare void @js_nm_install_inspector() +declare void @js_nm_install_module() +declare void @js_nm_install_net() +declare void @js_nm_install_node_pty() +declare void @js_nm_install_os() +declare void @js_nm_install_path() +declare void @js_nm_install_perf() +declare void @js_nm_install_process() +declare void @js_nm_install_punycode() +declare void @js_nm_install_querystring() +declare void @js_nm_install_readline() +declare void @js_nm_install_repl() +declare void @js_nm_install_sea() +declare void @js_nm_install_sqlite() +declare void @js_nm_install_stream() +declare void @js_nm_install_timers() +declare void @js_nm_install_tls() +declare void @js_nm_install_tty() +declare void @js_nm_install_url() +declare void @js_nm_install_util() +declare void @js_nm_install_v8() +declare void @js_nm_install_vm() +declare void @js_nm_install_wasi() +declare void @js_nm_install_zlib() +declare void @js_nm_install_all() +declare double @js_object_get_field_ic_miss(i64, i64, ptr) +declare double @js_object_get_field_ic(i64, i64, i64, ptr) +declare i64 @js_object_rest(i64, i64) +declare double @js_require_object_coercible(double) +declare double @js_require_json_disk(double) +declare double @js_require_resolve_node_modules(double, double) +declare void @js_globalthis_seed_async_local_storage() +declare void @js_register_path_module(double, double) +declare double @js_require_path_module(double) +declare void @js_register_path_init(ptr, i64, i64) +declare i64 @js_array_alloc_with_length(i32) +declare void @js_array_set_f64_unchecked(i64, i32, double) +declare double @js_typed_feedback_array_get_f64(i64, i64, i32) +declare i32 @js_typed_feedback_plain_array_index_get_guard(i64, double, i32, i32) #4 +declare i32 @js_typed_feedback_numeric_array_index_get_guard(i64, double, i32, i32) #4 +declare i32 @js_typed_feedback_packed_f64_array_loop_guard(i64, double) +declare i32 @js_typed_feedback_packed_f64_range_loop_guard(i64, double, i32, i32) +declare i32 @js_typed_feedback_packed_f64_range_loop_guard_dense(i64, double, i32, i32) +declare i32 @js_typed_feedback_packed_f64_range_loop_guard_dense_i32(i64, double, i32, i32) +declare i32 @js_typed_feedback_masked_window_ta_kind(i64, double, i32, i32) +declare i64 @js_typed_array_masked_window_data_ptr(double) +declare i32 @js_typed_feedback_packed_u32_array_loop_guard(i64, double) +declare double @js_typed_feedback_array_index_get_fallback_boxed(i64, double, double) +declare void @js_typed_feedback_array_set_f64(i64, i64, i32, double) +declare i64 @js_typed_feedback_array_set_f64_extend(i64, i64, i32, double) +declare i32 @js_typed_feedback_plain_array_index_set_guard(i64, double, i32, double, i32) #4 +declare i32 @js_typed_feedback_numeric_array_index_set_guard(i64, double, i32, double, i32) #4 +declare i32 @js_typed_feedback_numeric_array_push_guard(i64, double, double) #4 +declare double @js_typed_feedback_array_index_set_fallback_boxed(i64, double, double, double) +declare void @js_typed_feedback_observe_array_element(i64, i64, i32) +declare i64 @js_typed_feedback_array_set_string_key(i64, i64, i64, double) +declare i64 @js_typed_feedback_array_set_index_or_string(i64, i64, double, double) +declare void @js_typed_feedback_object_set_index_polymorphic(i64, i64, double, double) +declare double @js_proxy_new(double, double) +declare double @js_proxy_revocable(double, double) +declare void @js_proxy_revoke(double) +declare i32 @js_proxy_is_revoked(double) +declare i32 @js_proxy_is_proxy(double) +declare double @js_proxy_target(double) +declare double @js_proxy_get(double, double) +declare double @js_proxy_set(double, double, double) +declare double @js_proxy_has(double, double) +declare double @js_proxy_delete(double, double) +declare double @js_proxy_apply(double, double, double) +declare double @js_proxy_construct(double, double, double) +declare double @js_reflect_construct(double, double, double) +declare double @js_reflect_get(double, double, double) +declare double @js_reflect_set(double, double, double, double) +declare double @js_put_value_set(double, double, double, double, i32) +declare double @js_put_value_set_dyn_ic(ptr, double, double, double, i32) +declare double @js_put_value_set_ic_miss(double, i64, double, i32, ptr) +declare i64 @js_object_array_numeric_write_guard(double, double, double, double, double, i32, i32) +declare double @js_super_put_value_set(i32, double, double, double, i32) +declare double @js_super_accessor_get(i32, double, double) +declare double @js_reflect_has(double, double) +declare double @js_reflect_delete(double, double) +declare double @js_reflect_own_keys(double) +declare double @js_reflect_apply(double, double, double) +declare double @js_reflect_define_property(double, double, double) +declare double @js_reflect_get_own_property_descriptor(double, double) +declare double @js_reflect_get_prototype_of(double) +declare double @js_reflect_set_prototype_of(double, double) +declare double @js_reflect_is_extensible(double) +declare double @js_reflect_prevent_extensions(double) +declare double @js_reflect_define_metadata(double, double, double, double) +declare double @js_reflect_get_metadata(double, double, double) +declare double @js_reflect_get_own_metadata(double, double, double) +declare double @js_reflect_has_metadata(double, double, double) +declare double @js_reflect_has_own_metadata(double, double, double) +declare double @js_reflect_get_metadata_keys(double, double) +declare double @js_reflect_get_own_metadata_keys(double, double) +declare double @js_reflect_delete_metadata(double, double, double) +declare double @js_http_server_construct_with_this(double, double, double) +declare double @js_https_server_construct_with_this(double, double, double) +declare i64 @js_net_socket_set_encoding(i64, i64) +declare double @js_vm_create_context(double) +declare double @js_vm_module_call() +declare double @js_vm_module_constructor_error() +declare double @js_repl_start(double) +declare double @js_repl_repl_server_new(double) +declare double @js_repl_recoverable_new(double) +declare double @js_worker_threads_worker_new(i64, double) +declare double @js_worker_threads_worker_post_message(i64, double) +declare double @js_worker_threads_worker_on(i64, double, i64) +declare double @js_worker_threads_worker_once(i64, double, i64) +declare double @js_worker_threads_worker_off(i64, double, i64) +declare double @js_worker_threads_worker_add_event_listener(i64, double, i64) +declare double @js_worker_threads_worker_remove_event_listener(i64, double, i64) +declare double @js_worker_threads_worker_terminate(i64) +declare double @js_worker_threads_worker_ref(i64) +declare double @js_worker_threads_worker_unref(i64) +declare double @js_worker_threads_worker_get_heap_statistics(i64) +declare double @js_worker_threads_worker_cpu_usage(i64, double) +declare double @js_worker_threads_worker_get_heap_snapshot(i64, double) +declare double @js_worker_threads_worker_start_cpu_profile(i64) +declare double @js_worker_threads_worker_start_heap_profile(i64) +declare i64 @js_http_client_request_end(i64, double) +declare i64 @js_http_client_request_write(i64, double) +declare i64 @js_http_client_request_end_full(i64, double, i64, i64) +declare double @js_http_client_request_write_full(i64, double, i64, i64) +declare i64 @js_http_set_timeout_full(i64, double, i64) +declare i64 @js_http_client_request_method(i64) +declare i64 @js_http_client_request_protocol(i64) +declare i64 @js_http_client_request_host(i64) +declare i64 @js_http_client_request_path(i64) +declare double @js_http_client_request_listener_count(i64, i64) +declare double @js_http_client_request_get_header(i64, i64) +declare double @js_http_client_request_has_header(i64, i64) +declare double @js_http_client_request_remove_header(i64, i64) +declare double @js_http_client_request_get_header_names(i64) +declare double @js_http_client_request_get_headers(i64) +declare double @js_http_client_request_get_raw_header_names(i64) +declare double @js_http_client_request_abort(i64) +declare i64 @js_http_client_request_destroy(i64, double) +declare double @js_http_client_request_noop_undefined(i64, double, double) +declare double @js_http_client_request_aborted(i64) +declare double @js_http_client_request_destroyed(i64) +declare double @js_http_client_request_finished(i64) +declare double @js_http_client_request_reused_socket(i64) +declare double @js_http_client_request_max_headers_count(i64) +declare double @js_http_client_request_writable_ended(i64) +declare double @js_http_client_request_writable_finished(i64) +declare double @js_http_client_request_socket(i64) +declare i64 @js_http_get(double, i64) +declare i64 @js_http_get_overload(i64) +declare i64 @js_http_request_overload(i64) +declare i64 @js_https_get_overload(i64) +declare i64 @js_https_request_overload(i64) +declare i64 @js_http_on(i64, i64, i64) +declare i64 @js_http_request(double, i64) +declare i64 @js_http_request_body(i64) +declare double @js_http_request_body_length(i64) +declare i64 @js_http_request_content_type(i64) +declare double @js_http_request_has_header(i64, i64) +declare i64 @js_http_request_header(i64, i64) +declare i64 @js_http_request_headers_all(i64) +declare double @js_http_request_id(i64) +declare double @js_http_request_is_method(i64, i64) +declare i64 @js_http_request_method(i64) +declare i64 @js_http_request_path(i64) +declare i64 @js_http_request_query(i64) +declare i64 @js_http_request_query_all(i64) +declare i64 @js_http_request_query_param(i64, i64) +declare double @js_http_respond_error(i64, double, i64) +declare double @js_http_respond_html(i64, double, i64) +declare double @js_http_respond_json(i64, double, i64) +declare double @js_http_respond_not_found(i64) +declare double @js_http_respond_redirect(i64, i64, double) +declare i64 @js_http_respond_status_text(double) +declare double @js_http_respond_text(i64, double, i64) +declare double @js_http_respond_with_headers(i64, double, i64, i64) +declare double @js_http_response_headers(i64) +declare double @js_http_response_trailers(i64) +declare i64 @js_http_incoming_message_set_encoding(i64, i64) +declare i64 @js_http_server_accept_v2(i64) +declare double @js_http_server_close(i64) +declare i64 @js_http_server_create(double) +declare i64 @js_http_set_header(i64, i64, i64) +declare i64 @js_http_set_timeout(i64, double) +declare double @js_http_status_code(i64) +declare i64 @js_http_status_message(i64) +declare i64 @js_http_agent_new(double) +declare i64 @js_https_agent_new(double) +declare i64 @js_http_agent_get_name(i64, double) +declare i64 @js_http_agent_noop_self(i64) +declare double @js_http_agent_max_sockets(i64) +declare double @js_http_agent_max_free_sockets(i64) +declare double @js_http_agent_max_total_sockets(i64) +declare double @js_http_agent_keep_alive_msecs(i64) +declare double @js_http_agent_keep_alive(i64) +declare i64 @js_http_agent_protocol(i64) +declare double @js_http_agent_default_port(i64) +declare void @js_http_agent_set_protocol(i64, i64) +declare i64 @js_http_agent_destroy(i64) +declare double @js_http_agent_destroyed(i64) +declare double @js_http_agent_sockets(i64) +declare double @js_http_agent_free_sockets(i64) +declare double @js_http_agent_requests(i64) +declare void @js_http_agent_set_max_sockets(i64, double) +declare void @js_http_agent_set_max_free_sockets(i64, double) +declare void @js_http_agent_set_max_total_sockets(i64, double) +declare void @js_http_agent_set_keep_alive(i64, double) +declare void @js_http_agent_set_keep_alive_msecs(i64, double) +declare void @js_http_agent_set_create_connection(i64, i64) +declare void @js_http_agent_set_create_socket(i64, i64) +declare i64 @js_http_agent_create_connection(i64) +declare i64 @js_http_agent_create_socket(i64) +declare i64 @js_https_get(double, i64) +declare i64 @js_https_request(double, i64) +declare i64 @js_node_http_create_server(i64) +declare i64 @js_node_http_server_listen(i64, i64) +declare void @js_node_http_server_close(i64, i64) +declare void @js_node_http_server_close_all_connections(i64) +declare void @js_node_http_server_close_idle_connections(i64) +declare i64 @js_node_http_server_address_json(i64) +declare i32 @js_node_http_server_listening(i64) +declare double @js_node_http_server_listening_value(i64) +declare double @js_node_http_server_on(i64, i64, i64) +declare i64 @js_node_http_im_method(i64) +declare i64 @js_node_http_im_url(i64) +declare i64 @js_node_http_im_http_version(i64) +declare i64 @js_node_http_im_headers_json(i64) +declare i64 @js_node_http_im_raw_headers_json(i64) +declare i64 @js_node_http_im_headers_distinct_json(i64) +declare i64 @js_node_http_im_trailers_json(i64) +declare i64 @js_node_http_im_raw_trailers_json(i64) +declare i64 @js_node_http_im_trailers_distinct_json(i64) +declare i32 @js_node_http_im_complete(i64) +declare i32 @js_node_http_im_aborted(i64) +declare i32 @js_node_http_im_destroyed(i64) +declare i64 @js_node_http_im_remote_address(i64) +declare double @js_node_http_im_remote_port(i64) +declare void @js_node_http_im_pause(i64) +declare void @js_node_http_im_resume(i64) +declare void @js_node_http_im_destroy(i64) +declare double @js_node_http_im_on(i64, i64, i64) +declare double @js_node_http_im_read(i64) +declare i64 @js_node_http_im_set_timeout(i64, double, i64) +declare void @js_node_http_res_set_status(i64, double) +declare double @js_node_http_res_get_status(i64) +declare void @js_node_http_res_set_status_message(i64, i64) +declare void @js_node_http_res_set_header(i64, i64, double) +declare i64 @js_node_http_res_set_header_self(i64, i64, double) +declare double @js_node_http_res_get_header(i64, i64) +declare void @js_node_http_res_remove_header(i64, i64) +declare i32 @js_node_http_res_has_header(i64, i64) +declare double @js_node_http_res_has_header_value(i64, i64) +declare i64 @js_node_http_res_get_headers_json(i64) +declare i64 @js_node_http_res_get_header_names_json(i64) +declare i64 @js_node_http_res_append_header(i64, i64, i64) +declare i64 @js_node_http_res_set_headers(i64, double) +declare double @js_node_http_res_get_status_message(i64) +declare i32 @js_node_http_res_headers_sent(i64) +declare i32 @js_node_http_res_writable_ended(i64) +declare i32 @js_node_http_res_writable_finished(i64) +declare i32 @js_node_http_res_finished(i64) +declare i32 @js_node_http_res_send_date(i64) +declare void @js_node_http_res_set_send_date(i64, double) +declare i32 @js_node_http_res_strict_content_length(i64) +declare void @js_node_http_res_set_strict_content_length(i64, double) +declare i64 @js_node_http_res_req_handle(i64) +declare void @js_node_http_res_write_head(i64, double, i64, i64) +declare i32 @js_node_http_res_write(i64, double) +declare double @js_node_http_res_write_full(i64, double, i64, i64) +declare void @js_node_http_res_add_trailers(i64, double) +declare void @js_node_http_res_end(i64, double) +declare void @js_node_http_res_end_full(i64, double, i64, i64) +declare void @js_node_http_res_flush_headers(i64) +declare void @js_node_http_res_cork(i64) +declare void @js_node_http_res_uncork(i64) +declare i64 @js_node_http_res_set_timeout(i64, double, i64) +declare void @js_node_http_res_write_early_hints(i64, double, i64) +declare void @js_node_http_res_write_continue(i64) +declare void @js_node_http_res_write_processing(i64) +declare double @js_node_http_res_on(i64, i64, i64) +declare i64 @js_node_https_create_server(double, i64) +declare i64 @js_node_https_server_listen(i64, i64) +declare void @js_node_https_server_close(i64, i64) +declare void @js_node_https_server_close_all_connections(i64) +declare void @js_node_https_server_close_idle_connections(i64) +declare i64 @js_node_https_server_address_json(i64) +declare double @js_node_https_server_on(i64, i64, i64) +declare double @js_node_https_server_listening_value(i64) +declare double @js_node_https_server_headers_timeout(i64) +declare double @js_node_https_server_set_headers_timeout(i64, double) +declare double @js_node_https_server_keep_alive_timeout(i64) +declare double @js_node_https_server_set_keep_alive_timeout(i64, double) +declare double @js_node_https_server_keep_alive_timeout_buffer(i64) +declare double @js_node_https_server_set_keep_alive_timeout_buffer(i64, double) +declare double @js_node_https_server_request_timeout(i64) +declare double @js_node_https_server_set_request_timeout(i64, double) +declare double @js_node_https_server_idle_timeout(i64) +declare double @js_node_https_server_set_idle_timeout(i64, double) +declare double @js_node_https_server_max_headers_count(i64) +declare double @js_node_https_server_set_max_headers_count(i64, double) +declare double @js_node_https_server_max_requests_per_socket(i64) +declare double @js_node_https_server_set_max_requests_per_socket(i64, double) +declare i64 @js_node_https_server_set_timeout_method(i64, double, i64) +declare i64 @js_node_http2_create_server(double, double) +declare i64 @js_node_http2_create_secure_server(double, i64) +declare i64 @js_node_http2_connect(double, double, i64) +declare i64 @js_node_http2_server_listen(i64, i64) +declare void @js_node_http2_server_close(i64, i64) +declare i64 @js_node_http2_server_address_json(i64) +declare double @js_node_http2_server_on(i64, i64, i64) +declare i64 @js_node_http2_get_default_settings() +declare i64 @js_node_http2_get_packed_settings(i64) +declare i64 @js_node_http2_get_unpacked_settings(i64) +declare i64 @js_pg_client_connect(i64) +declare i64 @js_pg_client_end(i64) +declare i64 @js_pg_client_new(i64) +declare i64 @js_pg_client_query(i64, i64) +declare i64 @js_pg_client_query_params(i64, i64, i64) +declare i64 @js_pg_connect(i64) +declare i64 @js_pg_create_pool(i64) +declare i64 @js_pg_pool_end(i64) +declare i64 @js_pg_pool_new(i64) +declare i64 @js_pg_pool_query(i64, i64) +declare i64 @js_ioredis_connect(i64) +declare i64 @js_ioredis_decr(i64, i64) +declare i64 @js_ioredis_del(i64, i64) +declare void @js_ioredis_disconnect(i64) +declare i64 @js_ioredis_exists(i64, i64) +declare i64 @js_ioredis_expire(i64, i64, double) +declare i64 @js_ioredis_get(i64, i64) +declare i64 @js_ioredis_hdel(i64, i64, i64) +declare i64 @js_ioredis_hget(i64, i64, i64) +declare i64 @js_ioredis_hgetall(i64, i64) +declare i64 @js_ioredis_hlen(i64, i64) +declare i64 @js_ioredis_hset(i64, i64, i64, i64) +declare i64 @js_ioredis_incr(i64, i64) +declare i64 @js_ioredis_new(i64) +declare i64 @js_ioredis_ping(i64) +declare i64 @js_ioredis_quit(i64) +declare i64 @js_ioredis_set(i64, i64, i64) +declare i64 @js_ioredis_setex(i64, i64, double, i64) +declare i64 @js_mongodb_client_close(i64) +declare i64 @js_mongodb_client_connect(i64) +declare i64 @js_mongodb_client_db(i64, i64) +declare i64 @js_mongodb_client_list_databases(i64) +declare i64 @js_mongodb_client_new(i64) +declare i64 @js_mongodb_collection_count_value(i64, double) +declare i64 @js_mongodb_collection_delete_many_value(i64, double) +declare i64 @js_mongodb_collection_delete_one_value(i64, double) +declare i64 @js_mongodb_collection_find_one_value(i64, double) +declare i64 @js_mongodb_collection_find_value(i64, double) +declare i64 @js_mongodb_collection_insert_many_value(i64, double) +declare i64 @js_mongodb_collection_insert_one_value(i64, double) +declare i64 @js_mongodb_collection_update_many_value(i64, double, double) +declare i64 @js_mongodb_collection_update_one_value(i64, double, double) +declare i64 @js_mongodb_collection_count(i64, i64) +declare i64 @js_mongodb_collection_delete_many(i64, i64) +declare i64 @js_mongodb_collection_delete_one(i64, i64) +declare i64 @js_mongodb_collection_find(i64, i64) +declare i64 @js_mongodb_collection_find_one(i64, i64) +declare i64 @js_mongodb_collection_insert_many(i64, i64) +declare i64 @js_mongodb_collection_insert_one(i64, i64) +declare i64 @js_mongodb_collection_update_many(i64, i64, i64) +declare i64 @js_mongodb_collection_update_one(i64, i64, i64) +declare i64 @js_mongodb_connect(i64) +declare i64 @js_mongodb_db_collection(i64, i64) +declare i64 @js_mongodb_db_list_collections(i64) +declare void @js_sqlite_close(i64) +declare void @js_sqlite_exec(i64, i64) +declare i64 @js_sqlite_open(i64) +declare i64 @js_sqlite_pragma(i64, i64, i64) +declare i64 @js_sqlite_prepare(i64, i64) +declare i64 @js_sqlite_stmt_all(i64, i64) +declare i64 @js_sqlite_stmt_columns(i64) +declare i64 @js_sqlite_stmt_get(i64, i64) +declare i64 @js_sqlite_stmt_run(i64, i64) +declare i64 @js_sqlite_transaction(i64, i64) +declare void @js_sqlite_transaction_commit(i64) +declare void @js_sqlite_transaction_rollback(i64) +declare i64 @js_node_sqlite_backup(double, double, double) +declare i64 @js_node_sqlite_database_sync_call(double, double) +declare i64 @js_node_sqlite_database_sync_new(double, double) +declare i32 @js_node_sqlite_database_sync_open(i64) +declare i32 @js_node_sqlite_database_sync_close(i64) +declare i32 @js_node_sqlite_database_sync_dispose(i64) +declare i32 @js_node_sqlite_database_sync_exec(i64, double) +declare i64 @js_node_sqlite_database_sync_prepare(i64, double, double) +declare i32 @js_node_sqlite_database_sync_function(i64, double, double, double) +declare i32 @js_node_sqlite_database_sync_aggregate(i64, double, double) +declare i32 @js_node_sqlite_database_sync_enable_defensive(i64, double) +declare i32 @js_node_sqlite_database_sync_set_authorizer(i64, double) +declare i64 @js_node_sqlite_database_sync_create_tag_store(i64, double) +declare i64 @js_node_sqlite_database_sync_create_session(i64, double) +declare double @js_node_sqlite_database_sync_apply_changeset(i64, double, double) +declare i32 @js_node_sqlite_database_sync_enable_load_extension(i64, double) +declare i32 @js_node_sqlite_database_sync_load_extension(i64, double) +declare double @js_node_sqlite_database_sync_location(i64, double) +declare double @js_node_sqlite_database_sync_is_open(i64) +declare double @js_node_sqlite_database_sync_is_transaction(i64) +declare i64 @js_node_sqlite_database_sync_limits(i64) +declare i64 @js_node_sqlite_statement_sync_call(double, double) +declare i64 @js_node_sqlite_statement_sync_new(double, double) +declare i64 @js_node_sqlite_statement_sync_run(i64, i64) +declare double @js_node_sqlite_statement_sync_get(i64, i64) +declare i64 @js_node_sqlite_statement_sync_all(i64, i64) +declare double @js_node_sqlite_statement_sync_iterate(i64, i64) +declare i64 @js_node_sqlite_statement_sync_columns(i64) +declare i32 @js_node_sqlite_statement_sync_set_read_bigints(i64, double) +declare i32 @js_node_sqlite_statement_sync_set_return_arrays(i64, double) +declare i32 @js_node_sqlite_statement_sync_set_allow_bare_named_parameters(i64, double) +declare i32 @js_node_sqlite_statement_sync_set_allow_unknown_named_parameters(i64, double) +declare i64 @js_node_sqlite_statement_sync_source_sql(i64) +declare i64 @js_node_sqlite_statement_sync_expanded_sql(i64) +declare i64 @js_node_sqlite_sql_tag_store_run(i64, i64) +declare double @js_node_sqlite_sql_tag_store_get(i64, i64) +declare i64 @js_node_sqlite_sql_tag_store_all(i64, i64) +declare double @js_node_sqlite_sql_tag_store_iterate(i64, i64) +declare i32 @js_node_sqlite_sql_tag_store_clear(i64) +declare double @js_node_sqlite_sql_tag_store_size(i64) +declare double @js_node_sqlite_sql_tag_store_capacity(i64) +declare i64 @js_node_sqlite_sql_tag_store_db(i64) +declare i64 @js_node_sqlite_session_call(double, double) +declare i64 @js_node_sqlite_session_new(double, double) +declare i64 @js_node_sqlite_session_changeset(i64) +declare i64 @js_node_sqlite_session_patchset(i64) +declare i32 @js_node_sqlite_session_close(i64) +declare i32 @js_node_sqlite_session_dispose(i64) +declare i64 @js_os_cpus() +declare double @js_os_freemem() +declare i64 @js_os_homedir() +declare i64 @js_os_network_interfaces() +declare i64 @js_os_tmpdir() +declare double @js_os_totalmem() +declare double @js_os_uptime() +declare i64 @js_os_user_info() +declare i64 @js_os_user_info_buffer() +declare i64 @js_os_user_info_options(i64) +declare i64 @js_crypto_aes256_decrypt(i64, i64, i64) +declare i64 @js_crypto_aes256_encrypt(i64, i64, i64) +declare i64 @js_crypto_aes256_gcm_decrypt(i64, i64, i64) +declare i64 @js_crypto_aes256_gcm_encrypt(i64, i64, i64) +declare double @js_crypto_create_cipheriv(i64, i64, i64, double) +declare double @js_crypto_create_decipheriv(i64, i64, i64, double) +declare i64 @js_crypto_hkdf_sha256(i64, i64, i64, double) +declare i64 @js_crypto_hkdf_sync(i64, i64, i64, i64, double) +declare i64 @js_crypto_pbkdf2(i64, i64, double, double) +declare i64 @js_crypto_random_bytes_hex(double) +declare i64 @js_crypto_random_nonce() +declare i64 @js_crypto_scrypt(i64, i64, double) +declare double @js_crypto_generate_key_pair_sync(i64, i64) +declare i64 @js_crypto_scrypt_custom(i64, i64, double, double, double, double) +declare i64 @js_crypto_x25519_keypair() +declare i64 @js_crypto_x25519_shared_secret(i64, i64) +declare i64 @js_keccak256_native(i64) +declare i64 @js_keccak256_native_bytes(i64) +declare i64 @js_nanoid(double) +declare i64 @js_nanoid_custom(i64, double) +declare i64 @js_argon2_hash(i64) +declare i64 @js_argon2_hash_options(i64, i64) +declare i64 @js_argon2_verify(i64, i64) +declare i64 @js_bcrypt_compare(i64, i64) +declare double @js_bcrypt_compare_sync(i64, i64) +declare i64 @js_bcrypt_gen_salt(double) +declare i64 @js_bcrypt_hash(i64, double) +declare i64 @js_bcrypt_hash_sync(i64, double) +declare i64 @js_ads_interstitial_load(i64) +declare i64 @js_ads_interstitial_show() +declare i64 @js_ads_rewarded_load(i64) +declare i64 @js_ads_rewarded_show() +declare double @js_ads_banner_create(i64, i64) +declare void @js_ads_banner_destroy(double) +declare i64 @js_ads_request_consent() +declare i64 @js_perry_read_embedded(double) +declare i64 @js_perry_embedded_files() +declare double @js_thread_parallel_map(double, double) +declare double @js_thread_parallel_filter(double, double) +declare double @js_thread_spawn(double) +declare i64 @js_jwt_decode(i64) +declare i64 @js_jwt_sign(i64, i64, double, i64) +declare i64 @js_jwt_sign_es256(i64, i64, double, i64) +declare i64 @js_jwt_sign_rs256(i64, i64, double, i64) +declare i64 @js_jwt_verify(i64, i64) +declare i64 @js_jwt_verify_es256(i64, i64) +declare i64 @js_jwt_verify_rs256(i64, i64) +declare i64 @js_jwt_sign_dyn(i64, i64, i64, double, i64) +declare i64 @js_jwt_verify_dyn(i64, i64, i64) +declare i64 @js_jwt_sign_dyn_opts(i64, i64, double) +declare i64 @js_jwt_verify_dyn_opts(i64, i64, double) +declare double @js_axios_create(i64) +declare i64 @js_axios_delete(i64) +declare i64 @js_axios_get(i64) +declare i64 @js_axios_head(i64) +declare i64 @js_axios_options(i64) +declare i64 @js_axios_post(i64, double) +declare i64 @js_axios_put(i64, double) +declare i64 @js_axios_patch(i64, double) +declare i64 @js_axios_request(i64) +declare double @js_axios_response_status(i64) +declare i64 @js_axios_response_status_text(i64) +declare i64 @js_axios_response_data(i64) +declare double @js_axios_response_data_parsed(i64) +declare i64 @js_sharp_auto_orient(i64) +declare i64 @js_sharp_avif(i64, double) +declare i64 @js_sharp_blur(i64, double) +declare i64 @js_sharp_composite(i64, double) +declare i64 @js_sharp_extend(i64, double) +declare i64 @js_sharp_extract(i64, double) +declare i64 @js_sharp_flip(i64) +declare i64 @js_sharp_flop(i64) +declare i64 @js_sharp_from_buffer(i64, double) +declare i64 @js_sharp_from_file(i64) +declare i64 @js_sharp_from_input(i64) +declare i64 @js_sharp_grayscale(i64) +declare i64 @js_sharp_metadata(i64) +declare i64 @js_sharp_sharpen(i64) +declare i64 @js_sharp_trim(i64) +declare i64 @js_sharp_negate(i64) +declare i64 @js_sharp_quality(i64, double) +declare i64 @js_sharp_resize(i64, double, double) +declare i64 @js_sharp_rotate(i64, double) +declare i64 @js_sharp_to_buffer(i64) +declare i64 @js_sharp_to_file(i64, i64) +declare i64 @js_sharp_to_format(i64, i64) +declare void @js_cron_clear_interval(i64) +declare void @js_cron_clear_timeout(i64) +declare i64 @js_cron_describe(i64) +declare double @js_cron_job_is_running(i64) +declare i64 @js_cron_job_new(i64, i64, double) +declare void @js_cron_job_start(i64) +declare void @js_cron_job_stop(i64) +declare i64 @js_cron_next_date(i64) +declare i64 @js_cron_next_dates(i64, double) +declare i64 @js_cron_schedule(i64, i64) +declare i64 @js_cron_set_interval(double, double) +declare i64 @js_cron_set_timeout(double, double) +declare i32 @js_cron_timer_has_pending() +declare i32 @js_cron_timer_tick() +declare double @js_cron_validate(i64) +declare i64 @js_async_hooks_create_hook(double) +declare double @js_async_hooks_execution_async_id() +declare double @js_async_hooks_trigger_async_id() +declare double @js_async_hooks_execution_async_resource() +declare i64 @js_async_hook_enable(i64) +declare i64 @js_async_hook_disable(i64) +declare i64 @js_async_resource_new(double, double) +declare double @js_async_resource_async_id(i64) +declare double @js_async_resource_trigger_async_id(i64) +declare i64 @js_async_resource_emit_destroy(i64) +declare double @js_async_resource_run_in_async_scope(i64, double, double, i64) +declare i64 @js_async_resource_bind(i64, double, double) +declare i64 @js_async_resource_static_bind(i64, double) +declare void @js_async_local_storage_disable(i64) +declare void @js_async_local_storage_enter_with(i64, double) +declare double @js_async_local_storage_exit(i64, double, i64) +declare double @js_async_local_storage_get_store(i64) +declare i64 @js_async_local_storage_new() +declare double @js_async_local_storage_run(i64, double, double, i64) +declare i64 @js_disposable_stack_new() +declare i64 @js_async_disposable_stack_new() +declare double @js_suppressed_error_new(double, double, double) +declare i64 @js_zlib_deflate_sync(i64, double) +declare void @js_zlib_deflate(double, double) +declare i64 @js_zlib_gunzip_sync(i64) +declare void @js_zlib_gunzip(double, double) +declare i64 @js_zlib_gzip_sync(i64, double) +declare void @js_zlib_gzip(double, double) +declare i64 @js_zlib_inflate_sync(i64) +declare void @js_zlib_inflate(double, double) +declare i64 @js_zlib_deflate_raw_sync(double, double) +declare void @js_zlib_deflate_raw(double, double) +declare i64 @js_zlib_inflate_raw_sync(double) +declare void @js_zlib_inflate_raw(double, double) +declare i64 @js_zlib_unzip_sync(double) +declare void @js_zlib_unzip(double, double) +declare double @js_zlib_crc32(double, double) +declare i64 @js_zlib_brotli_compress_sync(i64) +declare i64 @js_zlib_brotli_decompress_sync(i64) +declare void @js_zlib_brotli_compress(double, double) +declare void @js_zlib_brotli_decompress(double, double) +declare i64 @js_zlib_zstd_compress_sync(double, double) +declare i64 @js_zlib_zstd_decompress_sync(double, double) +declare void @js_zlib_zstd_compress(double, double) +declare void @js_zlib_zstd_decompress(double, double) +declare i64 @js_zlib_create_gzip(double) +declare i64 @js_zlib_create_gunzip(double) +declare i64 @js_zlib_create_deflate(double) +declare i64 @js_zlib_create_inflate(double) +declare i64 @js_zlib_create_deflate_raw(double) +declare i64 @js_zlib_create_inflate_raw(double) +declare i64 @js_zlib_create_unzip(double) +declare i64 @js_zlib_create_brotli_compress(double) +declare i64 @js_zlib_create_zstd_compress(double) +declare i64 @js_zlib_create_zstd_decompress(double) +declare i64 @js_buffer_alloc_unsafe(i32) +declare i32 @js_buffer_byte_length(i64) +declare i32 @js_buffer_byte_length_value(double, double) +declare i64 @js_buffer_concat(i64) +declare i64 @js_buffer_concat_with_length(i64, double) +declare i32 @js_buffer_validate_size(double) +declare i64 @js_buffer_validate_concat_list(double) +declare i32 @js_buffer_copy(i64, i64, i32, i32, i32) +declare i32 @js_buffer_equals(i64, i64) +declare i64 @js_buffer_fill(i64, i32) +declare i64 @js_buffer_from_value(i64, i32) +declare double @js_buffer_is_ascii(double) +declare i32 @js_buffer_is_buffer(i64) +declare i32 @js_buffer_is_encoding(double) +declare double @js_buffer_is_utf8(double) +declare void @js_buffer_print(i64) +declare void @js_buffer_set(i64, i32, i32) +declare void @js_buffer_set_from(i64, i64, i32) +declare i64 @js_buffer_slice(i64, i32, i32) +declare i64 @js_buffer_to_string(i64, i32) +declare i64 @js_buffer_transcode(double, double, double) +declare i32 @js_buffer_write(i64, i64, i32, i32) +declare double @js_child_process_exec_sync(i64, i64) +declare double @js_child_process_exec(i64, double, double) +declare i64 @js_child_process_get_process_status(double) +declare i32 @js_child_process_kill_process(double) +declare i64 @js_child_process_spawn_background(double, i64, double, double) +declare i64 @js_child_process_spawn_sync(i64, i64, i64) +declare double @js_child_process_spawn_streams(i64, i64, i64) +declare double @js_pty_spawn(i64, i64, i64) +declare double @js_child_process_fork(i64, i64, i64) +declare double @js_child_process_exec_file(i64, double, double, double) +declare double @js_child_process_exec_file_sync(i64, double, double) +declare double @js_child_process_validate_command(double, ptr, i32) +declare double @js_child_process_validate_args(double) +declare double @js_child_process_validate_options(double, i32, i32) +declare double @js_child_process_validate_fork_module(double) +declare double @js_child_process_validate_spawn_args(double, i32, i32) +declare double @js_child_process_new() +declare i64 @js_cheerio_load(i64) +declare i64 @js_cheerio_load_fragment(i64) +declare i64 @js_cheerio_select(i64, i64) +declare i64 @js_cheerio_selection_attr(i64, i64) +declare i64 @js_cheerio_selection_attrs(i64, i64) +declare i64 @js_cheerio_selection_children(i64, i64) +declare i64 @js_cheerio_selection_eq(i64, double) +declare i64 @js_cheerio_selection_find(i64, i64) +declare i64 @js_cheerio_selection_first(i64) +declare double @js_cheerio_selection_has_class(i64, i64) +declare i64 @js_cheerio_selection_html(i64) +declare double @js_cheerio_selection_is(i64, i64) +declare i64 @js_cheerio_selection_last(i64) +declare double @js_cheerio_selection_length(i64) +declare i64 @js_cheerio_selection_parent(i64) +declare i64 @js_cheerio_selection_text(i64) +declare i64 @js_cheerio_selection_texts(i64) +declare i64 @js_cheerio_selection_to_array(i64) +declare double @js_url_file_url_to_path(double, double) +declare double @js_url_file_url_to_path_buffer(double, double) +declare double @js_url_get_hash(i64) +declare double @js_url_get_host(i64) +declare double @js_url_get_hostname(i64) +declare double @js_url_get_href(i64) +declare double @js_url_get_origin(i64) +declare double @js_url_get_pathname(i64) +declare double @js_url_get_port(i64) +declare double @js_url_get_protocol(i64) +declare double @js_url_get_search(i64) +declare double @js_url_get_search_params(i64) +declare i64 @js_url_new(i64) +declare i64 @js_url_new_with_base(i64, i64) +declare i64 @js_url_pattern_new(double, double) +declare double @js_url_pattern_constructor_call(double, double) +declare i32 @js_url_can_parse(i64) +declare i32 @js_url_can_parse_with_base(i64, i64) +declare i64 @js_url_parse(i64) +declare i64 @js_url_parse_with_base(i64, i64) +declare void @js_url_set_pathname(i64, double) +declare void @js_url_set_search(i64, double) +declare void @js_url_set_hash(i64, double) +declare void @js_url_set_protocol(i64, double) +declare void @js_url_set_hostname(i64, double) +declare void @js_url_set_port(i64, double) +declare void @js_url_set_username(i64, double) +declare void @js_url_set_password(i64, double) +declare void @js_url_set_href(i64, double) +declare double @js_url_search_params_has2(i64, double, double) +declare void @js_url_search_params_delete2(i64, double, double) +declare double @js_url_search_params_throw_missing_args(i32) +declare void @js_url_search_params_append(i64, double, double) +declare void @js_url_search_params_delete(i64, double) +declare i64 @js_url_search_params_get(i64, double) +declare double @js_url_search_params_get_all(i64, double) +declare double @js_url_search_params_has(i64, double) +declare i64 @js_url_search_params_new(i64) +declare i64 @js_url_search_params_new_any(double) +declare i64 @js_url_search_params_new_empty() +declare double @js_url_search_params_subclass_init(double, double) +declare void @js_url_search_params_set(i64, double, double) +declare i64 @js_url_search_params_to_string(i64) +declare i32 @js_url_search_params_size(i64) +declare double @js_url_search_params_entries_arr(i64) +declare double @js_url_search_params_keys_arr(i64) +declare double @js_url_search_params_values_arr(i64) +declare void @js_url_search_params_sort(i64) +declare void @js_url_search_params_for_each(i64, double, double) +declare i64 @js_url_coerce_string(double) +declare double @js_url_path_to_file_url(double, double) +declare double @js_url_domain_to_ascii(double) +declare double @js_url_domain_to_unicode(double) +declare double @js_url_to_http_options(double) +declare double @js_url_legacy_url_new() +declare double @js_url_format(double, double) +declare double @js_url_legacy_parse(double, double, double) +declare double @js_url_legacy_resolve(double, double) +declare double @js_url_legacy_resolve_object(double, double) +declare void @js_ws_close(i64) +declare i64 @js_ws_connect(i64) +declare double @js_ws_connect_start(double) +declare i64 @js_ws_handle_to_i64(double) +declare double @js_ws_is_open(i64) +declare double @js_ws_message_count(i64) +declare double @js_ws_ready_state(i64) +declare i64 @js_ws_on(i64, i64, i64) +declare i64 @js_ws_receive(i64) +declare void @js_ws_send(i64, i64) +declare void @js_ws_send_to_client(double, i64) +declare void @js_ws_close_client(double) +declare void @js_ws_send_client_i64(i64, i64) +declare void @js_ws_close_client_i64(i64) +declare i64 @js_ws_on_client_i64(i64, i64, i64) +declare void @js_ws_server_close(i64) +declare i64 @js_ws_server_new(double) +declare i64 @js_ws_handle_upgrade(i64, double, double, double, i64) +declare i64 @js_ws_wait_for_message(i64, double) +declare i64 @js_pdf_create_pdf(double) +declare void @js_pdf_add_text(i64, i64, double, double, double) +declare void @js_pdf_add_line(i64, double, double, double, double) +declare void @js_pdf_new_page(i64) +declare void @js_pdf_save(i64) +declare i64 @js_commander_action(i64, i64) +declare i64 @js_commander_command(i64, i64) +declare i64 @js_commander_description(i64, i64) +declare i64 @js_commander_get_option(i64, i64) +declare double @js_commander_get_option_bool(i64, i64) +declare double @js_commander_get_option_number(i64, i64) +declare i64 @js_commander_name(i64, i64) +declare i64 @js_commander_new() +declare i64 @js_commander_option(i64, i64, i64, i64) +declare i64 @js_commander_opts(i64) +declare i64 @js_commander_parse(i64, double) +declare i64 @js_commander_required_option(i64, i64, i64, i64) +declare i64 @js_commander_version(i64, i64) +declare double @js_dotenv_config() +declare double @js_dotenv_config_path(i64) +declare i64 @js_dotenv_parse(i64) +declare double @js_datefns_add_days(double, double) +declare double @js_datefns_add_months(double, double) +declare double @js_datefns_add_years(double, double) +declare double @js_datefns_difference_in_days(double, double) +declare double @js_datefns_difference_in_hours(double, double) +declare double @js_datefns_difference_in_minutes(double, double) +declare double @js_datefns_end_of_day(double) +declare i64 @js_datefns_format(double, i64) +declare double @js_datefns_is_after(double, double) +declare double @js_datefns_is_before(double, double) +declare double @js_datefns_parse_iso(i64) +declare double @js_datefns_start_of_day(double) +declare double @js_dayjs_add(i64, double, i64) +declare double @js_dayjs_date(i64) +declare double @js_dayjs_day(i64) +declare double @js_dayjs_diff(i64, i64, i64) +declare double @js_dayjs_end_of(i64, i64) +declare double @js_dayjs_factory(i64) +declare i64 @js_dayjs_format(i64, i64) +declare double @js_dayjs_from_timestamp(double) +declare double @js_dayjs_hour(i64) +declare double @js_dayjs_is_after(i64, i64) +declare double @js_dayjs_is_before(i64, i64) +declare double @js_dayjs_is_same(i64, i64) +declare double @js_dayjs_is_valid(i64) +declare double @js_dayjs_millisecond(i64) +declare double @js_dayjs_minute(i64) +declare double @js_dayjs_month(i64) +declare double @js_dayjs_now() +declare double @js_dayjs_parse(i64) +declare double @js_dayjs_second(i64) +declare double @js_dayjs_start_of(i64, i64) +declare double @js_dayjs_subtract(i64, double, i64) +declare i64 @js_dayjs_to_iso_string(i64) +declare double @js_dayjs_unix(i64) +declare double @js_dayjs_value_of(i64) +declare double @js_dayjs_year(i64) +declare double @js_moment_add(i64, double, i64) +declare double @js_moment_clone(i64) +declare double @js_moment_date(i64) +declare double @js_moment_day(i64) +declare double @js_moment_diff(i64, i64, i64) +declare double @js_moment_end_of(i64, i64) +declare double @js_moment_factory(i64) +declare i64 @js_moment_format(i64, i64) +declare i64 @js_moment_from_now(i64) +declare double @js_moment_from_timestamp(double) +declare double @js_moment_hour(i64) +declare double @js_moment_is_after(i64, i64) +declare double @js_moment_is_before(i64, i64) +declare double @js_moment_is_between(i64, i64, i64) +declare double @js_moment_is_same(i64, i64, i64) +declare double @js_moment_is_valid(i64) +declare double @js_moment_millisecond(i64) +declare double @js_moment_minute(i64) +declare double @js_moment_month(i64) +declare double @js_moment_now() +declare double @js_moment_parse(i64) +declare double @js_moment_second(i64) +declare double @js_moment_start_of(i64, i64) +declare double @js_moment_subtract(i64, double, i64) +declare double @js_moment_to_date(i64) +declare i64 @js_moment_to_iso_string(i64) +declare double @js_moment_unix(i64) +declare double @js_moment_value_of(i64) +declare double @js_moment_year(i64) +declare i64 @js_decimal_abs(i64) +declare i64 @js_decimal_ceil(i64) +declare double @js_decimal_cmp(i64, i64) +declare double @js_decimal_cmp_value(i64, double) +declare i64 @js_decimal_coerce_to_handle(double) +declare i64 @js_decimal_div(i64, i64) +declare i64 @js_decimal_div_number(i64, double) +declare i64 @js_decimal_div_value(i64, double) +declare double @js_decimal_eq(i64, i64) +declare double @js_decimal_eq_value(i64, double) +declare i64 @js_decimal_floor(i64) +declare i64 @js_decimal_from_number(double) +declare i64 @js_decimal_from_string(i64) +declare double @js_decimal_gt(i64, i64) +declare double @js_decimal_gt_value(i64, double) +declare double @js_decimal_gte(i64, i64) +declare double @js_decimal_gte_value(i64, double) +declare double @js_decimal_is_negative(i64) +declare double @js_decimal_is_positive(i64) +declare double @js_decimal_is_zero(i64) +declare double @js_decimal_lt(i64, i64) +declare double @js_decimal_lt_value(i64, double) +declare double @js_decimal_lte(i64, i64) +declare double @js_decimal_lte_value(i64, double) +declare i64 @js_decimal_minus(i64, i64) +declare i64 @js_decimal_minus_number(i64, double) +declare i64 @js_decimal_minus_value(i64, double) +declare i64 @js_decimal_mod(i64, i64) +declare i64 @js_decimal_mod_value(i64, double) +declare i64 @js_decimal_neg(i64) +declare i64 @js_decimal_plus(i64, i64) +declare i64 @js_decimal_plus_number(i64, double) +declare i64 @js_decimal_plus_value(i64, double) +declare i64 @js_decimal_pow(i64, double) +declare i64 @js_decimal_round(i64) +declare i64 @js_decimal_sqrt(i64) +declare i64 @js_decimal_times(i64, i64) +declare i64 @js_decimal_times_number(i64, double) +declare i64 @js_decimal_times_value(i64, double) +declare i64 @js_decimal_to_fixed(i64, double) +declare double @js_decimal_to_number(i64) +declare i64 @js_decimal_to_string(i64) +declare i64 @js_ethers_format_ether(i64) +declare i64 @js_ethers_format_units(i64, double) +declare i64 @js_ethers_get_address(i64) +declare i64 @js_ethers_parse_ether(i64) +declare i64 @js_ethers_parse_units(i64, double) +declare i64 @js_lodash_camel_case(i64) +declare i64 @js_lodash_capitalize(i64) +declare i64 @js_lodash_chunk(i64, double) +declare double @js_lodash_clamp(double, double, double) +declare i64 @js_lodash_compact(i64) +declare i64 @js_lodash_concat(i64, i64) +declare i64 @js_lodash_difference(i64, i64) +declare i64 @js_lodash_drop(i64, double) +declare i64 @js_lodash_drop_right(i64, double) +declare double @js_lodash_ends_with(i64, i64) +declare i64 @js_lodash_escape(i64) +declare double @js_lodash_first(i64) +declare i64 @js_lodash_flatten(i64) +declare double @js_lodash_in_range(double, double, double) +declare double @js_lodash_includes(i64, i64) +declare i64 @js_lodash_initial(i64) +declare i64 @js_lodash_kebab_case(i64) +declare double @js_lodash_last(i64) +declare i64 @js_lodash_lower_case(i64) +declare i64 @js_lodash_lower_first(i64) +declare double @js_lodash_max(i64) +declare double @js_lodash_max_by(i64, double) +declare double @js_lodash_mean(i64) +declare double @js_lodash_mean_by(i64, double) +declare double @js_lodash_min(i64) +declare double @js_lodash_min_by(i64, double) +declare i64 @js_lodash_pad(i64, double) +declare i64 @js_lodash_pad_end(i64, double) +declare i64 @js_lodash_pad_start(i64, double) +declare double @js_lodash_random(double, double) +declare i64 @js_lodash_repeat(i64, double) +declare i64 @js_lodash_replace(i64, i64, i64) +declare i64 @js_lodash_reverse(i64) +declare double @js_lodash_size(i64) +declare i64 @js_lodash_snake_case(i64) +declare i64 @js_lodash_split(i64, i64) +declare i64 @js_lodash_start_case(i64) +declare double @js_lodash_starts_with(i64, i64) +declare double @js_lodash_sum(i64) +declare double @js_lodash_sum_by(i64, double) +declare i64 @js_lodash_tail(i64) +declare i64 @js_lodash_take(i64, double) +declare i64 @js_lodash_take_right(i64, double) +declare i64 @js_lodash_trim(i64) +declare i64 @js_lodash_trim_end(i64) +declare i64 @js_lodash_trim_start(i64) +declare i64 @js_lodash_truncate(i64, double) +declare i64 @js_lodash_unescape(i64) +declare i64 @js_lodash_uniq(i64) +declare i64 @js_lodash_upper_case(i64) +declare i64 @js_lodash_upper_first(i64) +declare void @js_lru_cache_clear(i64) +declare double @js_lru_cache_delete(i64, double) +declare double @js_lru_cache_get(i64, double) +declare double @js_lru_cache_has(i64, double) +declare i64 @js_lru_cache_new(double) +declare double @js_lru_cache_peek(i64, double) +declare i64 @js_lru_cache_set(i64, double, double) +declare double @js_lru_cache_size(i64) +declare double @js_event_emitter_subclass_init(double) +declare double @js_array_subclass_init(double, double) +declare double @js_map_set_subclass_init(double, i32, double) +declare double @js_promise_subclass_init(double, double) +declare double @js_node_stream_readable_new(double) +declare double @js_node_stream_readable_subclass_init(double, double) +declare double @js_node_stream_writable_new(double) +declare double @js_node_stream_writable_subclass_init(double, double) +declare double @js_node_stream_duplex_new(double) +declare double @js_node_stream_duplex_subclass_init(double, double) +declare double @js_node_stream_transform_new(double) +declare double @js_node_stream_transform_subclass_init(double, double) +declare double @js_node_stream_passthrough_new(double) +declare double @js_node_stream_readable_from(double) +declare double @js_node_stream_readable_from_options(double, double) +declare double @js_node_stream_duplex_from_options(double, double) +declare double @js_node_stream_is_disturbed(double) +declare double @js_node_stream_is_errored(double) +declare double @js_node_stream_is_readable(double) +declare double @js_node_stream_is_writable(double) +declare double @js_node_stream_is_array_buffer_view(double) +declare double @js_node_stream_is_uint8_array(double) +declare double @js_node_stream_is_destroyed(double) +declare double @js_node_stream_uint8_array_to_buffer(double) +declare double @js_node_stream_get_default_hwm(double) +declare double @js_node_stream_set_default_hwm(double, double) +declare double @js_node_stream_add_abort_signal(double, double) +declare double @js_node_stream_compose(i64) +declare double @js_node_stream_pipeline(i64) +declare double @js_node_stream_finished(i64) +declare double @js_node_stream_duplex_pair(double) +declare double @js_node_stream_readable_to_web(double) +declare double @js_node_stream_writable_to_web(double) +declare double @js_node_stream_duplex_to_web(double) +declare double @js_node_stream_readable_from_web(double, double) +declare double @js_node_stream_writable_from_web(double, double) +declare double @js_node_stream_duplex_from_web(double, double) +declare double @js_node_stream_to_web(double) +declare double @js_node_stream_from_web(double) +declare double @js_node_stream_method_readable_aborted(i64) +declare double @js_node_stream_method_closed(i64) +declare double @js_node_stream_method_errored(i64) +declare double @js_node_stream_method_readable_did_read(i64) +declare double @js_node_stream_method_destroyed(i64) +declare double @js_node_stream_method_destroy(i64, double) +declare double @js_node_stream_method_pause(i64) +declare double @js_node_stream_method_readable(i64) +declare double @js_node_stream_method_readable_length(i64) +declare double @js_node_stream_method_readable_flowing(i64) +declare double @js_node_stream_method_readable_ended(i64) +declare double @js_node_stream_method_readable_object_mode(i64) +declare double @js_node_stream_method_pipe(i64, double, double) +declare double @js_node_stream_method_unpipe(i64, double) +declare double @js_node_stream_method_is_paused(i64) +declare double @js_node_stream_method_resume(i64) +declare double @js_node_stream_method_readable_encoding(i64) +declare double @js_node_stream_method_cork(i64) +declare double @js_node_stream_method_uncork(i64) +declare double @js_node_stream_method_writable_corked(i64) +declare double @js_node_stream_method_writable_length(i64) +declare double @js_node_stream_method_writable_need_drain(i64) +declare double @js_node_stream_method_writable(i64) +declare double @js_node_stream_method_writable_ended(i64) +declare double @js_node_stream_method_writable_finished(i64) +declare double @js_node_stream_method_allow_half_open(i64) +declare double @js_node_stream_method_set_encoding(i64, double) +declare double @js_node_stream_method_writable_object_mode(i64) +declare double @js_event_emitter_emit(i64, i64, i64) +declare double @js_event_emitter_emit0(i64, i64) +declare double @js_event_emitter_listener_count(i64, i64, i64) +declare i64 @js_event_emitter_new() +declare i64 @js_event_emitter_new_with_options(double) +declare i64 @js_event_emitter_on(i64, i64, i64) +declare i64 @js_event_emitter_once(i64, i64, i64) +declare i64 @js_event_emitter_prepend_listener(i64, i64, i64) +declare i64 @js_event_emitter_prepend_once_listener(i64, i64, i64) +declare i64 @js_event_emitter_remove_all_listeners(i64, i64) +declare i64 @js_event_emitter_remove_listener(i64, i64, i64) +declare i64 @js_event_emitter_set_max_listeners(i64, double) +declare double @js_event_emitter_get_max_listeners(i64) +declare i64 @js_event_emitter_event_names(i64) +declare i64 @js_event_emitter_listeners(i64, i64) +declare i64 @js_event_emitter_raw_listeners(i64, i64) +declare double @js_event_emitter_domain_value(i64) +declare i64 @js_event_emitter_async_resource_new(double) +declare double @js_event_emitter_async_resource_call(double) +declare double @js_event_emitter_async_resource_async_id(i64) +declare double @js_event_emitter_async_resource_trigger_async_id(i64) +declare double @js_event_emitter_async_resource_async_resource(i64) +declare double @js_event_emitter_async_resource_emit_destroy(i64) +declare i64 @js_events_once(double, i64, double) +declare i64 @js_events_on(double, i64, double) +declare i64 @js_events_add_abort_listener(double, double) +declare i64 @js_events_get_event_listeners(double, i64) +declare double @js_events_listener_count(double, i64) +declare double @js_events_get_max_listeners(double) +declare double @js_events_set_max_listeners(double, i64) +declare double @js_events_init() +declare i64 @js_domain_create() +declare i64 @js_domain_on(i64, i64, i64) +declare double @js_domain_emit(i64, i64, i64) +declare double @js_domain_run(i64, double, i64) +declare double @js_domain_bind(i64, double) +declare double @js_domain_intercept(i64, double) +declare i64 @js_domain_add(i64, double) +declare i64 @js_domain_remove(i64, double) +declare double @js_domain_enter(i64) +declare double @js_domain_exit(i64) +declare i64 @js_string_decoder_new(i64) +declare double @js_string_decoder_write(i64, double) +declare double @js_string_decoder_end(i64, double) +declare double @js_querystring_escape(double) +declare double @js_querystring_unescape(double) +declare i64 @js_querystring_unescape_buffer(double, double) +declare i64 @js_querystring_parse(double, double, double, double) +declare double @js_querystring_stringify(double, double, double, double) +declare i32 @js_fastify_add_hook(i64, i64, i64) +declare i32 @js_fastify_all(i64, i64, i64) +declare i64 @js_fastify_create() +declare i64 @js_fastify_create_with_opts(double) +declare double @js_fastify_ctx_html(i64, i64, double) +declare double @js_fastify_ctx_json(i64, double, double) +declare double @js_fastify_ctx_redirect(i64, i64, double) +declare double @js_fastify_ctx_text(i64, i64, double) +declare i32 @js_fastify_delete(i64, i64, i64) +declare i32 @js_fastify_get(i64, i64, i64) +declare i32 @js_fastify_head(i64, i64, i64) +declare void @js_fastify_listen(i64, double, i64) +declare void @js_fastify_app_close(i64) +declare i64 @js_fastify_app_server(i64) +declare void @js_fastify_app_on(i64, i64, i64) +declare i32 @js_fastify_options(i64, i64, i64) +declare i32 @js_fastify_patch(i64, i64, i64) +declare i32 @js_fastify_post(i64, i64, i64) +declare i32 @js_fastify_put(i64, i64, i64) +declare i32 @js_fastify_register(i64, i64, double) +declare i64 @js_fastify_reply_header(i64, i64, i64) +declare i32 @js_fastify_reply_send(i64, double) +declare i64 @js_fastify_reply_status(i64, double) +declare i64 @js_fastify_reply_type(i64, i64) +declare i64 @js_fastify_req_body(i64) +declare double @js_fastify_req_get_user_data(i64) +declare i64 @js_fastify_req_header(i64, i64) +declare i64 @js_fastify_req_headers(i64) +declare double @js_fastify_req_json(i64) +declare i64 @js_fastify_req_method(i64) +declare i64 @js_fastify_req_param(i64, i64) +declare i64 @js_fastify_req_params(i64) +declare i64 @js_fastify_req_query(i64) +declare double @js_fastify_req_query_object(i64) +declare void @js_fastify_req_set_user_data(i64, double) +declare i64 @js_fastify_req_url(i64) +declare i32 @js_fastify_route(i64, i64, i64, i64) +declare i32 @js_fastify_set_error_handler(i64, i64) +declare double @js_nodemailer_create_transport(i64) +declare i64 @js_nodemailer_send_mail(i64, i64) +declare i64 @js_nodemailer_verify(i64) +declare i64 @js_ratelimit_block(i64, i64, double) +declare i64 @js_ratelimit_consume(i64, i64, double) +declare i64 @js_ratelimit_create(i64) +declare i64 @js_ratelimit_delete(i64, i64) +declare i64 @js_ratelimit_get(i64, i64) +declare i64 @js_ratelimit_new_from_options(i64) +declare i64 @js_ratelimit_penalty(i64, i64, double) +declare i64 @js_ratelimit_reward(i64, i64, double) +declare double @js_validator_contains(i64, i64) +declare double @js_validator_equals(i64, i64) +declare double @js_validator_is_alpha(i64) +declare double @js_validator_is_alphanumeric(i64) +declare double @js_validator_is_email(i64) +declare double @js_validator_is_empty(i64) +declare double @js_validator_is_float(i64) +declare double @js_validator_is_hexadecimal(i64) +declare double @js_validator_is_int(i64) +declare double @js_validator_is_json(i64) +declare double @js_validator_is_length(i64, double, double) +declare double @js_validator_is_lowercase(i64) +declare double @js_validator_is_numeric(i64) +declare double @js_validator_is_uppercase(i64) +declare double @js_validator_is_url(i64) +declare double @js_validator_is_uuid(i64) +declare i64 @js_date_to_locale_string(double) +declare i64 @js_number_to_locale_string(double) +declare double @js_value_to_locale_string(double) +declare i64 @js_string_split_regex(i64, i64) +declare i32 @js_object_delete_dynamic(i64, double) +declare double @js_object_get_prototype_of(double) +declare double @js_object_set_prototype_of(double, double) +declare double @js_object_define_properties(double, double) +declare double @js_math_acos(double) +declare double @js_math_asin(double) +declare double @js_math_atan(double) +declare double @js_math_atan2(double, double) +declare double @js_math_cos(double) +declare double @js_math_expm1(double) +declare double @js_math_log(double) +declare double @js_math_log10(double) +declare double @js_math_log1p(double) +declare double @js_math_log2(double) +declare double @js_math_sin(double) +declare double @js_math_tan(double) +declare double @js_atomics_load(ptr, double, double) +declare double @js_atomics_is_lock_free(ptr, double) +declare double @js_atomics_store(ptr, double, double, double) +declare double @js_atomics_add(ptr, double, double, double) +declare double @js_atomics_sub(ptr, double, double, double) +declare double @js_atomics_and(ptr, double, double, double) +declare double @js_atomics_or(ptr, double, double, double) +declare double @js_atomics_xor(ptr, double, double, double) +declare double @js_atomics_exchange(ptr, double, double, double) +declare double @js_atomics_compare_exchange(ptr, double, double, double, double) +declare double @js_atomics_notify(ptr, double, double, double) +declare double @js_atomics_wait(ptr, double, double, double, double) +declare double @js_atomics_wait_async(ptr, double, double, double, double) +declare double @js_number_is_finite(double) +declare double @js_json_get_bool(i64, i64) +declare double @js_json_get_number(i64, i64) +declare i64 @js_json_get_string(i64, i64) +declare double @js_json_is_valid(i64) +declare i64 @js_json_stringify_bool(double) +declare i64 @js_json_stringify_null() +declare i64 @js_json_stringify_number(double) +declare i64 @js_json_stringify_string(i64) +declare void @js_set_property(double, i64, i64, double) +declare i64 @js_error_get_message(i64) +declare double @js_await_js_promise(double) +declare i64 @js_text_decoder_decode(i64) +declare i64 @js_text_encoder_encode(double) +declare double @js_call_function(i64, i64, i64, i64, i64) +declare double @js_call_method(double, i64, i64, i64, i64) +declare double @js_call_value(double, i64, i64) +declare double @js_closure_call_array(i64, ptr, i64) +declare double @js_closure_call_apply_with_spread(double, ptr, i64, i64) +declare double @js_create_callback(i64, i64, i64) +declare double @js_dynamic_neg(double) +declare i32 @js_dynamic_string_equals(double, double) +declare double @js_is_nan(double) +declare i32 @js_jsvalue_compare(double, double) +declare i32 @js_jsvalue_loose_equals(double, double) +declare void @js_gc_collect() +declare void @js_console_assert(double, i64) +declare void @js_console_assert_spread(double, i64) +declare void @js_console_group(i64) +declare double @js_console_context(double) +declare double @js_console_create_task(double) +declare i64 @js_fetch_get(i64) +declare i64 @js_fetch_get_with_auth(i64, i64) +declare i64 @js_fetch_post(i64, i64, i64) +declare i64 @js_fetch_post_with_auth(i64, i64, i64) +declare double @js_fetch_stream_close(double) +declare i64 @js_fetch_stream_poll(double) +declare double @js_fetch_stream_start(i64, i64, i64, i64) +declare double @js_fetch_stream_status(double) +declare i64 @js_fetch_text(i64) +declare i64 @js_fetch_with_options(i64, i64, i64, i64) +declare void @js_fetch_set_pending_signal(double) +declare i64 @js_fetch_headers_to_json(double) +declare double @js_net_create_connection(i32, i64, i64) +declare i64 @js_net_create_server(i64, i64) +declare double @js_net_normalize_args(double) +declare double @js_net_create_server_handle_stub(double, double, double, double, double) +declare void @js_net_validate_create_server_options(double) +declare i64 @js_net_socket_set_timeout(i64, double, i64) +declare void @js_net_server_listen(i64, double, double, double) +declare void @js_net_server_close(i64, i64) +declare i64 @js_net_server_address(i64) +declare void @js_net_server_on(i64, i64, i64) +declare double @js_net_server_get_listening(i64) +declare double @js_net_server_get_connections(i64) +declare double @js_net_server_get_max_connections(i64) +declare double @js_net_server_set_max_connections(i64, double) +declare double @js_net_server_get_drop_max_connection(i64) +declare double @js_net_server_set_drop_max_connection(i64, double) +declare i64 @js_net_block_list_new() +declare double @js_net_block_list_is_block_list(double) +declare double @js_net_block_list_add_address(i64, i64, i64) +declare double @js_net_block_list_add_range(i64, i64, i64, i64) +declare double @js_net_block_list_add_subnet(i64, i64, double, i64) +declare double @js_net_block_list_check(i64, i64, i64) +declare double @js_net_block_list_to_json(i64) +declare i64 @js_net_block_list_rules(i64) +declare double @js_net_block_list_from_json(i64, double) +declare i64 @js_net_socket_address_new(double) +declare double @js_net_socket_address_parse(i64) +declare i64 @js_net_socket_address_get_address(i64) +declare i64 @js_net_socket_address_get_family(i64) +declare double @js_net_socket_address_get_port(i64) +declare double @js_net_socket_address_get_flowlabel(i64) +declare double @js_net_socket_get_type_of_service(i64) +declare i64 @js_net_socket_set_type_of_service(i64, double) +declare i64 @js_net_socket_address(i64) +declare i64 @js_net_socket_once(i64, i64, i64) +declare i64 @js_net_socket_remove_listener(i64, i64, i64) +declare i64 @js_net_socket_remove_all_listeners(i64, i64) +declare double @js_net_socket_listener_count(i64, i64) +declare i64 @js_net_socket_event_names(i64) +declare i64 @js_net_socket_reset_and_destroy(i64) +declare i64 @js_net_server_once(i64, i64, i64) +declare i64 @js_net_server_remove_listener(i64, i64, i64) +declare i64 @js_net_server_remove_all_listeners(i64, i64) +declare double @js_net_server_listener_count(i64, i64) +declare i64 @js_net_server_event_names(i64) +declare double @js_performance_now() +declare double @js_perf_mark(double, double) +declare double @js_perf_measure(double, double, double) +declare double @js_perf_get_entries() +declare double @js_perf_get_entries_by_type(double) +declare double @js_perf_get_entries_by_name(double, double) +declare double @js_perf_clear_marks(double) +declare double @js_perf_clear_measures(double) +declare double @js_perf_event_loop_utilization(double, double) +declare double @js_perf_to_json() +declare double @js_perf_clear_resource_timings() +declare double @js_perf_set_resource_timing_buffer_size(double) +declare double @js_perf_mark_resource_timing(double, double, double, double, double, double, double, double) +declare double @js_perf_timerify(double, double) +declare double @js_perf_observer_new(double) +declare double @js_perf_observer_observe(double, double) +declare double @js_perf_observer_disconnect(double) +declare double @js_perf_observer_take_records(double) +declare double @js_perf_monitor_event_loop_delay(double) +declare double @js_perf_create_histogram(double) +declare double @js_perf_histogram_noop() +declare double @js_perf_histogram_percentile(double) +declare double @js_iter_result_set(double, i32) +declare double @js_iter_result_set_f64(double, i32) +declare double @js_iter_result_set_i32(i32, i32) +declare double @js_iter_result_set_i1(i32, i32) +declare double @js_iter_result_get_value() +declare double @js_iter_result_get_value_f64() +declare i32 @js_iter_result_get_value_i32() +declare i32 @js_iter_result_get_value_i1() +declare double @js_iter_result_get_done() +declare i64 @js_async_step_chain(double, i64) +declare i64 @js_async_step_done(double, i64) +declare i64 @js_get_current_step_closure() +declare double @js_async_first_call(double) +declare double @js_async_generator_resume(double, double, double) +declare i64 @js_slugify(i64) +declare i64 @js_slugify_strict(i64) +declare void @js_register_class_getter(i64, i64, i64, i64) +declare void @js_register_class_setter(i64, i64, i64, i64) +declare void @js_register_class_method_bind_length(i64, i64, i64, i64) +declare void @js_register_class_static_method_bind_length(i64, i64, i64, i64) +declare void @js_register_class_static_getter(i64, i64, i64, i64) +declare void @js_register_class_static_setter(i64, i64, i64, i64) +declare void @js_register_class_method(i64, i64, i64, i64, i64, i64, i64) +declare void @js_register_class_constructor(i64, i64, i64, i64) +declare void @js_register_class_constructor_flags(i64, i64, i64) +declare void @js_register_class_static_method(i64, i64, i64, i64, i64, i64) +declare double @js_class_static_method_call(double, i64, i64, ptr, i64) +declare double @js_class_method_bind(double, i64, i64) +declare double @js_class_method_bind_by_id(double, i64) +declare double @js_class_prototype_method_value(double, double) +declare double @js_implicit_this_get() +declare double @js_implicit_this_get_sloppy() +declare double @js_implicit_this_set(double) +declare double @js_static_this_resolve(double) +declare void @js_static_this_arm_classref(i32) +declare void @js_static_this_arm_value(double) +declare double @js_ctor_return_override(double, double, i32) +declare double @js_new_target_get() +declare double @js_new_target_set(double) +declare double @js_get_export(i64, i64, i64) +declare double @js_get_property(double, i64, i64) +declare i64 @js_load_module(i64, i64) +declare double @js_module_dynamic_import_apply_hooks(double) +declare double @js_native_call_method_nullsafe(double, i64, i64, i64, i64) +declare double @js_native_call_value(double, i64, i64) +declare double @js_new_from_handle(double, i64, i64) +declare double @js_new_instance(i64, i64, i64, i64, i64) +declare void @js_runtime_init() +declare double @js_object_set_symbol_method(double, double, double) +declare double @js_object_set_method_by_name(double, double, double) +declare double @js_object_define_accessor(double, double, double, double) +declare double @js_object_literal_set_computed(double, double, double) +declare double @js_object_literal_to_property_key(double) +declare double @js_object_literal_set_prototype(double, double) +declare double @js_to_primitive(double, i32) +declare void @js_register_class_has_instance(i32, i64) +declare void @js_register_class_to_string_tag(i32, i64) +declare double @js_object_to_string(double) +declare double @js_object_group_by(double, double) +declare double @js_map_group_by(double, double) +declare double @js_array_from_async(double, double, double) +declare double @js_jsx(double, double) +declare double @js_jsxs(double, double) +declare i64 @js_node_http_server_ref(i64) +declare i64 @js_node_http_server_unref(i64) +declare i64 @js_node_https_server_ref(i64) +declare i64 @js_node_https_server_unref(i64) +declare double @js_http_client_request_flush_headers(i64, double, double) +declare double @js_node_http_im_http_version_major(i64) +declare double @js_node_http_im_http_version_minor(i64) +declare i64 @js_node_http_im_pause_self(i64) +declare i64 @js_node_http_im_resume_self(i64) +declare i64 @js_commander_args_array(i64) +declare i64 @js_commander_argument(i64, i64) +declare double @__ic_decl_1() +declare double @__ic_decl_3() +declare double @__ic_decl_5() +declare double @__ic_decl_7() +declare double @__ic_decl_9() + +define double @perry_fn_test_gap_7302_invoke_eh_paths_ts__basic() alwaysinline personality ptr @perry_eh_personality { +entry.0: + %r1 = alloca i64 + %r2 = alloca ptr + store ptr null, ptr %r2 + %r3 = call ptr @js_shadow_frame_enter(i32 1) + store ptr %r3, ptr %r2 + %r4 = getelementptr inbounds i8, ptr %r3, i64 24 + %r5 = load i64, ptr %r4 + %r6 = sub i64 %r5, 1 + store i64 %r6, ptr %r1 + %r15 = alloca double + call void @js_eh_try_push() + br label %try.body.1 + +try.body.1: + %r8 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.0.handle + %r9 = invoke i64 @js_error_new_from_value(double %r8) to label %eh.cont10 unwind label %eh.lpad.4 +eh.cont10: + %r11 = or i64 %r9, 9222527611924643840 + %r12 = bitcast i64 %r11 to double + invoke void @js_throw(double %r12) to label %eh.cont13 unwind label %eh.lpad.4 +eh.cont13: + unreachable + +try.catch.2: + call void @js_try_end() + %r14 = call double @js_get_exception() + call void @js_clear_exception() + store double %r14, ptr %r15 + %r16 = load ptr, ptr %r2 + %r17 = icmp eq ptr %r16, null + br i1 %r17, label %ss.slow.5, label %ss.chk_top.6 + +try.finally.3: + %r116 = load ptr, ptr %r2 + %r117 = icmp eq ptr %r116, null + br i1 %r117, label %ss.slow.24, label %ss.chk_top.25 + +eh.lpad.4: + %r7 = landingpad { ptr, i32 } catch ptr null + br label %try.catch.2 + +ss.slow.5: + call void @js_shadow_slot_bind(i32 0, ptr %r15) + br label %ss.done.9 + +ss.chk_top.6: + %r18 = getelementptr inbounds i8, ptr %r16, i64 24 + %r19 = load i64, ptr %r18 + %r20 = icmp eq i64 %r19, -1 + br i1 %r20, label %ss.done.9, label %ss.chk_len.7 + +ss.chk_len.7: + %r21 = add i64 %r19, 0 + %r22 = getelementptr inbounds i8, ptr %r16, i64 8 + %r23 = load i64, ptr %r22 + %r24 = icmp ult i64 %r21, %r23 + br i1 %r24, label %ss.store.8, label %ss.done.9 + +ss.store.8: + %r25 = load ptr, ptr %r16 + %r26 = shl i64 %r21, 4 + %r27 = getelementptr inbounds i8, ptr %r25, i64 %r26 + %r28 = getelementptr inbounds i8, ptr %r27, i64 8 + %r29 = load i64, ptr %r15 + %r30 = ptrtoint ptr %r15 to i64 + %r31 = and i64 %r30, 1 + %r32 = icmp eq i64 %r31, 0 + %r33 = select i1 %r32, i64 %r30, i64 0 + %r34 = or i64 %r33, 1 + store i64 %r29, ptr %r27 + store i64 %r34, ptr %r28 + %r35 = load atomic i32, ptr @PERRY_INCREMENTAL_MARK_BARRIER_ACTIVE_COUNT seq_cst, align 4 + %r36 = icmp ne i32 %r35, 0 + br i1 %r36, label %ss.barrier.10, label %ss.done.9 + +ss.done.9: + %r37 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.1.handle + %r38 = load double, ptr %r15 + %r39 = bitcast double %r38 to i64 + %r40 = and i64 %r39, 281474976710655 + %r41 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.2.handle + %r42 = bitcast double %r41 to i64 + %r43 = and i64 %r42, 281474976710655 + %r44 = lshr i64 %r39, 48 + %r45 = icmp eq i64 %r44, 32761 + %r46 = icmp eq i64 %r44, 32766 + %r47 = and i64 %r44, 65533 + %r48 = icmp eq i64 %r47, 32765 + br i1 %r45, label %pget.recv_sso.11, label %pget.check_class_ref.17 + +ss.barrier.10: + call void @js_write_barrier_root_nanbox(i64 %r29) + br label %ss.done.9 + +pget.recv_sso.11: + %r112 = call double @js_object_get_field_by_name_f64(i64 %r39, i64 %r43) + br label %pget.recv_merge.15 + +pget.recv_ok.12: + call void @js_typed_feedback_observe_property_get(i64 8601651645035577344, i64 %r40, i64 %r43) + %r50 = icmp ugt i64 %r40, 1048575 + %r51 = ptrtoint ptr @perry_ic_1 to i64 + %r52 = select i1 %r50, i64 %r40, i64 %r51 + %r53 = sub i64 %r52, 8 + %r54 = inttoptr i64 %r53 to ptr + %r55 = load i8, ptr %r54 + %r56 = icmp eq i8 %r55, 2 + %r57 = and i1 %r50, %r56 + %r58 = add i64 %r52, 12 + %r59 = inttoptr i64 %r58 to ptr + %r60 = load i32, ptr %r59 + %r61 = icmp eq i32 %r60, 1129268819 + %r62 = xor i1 %r61, true + %r63 = and i1 %r57, %r62 + %r64 = inttoptr i64 %r52 to ptr + %r65 = load i32, ptr %r64 + %r66 = icmp eq i32 %r65, 1 + %r67 = and i1 %r63, %r66 + %r68 = sub i64 %r52, 6 + %r69 = inttoptr i64 %r68 to ptr + %r70 = load i16, ptr %r69 + %r71 = and i16 %r70, 2048 + %r72 = icmp eq i16 %r71, 0 + %r73 = and i1 %r67, %r72 + %r74 = add i64 %r52, 16 + %r75 = inttoptr i64 %r74 to ptr + %r76 = load i64, ptr %r75 + %r77 = add i64 %r52, 8 + %r78 = inttoptr i64 %r77 to ptr + %r79 = load i32, ptr %r78 + %r80 = add i32 %r79, -2147483648 + %r81 = icmp ult i32 %r80, 1073741824 + %r82 = zext i32 %r79 to i64 + %r83 = or i64 %r82, 4611686018427387904 + %r84 = select i1 %r81, i64 %r83, i64 %r76 + %r85 = getelementptr i64, ptr @perry_ic_1, i64 0 + %r86 = load i64, ptr %r85 + %r87 = icmp eq i64 %r84, %r86 + %r88 = icmp ne i64 %r84, 0 + %r89 = and i1 %r73, %r87 + %r90 = and i1 %r89, %r88 + br i1 %r90, label %pic.hit.18, label %pic.miss.19 + +pget.recv_bad.13: + %r107 = icmp eq i64 %r39, 9222246136947933185 + %r108 = icmp eq i64 %r39, 9222246136947933186 + %r109 = or i1 %r107, %r108 + br i1 %r109, label %pget.throw_nullish.22, label %pget.recv_undef_return.23 + +pget.recv_class_ref.14: + %r49 = call double @js_typed_feedback_object_get_field_by_name_f64(i64 8601651645035577344, i64 %r39, i64 %r43) + br label %pget.recv_merge.15 + +pget.recv_merge.15: + %r113 = phi double [ %r106, %pic.merge.20 ], [ %r111, %pget.recv_undef_return.23 ], [ %r112, %pget.recv_sso.11 ], [ %r49, %pget.recv_class_ref.14 ] + %r114 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.1.handle + %r115 = call double @js_dynamic_string_or_number_add(double %r114, double %r113) + %shadow_pop_l_0 = load i64, ptr %r1 + call void @js_shadow_frame_pop(i64 %shadow_pop_l_0) + ret double %r115 + +pget.check_ptr.16: + br i1 %r48, label %pget.recv_ok.12, label %pget.recv_bad.13 + +pget.check_class_ref.17: + br i1 %r46, label %pget.recv_class_ref.14, label %pget.check_ptr.16 + +pic.hit.18: + %r91 = getelementptr i64, ptr @perry_ic_1, i64 1 + %r92 = load i64, ptr %r91 + %r93 = add i64 %r52, 12 + %r94 = inttoptr i64 %r93 to ptr + %r95 = load i32, ptr %r94 + %r96 = zext i32 %r95 to i64 + %r97 = icmp ult i64 %r96, 4 + %r98 = select i1 %r97, i64 4, i64 %r96 + %r99 = icmp ult i64 %r92, %r98 + br i1 %r99, label %pic.hit.load.21, label %pic.miss.19 + +pic.miss.19: + call void @js_typed_feedback_record_guard_fail(i64 8601651645035577344) + call void @js_typed_feedback_record_fallback_call(i64 8601651645035577344) + %r105 = call double @js_object_get_field_ic_miss(i64 %r40, i64 %r43, ptr @perry_ic_1) + br label %pic.merge.20 + +pic.merge.20: + %r106 = phi double [ %r104, %pic.hit.load.21 ], [ %r105, %pic.miss.19 ] + br label %pget.recv_merge.15 + +pic.hit.load.21: + call void @js_typed_feedback_record_guard_pass(i64 8601651645035577344) + %r100 = shl i64 %r92, 3 + %r101 = add i64 %r40, 32 + %r102 = add i64 %r101, %r100 + %r103 = inttoptr i64 %r102 to ptr + %r104 = load double, ptr %r103 + br label %pic.merge.20 + +pget.throw_nullish.22: + %r110 = zext i1 %r108 to i32 + call void @js_throw_type_error_property_access(i32 %r110, ptr @test_gap_7302_invoke_eh_paths_ts_.str.2.bytes, i64 7) + unreachable + +pget.recv_undef_return.23: + %r111 = call double @js_object_get_field_by_name_f64(i64 %r39, i64 %r43) + br label %pget.recv_merge.15 + +ss.slow.24: + call void @js_shadow_slot_set(i32 0, i64 0) + br label %ss.done.28 + +ss.chk_top.25: + %r118 = getelementptr inbounds i8, ptr %r116, i64 24 + %r119 = load i64, ptr %r118 + %r120 = icmp eq i64 %r119, -1 + br i1 %r120, label %ss.done.28, label %ss.chk_len.26 + +ss.chk_len.26: + %r121 = add i64 %r119, 0 + %r122 = getelementptr inbounds i8, ptr %r116, i64 8 + %r123 = load i64, ptr %r122 + %r124 = icmp ult i64 %r121, %r123 + br i1 %r124, label %ss.store.27, label %ss.done.28 + +ss.store.27: + %r125 = load ptr, ptr %r116 + %r126 = shl i64 %r121, 4 + %r127 = getelementptr inbounds i8, ptr %r125, i64 %r126 + %r128 = getelementptr inbounds i8, ptr %r127, i64 8 + %r129 = load i64, ptr %r128 + %r130 = and i64 %r129, -2 + store i64 0, ptr %r127 + store i64 %r130, ptr %r128 + br label %ss.done.28 + +ss.done.28: + %shadow_pop_l_1 = load i64, ptr %r1 + call void @js_shadow_frame_pop(i64 %shadow_pop_l_1) + ret double 0x7FFC000000000001 +} + +define double @perry_fn_test_gap_7302_invoke_eh_paths_ts__finBoth(double %arg1) alwaysinline personality ptr @perry_eh_personality { +entry.0: + %r1 = alloca i64 + %r2 = alloca ptr + store ptr null, ptr %r2 + %r3 = call ptr @js_shadow_frame_enter(i32 1) + store ptr %r3, ptr %r2 + %r4 = getelementptr inbounds i8, ptr %r3, i64 24 + %r5 = load i64, ptr %r4 + %r6 = sub i64 %r5, 1 + store i64 %r6, ptr %r1 + %r8 = alloca double + store double 0x7FFC000000000001, ptr %r8 + %r7 = alloca double + store double %arg1, ptr %r7 + %r9 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.3.handle + store double %r9, ptr %r8 + %r10 = load ptr, ptr %r2 + %r11 = icmp eq ptr %r10, null + br i1 %r11, label %ss.slow.1, label %ss.chk_top.2 + +ss.slow.1: + call void @js_shadow_slot_bind(i32 0, ptr %r8) + br label %ss.done.5 + +ss.chk_top.2: + %r12 = getelementptr inbounds i8, ptr %r10, i64 24 + %r13 = load i64, ptr %r12 + %r14 = icmp eq i64 %r13, -1 + br i1 %r14, label %ss.done.5, label %ss.chk_len.3 + +ss.chk_len.3: + %r15 = add i64 %r13, 0 + %r16 = getelementptr inbounds i8, ptr %r10, i64 8 + %r17 = load i64, ptr %r16 + %r18 = icmp ult i64 %r15, %r17 + br i1 %r18, label %ss.store.4, label %ss.done.5 + +ss.store.4: + %r19 = load ptr, ptr %r10 + %r20 = shl i64 %r15, 4 + %r21 = getelementptr inbounds i8, ptr %r19, i64 %r20 + %r22 = getelementptr inbounds i8, ptr %r21, i64 8 + %r23 = load i64, ptr %r8 + %r24 = ptrtoint ptr %r8 to i64 + %r25 = and i64 %r24, 1 + %r26 = icmp eq i64 %r25, 0 + %r27 = select i1 %r26, i64 %r24, i64 0 + %r28 = or i64 %r27, 1 + store i64 %r23, ptr %r21 + store i64 %r28, ptr %r22 + %r29 = load atomic i32, ptr @PERRY_INCREMENTAL_MARK_BARRIER_ACTIVE_COUNT seq_cst, align 4 + %r30 = icmp ne i32 %r29, 0 + br i1 %r30, label %ss.barrier.6, label %ss.done.5 + +ss.done.5: + call void @js_eh_try_push() + br label %try.body.7 + +ss.barrier.6: + call void @js_write_barrier_root_nanbox(i64 %r23) + br label %ss.done.5 + +try.body.7: + %r32 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.4.handle + %r33 = load double, ptr %r8 + %r34 = bitcast double %r33 to i64 + %r35 = bitcast double %r32 to i64 + %r36 = lshr i64 %r34, 48 + %r37 = lshr i64 %r35, 48 + %r38 = icmp eq i64 %r36, 32767 + br i1 %r38, label %strapp.dheap.11, label %strapp.dother.14 + +try.catch.8: + call void @js_try_end() + %r159 = call double @js_get_exception() + call void @js_clear_exception() + call void @js_eh_try_push() + br label %try.catch.body.40 + +try.finally.9: + %r272 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.8.handle + %r273 = load double, ptr %r8 + %r274 = bitcast double %r273 to i64 + %r275 = bitcast double %r272 to i64 + %r276 = lshr i64 %r274, 48 + %r277 = lshr i64 %r275, 48 + %r278 = icmp eq i64 %r276, 32767 + br i1 %r278, label %strapp.dheap.69, label %strapp.dother.72 + +eh.lpad.10: + %r31 = landingpad { ptr, i32 } catch ptr null + br label %try.catch.8 + +strapp.dheap.11: + %r39 = icmp eq i64 %r37, 32767 + br i1 %r39, label %strapp.heap.12, label %strapp.rcold.13 + +strapp.heap.12: + %r40 = and i64 %r34, 281474976710655 + %r41 = and i64 %r35, 281474976710655 + %r42 = invoke i64 @js_string_append(i64 %r40, i64 %r41) to label %eh.cont43 unwind label %eh.lpad.10 +eh.cont43: + %r44 = or i64 %r42, 9223090561878065152 + %r45 = bitcast i64 %r44 to double + br label %strapp.merge.17 + +strapp.rcold.13: + %r46 = and i64 %r34, 281474976710655 + %r47 = invoke i64 @js_get_string_pointer_unified(double %r32) to label %eh.cont48 unwind label %eh.lpad.10 +eh.cont48: + %r49 = invoke i64 @js_string_append(i64 %r46, i64 %r47) to label %eh.cont50 unwind label %eh.lpad.10 +eh.cont50: + %r51 = or i64 %r49, 9223090561878065152 + %r52 = bitcast i64 %r51 to double + br label %strapp.merge.17 + +strapp.dother.14: + %r53 = icmp eq i64 %r36, 32761 + %r54 = icmp eq i64 %r37, 32767 + %r55 = icmp eq i64 %r37, 32761 + %r56 = or i1 %r54, %r55 + %r57 = and i1 %r53, %r56 + br i1 %r57, label %strapp.sso.15, label %strapp.cold.16 + +strapp.sso.15: + %r58 = invoke double @js_string_concat_box(double %r33, double %r32) to label %eh.cont59 unwind label %eh.lpad.10 +eh.cont59: + br label %strapp.merge.17 + +strapp.cold.16: + %r60 = invoke i64 @js_get_string_pointer_unified(double %r33) to label %eh.cont61 unwind label %eh.lpad.10 +eh.cont61: + %r62 = invoke i64 @js_get_string_pointer_unified(double %r32) to label %eh.cont63 unwind label %eh.lpad.10 +eh.cont63: + %r64 = invoke i64 @js_string_append(i64 %r60, i64 %r62) to label %eh.cont65 unwind label %eh.lpad.10 +eh.cont65: + %r66 = or i64 %r64, 9223090561878065152 + %r67 = bitcast i64 %r66 to double + br label %strapp.merge.17 + +strapp.merge.17: + %r68 = phi double [ %r45, %eh.cont43 ], [ %r52, %eh.cont50 ], [ %r58, %eh.cont59 ], [ %r67, %eh.cont65 ] + store double %r68, ptr %r8 + %r69 = load ptr, ptr %r2 + %r70 = icmp eq ptr %r69, null + br i1 %r70, label %ss.slow.18, label %ss.chk_top.19 + +ss.slow.18: + call void @js_shadow_slot_bind(i32 0, ptr %r8) + br label %ss.done.22 + +ss.chk_top.19: + %r71 = getelementptr inbounds i8, ptr %r69, i64 24 + %r72 = load i64, ptr %r71 + %r73 = icmp eq i64 %r72, -1 + br i1 %r73, label %ss.done.22, label %ss.chk_len.20 + +ss.chk_len.20: + %r74 = add i64 %r72, 0 + %r75 = getelementptr inbounds i8, ptr %r69, i64 8 + %r76 = load i64, ptr %r75 + %r77 = icmp ult i64 %r74, %r76 + br i1 %r77, label %ss.store.21, label %ss.done.22 + +ss.store.21: + %r78 = load ptr, ptr %r69 + %r79 = shl i64 %r74, 4 + %r80 = getelementptr inbounds i8, ptr %r78, i64 %r79 + %r81 = getelementptr inbounds i8, ptr %r80, i64 8 + %r82 = load i64, ptr %r8 + %r83 = ptrtoint ptr %r8 to i64 + %r84 = and i64 %r83, 1 + %r85 = icmp eq i64 %r84, 0 + %r86 = select i1 %r85, i64 %r83, i64 0 + %r87 = or i64 %r86, 1 + store i64 %r82, ptr %r80 + store i64 %r87, ptr %r81 + %r88 = load atomic i32, ptr @PERRY_INCREMENTAL_MARK_BARRIER_ACTIVE_COUNT seq_cst, align 4 + %r89 = icmp ne i32 %r88, 0 + br i1 %r89, label %ss.barrier.23, label %ss.done.22 + +ss.done.22: + %r91 = load double, ptr %r7 + %r92 = bitcast double %r91 to i64 + %r93 = icmp eq i64 %r92, 9222246136947933188 + br i1 %r93, label %if.then.24, label %if.else.25 + +ss.barrier.23: + invoke void @js_write_barrier_root_nanbox(i64 %r82) to label %eh.cont90 unwind label %eh.lpad.10 +eh.cont90: + br label %ss.done.22 + +if.then.24: + %r94 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.5.handle + %r95 = invoke i64 @js_error_new_from_value(double %r94) to label %eh.cont96 unwind label %eh.lpad.10 +eh.cont96: + %r97 = or i64 %r95, 9222527611924643840 + %r98 = bitcast i64 %r97 to double + invoke void @js_throw(double %r98) to label %eh.cont99 unwind label %eh.lpad.10 +eh.cont99: + unreachable + +if.else.25: + br label %if.merge.26 + +if.merge.26: + %r100 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.6.handle + %r101 = load double, ptr %r8 + %r102 = bitcast double %r101 to i64 + %r103 = bitcast double %r100 to i64 + %r104 = lshr i64 %r102, 48 + %r105 = lshr i64 %r103, 48 + %r106 = icmp eq i64 %r104, 32767 + br i1 %r106, label %strapp.dheap.27, label %strapp.dother.30 + +strapp.dheap.27: + %r107 = icmp eq i64 %r105, 32767 + br i1 %r107, label %strapp.heap.28, label %strapp.rcold.29 + +strapp.heap.28: + %r108 = and i64 %r102, 281474976710655 + %r109 = and i64 %r103, 281474976710655 + %r110 = invoke i64 @js_string_append(i64 %r108, i64 %r109) to label %eh.cont111 unwind label %eh.lpad.10 +eh.cont111: + %r112 = or i64 %r110, 9223090561878065152 + %r113 = bitcast i64 %r112 to double + br label %strapp.merge.33 + +strapp.rcold.29: + %r114 = and i64 %r102, 281474976710655 + %r115 = invoke i64 @js_get_string_pointer_unified(double %r100) to label %eh.cont116 unwind label %eh.lpad.10 +eh.cont116: + %r117 = invoke i64 @js_string_append(i64 %r114, i64 %r115) to label %eh.cont118 unwind label %eh.lpad.10 +eh.cont118: + %r119 = or i64 %r117, 9223090561878065152 + %r120 = bitcast i64 %r119 to double + br label %strapp.merge.33 + +strapp.dother.30: + %r121 = icmp eq i64 %r104, 32761 + %r122 = icmp eq i64 %r105, 32767 + %r123 = icmp eq i64 %r105, 32761 + %r124 = or i1 %r122, %r123 + %r125 = and i1 %r121, %r124 + br i1 %r125, label %strapp.sso.31, label %strapp.cold.32 + +strapp.sso.31: + %r126 = invoke double @js_string_concat_box(double %r101, double %r100) to label %eh.cont127 unwind label %eh.lpad.10 +eh.cont127: + br label %strapp.merge.33 + +strapp.cold.32: + %r128 = invoke i64 @js_get_string_pointer_unified(double %r101) to label %eh.cont129 unwind label %eh.lpad.10 +eh.cont129: + %r130 = invoke i64 @js_get_string_pointer_unified(double %r100) to label %eh.cont131 unwind label %eh.lpad.10 +eh.cont131: + %r132 = invoke i64 @js_string_append(i64 %r128, i64 %r130) to label %eh.cont133 unwind label %eh.lpad.10 +eh.cont133: + %r134 = or i64 %r132, 9223090561878065152 + %r135 = bitcast i64 %r134 to double + br label %strapp.merge.33 + +strapp.merge.33: + %r136 = phi double [ %r113, %eh.cont111 ], [ %r120, %eh.cont118 ], [ %r126, %eh.cont127 ], [ %r135, %eh.cont133 ] + store double %r136, ptr %r8 + %r137 = load ptr, ptr %r2 + %r138 = icmp eq ptr %r137, null + br i1 %r138, label %ss.slow.34, label %ss.chk_top.35 + +ss.slow.34: + call void @js_shadow_slot_bind(i32 0, ptr %r8) + br label %ss.done.38 + +ss.chk_top.35: + %r139 = getelementptr inbounds i8, ptr %r137, i64 24 + %r140 = load i64, ptr %r139 + %r141 = icmp eq i64 %r140, -1 + br i1 %r141, label %ss.done.38, label %ss.chk_len.36 + +ss.chk_len.36: + %r142 = add i64 %r140, 0 + %r143 = getelementptr inbounds i8, ptr %r137, i64 8 + %r144 = load i64, ptr %r143 + %r145 = icmp ult i64 %r142, %r144 + br i1 %r145, label %ss.store.37, label %ss.done.38 + +ss.store.37: + %r146 = load ptr, ptr %r137 + %r147 = shl i64 %r142, 4 + %r148 = getelementptr inbounds i8, ptr %r146, i64 %r147 + %r149 = getelementptr inbounds i8, ptr %r148, i64 8 + %r150 = load i64, ptr %r8 + %r151 = ptrtoint ptr %r8 to i64 + %r152 = and i64 %r151, 1 + %r153 = icmp eq i64 %r152, 0 + %r154 = select i1 %r153, i64 %r151, i64 0 + %r155 = or i64 %r154, 1 + store i64 %r150, ptr %r148 + store i64 %r155, ptr %r149 + %r156 = load atomic i32, ptr @PERRY_INCREMENTAL_MARK_BARRIER_ACTIVE_COUNT seq_cst, align 4 + %r157 = icmp ne i32 %r156, 0 + br i1 %r157, label %ss.barrier.39, label %ss.done.38 + +ss.done.38: + call void @js_try_end() + br label %try.finally.9 + +ss.barrier.39: + invoke void @js_write_barrier_root_nanbox(i64 %r150) to label %eh.cont158 unwind label %eh.lpad.10 +eh.cont158: + br label %ss.done.38 + +try.catch.body.40: + %r161 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.7.handle + %r162 = load double, ptr %r8 + %r163 = bitcast double %r162 to i64 + %r164 = bitcast double %r161 to i64 + %r165 = lshr i64 %r163, 48 + %r166 = lshr i64 %r164, 48 + %r167 = icmp eq i64 %r165, 32767 + br i1 %r167, label %strapp.dheap.43, label %strapp.dother.46 + +try.catch.fail.41: + call void @js_try_end() + %r220 = call double @js_get_exception() + %r221 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.8.handle + %r222 = load double, ptr %r8 + %r223 = bitcast double %r222 to i64 + %r224 = bitcast double %r221 to i64 + %r225 = lshr i64 %r223, 48 + %r226 = lshr i64 %r224, 48 + %r227 = icmp eq i64 %r225, 32767 + br i1 %r227, label %strapp.dheap.56, label %strapp.dother.59 + +eh.lpad.42: + %r160 = landingpad { ptr, i32 } catch ptr null + br label %try.catch.fail.41 + +strapp.dheap.43: + %r168 = icmp eq i64 %r166, 32767 + br i1 %r168, label %strapp.heap.44, label %strapp.rcold.45 + +strapp.heap.44: + %r169 = and i64 %r163, 281474976710655 + %r170 = and i64 %r164, 281474976710655 + %r171 = invoke i64 @js_string_append(i64 %r169, i64 %r170) to label %eh.cont172 unwind label %eh.lpad.42 +eh.cont172: + %r173 = or i64 %r171, 9223090561878065152 + %r174 = bitcast i64 %r173 to double + br label %strapp.merge.49 + +strapp.rcold.45: + %r175 = and i64 %r163, 281474976710655 + %r176 = invoke i64 @js_get_string_pointer_unified(double %r161) to label %eh.cont177 unwind label %eh.lpad.42 +eh.cont177: + %r178 = invoke i64 @js_string_append(i64 %r175, i64 %r176) to label %eh.cont179 unwind label %eh.lpad.42 +eh.cont179: + %r180 = or i64 %r178, 9223090561878065152 + %r181 = bitcast i64 %r180 to double + br label %strapp.merge.49 + +strapp.dother.46: + %r182 = icmp eq i64 %r165, 32761 + %r183 = icmp eq i64 %r166, 32767 + %r184 = icmp eq i64 %r166, 32761 + %r185 = or i1 %r183, %r184 + %r186 = and i1 %r182, %r185 + br i1 %r186, label %strapp.sso.47, label %strapp.cold.48 + +strapp.sso.47: + %r187 = invoke double @js_string_concat_box(double %r162, double %r161) to label %eh.cont188 unwind label %eh.lpad.42 +eh.cont188: + br label %strapp.merge.49 + +strapp.cold.48: + %r189 = invoke i64 @js_get_string_pointer_unified(double %r162) to label %eh.cont190 unwind label %eh.lpad.42 +eh.cont190: + %r191 = invoke i64 @js_get_string_pointer_unified(double %r161) to label %eh.cont192 unwind label %eh.lpad.42 +eh.cont192: + %r193 = invoke i64 @js_string_append(i64 %r189, i64 %r191) to label %eh.cont194 unwind label %eh.lpad.42 +eh.cont194: + %r195 = or i64 %r193, 9223090561878065152 + %r196 = bitcast i64 %r195 to double + br label %strapp.merge.49 + +strapp.merge.49: + %r197 = phi double [ %r174, %eh.cont172 ], [ %r181, %eh.cont179 ], [ %r187, %eh.cont188 ], [ %r196, %eh.cont194 ] + store double %r197, ptr %r8 + %r198 = load ptr, ptr %r2 + %r199 = icmp eq ptr %r198, null + br i1 %r199, label %ss.slow.50, label %ss.chk_top.51 + +ss.slow.50: + call void @js_shadow_slot_bind(i32 0, ptr %r8) + br label %ss.done.54 + +ss.chk_top.51: + %r200 = getelementptr inbounds i8, ptr %r198, i64 24 + %r201 = load i64, ptr %r200 + %r202 = icmp eq i64 %r201, -1 + br i1 %r202, label %ss.done.54, label %ss.chk_len.52 + +ss.chk_len.52: + %r203 = add i64 %r201, 0 + %r204 = getelementptr inbounds i8, ptr %r198, i64 8 + %r205 = load i64, ptr %r204 + %r206 = icmp ult i64 %r203, %r205 + br i1 %r206, label %ss.store.53, label %ss.done.54 + +ss.store.53: + %r207 = load ptr, ptr %r198 + %r208 = shl i64 %r203, 4 + %r209 = getelementptr inbounds i8, ptr %r207, i64 %r208 + %r210 = getelementptr inbounds i8, ptr %r209, i64 8 + %r211 = load i64, ptr %r8 + %r212 = ptrtoint ptr %r8 to i64 + %r213 = and i64 %r212, 1 + %r214 = icmp eq i64 %r213, 0 + %r215 = select i1 %r214, i64 %r212, i64 0 + %r216 = or i64 %r215, 1 + store i64 %r211, ptr %r209 + store i64 %r216, ptr %r210 + %r217 = load atomic i32, ptr @PERRY_INCREMENTAL_MARK_BARRIER_ACTIVE_COUNT seq_cst, align 4 + %r218 = icmp ne i32 %r217, 0 + br i1 %r218, label %ss.barrier.55, label %ss.done.54 + +ss.done.54: + call void @js_try_end() + br label %try.finally.9 + +ss.barrier.55: + invoke void @js_write_barrier_root_nanbox(i64 %r211) to label %eh.cont219 unwind label %eh.lpad.42 +eh.cont219: + br label %ss.done.54 + +strapp.dheap.56: + %r228 = icmp eq i64 %r226, 32767 + br i1 %r228, label %strapp.heap.57, label %strapp.rcold.58 + +strapp.heap.57: + %r229 = and i64 %r223, 281474976710655 + %r230 = and i64 %r224, 281474976710655 + %r231 = call i64 @js_string_append(i64 %r229, i64 %r230) + %r232 = or i64 %r231, 9223090561878065152 + %r233 = bitcast i64 %r232 to double + br label %strapp.merge.62 + +strapp.rcold.58: + %r234 = and i64 %r223, 281474976710655 + %r235 = call i64 @js_get_string_pointer_unified(double %r221) + %r236 = call i64 @js_string_append(i64 %r234, i64 %r235) + %r237 = or i64 %r236, 9223090561878065152 + %r238 = bitcast i64 %r237 to double + br label %strapp.merge.62 + +strapp.dother.59: + %r239 = icmp eq i64 %r225, 32761 + %r240 = icmp eq i64 %r226, 32767 + %r241 = icmp eq i64 %r226, 32761 + %r242 = or i1 %r240, %r241 + %r243 = and i1 %r239, %r242 + br i1 %r243, label %strapp.sso.60, label %strapp.cold.61 + +strapp.sso.60: + %r244 = call double @js_string_concat_box(double %r222, double %r221) + br label %strapp.merge.62 + +strapp.cold.61: + %r245 = call i64 @js_get_string_pointer_unified(double %r222) + %r246 = call i64 @js_get_string_pointer_unified(double %r221) + %r247 = call i64 @js_string_append(i64 %r245, i64 %r246) + %r248 = or i64 %r247, 9223090561878065152 + %r249 = bitcast i64 %r248 to double + br label %strapp.merge.62 + +strapp.merge.62: + %r250 = phi double [ %r233, %strapp.heap.57 ], [ %r238, %strapp.rcold.58 ], [ %r244, %strapp.sso.60 ], [ %r249, %strapp.cold.61 ] + store double %r250, ptr %r8 + %r251 = load ptr, ptr %r2 + %r252 = icmp eq ptr %r251, null + br i1 %r252, label %ss.slow.63, label %ss.chk_top.64 + +ss.slow.63: + call void @js_shadow_slot_bind(i32 0, ptr %r8) + br label %ss.done.67 + +ss.chk_top.64: + %r253 = getelementptr inbounds i8, ptr %r251, i64 24 + %r254 = load i64, ptr %r253 + %r255 = icmp eq i64 %r254, -1 + br i1 %r255, label %ss.done.67, label %ss.chk_len.65 + +ss.chk_len.65: + %r256 = add i64 %r254, 0 + %r257 = getelementptr inbounds i8, ptr %r251, i64 8 + %r258 = load i64, ptr %r257 + %r259 = icmp ult i64 %r256, %r258 + br i1 %r259, label %ss.store.66, label %ss.done.67 + +ss.store.66: + %r260 = load ptr, ptr %r251 + %r261 = shl i64 %r256, 4 + %r262 = getelementptr inbounds i8, ptr %r260, i64 %r261 + %r263 = getelementptr inbounds i8, ptr %r262, i64 8 + %r264 = load i64, ptr %r8 + %r265 = ptrtoint ptr %r8 to i64 + %r266 = and i64 %r265, 1 + %r267 = icmp eq i64 %r266, 0 + %r268 = select i1 %r267, i64 %r265, i64 0 + %r269 = or i64 %r268, 1 + store i64 %r264, ptr %r262 + store i64 %r269, ptr %r263 + %r270 = load atomic i32, ptr @PERRY_INCREMENTAL_MARK_BARRIER_ACTIVE_COUNT seq_cst, align 4 + %r271 = icmp ne i32 %r270, 0 + br i1 %r271, label %ss.barrier.68, label %ss.done.67 + +ss.done.67: + call void @js_throw(double %r220) + unreachable + +ss.barrier.68: + call void @js_write_barrier_root_nanbox(i64 %r264) + br label %ss.done.67 + +strapp.dheap.69: + %r279 = icmp eq i64 %r277, 32767 + br i1 %r279, label %strapp.heap.70, label %strapp.rcold.71 + +strapp.heap.70: + %r280 = and i64 %r274, 281474976710655 + %r281 = and i64 %r275, 281474976710655 + %r282 = call i64 @js_string_append(i64 %r280, i64 %r281) + %r283 = or i64 %r282, 9223090561878065152 + %r284 = bitcast i64 %r283 to double + br label %strapp.merge.75 + +strapp.rcold.71: + %r285 = and i64 %r274, 281474976710655 + %r286 = call i64 @js_get_string_pointer_unified(double %r272) + %r287 = call i64 @js_string_append(i64 %r285, i64 %r286) + %r288 = or i64 %r287, 9223090561878065152 + %r289 = bitcast i64 %r288 to double + br label %strapp.merge.75 + +strapp.dother.72: + %r290 = icmp eq i64 %r276, 32761 + %r291 = icmp eq i64 %r277, 32767 + %r292 = icmp eq i64 %r277, 32761 + %r293 = or i1 %r291, %r292 + %r294 = and i1 %r290, %r293 + br i1 %r294, label %strapp.sso.73, label %strapp.cold.74 + +strapp.sso.73: + %r295 = call double @js_string_concat_box(double %r273, double %r272) + br label %strapp.merge.75 + +strapp.cold.74: + %r296 = call i64 @js_get_string_pointer_unified(double %r273) + %r297 = call i64 @js_get_string_pointer_unified(double %r272) + %r298 = call i64 @js_string_append(i64 %r296, i64 %r297) + %r299 = or i64 %r298, 9223090561878065152 + %r300 = bitcast i64 %r299 to double + br label %strapp.merge.75 + +strapp.merge.75: + %r301 = phi double [ %r284, %strapp.heap.70 ], [ %r289, %strapp.rcold.71 ], [ %r295, %strapp.sso.73 ], [ %r300, %strapp.cold.74 ] + store double %r301, ptr %r8 + %r302 = load ptr, ptr %r2 + %r303 = icmp eq ptr %r302, null + br i1 %r303, label %ss.slow.76, label %ss.chk_top.77 + +ss.slow.76: + call void @js_shadow_slot_bind(i32 0, ptr %r8) + br label %ss.done.80 + +ss.chk_top.77: + %r304 = getelementptr inbounds i8, ptr %r302, i64 24 + %r305 = load i64, ptr %r304 + %r306 = icmp eq i64 %r305, -1 + br i1 %r306, label %ss.done.80, label %ss.chk_len.78 + +ss.chk_len.78: + %r307 = add i64 %r305, 0 + %r308 = getelementptr inbounds i8, ptr %r302, i64 8 + %r309 = load i64, ptr %r308 + %r310 = icmp ult i64 %r307, %r309 + br i1 %r310, label %ss.store.79, label %ss.done.80 + +ss.store.79: + %r311 = load ptr, ptr %r302 + %r312 = shl i64 %r307, 4 + %r313 = getelementptr inbounds i8, ptr %r311, i64 %r312 + %r314 = getelementptr inbounds i8, ptr %r313, i64 8 + %r315 = load i64, ptr %r8 + %r316 = ptrtoint ptr %r8 to i64 + %r317 = and i64 %r316, 1 + %r318 = icmp eq i64 %r317, 0 + %r319 = select i1 %r318, i64 %r316, i64 0 + %r320 = or i64 %r319, 1 + store i64 %r315, ptr %r313 + store i64 %r320, ptr %r314 + %r321 = load atomic i32, ptr @PERRY_INCREMENTAL_MARK_BARRIER_ACTIVE_COUNT seq_cst, align 4 + %r322 = icmp ne i32 %r321, 0 + br i1 %r322, label %ss.barrier.81, label %ss.done.80 + +ss.done.80: + %r323 = load double, ptr %r8 + %shadow_pop_l_0 = load i64, ptr %r1 + call void @js_shadow_frame_pop(i64 %shadow_pop_l_0) + ret double %r323 + +ss.barrier.81: + call void @js_write_barrier_root_nanbox(i64 %r315) + br label %ss.done.80 +} + +define double @perry_fn_test_gap_7302_invoke_eh_paths_ts__nestedRethrow() alwaysinline personality ptr @perry_eh_personality { +entry.0: + %r1 = alloca i64 + %r2 = alloca ptr + store ptr null, ptr %r2 + %r3 = call ptr @js_shadow_frame_enter(i32 2) + store ptr %r3, ptr %r2 + %r4 = getelementptr inbounds i8, ptr %r3, i64 24 + %r5 = load i64, ptr %r4 + %r6 = sub i64 %r5, 1 + store i64 %r6, ptr %r1 + %r16 = alloca double + %r134 = alloca double + call void @js_eh_try_push() + br label %try.body.1 + +try.body.1: + call void @js_eh_try_push() + br label %try.body.5 + +try.catch.2: + call void @js_try_end() + %r133 = call double @js_get_exception() + call void @js_clear_exception() + store double %r133, ptr %r134 + %r135 = load ptr, ptr %r2 + %r136 = icmp eq ptr %r135, null + br i1 %r136, label %ss.slow.28, label %ss.chk_top.29 + +try.finally.3: + %r232 = load ptr, ptr %r2 + %r233 = icmp eq ptr %r232, null + br i1 %r233, label %ss.slow.47, label %ss.chk_top.48 + +eh.lpad.4: + %r7 = landingpad { ptr, i32 } catch ptr null + br label %try.catch.2 + +try.body.5: + %r9 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.9.handle + %r10 = invoke i64 @js_error_new_from_value(double %r9) to label %eh.cont11 unwind label %eh.lpad.8 +eh.cont11: + %r12 = or i64 %r10, 9222527611924643840 + %r13 = bitcast i64 %r12 to double + invoke void @js_throw(double %r13) to label %eh.cont14 unwind label %eh.lpad.8 +eh.cont14: + unreachable + +try.catch.6: + call void @js_try_end() + %r15 = call double @js_get_exception() + call void @js_clear_exception() + store double %r15, ptr %r16 + %r17 = load ptr, ptr %r2 + %r18 = icmp eq ptr %r17, null + br i1 %r18, label %ss.slow.9, label %ss.chk_top.10 + +try.finally.7: + call void @js_try_end() + br label %try.finally.3 + +eh.lpad.8: + %r8 = landingpad { ptr, i32 } catch ptr null + br label %try.catch.6 + +ss.slow.9: + call void @js_shadow_slot_bind(i32 0, ptr %r16) + br label %ss.done.13 + +ss.chk_top.10: + %r19 = getelementptr inbounds i8, ptr %r17, i64 24 + %r20 = load i64, ptr %r19 + %r21 = icmp eq i64 %r20, -1 + br i1 %r21, label %ss.done.13, label %ss.chk_len.11 + +ss.chk_len.11: + %r22 = add i64 %r20, 0 + %r23 = getelementptr inbounds i8, ptr %r17, i64 8 + %r24 = load i64, ptr %r23 + %r25 = icmp ult i64 %r22, %r24 + br i1 %r25, label %ss.store.12, label %ss.done.13 + +ss.store.12: + %r26 = load ptr, ptr %r17 + %r27 = shl i64 %r22, 4 + %r28 = getelementptr inbounds i8, ptr %r26, i64 %r27 + %r29 = getelementptr inbounds i8, ptr %r28, i64 8 + %r30 = load i64, ptr %r16 + %r31 = ptrtoint ptr %r16 to i64 + %r32 = and i64 %r31, 1 + %r33 = icmp eq i64 %r32, 0 + %r34 = select i1 %r33, i64 %r31, i64 0 + %r35 = or i64 %r34, 1 + store i64 %r30, ptr %r28 + store i64 %r35, ptr %r29 + %r36 = load atomic i32, ptr @PERRY_INCREMENTAL_MARK_BARRIER_ACTIVE_COUNT seq_cst, align 4 + %r37 = icmp ne i32 %r36, 0 + br i1 %r37, label %ss.barrier.14, label %ss.done.13 + +ss.done.13: + %r39 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.10.handle + %r40 = load double, ptr %r16 + %r41 = bitcast double %r40 to i64 + %r42 = and i64 %r41, 281474976710655 + %r43 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.2.handle + %r44 = bitcast double %r43 to i64 + %r45 = and i64 %r44, 281474976710655 + %r46 = lshr i64 %r41, 48 + %r47 = icmp eq i64 %r46, 32761 + %r48 = icmp eq i64 %r46, 32766 + %r49 = and i64 %r46, 65533 + %r50 = icmp eq i64 %r49, 32765 + br i1 %r47, label %pget.recv_sso.15, label %pget.check_class_ref.21 + +ss.barrier.14: + invoke void @js_write_barrier_root_nanbox(i64 %r30) to label %eh.cont38 unwind label %eh.lpad.4 +eh.cont38: + br label %ss.done.13 + +pget.recv_sso.15: + %r122 = invoke double @js_object_get_field_by_name_f64(i64 %r41, i64 %r45) to label %eh.cont123 unwind label %eh.lpad.4 +eh.cont123: + br label %pget.recv_merge.19 + +pget.recv_ok.16: + invoke void @js_typed_feedback_observe_property_get(i64 8601651645035577346, i64 %r42, i64 %r45) to label %eh.cont53 unwind label %eh.lpad.4 +eh.cont53: + %r54 = icmp ugt i64 %r42, 1048575 + %r55 = ptrtoint ptr @perry_ic_3 to i64 + %r56 = select i1 %r54, i64 %r42, i64 %r55 + %r57 = sub i64 %r56, 8 + %r58 = inttoptr i64 %r57 to ptr + %r59 = load i8, ptr %r58 + %r60 = icmp eq i8 %r59, 2 + %r61 = and i1 %r54, %r60 + %r62 = add i64 %r56, 12 + %r63 = inttoptr i64 %r62 to ptr + %r64 = load i32, ptr %r63 + %r65 = icmp eq i32 %r64, 1129268819 + %r66 = xor i1 %r65, true + %r67 = and i1 %r61, %r66 + %r68 = inttoptr i64 %r56 to ptr + %r69 = load i32, ptr %r68 + %r70 = icmp eq i32 %r69, 1 + %r71 = and i1 %r67, %r70 + %r72 = sub i64 %r56, 6 + %r73 = inttoptr i64 %r72 to ptr + %r74 = load i16, ptr %r73 + %r75 = and i16 %r74, 2048 + %r76 = icmp eq i16 %r75, 0 + %r77 = and i1 %r71, %r76 + %r78 = add i64 %r56, 16 + %r79 = inttoptr i64 %r78 to ptr + %r80 = load i64, ptr %r79 + %r81 = add i64 %r56, 8 + %r82 = inttoptr i64 %r81 to ptr + %r83 = load i32, ptr %r82 + %r84 = add i32 %r83, -2147483648 + %r85 = icmp ult i32 %r84, 1073741824 + %r86 = zext i32 %r83 to i64 + %r87 = or i64 %r86, 4611686018427387904 + %r88 = select i1 %r85, i64 %r87, i64 %r80 + %r89 = getelementptr i64, ptr @perry_ic_3, i64 0 + %r90 = load i64, ptr %r89 + %r91 = icmp eq i64 %r88, %r90 + %r92 = icmp ne i64 %r88, 0 + %r93 = and i1 %r77, %r91 + %r94 = and i1 %r93, %r92 + br i1 %r94, label %pic.hit.22, label %pic.miss.23 + +pget.recv_bad.17: + %r115 = icmp eq i64 %r41, 9222246136947933185 + %r116 = icmp eq i64 %r41, 9222246136947933186 + %r117 = or i1 %r115, %r116 + br i1 %r117, label %pget.throw_nullish.26, label %pget.recv_undef_return.27 + +pget.recv_class_ref.18: + %r51 = invoke double @js_typed_feedback_object_get_field_by_name_f64(i64 8601651645035577346, i64 %r41, i64 %r45) to label %eh.cont52 unwind label %eh.lpad.4 +eh.cont52: + br label %pget.recv_merge.19 + +pget.recv_merge.19: + %r124 = phi double [ %r114, %pic.merge.24 ], [ %r120, %eh.cont121 ], [ %r122, %eh.cont123 ], [ %r51, %eh.cont52 ] + %r125 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.10.handle + %r126 = invoke double @js_dynamic_string_or_number_add(double %r125, double %r124) to label %eh.cont127 unwind label %eh.lpad.4 +eh.cont127: + %r128 = invoke i64 @js_error_new_from_value(double %r126) to label %eh.cont129 unwind label %eh.lpad.4 +eh.cont129: + %r130 = or i64 %r128, 9222527611924643840 + %r131 = bitcast i64 %r130 to double + invoke void @js_throw(double %r131) to label %eh.cont132 unwind label %eh.lpad.4 +eh.cont132: + unreachable + +pget.check_ptr.20: + br i1 %r50, label %pget.recv_ok.16, label %pget.recv_bad.17 + +pget.check_class_ref.21: + br i1 %r48, label %pget.recv_class_ref.18, label %pget.check_ptr.20 + +pic.hit.22: + %r95 = getelementptr i64, ptr @perry_ic_3, i64 1 + %r96 = load i64, ptr %r95 + %r97 = add i64 %r56, 12 + %r98 = inttoptr i64 %r97 to ptr + %r99 = load i32, ptr %r98 + %r100 = zext i32 %r99 to i64 + %r101 = icmp ult i64 %r100, 4 + %r102 = select i1 %r101, i64 4, i64 %r100 + %r103 = icmp ult i64 %r96, %r102 + br i1 %r103, label %pic.hit.load.25, label %pic.miss.23 + +pic.miss.23: + invoke void @js_typed_feedback_record_guard_fail(i64 8601651645035577346) to label %eh.cont110 unwind label %eh.lpad.4 +eh.cont110: + invoke void @js_typed_feedback_record_fallback_call(i64 8601651645035577346) to label %eh.cont111 unwind label %eh.lpad.4 +eh.cont111: + %r112 = invoke double @js_object_get_field_ic_miss(i64 %r42, i64 %r45, ptr @perry_ic_3) to label %eh.cont113 unwind label %eh.lpad.4 +eh.cont113: + br label %pic.merge.24 + +pic.merge.24: + %r114 = phi double [ %r109, %eh.cont104 ], [ %r112, %eh.cont113 ] + br label %pget.recv_merge.19 + +pic.hit.load.25: + invoke void @js_typed_feedback_record_guard_pass(i64 8601651645035577346) to label %eh.cont104 unwind label %eh.lpad.4 +eh.cont104: + %r105 = shl i64 %r96, 3 + %r106 = add i64 %r42, 32 + %r107 = add i64 %r106, %r105 + %r108 = inttoptr i64 %r107 to ptr + %r109 = load double, ptr %r108 + br label %pic.merge.24 + +pget.throw_nullish.26: + %r118 = zext i1 %r116 to i32 + invoke void @js_throw_type_error_property_access(i32 %r118, ptr @test_gap_7302_invoke_eh_paths_ts_.str.2.bytes, i64 7) to label %eh.cont119 unwind label %eh.lpad.4 +eh.cont119: + unreachable + +pget.recv_undef_return.27: + %r120 = invoke double @js_object_get_field_by_name_f64(i64 %r41, i64 %r45) to label %eh.cont121 unwind label %eh.lpad.4 +eh.cont121: + br label %pget.recv_merge.19 + +ss.slow.28: + call void @js_shadow_slot_bind(i32 1, ptr %r134) + br label %ss.done.32 + +ss.chk_top.29: + %r137 = getelementptr inbounds i8, ptr %r135, i64 24 + %r138 = load i64, ptr %r137 + %r139 = icmp eq i64 %r138, -1 + br i1 %r139, label %ss.done.32, label %ss.chk_len.30 + +ss.chk_len.30: + %r140 = add i64 %r138, 1 + %r141 = getelementptr inbounds i8, ptr %r135, i64 8 + %r142 = load i64, ptr %r141 + %r143 = icmp ult i64 %r140, %r142 + br i1 %r143, label %ss.store.31, label %ss.done.32 + +ss.store.31: + %r144 = load ptr, ptr %r135 + %r145 = shl i64 %r140, 4 + %r146 = getelementptr inbounds i8, ptr %r144, i64 %r145 + %r147 = getelementptr inbounds i8, ptr %r146, i64 8 + %r148 = load i64, ptr %r134 + %r149 = ptrtoint ptr %r134 to i64 + %r150 = and i64 %r149, 1 + %r151 = icmp eq i64 %r150, 0 + %r152 = select i1 %r151, i64 %r149, i64 0 + %r153 = or i64 %r152, 1 + store i64 %r148, ptr %r146 + store i64 %r153, ptr %r147 + %r154 = load atomic i32, ptr @PERRY_INCREMENTAL_MARK_BARRIER_ACTIVE_COUNT seq_cst, align 4 + %r155 = icmp ne i32 %r154, 0 + br i1 %r155, label %ss.barrier.33, label %ss.done.32 + +ss.done.32: + %r156 = load double, ptr %r134 + %r157 = bitcast double %r156 to i64 + %r158 = and i64 %r157, 281474976710655 + %r159 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.2.handle + %r160 = bitcast double %r159 to i64 + %r161 = and i64 %r160, 281474976710655 + %r162 = lshr i64 %r157, 48 + %r163 = icmp eq i64 %r162, 32761 + %r164 = icmp eq i64 %r162, 32766 + %r165 = and i64 %r162, 65533 + %r166 = icmp eq i64 %r165, 32765 + br i1 %r163, label %pget.recv_sso.34, label %pget.check_class_ref.40 + +ss.barrier.33: + call void @js_write_barrier_root_nanbox(i64 %r148) + br label %ss.done.32 + +pget.recv_sso.34: + %r230 = call double @js_object_get_field_by_name_f64(i64 %r157, i64 %r161) + br label %pget.recv_merge.38 + +pget.recv_ok.35: + call void @js_typed_feedback_observe_property_get(i64 8601651645035577348, i64 %r158, i64 %r161) + %r168 = icmp ugt i64 %r158, 1048575 + %r169 = ptrtoint ptr @perry_ic_5 to i64 + %r170 = select i1 %r168, i64 %r158, i64 %r169 + %r171 = sub i64 %r170, 8 + %r172 = inttoptr i64 %r171 to ptr + %r173 = load i8, ptr %r172 + %r174 = icmp eq i8 %r173, 2 + %r175 = and i1 %r168, %r174 + %r176 = add i64 %r170, 12 + %r177 = inttoptr i64 %r176 to ptr + %r178 = load i32, ptr %r177 + %r179 = icmp eq i32 %r178, 1129268819 + %r180 = xor i1 %r179, true + %r181 = and i1 %r175, %r180 + %r182 = inttoptr i64 %r170 to ptr + %r183 = load i32, ptr %r182 + %r184 = icmp eq i32 %r183, 1 + %r185 = and i1 %r181, %r184 + %r186 = sub i64 %r170, 6 + %r187 = inttoptr i64 %r186 to ptr + %r188 = load i16, ptr %r187 + %r189 = and i16 %r188, 2048 + %r190 = icmp eq i16 %r189, 0 + %r191 = and i1 %r185, %r190 + %r192 = add i64 %r170, 16 + %r193 = inttoptr i64 %r192 to ptr + %r194 = load i64, ptr %r193 + %r195 = add i64 %r170, 8 + %r196 = inttoptr i64 %r195 to ptr + %r197 = load i32, ptr %r196 + %r198 = add i32 %r197, -2147483648 + %r199 = icmp ult i32 %r198, 1073741824 + %r200 = zext i32 %r197 to i64 + %r201 = or i64 %r200, 4611686018427387904 + %r202 = select i1 %r199, i64 %r201, i64 %r194 + %r203 = getelementptr i64, ptr @perry_ic_5, i64 0 + %r204 = load i64, ptr %r203 + %r205 = icmp eq i64 %r202, %r204 + %r206 = icmp ne i64 %r202, 0 + %r207 = and i1 %r191, %r205 + %r208 = and i1 %r207, %r206 + br i1 %r208, label %pic.hit.41, label %pic.miss.42 + +pget.recv_bad.36: + %r225 = icmp eq i64 %r157, 9222246136947933185 + %r226 = icmp eq i64 %r157, 9222246136947933186 + %r227 = or i1 %r225, %r226 + br i1 %r227, label %pget.throw_nullish.45, label %pget.recv_undef_return.46 + +pget.recv_class_ref.37: + %r167 = call double @js_typed_feedback_object_get_field_by_name_f64(i64 8601651645035577348, i64 %r157, i64 %r161) + br label %pget.recv_merge.38 + +pget.recv_merge.38: + %r231 = phi double [ %r224, %pic.merge.43 ], [ %r229, %pget.recv_undef_return.46 ], [ %r230, %pget.recv_sso.34 ], [ %r167, %pget.recv_class_ref.37 ] + %shadow_pop_l_0 = load i64, ptr %r1 + call void @js_shadow_frame_pop(i64 %shadow_pop_l_0) + ret double %r231 + +pget.check_ptr.39: + br i1 %r166, label %pget.recv_ok.35, label %pget.recv_bad.36 + +pget.check_class_ref.40: + br i1 %r164, label %pget.recv_class_ref.37, label %pget.check_ptr.39 + +pic.hit.41: + %r209 = getelementptr i64, ptr @perry_ic_5, i64 1 + %r210 = load i64, ptr %r209 + %r211 = add i64 %r170, 12 + %r212 = inttoptr i64 %r211 to ptr + %r213 = load i32, ptr %r212 + %r214 = zext i32 %r213 to i64 + %r215 = icmp ult i64 %r214, 4 + %r216 = select i1 %r215, i64 4, i64 %r214 + %r217 = icmp ult i64 %r210, %r216 + br i1 %r217, label %pic.hit.load.44, label %pic.miss.42 + +pic.miss.42: + call void @js_typed_feedback_record_guard_fail(i64 8601651645035577348) + call void @js_typed_feedback_record_fallback_call(i64 8601651645035577348) + %r223 = call double @js_object_get_field_ic_miss(i64 %r158, i64 %r161, ptr @perry_ic_5) + br label %pic.merge.43 + +pic.merge.43: + %r224 = phi double [ %r222, %pic.hit.load.44 ], [ %r223, %pic.miss.42 ] + br label %pget.recv_merge.38 + +pic.hit.load.44: + call void @js_typed_feedback_record_guard_pass(i64 8601651645035577348) + %r218 = shl i64 %r210, 3 + %r219 = add i64 %r158, 32 + %r220 = add i64 %r219, %r218 + %r221 = inttoptr i64 %r220 to ptr + %r222 = load double, ptr %r221 + br label %pic.merge.43 + +pget.throw_nullish.45: + %r228 = zext i1 %r226 to i32 + call void @js_throw_type_error_property_access(i32 %r228, ptr @test_gap_7302_invoke_eh_paths_ts_.str.2.bytes, i64 7) + unreachable + +pget.recv_undef_return.46: + %r229 = call double @js_object_get_field_by_name_f64(i64 %r157, i64 %r161) + br label %pget.recv_merge.38 + +ss.slow.47: + call void @js_shadow_slot_set(i32 0, i64 0) + br label %ss.done.51 + +ss.chk_top.48: + %r234 = getelementptr inbounds i8, ptr %r232, i64 24 + %r235 = load i64, ptr %r234 + %r236 = icmp eq i64 %r235, -1 + br i1 %r236, label %ss.done.51, label %ss.chk_len.49 + +ss.chk_len.49: + %r237 = add i64 %r235, 0 + %r238 = getelementptr inbounds i8, ptr %r232, i64 8 + %r239 = load i64, ptr %r238 + %r240 = icmp ult i64 %r237, %r239 + br i1 %r240, label %ss.store.50, label %ss.done.51 + +ss.store.50: + %r241 = load ptr, ptr %r232 + %r242 = shl i64 %r237, 4 + %r243 = getelementptr inbounds i8, ptr %r241, i64 %r242 + %r244 = getelementptr inbounds i8, ptr %r243, i64 8 + %r245 = load i64, ptr %r244 + %r246 = and i64 %r245, -2 + store i64 0, ptr %r243 + store i64 %r246, ptr %r244 + br label %ss.done.51 + +ss.done.51: + %r247 = load ptr, ptr %r2 + %r248 = icmp eq ptr %r247, null + br i1 %r248, label %ss.slow.52, label %ss.chk_top.53 + +ss.slow.52: + call void @js_shadow_slot_set(i32 1, i64 0) + br label %ss.done.56 + +ss.chk_top.53: + %r249 = getelementptr inbounds i8, ptr %r247, i64 24 + %r250 = load i64, ptr %r249 + %r251 = icmp eq i64 %r250, -1 + br i1 %r251, label %ss.done.56, label %ss.chk_len.54 + +ss.chk_len.54: + %r252 = add i64 %r250, 1 + %r253 = getelementptr inbounds i8, ptr %r247, i64 8 + %r254 = load i64, ptr %r253 + %r255 = icmp ult i64 %r252, %r254 + br i1 %r255, label %ss.store.55, label %ss.done.56 + +ss.store.55: + %r256 = load ptr, ptr %r247 + %r257 = shl i64 %r252, 4 + %r258 = getelementptr inbounds i8, ptr %r256, i64 %r257 + %r259 = getelementptr inbounds i8, ptr %r258, i64 8 + %r260 = load i64, ptr %r259 + %r261 = and i64 %r260, -2 + store i64 0, ptr %r258 + store i64 %r261, ptr %r259 + br label %ss.done.56 + +ss.done.56: + %shadow_pop_l_1 = load i64, ptr %r1 + call void @js_shadow_frame_pop(i64 %shadow_pop_l_1) + ret double 0x7FFC000000000001 +} + +define double @perry_fn_test_gap_7302_invoke_eh_paths_ts__retInTry() alwaysinline personality ptr @perry_eh_personality { +entry.0: + %r1 = alloca i64 + %r2 = alloca ptr + store ptr null, ptr %r2 + %r3 = call ptr @js_shadow_frame_enter(i32 2) + store ptr %r3, ptr %r2 + %r4 = getelementptr inbounds i8, ptr %r3, i64 24 + %r5 = load i64, ptr %r4 + %r6 = sub i64 %r5, 1 + store i64 %r6, ptr %r1 + %r7 = alloca double + store double 0x7FFC000000000001, ptr %r7 + %r90 = alloca double + store double 0x7FFC000000000001, ptr %r90 + %r8 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.3.handle + store double %r8, ptr %r7 + %r9 = load ptr, ptr %r2 + %r10 = icmp eq ptr %r9, null + br i1 %r10, label %ss.slow.1, label %ss.chk_top.2 + +ss.slow.1: + call void @js_shadow_slot_bind(i32 0, ptr %r7) + br label %ss.done.5 + +ss.chk_top.2: + %r11 = getelementptr inbounds i8, ptr %r9, i64 24 + %r12 = load i64, ptr %r11 + %r13 = icmp eq i64 %r12, -1 + br i1 %r13, label %ss.done.5, label %ss.chk_len.3 + +ss.chk_len.3: + %r14 = add i64 %r12, 0 + %r15 = getelementptr inbounds i8, ptr %r9, i64 8 + %r16 = load i64, ptr %r15 + %r17 = icmp ult i64 %r14, %r16 + br i1 %r17, label %ss.store.4, label %ss.done.5 + +ss.store.4: + %r18 = load ptr, ptr %r9 + %r19 = shl i64 %r14, 4 + %r20 = getelementptr inbounds i8, ptr %r18, i64 %r19 + %r21 = getelementptr inbounds i8, ptr %r20, i64 8 + %r22 = load i64, ptr %r7 + %r23 = ptrtoint ptr %r7 to i64 + %r24 = and i64 %r23, 1 + %r25 = icmp eq i64 %r24, 0 + %r26 = select i1 %r25, i64 %r23, i64 0 + %r27 = or i64 %r26, 1 + store i64 %r22, ptr %r20 + store i64 %r27, ptr %r21 + %r28 = load atomic i32, ptr @PERRY_INCREMENTAL_MARK_BARRIER_ACTIVE_COUNT seq_cst, align 4 + %r29 = icmp ne i32 %r28, 0 + br i1 %r29, label %ss.barrier.6, label %ss.done.5 + +ss.done.5: + call void @js_eh_try_push() + br label %try.body.7 + +ss.barrier.6: + call void @js_write_barrier_root_nanbox(i64 %r22) + br label %ss.done.5 + +try.body.7: + %r31 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.4.handle + %r32 = load double, ptr %r7 + %r33 = bitcast double %r32 to i64 + %r34 = bitcast double %r31 to i64 + %r35 = lshr i64 %r33, 48 + %r36 = lshr i64 %r34, 48 + %r37 = icmp eq i64 %r35, 32767 + br i1 %r37, label %strapp.dheap.11, label %strapp.dother.14 + +try.catch.8: + call void @js_try_end() + %r191 = call double @js_get_exception() + %r192 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.8.handle + %r193 = load double, ptr %r7 + %r194 = bitcast double %r193 to i64 + %r195 = bitcast double %r192 to i64 + %r196 = lshr i64 %r194, 48 + %r197 = lshr i64 %r195, 48 + %r198 = icmp eq i64 %r196, 32767 + br i1 %r198, label %strapp.dheap.43, label %strapp.dother.46 + +try.finally.9: + %r253 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.8.handle + %r254 = load double, ptr %r7 + %r255 = bitcast double %r254 to i64 + %r256 = bitcast double %r253 to i64 + %r257 = lshr i64 %r255, 48 + %r258 = lshr i64 %r256, 48 + %r259 = icmp eq i64 %r257, 32767 + br i1 %r259, label %strapp.dheap.56, label %strapp.dother.59 + +eh.lpad.10: + %r30 = landingpad { ptr, i32 } catch ptr null + br label %try.catch.8 + +strapp.dheap.11: + %r38 = icmp eq i64 %r36, 32767 + br i1 %r38, label %strapp.heap.12, label %strapp.rcold.13 + +strapp.heap.12: + %r39 = and i64 %r33, 281474976710655 + %r40 = and i64 %r34, 281474976710655 + %r41 = invoke i64 @js_string_append(i64 %r39, i64 %r40) to label %eh.cont42 unwind label %eh.lpad.10 +eh.cont42: + %r43 = or i64 %r41, 9223090561878065152 + %r44 = bitcast i64 %r43 to double + br label %strapp.merge.17 + +strapp.rcold.13: + %r45 = and i64 %r33, 281474976710655 + %r46 = invoke i64 @js_get_string_pointer_unified(double %r31) to label %eh.cont47 unwind label %eh.lpad.10 +eh.cont47: + %r48 = invoke i64 @js_string_append(i64 %r45, i64 %r46) to label %eh.cont49 unwind label %eh.lpad.10 +eh.cont49: + %r50 = or i64 %r48, 9223090561878065152 + %r51 = bitcast i64 %r50 to double + br label %strapp.merge.17 + +strapp.dother.14: + %r52 = icmp eq i64 %r35, 32761 + %r53 = icmp eq i64 %r36, 32767 + %r54 = icmp eq i64 %r36, 32761 + %r55 = or i1 %r53, %r54 + %r56 = and i1 %r52, %r55 + br i1 %r56, label %strapp.sso.15, label %strapp.cold.16 + +strapp.sso.15: + %r57 = invoke double @js_string_concat_box(double %r32, double %r31) to label %eh.cont58 unwind label %eh.lpad.10 +eh.cont58: + br label %strapp.merge.17 + +strapp.cold.16: + %r59 = invoke i64 @js_get_string_pointer_unified(double %r32) to label %eh.cont60 unwind label %eh.lpad.10 +eh.cont60: + %r61 = invoke i64 @js_get_string_pointer_unified(double %r31) to label %eh.cont62 unwind label %eh.lpad.10 +eh.cont62: + %r63 = invoke i64 @js_string_append(i64 %r59, i64 %r61) to label %eh.cont64 unwind label %eh.lpad.10 +eh.cont64: + %r65 = or i64 %r63, 9223090561878065152 + %r66 = bitcast i64 %r65 to double + br label %strapp.merge.17 + +strapp.merge.17: + %r67 = phi double [ %r44, %eh.cont42 ], [ %r51, %eh.cont49 ], [ %r57, %eh.cont58 ], [ %r66, %eh.cont64 ] + store double %r67, ptr %r7 + %r68 = load ptr, ptr %r2 + %r69 = icmp eq ptr %r68, null + br i1 %r69, label %ss.slow.18, label %ss.chk_top.19 + +ss.slow.18: + call void @js_shadow_slot_bind(i32 0, ptr %r7) + br label %ss.done.22 + +ss.chk_top.19: + %r70 = getelementptr inbounds i8, ptr %r68, i64 24 + %r71 = load i64, ptr %r70 + %r72 = icmp eq i64 %r71, -1 + br i1 %r72, label %ss.done.22, label %ss.chk_len.20 + +ss.chk_len.20: + %r73 = add i64 %r71, 0 + %r74 = getelementptr inbounds i8, ptr %r68, i64 8 + %r75 = load i64, ptr %r74 + %r76 = icmp ult i64 %r73, %r75 + br i1 %r76, label %ss.store.21, label %ss.done.22 + +ss.store.21: + %r77 = load ptr, ptr %r68 + %r78 = shl i64 %r73, 4 + %r79 = getelementptr inbounds i8, ptr %r77, i64 %r78 + %r80 = getelementptr inbounds i8, ptr %r79, i64 8 + %r81 = load i64, ptr %r7 + %r82 = ptrtoint ptr %r7 to i64 + %r83 = and i64 %r82, 1 + %r84 = icmp eq i64 %r83, 0 + %r85 = select i1 %r84, i64 %r82, i64 0 + %r86 = or i64 %r85, 1 + store i64 %r81, ptr %r79 + store i64 %r86, ptr %r80 + %r87 = load atomic i32, ptr @PERRY_INCREMENTAL_MARK_BARRIER_ACTIVE_COUNT seq_cst, align 4 + %r88 = icmp ne i32 %r87, 0 + br i1 %r88, label %ss.barrier.23, label %ss.done.22 + +ss.done.22: + %r91 = load double, ptr %r7 + %r92 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.11.handle + %r93 = invoke double @js_string_concat_box(double %r91, double %r92) to label %eh.cont94 unwind label %eh.lpad.10 +eh.cont94: + store double %r93, ptr %r90 + %r95 = load ptr, ptr %r2 + %r96 = icmp eq ptr %r95, null + br i1 %r96, label %ss.slow.24, label %ss.chk_top.25 + +ss.barrier.23: + invoke void @js_write_barrier_root_nanbox(i64 %r81) to label %eh.cont89 unwind label %eh.lpad.10 +eh.cont89: + br label %ss.done.22 + +ss.slow.24: + call void @js_shadow_slot_bind(i32 1, ptr %r90) + br label %ss.done.28 + +ss.chk_top.25: + %r97 = getelementptr inbounds i8, ptr %r95, i64 24 + %r98 = load i64, ptr %r97 + %r99 = icmp eq i64 %r98, -1 + br i1 %r99, label %ss.done.28, label %ss.chk_len.26 + +ss.chk_len.26: + %r100 = add i64 %r98, 1 + %r101 = getelementptr inbounds i8, ptr %r95, i64 8 + %r102 = load i64, ptr %r101 + %r103 = icmp ult i64 %r100, %r102 + br i1 %r103, label %ss.store.27, label %ss.done.28 + +ss.store.27: + %r104 = load ptr, ptr %r95 + %r105 = shl i64 %r100, 4 + %r106 = getelementptr inbounds i8, ptr %r104, i64 %r105 + %r107 = getelementptr inbounds i8, ptr %r106, i64 8 + %r108 = load i64, ptr %r90 + %r109 = ptrtoint ptr %r90 to i64 + %r110 = and i64 %r109, 1 + %r111 = icmp eq i64 %r110, 0 + %r112 = select i1 %r111, i64 %r109, i64 0 + %r113 = or i64 %r112, 1 + store i64 %r108, ptr %r106 + store i64 %r113, ptr %r107 + %r114 = load atomic i32, ptr @PERRY_INCREMENTAL_MARK_BARRIER_ACTIVE_COUNT seq_cst, align 4 + %r115 = icmp ne i32 %r114, 0 + br i1 %r115, label %ss.barrier.29, label %ss.done.28 + +ss.done.28: + %r117 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.8.handle + %r118 = load double, ptr %r7 + %r119 = bitcast double %r118 to i64 + %r120 = bitcast double %r117 to i64 + %r121 = lshr i64 %r119, 48 + %r122 = lshr i64 %r120, 48 + %r123 = icmp eq i64 %r121, 32767 + br i1 %r123, label %strapp.dheap.30, label %strapp.dother.33 + +ss.barrier.29: + invoke void @js_write_barrier_root_nanbox(i64 %r108) to label %eh.cont116 unwind label %eh.lpad.10 +eh.cont116: + br label %ss.done.28 + +strapp.dheap.30: + %r124 = icmp eq i64 %r122, 32767 + br i1 %r124, label %strapp.heap.31, label %strapp.rcold.32 + +strapp.heap.31: + %r125 = and i64 %r119, 281474976710655 + %r126 = and i64 %r120, 281474976710655 + %r127 = invoke i64 @js_string_append(i64 %r125, i64 %r126) to label %eh.cont128 unwind label %eh.lpad.10 +eh.cont128: + %r129 = or i64 %r127, 9223090561878065152 + %r130 = bitcast i64 %r129 to double + br label %strapp.merge.36 + +strapp.rcold.32: + %r131 = and i64 %r119, 281474976710655 + %r132 = invoke i64 @js_get_string_pointer_unified(double %r117) to label %eh.cont133 unwind label %eh.lpad.10 +eh.cont133: + %r134 = invoke i64 @js_string_append(i64 %r131, i64 %r132) to label %eh.cont135 unwind label %eh.lpad.10 +eh.cont135: + %r136 = or i64 %r134, 9223090561878065152 + %r137 = bitcast i64 %r136 to double + br label %strapp.merge.36 + +strapp.dother.33: + %r138 = icmp eq i64 %r121, 32761 + %r139 = icmp eq i64 %r122, 32767 + %r140 = icmp eq i64 %r122, 32761 + %r141 = or i1 %r139, %r140 + %r142 = and i1 %r138, %r141 + br i1 %r142, label %strapp.sso.34, label %strapp.cold.35 + +strapp.sso.34: + %r143 = invoke double @js_string_concat_box(double %r118, double %r117) to label %eh.cont144 unwind label %eh.lpad.10 +eh.cont144: + br label %strapp.merge.36 + +strapp.cold.35: + %r145 = invoke i64 @js_get_string_pointer_unified(double %r118) to label %eh.cont146 unwind label %eh.lpad.10 +eh.cont146: + %r147 = invoke i64 @js_get_string_pointer_unified(double %r117) to label %eh.cont148 unwind label %eh.lpad.10 +eh.cont148: + %r149 = invoke i64 @js_string_append(i64 %r145, i64 %r147) to label %eh.cont150 unwind label %eh.lpad.10 +eh.cont150: + %r151 = or i64 %r149, 9223090561878065152 + %r152 = bitcast i64 %r151 to double + br label %strapp.merge.36 + +strapp.merge.36: + %r153 = phi double [ %r130, %eh.cont128 ], [ %r137, %eh.cont135 ], [ %r143, %eh.cont144 ], [ %r152, %eh.cont150 ] + store double %r153, ptr %r7 + %r154 = load ptr, ptr %r2 + %r155 = icmp eq ptr %r154, null + br i1 %r155, label %ss.slow.37, label %ss.chk_top.38 + +ss.slow.37: + call void @js_shadow_slot_bind(i32 0, ptr %r7) + br label %ss.done.41 + +ss.chk_top.38: + %r156 = getelementptr inbounds i8, ptr %r154, i64 24 + %r157 = load i64, ptr %r156 + %r158 = icmp eq i64 %r157, -1 + br i1 %r158, label %ss.done.41, label %ss.chk_len.39 + +ss.chk_len.39: + %r159 = add i64 %r157, 0 + %r160 = getelementptr inbounds i8, ptr %r154, i64 8 + %r161 = load i64, ptr %r160 + %r162 = icmp ult i64 %r159, %r161 + br i1 %r162, label %ss.store.40, label %ss.done.41 + +ss.store.40: + %r163 = load ptr, ptr %r154 + %r164 = shl i64 %r159, 4 + %r165 = getelementptr inbounds i8, ptr %r163, i64 %r164 + %r166 = getelementptr inbounds i8, ptr %r165, i64 8 + %r167 = load i64, ptr %r7 + %r168 = ptrtoint ptr %r7 to i64 + %r169 = and i64 %r168, 1 + %r170 = icmp eq i64 %r169, 0 + %r171 = select i1 %r170, i64 %r168, i64 0 + %r172 = or i64 %r171, 1 + store i64 %r167, ptr %r165 + store i64 %r172, ptr %r166 + %r173 = load atomic i32, ptr @PERRY_INCREMENTAL_MARK_BARRIER_ACTIVE_COUNT seq_cst, align 4 + %r174 = icmp ne i32 %r173, 0 + br i1 %r174, label %ss.barrier.42, label %ss.done.41 + +ss.done.41: + %r176 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.12.handle + %r177 = load double, ptr %r7 + %r178 = invoke double @js_string_concat_box(double %r176, double %r177) to label %eh.cont179 unwind label %eh.lpad.10 +eh.cont179: + %r180 = bitcast double %r178 to i64 + %r181 = call i32 @js_gc_temp_root_push(i64 %r180) + %r182 = invoke i64 @js_array_alloc(i32 1) to label %eh.cont183 unwind label %eh.lpad.10 +eh.cont183: + %r184 = call i32 @js_gc_temp_root_push(i64 %r182) + %r185 = call i64 @js_gc_temp_root_get(i32 %r181) + %r186 = bitcast i64 %r185 to double + invoke void @js_array_push_f64_temp_rooted(i32 %r184, double %r186) to label %eh.cont187 unwind label %eh.lpad.10 +eh.cont187: + %r188 = call i64 @js_gc_temp_root_get(i32 %r184) + invoke void @js_console_log_spread(i64 %r188) to label %eh.cont189 unwind label %eh.lpad.10 +eh.cont189: + call void @js_gc_temp_root_truncate(i32 %r181) + %r190 = load double, ptr %r90 + call void @js_try_end() + %shadow_pop_l_0 = load i64, ptr %r1 + call void @js_shadow_frame_pop(i64 %shadow_pop_l_0) + ret double %r190 + +ss.barrier.42: + invoke void @js_write_barrier_root_nanbox(i64 %r167) to label %eh.cont175 unwind label %eh.lpad.10 +eh.cont175: + br label %ss.done.41 + +strapp.dheap.43: + %r199 = icmp eq i64 %r197, 32767 + br i1 %r199, label %strapp.heap.44, label %strapp.rcold.45 + +strapp.heap.44: + %r200 = and i64 %r194, 281474976710655 + %r201 = and i64 %r195, 281474976710655 + %r202 = call i64 @js_string_append(i64 %r200, i64 %r201) + %r203 = or i64 %r202, 9223090561878065152 + %r204 = bitcast i64 %r203 to double + br label %strapp.merge.49 + +strapp.rcold.45: + %r205 = and i64 %r194, 281474976710655 + %r206 = call i64 @js_get_string_pointer_unified(double %r192) + %r207 = call i64 @js_string_append(i64 %r205, i64 %r206) + %r208 = or i64 %r207, 9223090561878065152 + %r209 = bitcast i64 %r208 to double + br label %strapp.merge.49 + +strapp.dother.46: + %r210 = icmp eq i64 %r196, 32761 + %r211 = icmp eq i64 %r197, 32767 + %r212 = icmp eq i64 %r197, 32761 + %r213 = or i1 %r211, %r212 + %r214 = and i1 %r210, %r213 + br i1 %r214, label %strapp.sso.47, label %strapp.cold.48 + +strapp.sso.47: + %r215 = call double @js_string_concat_box(double %r193, double %r192) + br label %strapp.merge.49 + +strapp.cold.48: + %r216 = call i64 @js_get_string_pointer_unified(double %r193) + %r217 = call i64 @js_get_string_pointer_unified(double %r192) + %r218 = call i64 @js_string_append(i64 %r216, i64 %r217) + %r219 = or i64 %r218, 9223090561878065152 + %r220 = bitcast i64 %r219 to double + br label %strapp.merge.49 + +strapp.merge.49: + %r221 = phi double [ %r204, %strapp.heap.44 ], [ %r209, %strapp.rcold.45 ], [ %r215, %strapp.sso.47 ], [ %r220, %strapp.cold.48 ] + store double %r221, ptr %r7 + %r222 = load ptr, ptr %r2 + %r223 = icmp eq ptr %r222, null + br i1 %r223, label %ss.slow.50, label %ss.chk_top.51 + +ss.slow.50: + call void @js_shadow_slot_bind(i32 0, ptr %r7) + br label %ss.done.54 + +ss.chk_top.51: + %r224 = getelementptr inbounds i8, ptr %r222, i64 24 + %r225 = load i64, ptr %r224 + %r226 = icmp eq i64 %r225, -1 + br i1 %r226, label %ss.done.54, label %ss.chk_len.52 + +ss.chk_len.52: + %r227 = add i64 %r225, 0 + %r228 = getelementptr inbounds i8, ptr %r222, i64 8 + %r229 = load i64, ptr %r228 + %r230 = icmp ult i64 %r227, %r229 + br i1 %r230, label %ss.store.53, label %ss.done.54 + +ss.store.53: + %r231 = load ptr, ptr %r222 + %r232 = shl i64 %r227, 4 + %r233 = getelementptr inbounds i8, ptr %r231, i64 %r232 + %r234 = getelementptr inbounds i8, ptr %r233, i64 8 + %r235 = load i64, ptr %r7 + %r236 = ptrtoint ptr %r7 to i64 + %r237 = and i64 %r236, 1 + %r238 = icmp eq i64 %r237, 0 + %r239 = select i1 %r238, i64 %r236, i64 0 + %r240 = or i64 %r239, 1 + store i64 %r235, ptr %r233 + store i64 %r240, ptr %r234 + %r241 = load atomic i32, ptr @PERRY_INCREMENTAL_MARK_BARRIER_ACTIVE_COUNT seq_cst, align 4 + %r242 = icmp ne i32 %r241, 0 + br i1 %r242, label %ss.barrier.55, label %ss.done.54 + +ss.done.54: + %r243 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.12.handle + %r244 = load double, ptr %r7 + %r245 = call double @js_string_concat_box(double %r243, double %r244) + %r246 = bitcast double %r245 to i64 + %r247 = call i32 @js_gc_temp_root_push(i64 %r246) + %r248 = call i64 @js_array_alloc(i32 1) + %r249 = call i32 @js_gc_temp_root_push(i64 %r248) + %r250 = call i64 @js_gc_temp_root_get(i32 %r247) + %r251 = bitcast i64 %r250 to double + call void @js_array_push_f64_temp_rooted(i32 %r249, double %r251) + %r252 = call i64 @js_gc_temp_root_get(i32 %r249) + call void @js_console_log_spread(i64 %r252) + call void @js_gc_temp_root_truncate(i32 %r247) + call void @js_throw(double %r191) + unreachable + +ss.barrier.55: + call void @js_write_barrier_root_nanbox(i64 %r235) + br label %ss.done.54 + +strapp.dheap.56: + %r260 = icmp eq i64 %r258, 32767 + br i1 %r260, label %strapp.heap.57, label %strapp.rcold.58 + +strapp.heap.57: + %r261 = and i64 %r255, 281474976710655 + %r262 = and i64 %r256, 281474976710655 + %r263 = call i64 @js_string_append(i64 %r261, i64 %r262) + %r264 = or i64 %r263, 9223090561878065152 + %r265 = bitcast i64 %r264 to double + br label %strapp.merge.62 + +strapp.rcold.58: + %r266 = and i64 %r255, 281474976710655 + %r267 = call i64 @js_get_string_pointer_unified(double %r253) + %r268 = call i64 @js_string_append(i64 %r266, i64 %r267) + %r269 = or i64 %r268, 9223090561878065152 + %r270 = bitcast i64 %r269 to double + br label %strapp.merge.62 + +strapp.dother.59: + %r271 = icmp eq i64 %r257, 32761 + %r272 = icmp eq i64 %r258, 32767 + %r273 = icmp eq i64 %r258, 32761 + %r274 = or i1 %r272, %r273 + %r275 = and i1 %r271, %r274 + br i1 %r275, label %strapp.sso.60, label %strapp.cold.61 + +strapp.sso.60: + %r276 = call double @js_string_concat_box(double %r254, double %r253) + br label %strapp.merge.62 + +strapp.cold.61: + %r277 = call i64 @js_get_string_pointer_unified(double %r254) + %r278 = call i64 @js_get_string_pointer_unified(double %r253) + %r279 = call i64 @js_string_append(i64 %r277, i64 %r278) + %r280 = or i64 %r279, 9223090561878065152 + %r281 = bitcast i64 %r280 to double + br label %strapp.merge.62 + +strapp.merge.62: + %r282 = phi double [ %r265, %strapp.heap.57 ], [ %r270, %strapp.rcold.58 ], [ %r276, %strapp.sso.60 ], [ %r281, %strapp.cold.61 ] + store double %r282, ptr %r7 + %r283 = load ptr, ptr %r2 + %r284 = icmp eq ptr %r283, null + br i1 %r284, label %ss.slow.63, label %ss.chk_top.64 + +ss.slow.63: + call void @js_shadow_slot_bind(i32 0, ptr %r7) + br label %ss.done.67 + +ss.chk_top.64: + %r285 = getelementptr inbounds i8, ptr %r283, i64 24 + %r286 = load i64, ptr %r285 + %r287 = icmp eq i64 %r286, -1 + br i1 %r287, label %ss.done.67, label %ss.chk_len.65 + +ss.chk_len.65: + %r288 = add i64 %r286, 0 + %r289 = getelementptr inbounds i8, ptr %r283, i64 8 + %r290 = load i64, ptr %r289 + %r291 = icmp ult i64 %r288, %r290 + br i1 %r291, label %ss.store.66, label %ss.done.67 + +ss.store.66: + %r292 = load ptr, ptr %r283 + %r293 = shl i64 %r288, 4 + %r294 = getelementptr inbounds i8, ptr %r292, i64 %r293 + %r295 = getelementptr inbounds i8, ptr %r294, i64 8 + %r296 = load i64, ptr %r7 + %r297 = ptrtoint ptr %r7 to i64 + %r298 = and i64 %r297, 1 + %r299 = icmp eq i64 %r298, 0 + %r300 = select i1 %r299, i64 %r297, i64 0 + %r301 = or i64 %r300, 1 + store i64 %r296, ptr %r294 + store i64 %r301, ptr %r295 + %r302 = load atomic i32, ptr @PERRY_INCREMENTAL_MARK_BARRIER_ACTIVE_COUNT seq_cst, align 4 + %r303 = icmp ne i32 %r302, 0 + br i1 %r303, label %ss.barrier.68, label %ss.done.67 + +ss.done.67: + %r304 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.12.handle + %r305 = load double, ptr %r7 + %r306 = call double @js_string_concat_box(double %r304, double %r305) + %r307 = bitcast double %r306 to i64 + %r308 = call i32 @js_gc_temp_root_push(i64 %r307) + %r309 = call i64 @js_array_alloc(i32 1) + %r310 = call i32 @js_gc_temp_root_push(i64 %r309) + %r311 = call i64 @js_gc_temp_root_get(i32 %r308) + %r312 = bitcast i64 %r311 to double + call void @js_array_push_f64_temp_rooted(i32 %r310, double %r312) + %r313 = call i64 @js_gc_temp_root_get(i32 %r310) + call void @js_console_log_spread(i64 %r313) + call void @js_gc_temp_root_truncate(i32 %r308) + %r314 = load ptr, ptr %r2 + %r315 = icmp eq ptr %r314, null + br i1 %r315, label %ss.slow.69, label %ss.chk_top.70 + +ss.barrier.68: + call void @js_write_barrier_root_nanbox(i64 %r296) + br label %ss.done.67 + +ss.slow.69: + call void @js_shadow_slot_set(i32 0, i64 0) + br label %ss.done.73 + +ss.chk_top.70: + %r316 = getelementptr inbounds i8, ptr %r314, i64 24 + %r317 = load i64, ptr %r316 + %r318 = icmp eq i64 %r317, -1 + br i1 %r318, label %ss.done.73, label %ss.chk_len.71 + +ss.chk_len.71: + %r319 = add i64 %r317, 0 + %r320 = getelementptr inbounds i8, ptr %r314, i64 8 + %r321 = load i64, ptr %r320 + %r322 = icmp ult i64 %r319, %r321 + br i1 %r322, label %ss.store.72, label %ss.done.73 + +ss.store.72: + %r323 = load ptr, ptr %r314 + %r324 = shl i64 %r319, 4 + %r325 = getelementptr inbounds i8, ptr %r323, i64 %r324 + %r326 = getelementptr inbounds i8, ptr %r325, i64 8 + %r327 = load i64, ptr %r326 + %r328 = and i64 %r327, -2 + store i64 0, ptr %r325 + store i64 %r328, ptr %r326 + br label %ss.done.73 + +ss.done.73: + %r329 = load ptr, ptr %r2 + %r330 = icmp eq ptr %r329, null + br i1 %r330, label %ss.slow.74, label %ss.chk_top.75 + +ss.slow.74: + call void @js_shadow_slot_set(i32 1, i64 0) + br label %ss.done.78 + +ss.chk_top.75: + %r331 = getelementptr inbounds i8, ptr %r329, i64 24 + %r332 = load i64, ptr %r331 + %r333 = icmp eq i64 %r332, -1 + br i1 %r333, label %ss.done.78, label %ss.chk_len.76 + +ss.chk_len.76: + %r334 = add i64 %r332, 1 + %r335 = getelementptr inbounds i8, ptr %r329, i64 8 + %r336 = load i64, ptr %r335 + %r337 = icmp ult i64 %r334, %r336 + br i1 %r337, label %ss.store.77, label %ss.done.78 + +ss.store.77: + %r338 = load ptr, ptr %r329 + %r339 = shl i64 %r334, 4 + %r340 = getelementptr inbounds i8, ptr %r338, i64 %r339 + %r341 = getelementptr inbounds i8, ptr %r340, i64 8 + %r342 = load i64, ptr %r341 + %r343 = and i64 %r342, -2 + store i64 0, ptr %r340 + store i64 %r343, ptr %r341 + br label %ss.done.78 + +ss.done.78: + %shadow_pop_l_1 = load i64, ptr %r1 + call void @js_shadow_frame_pop(i64 %shadow_pop_l_1) + ret double 0x7FFC000000000001 +} + +define double @perry_fn_test_gap_7302_invoke_eh_paths_ts__catchFinallyFail() alwaysinline personality ptr @perry_eh_personality { +entry.0: + %r1 = alloca i64 + %r2 = alloca ptr + store ptr null, ptr %r2 + %r3 = call ptr @js_shadow_frame_enter(i32 1) + store ptr %r3, ptr %r2 + %r4 = getelementptr inbounds i8, ptr %r3, i64 24 + %r5 = load i64, ptr %r4 + %r6 = sub i64 %r5, 1 + store i64 %r6, ptr %r1 + %r48 = alloca double + call void @js_eh_try_push() + br label %try.body.1 + +try.body.1: + call void @js_eh_try_push() + br label %try.body.5 + +try.catch.2: + call void @js_try_end() + %r47 = call double @js_get_exception() + call void @js_clear_exception() + store double %r47, ptr %r48 + %r49 = load ptr, ptr %r2 + %r50 = icmp eq ptr %r49, null + br i1 %r50, label %ss.slow.12, label %ss.chk_top.13 + +try.finally.3: + %r149 = load ptr, ptr %r2 + %r150 = icmp eq ptr %r149, null + br i1 %r150, label %ss.slow.31, label %ss.chk_top.32 + +eh.lpad.4: + %r7 = landingpad { ptr, i32 } catch ptr null + br label %try.catch.2 + +try.body.5: + %r9 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.13.handle + %r10 = invoke i64 @js_error_new_from_value(double %r9) to label %eh.cont11 unwind label %eh.lpad.8 +eh.cont11: + %r12 = or i64 %r10, 9222527611924643840 + %r13 = bitcast i64 %r12 to double + invoke void @js_throw(double %r13) to label %eh.cont14 unwind label %eh.lpad.8 +eh.cont14: + unreachable + +try.catch.6: + call void @js_try_end() + %r15 = call double @js_get_exception() + call void @js_clear_exception() + call void @js_eh_try_push() + br label %try.catch.body.9 + +try.finally.7: + %r36 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.15.handle + %r37 = bitcast double %r36 to i64 + %r38 = call i32 @js_gc_temp_root_push(i64 %r37) + %r39 = invoke i64 @js_array_alloc(i32 1) to label %eh.cont40 unwind label %eh.lpad.4 +eh.cont40: + %r41 = call i32 @js_gc_temp_root_push(i64 %r39) + %r42 = call i64 @js_gc_temp_root_get(i32 %r38) + %r43 = bitcast i64 %r42 to double + invoke void @js_array_push_f64_temp_rooted(i32 %r41, double %r43) to label %eh.cont44 unwind label %eh.lpad.4 +eh.cont44: + %r45 = call i64 @js_gc_temp_root_get(i32 %r41) + invoke void @js_console_log_spread(i64 %r45) to label %eh.cont46 unwind label %eh.lpad.4 +eh.cont46: + call void @js_gc_temp_root_truncate(i32 %r38) + call void @js_try_end() + br label %try.finally.3 + +eh.lpad.8: + %r8 = landingpad { ptr, i32 } catch ptr null + br label %try.catch.6 + +try.catch.body.9: + %r17 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.14.handle + %r18 = invoke i64 @js_error_new_from_value(double %r17) to label %eh.cont19 unwind label %eh.lpad.11 +eh.cont19: + %r20 = or i64 %r18, 9222527611924643840 + %r21 = bitcast i64 %r20 to double + invoke void @js_throw(double %r21) to label %eh.cont22 unwind label %eh.lpad.11 +eh.cont22: + unreachable + +try.catch.fail.10: + call void @js_try_end() + %r23 = call double @js_get_exception() + %r24 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.15.handle + %r25 = bitcast double %r24 to i64 + %r26 = call i32 @js_gc_temp_root_push(i64 %r25) + %r27 = invoke i64 @js_array_alloc(i32 1) to label %eh.cont28 unwind label %eh.lpad.4 +eh.cont28: + %r29 = call i32 @js_gc_temp_root_push(i64 %r27) + %r30 = call i64 @js_gc_temp_root_get(i32 %r26) + %r31 = bitcast i64 %r30 to double + invoke void @js_array_push_f64_temp_rooted(i32 %r29, double %r31) to label %eh.cont32 unwind label %eh.lpad.4 +eh.cont32: + %r33 = call i64 @js_gc_temp_root_get(i32 %r29) + invoke void @js_console_log_spread(i64 %r33) to label %eh.cont34 unwind label %eh.lpad.4 +eh.cont34: + call void @js_gc_temp_root_truncate(i32 %r26) + invoke void @js_throw(double %r23) to label %eh.cont35 unwind label %eh.lpad.4 +eh.cont35: + unreachable + +eh.lpad.11: + %r16 = landingpad { ptr, i32 } catch ptr null + br label %try.catch.fail.10 + +ss.slow.12: + call void @js_shadow_slot_bind(i32 0, ptr %r48) + br label %ss.done.16 + +ss.chk_top.13: + %r51 = getelementptr inbounds i8, ptr %r49, i64 24 + %r52 = load i64, ptr %r51 + %r53 = icmp eq i64 %r52, -1 + br i1 %r53, label %ss.done.16, label %ss.chk_len.14 + +ss.chk_len.14: + %r54 = add i64 %r52, 0 + %r55 = getelementptr inbounds i8, ptr %r49, i64 8 + %r56 = load i64, ptr %r55 + %r57 = icmp ult i64 %r54, %r56 + br i1 %r57, label %ss.store.15, label %ss.done.16 + +ss.store.15: + %r58 = load ptr, ptr %r49 + %r59 = shl i64 %r54, 4 + %r60 = getelementptr inbounds i8, ptr %r58, i64 %r59 + %r61 = getelementptr inbounds i8, ptr %r60, i64 8 + %r62 = load i64, ptr %r48 + %r63 = ptrtoint ptr %r48 to i64 + %r64 = and i64 %r63, 1 + %r65 = icmp eq i64 %r64, 0 + %r66 = select i1 %r65, i64 %r63, i64 0 + %r67 = or i64 %r66, 1 + store i64 %r62, ptr %r60 + store i64 %r67, ptr %r61 + %r68 = load atomic i32, ptr @PERRY_INCREMENTAL_MARK_BARRIER_ACTIVE_COUNT seq_cst, align 4 + %r69 = icmp ne i32 %r68, 0 + br i1 %r69, label %ss.barrier.17, label %ss.done.16 + +ss.done.16: + %r70 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.16.handle + %r71 = load double, ptr %r48 + %r72 = bitcast double %r71 to i64 + %r73 = and i64 %r72, 281474976710655 + %r74 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.2.handle + %r75 = bitcast double %r74 to i64 + %r76 = and i64 %r75, 281474976710655 + %r77 = lshr i64 %r72, 48 + %r78 = icmp eq i64 %r77, 32761 + %r79 = icmp eq i64 %r77, 32766 + %r80 = and i64 %r77, 65533 + %r81 = icmp eq i64 %r80, 32765 + br i1 %r78, label %pget.recv_sso.18, label %pget.check_class_ref.24 + +ss.barrier.17: + call void @js_write_barrier_root_nanbox(i64 %r62) + br label %ss.done.16 + +pget.recv_sso.18: + %r145 = call double @js_object_get_field_by_name_f64(i64 %r72, i64 %r76) + br label %pget.recv_merge.22 + +pget.recv_ok.19: + call void @js_typed_feedback_observe_property_get(i64 8601651645035577350, i64 %r73, i64 %r76) + %r83 = icmp ugt i64 %r73, 1048575 + %r84 = ptrtoint ptr @perry_ic_7 to i64 + %r85 = select i1 %r83, i64 %r73, i64 %r84 + %r86 = sub i64 %r85, 8 + %r87 = inttoptr i64 %r86 to ptr + %r88 = load i8, ptr %r87 + %r89 = icmp eq i8 %r88, 2 + %r90 = and i1 %r83, %r89 + %r91 = add i64 %r85, 12 + %r92 = inttoptr i64 %r91 to ptr + %r93 = load i32, ptr %r92 + %r94 = icmp eq i32 %r93, 1129268819 + %r95 = xor i1 %r94, true + %r96 = and i1 %r90, %r95 + %r97 = inttoptr i64 %r85 to ptr + %r98 = load i32, ptr %r97 + %r99 = icmp eq i32 %r98, 1 + %r100 = and i1 %r96, %r99 + %r101 = sub i64 %r85, 6 + %r102 = inttoptr i64 %r101 to ptr + %r103 = load i16, ptr %r102 + %r104 = and i16 %r103, 2048 + %r105 = icmp eq i16 %r104, 0 + %r106 = and i1 %r100, %r105 + %r107 = add i64 %r85, 16 + %r108 = inttoptr i64 %r107 to ptr + %r109 = load i64, ptr %r108 + %r110 = add i64 %r85, 8 + %r111 = inttoptr i64 %r110 to ptr + %r112 = load i32, ptr %r111 + %r113 = add i32 %r112, -2147483648 + %r114 = icmp ult i32 %r113, 1073741824 + %r115 = zext i32 %r112 to i64 + %r116 = or i64 %r115, 4611686018427387904 + %r117 = select i1 %r114, i64 %r116, i64 %r109 + %r118 = getelementptr i64, ptr @perry_ic_7, i64 0 + %r119 = load i64, ptr %r118 + %r120 = icmp eq i64 %r117, %r119 + %r121 = icmp ne i64 %r117, 0 + %r122 = and i1 %r106, %r120 + %r123 = and i1 %r122, %r121 + br i1 %r123, label %pic.hit.25, label %pic.miss.26 + +pget.recv_bad.20: + %r140 = icmp eq i64 %r72, 9222246136947933185 + %r141 = icmp eq i64 %r72, 9222246136947933186 + %r142 = or i1 %r140, %r141 + br i1 %r142, label %pget.throw_nullish.29, label %pget.recv_undef_return.30 + +pget.recv_class_ref.21: + %r82 = call double @js_typed_feedback_object_get_field_by_name_f64(i64 8601651645035577350, i64 %r72, i64 %r76) + br label %pget.recv_merge.22 + +pget.recv_merge.22: + %r146 = phi double [ %r139, %pic.merge.27 ], [ %r144, %pget.recv_undef_return.30 ], [ %r145, %pget.recv_sso.18 ], [ %r82, %pget.recv_class_ref.21 ] + %r147 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.16.handle + %r148 = call double @js_dynamic_string_or_number_add(double %r147, double %r146) + %shadow_pop_l_0 = load i64, ptr %r1 + call void @js_shadow_frame_pop(i64 %shadow_pop_l_0) + ret double %r148 + +pget.check_ptr.23: + br i1 %r81, label %pget.recv_ok.19, label %pget.recv_bad.20 + +pget.check_class_ref.24: + br i1 %r79, label %pget.recv_class_ref.21, label %pget.check_ptr.23 + +pic.hit.25: + %r124 = getelementptr i64, ptr @perry_ic_7, i64 1 + %r125 = load i64, ptr %r124 + %r126 = add i64 %r85, 12 + %r127 = inttoptr i64 %r126 to ptr + %r128 = load i32, ptr %r127 + %r129 = zext i32 %r128 to i64 + %r130 = icmp ult i64 %r129, 4 + %r131 = select i1 %r130, i64 4, i64 %r129 + %r132 = icmp ult i64 %r125, %r131 + br i1 %r132, label %pic.hit.load.28, label %pic.miss.26 + +pic.miss.26: + call void @js_typed_feedback_record_guard_fail(i64 8601651645035577350) + call void @js_typed_feedback_record_fallback_call(i64 8601651645035577350) + %r138 = call double @js_object_get_field_ic_miss(i64 %r73, i64 %r76, ptr @perry_ic_7) + br label %pic.merge.27 + +pic.merge.27: + %r139 = phi double [ %r137, %pic.hit.load.28 ], [ %r138, %pic.miss.26 ] + br label %pget.recv_merge.22 + +pic.hit.load.28: + call void @js_typed_feedback_record_guard_pass(i64 8601651645035577350) + %r133 = shl i64 %r125, 3 + %r134 = add i64 %r73, 32 + %r135 = add i64 %r134, %r133 + %r136 = inttoptr i64 %r135 to ptr + %r137 = load double, ptr %r136 + br label %pic.merge.27 + +pget.throw_nullish.29: + %r143 = zext i1 %r141 to i32 + call void @js_throw_type_error_property_access(i32 %r143, ptr @test_gap_7302_invoke_eh_paths_ts_.str.2.bytes, i64 7) + unreachable + +pget.recv_undef_return.30: + %r144 = call double @js_object_get_field_by_name_f64(i64 %r72, i64 %r76) + br label %pget.recv_merge.22 + +ss.slow.31: + call void @js_shadow_slot_set(i32 0, i64 0) + br label %ss.done.35 + +ss.chk_top.32: + %r151 = getelementptr inbounds i8, ptr %r149, i64 24 + %r152 = load i64, ptr %r151 + %r153 = icmp eq i64 %r152, -1 + br i1 %r153, label %ss.done.35, label %ss.chk_len.33 + +ss.chk_len.33: + %r154 = add i64 %r152, 0 + %r155 = getelementptr inbounds i8, ptr %r149, i64 8 + %r156 = load i64, ptr %r155 + %r157 = icmp ult i64 %r154, %r156 + br i1 %r157, label %ss.store.34, label %ss.done.35 + +ss.store.34: + %r158 = load ptr, ptr %r149 + %r159 = shl i64 %r154, 4 + %r160 = getelementptr inbounds i8, ptr %r158, i64 %r159 + %r161 = getelementptr inbounds i8, ptr %r160, i64 8 + %r162 = load i64, ptr %r161 + %r163 = and i64 %r162, -2 + store i64 0, ptr %r160 + store i64 %r163, ptr %r161 + br label %ss.done.35 + +ss.done.35: + %shadow_pop_l_1 = load i64, ptr %r1 + call void @js_shadow_frame_pop(i64 %shadow_pop_l_1) + ret double 0x7FFC000000000001 +} + +define double @perry_fn_test_gap_7302_invoke_eh_paths_ts__volatileHazard() alwaysinline personality ptr @perry_eh_personality { +entry.0: + %r1 = alloca double + store double 0x7FFC000000000001, ptr %r1 + %r2 = alloca double + store double 0x7FFC000000000001, ptr %r2 + store double 0.0, ptr %r1 + store double 0.0, ptr %r2 + br label %for.cond.1 + +for.cond.1: + %r3 = load double, ptr %r2 + %r4 = fcmp olt double %r3, 100.0 + %r5 = select i1 %r4, i64 9222246136947933188, i64 9222246136947933187 + %r6 = bitcast i64 %r5 to double + %r7 = icmp eq i64 %r5, 9222246136947933188 + br i1 %r7, label %for.body.2, label %for.exit.4 + +for.body.2: + %r8 = load double, ptr %r1 + %r9 = load double, ptr %r2 + %r10 = fadd double %r8, %r9 + store double %r10, ptr %r1 + br label %for.update.3 + +for.update.3: + %r11 = load double, ptr %r2 + %r12 = fadd double %r11, 1.0 + store double %r12, ptr %r2 + br label %for.cond.1 + +for.exit.4: + call void @js_eh_try_push() + br label %try.body.5 + +try.body.5: + store double 4141.0, ptr %r1 + %r14 = load double, ptr %r1 + %r15 = fadd double %r14, 800.0 + store double %r15, ptr %r1 + %r16 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.17.handle + %r17 = invoke i64 @js_error_new_from_value(double %r16) to label %eh.cont18 unwind label %eh.lpad.8 +eh.cont18: + %r19 = or i64 %r17, 9222527611924643840 + %r20 = bitcast i64 %r19 to double + invoke void @js_throw(double %r20) to label %eh.cont21 unwind label %eh.lpad.8 +eh.cont21: + unreachable + +try.catch.6: + call void @js_try_end() + %r22 = call double @js_get_exception() + call void @js_clear_exception() + %r23 = load double, ptr %r1 + %r24 = fadd double %r23, 1.0 + store double %r24, ptr %r1 + br label %try.finally.7 + +try.finally.7: + %r25 = load double, ptr %r1 + ret double %r25 + +eh.lpad.8: + %r13 = landingpad { ptr, i32 } catch ptr null + br label %try.catch.6 +} + +define double @perry_fn_test_gap_7302_invoke_eh_paths_ts__tryFinallyRepropagates() alwaysinline personality ptr @perry_eh_personality { +entry.0: + %r1 = alloca i64 + %r2 = alloca ptr + store ptr null, ptr %r2 + %r3 = call ptr @js_shadow_frame_enter(i32 1) + store ptr %r3, ptr %r2 + %r4 = getelementptr inbounds i8, ptr %r3, i64 24 + %r5 = load i64, ptr %r4 + %r6 = sub i64 %r5, 1 + store i64 %r6, ptr %r1 + %r40 = alloca double + call void @js_eh_try_push() + br label %try.body.1 + +try.body.1: + call void @js_eh_try_push() + br label %try.body.5 + +try.catch.2: + call void @js_try_end() + %r39 = call double @js_get_exception() + call void @js_clear_exception() + store double %r39, ptr %r40 + %r41 = load ptr, ptr %r2 + %r42 = icmp eq ptr %r41, null + br i1 %r42, label %ss.slow.9, label %ss.chk_top.10 + +try.finally.3: + %r141 = load ptr, ptr %r2 + %r142 = icmp eq ptr %r141, null + br i1 %r142, label %ss.slow.28, label %ss.chk_top.29 + +eh.lpad.4: + %r7 = landingpad { ptr, i32 } catch ptr null + br label %try.catch.2 + +try.body.5: + %r9 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.18.handle + %r10 = invoke i64 @js_error_new_from_value(double %r9) to label %eh.cont11 unwind label %eh.lpad.8 +eh.cont11: + %r12 = or i64 %r10, 9222527611924643840 + %r13 = bitcast i64 %r12 to double + invoke void @js_throw(double %r13) to label %eh.cont14 unwind label %eh.lpad.8 +eh.cont14: + unreachable + +try.catch.6: + call void @js_try_end() + %r15 = call double @js_get_exception() + %r16 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.19.handle + %r17 = bitcast double %r16 to i64 + %r18 = call i32 @js_gc_temp_root_push(i64 %r17) + %r19 = invoke i64 @js_array_alloc(i32 1) to label %eh.cont20 unwind label %eh.lpad.4 +eh.cont20: + %r21 = call i32 @js_gc_temp_root_push(i64 %r19) + %r22 = call i64 @js_gc_temp_root_get(i32 %r18) + %r23 = bitcast i64 %r22 to double + invoke void @js_array_push_f64_temp_rooted(i32 %r21, double %r23) to label %eh.cont24 unwind label %eh.lpad.4 +eh.cont24: + %r25 = call i64 @js_gc_temp_root_get(i32 %r21) + invoke void @js_console_log_spread(i64 %r25) to label %eh.cont26 unwind label %eh.lpad.4 +eh.cont26: + call void @js_gc_temp_root_truncate(i32 %r18) + invoke void @js_throw(double %r15) to label %eh.cont27 unwind label %eh.lpad.4 +eh.cont27: + unreachable + +try.finally.7: + %r28 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.19.handle + %r29 = bitcast double %r28 to i64 + %r30 = call i32 @js_gc_temp_root_push(i64 %r29) + %r31 = invoke i64 @js_array_alloc(i32 1) to label %eh.cont32 unwind label %eh.lpad.4 +eh.cont32: + %r33 = call i32 @js_gc_temp_root_push(i64 %r31) + %r34 = call i64 @js_gc_temp_root_get(i32 %r30) + %r35 = bitcast i64 %r34 to double + invoke void @js_array_push_f64_temp_rooted(i32 %r33, double %r35) to label %eh.cont36 unwind label %eh.lpad.4 +eh.cont36: + %r37 = call i64 @js_gc_temp_root_get(i32 %r33) + invoke void @js_console_log_spread(i64 %r37) to label %eh.cont38 unwind label %eh.lpad.4 +eh.cont38: + call void @js_gc_temp_root_truncate(i32 %r30) + call void @js_try_end() + br label %try.finally.3 + +eh.lpad.8: + %r8 = landingpad { ptr, i32 } catch ptr null + br label %try.catch.6 + +ss.slow.9: + call void @js_shadow_slot_bind(i32 0, ptr %r40) + br label %ss.done.13 + +ss.chk_top.10: + %r43 = getelementptr inbounds i8, ptr %r41, i64 24 + %r44 = load i64, ptr %r43 + %r45 = icmp eq i64 %r44, -1 + br i1 %r45, label %ss.done.13, label %ss.chk_len.11 + +ss.chk_len.11: + %r46 = add i64 %r44, 0 + %r47 = getelementptr inbounds i8, ptr %r41, i64 8 + %r48 = load i64, ptr %r47 + %r49 = icmp ult i64 %r46, %r48 + br i1 %r49, label %ss.store.12, label %ss.done.13 + +ss.store.12: + %r50 = load ptr, ptr %r41 + %r51 = shl i64 %r46, 4 + %r52 = getelementptr inbounds i8, ptr %r50, i64 %r51 + %r53 = getelementptr inbounds i8, ptr %r52, i64 8 + %r54 = load i64, ptr %r40 + %r55 = ptrtoint ptr %r40 to i64 + %r56 = and i64 %r55, 1 + %r57 = icmp eq i64 %r56, 0 + %r58 = select i1 %r57, i64 %r55, i64 0 + %r59 = or i64 %r58, 1 + store i64 %r54, ptr %r52 + store i64 %r59, ptr %r53 + %r60 = load atomic i32, ptr @PERRY_INCREMENTAL_MARK_BARRIER_ACTIVE_COUNT seq_cst, align 4 + %r61 = icmp ne i32 %r60, 0 + br i1 %r61, label %ss.barrier.14, label %ss.done.13 + +ss.done.13: + %r62 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.20.handle + %r63 = load double, ptr %r40 + %r64 = bitcast double %r63 to i64 + %r65 = and i64 %r64, 281474976710655 + %r66 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.2.handle + %r67 = bitcast double %r66 to i64 + %r68 = and i64 %r67, 281474976710655 + %r69 = lshr i64 %r64, 48 + %r70 = icmp eq i64 %r69, 32761 + %r71 = icmp eq i64 %r69, 32766 + %r72 = and i64 %r69, 65533 + %r73 = icmp eq i64 %r72, 32765 + br i1 %r70, label %pget.recv_sso.15, label %pget.check_class_ref.21 + +ss.barrier.14: + call void @js_write_barrier_root_nanbox(i64 %r54) + br label %ss.done.13 + +pget.recv_sso.15: + %r137 = call double @js_object_get_field_by_name_f64(i64 %r64, i64 %r68) + br label %pget.recv_merge.19 + +pget.recv_ok.16: + call void @js_typed_feedback_observe_property_get(i64 8601651645035577352, i64 %r65, i64 %r68) + %r75 = icmp ugt i64 %r65, 1048575 + %r76 = ptrtoint ptr @perry_ic_9 to i64 + %r77 = select i1 %r75, i64 %r65, i64 %r76 + %r78 = sub i64 %r77, 8 + %r79 = inttoptr i64 %r78 to ptr + %r80 = load i8, ptr %r79 + %r81 = icmp eq i8 %r80, 2 + %r82 = and i1 %r75, %r81 + %r83 = add i64 %r77, 12 + %r84 = inttoptr i64 %r83 to ptr + %r85 = load i32, ptr %r84 + %r86 = icmp eq i32 %r85, 1129268819 + %r87 = xor i1 %r86, true + %r88 = and i1 %r82, %r87 + %r89 = inttoptr i64 %r77 to ptr + %r90 = load i32, ptr %r89 + %r91 = icmp eq i32 %r90, 1 + %r92 = and i1 %r88, %r91 + %r93 = sub i64 %r77, 6 + %r94 = inttoptr i64 %r93 to ptr + %r95 = load i16, ptr %r94 + %r96 = and i16 %r95, 2048 + %r97 = icmp eq i16 %r96, 0 + %r98 = and i1 %r92, %r97 + %r99 = add i64 %r77, 16 + %r100 = inttoptr i64 %r99 to ptr + %r101 = load i64, ptr %r100 + %r102 = add i64 %r77, 8 + %r103 = inttoptr i64 %r102 to ptr + %r104 = load i32, ptr %r103 + %r105 = add i32 %r104, -2147483648 + %r106 = icmp ult i32 %r105, 1073741824 + %r107 = zext i32 %r104 to i64 + %r108 = or i64 %r107, 4611686018427387904 + %r109 = select i1 %r106, i64 %r108, i64 %r101 + %r110 = getelementptr i64, ptr @perry_ic_9, i64 0 + %r111 = load i64, ptr %r110 + %r112 = icmp eq i64 %r109, %r111 + %r113 = icmp ne i64 %r109, 0 + %r114 = and i1 %r98, %r112 + %r115 = and i1 %r114, %r113 + br i1 %r115, label %pic.hit.22, label %pic.miss.23 + +pget.recv_bad.17: + %r132 = icmp eq i64 %r64, 9222246136947933185 + %r133 = icmp eq i64 %r64, 9222246136947933186 + %r134 = or i1 %r132, %r133 + br i1 %r134, label %pget.throw_nullish.26, label %pget.recv_undef_return.27 + +pget.recv_class_ref.18: + %r74 = call double @js_typed_feedback_object_get_field_by_name_f64(i64 8601651645035577352, i64 %r64, i64 %r68) + br label %pget.recv_merge.19 + +pget.recv_merge.19: + %r138 = phi double [ %r131, %pic.merge.24 ], [ %r136, %pget.recv_undef_return.27 ], [ %r137, %pget.recv_sso.15 ], [ %r74, %pget.recv_class_ref.18 ] + %r139 = load double, ptr @test_gap_7302_invoke_eh_paths_ts_.str.20.handle + %r140 = call double @js_dynamic_string_or_number_add(double %r139, double %r138) + %shadow_pop_l_0 = load i64, ptr %r1 + call void @js_shadow_frame_pop(i64 %shadow_pop_l_0) + ret double %r140 + +pget.check_ptr.20: + br i1 %r73, label %pget.recv_ok.16, label %pget.recv_bad.17 + +pget.check_class_ref.21: + br i1 %r71, label %pget.recv_class_ref.18, label %pget.check_ptr.20 + +pic.hit.22: + %r116 = getelementptr i64, ptr @perry_ic_9, i64 1 + %r117 = load i64, ptr %r116 + %r118 = add i64 %r77, 12 + %r119 = inttoptr i64 %r118 to ptr + %r120 = load i32, ptr %r119 + %r121 = zext i32 %r120 to i64 + %r122 = icmp ult i64 %r121, 4 + %r123 = select i1 %r122, i64 4, i64 %r121 + %r124 = icmp ult i64 %r117, %r123 + br i1 %r124, label %pic.hit.load.25, label %pic.miss.23 + +pic.miss.23: + call void @js_typed_feedback_record_guard_fail(i64 8601651645035577352) + call void @js_typed_feedback_record_fallback_call(i64 8601651645035577352) + %r130 = call double @js_object_get_field_ic_miss(i64 %r65, i64 %r68, ptr @perry_ic_9) + br label %pic.merge.24 + +pic.merge.24: + %r131 = phi double [ %r129, %pic.hit.load.25 ], [ %r130, %pic.miss.23 ] + br label %pget.recv_merge.19 + +pic.hit.load.25: + call void @js_typed_feedback_record_guard_pass(i64 8601651645035577352) + %r125 = shl i64 %r117, 3 + %r126 = add i64 %r65, 32 + %r127 = add i64 %r126, %r125 + %r128 = inttoptr i64 %r127 to ptr + %r129 = load double, ptr %r128 + br label %pic.merge.24 + +pget.throw_nullish.26: + %r135 = zext i1 %r133 to i32 + call void @js_throw_type_error_property_access(i32 %r135, ptr @test_gap_7302_invoke_eh_paths_ts_.str.2.bytes, i64 7) + unreachable + +pget.recv_undef_return.27: + %r136 = call double @js_object_get_field_by_name_f64(i64 %r64, i64 %r68) + br label %pget.recv_merge.19 + +ss.slow.28: + call void @js_shadow_slot_set(i32 0, i64 0) + br label %ss.done.32 + +ss.chk_top.29: + %r143 = getelementptr inbounds i8, ptr %r141, i64 24 + %r144 = load i64, ptr %r143 + %r145 = icmp eq i64 %r144, -1 + br i1 %r145, label %ss.done.32, label %ss.chk_len.30 + +ss.chk_len.30: + %r146 = add i64 %r144, 0 + %r147 = getelementptr inbounds i8, ptr %r141, i64 8 + %r148 = load i64, ptr %r147 + %r149 = icmp ult i64 %r146, %r148 + br i1 %r149, label %ss.store.31, label %ss.done.32 + +ss.store.31: + %r150 = load ptr, ptr %r141 + %r151 = shl i64 %r146, 4 + %r152 = getelementptr inbounds i8, ptr %r150, i64 %r151 + %r153 = getelementptr inbounds i8, ptr %r152, i64 8 + %r154 = load i64, ptr %r153 + %r155 = and i64 %r154, -2 + store i64 0, ptr %r152 + store i64 %r155, ptr %r153 + br label %ss.done.32 + +ss.done.32: + %shadow_pop_l_1 = load i64, ptr %r1 + call void @js_shadow_frame_pop(i64 %shadow_pop_l_1) + ret double 0x7FFC000000000001 +} + +define double @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__basic(i64 %this_closure) { +entry.0: + %r1 = call double @perry_fn_test_gap_7302_invoke_eh_paths_ts__basic() + ret double %r1 +} + +define double @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__finBoth(i64 %this_closure, double %a0) { +entry.0: + %r1 = call double @perry_fn_test_gap_7302_invoke_eh_paths_ts__finBoth(double %a0) + ret double %r1 +} + +define double @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__nestedRethrow(i64 %this_closure) { +entry.0: + %r1 = call double @perry_fn_test_gap_7302_invoke_eh_paths_ts__nestedRethrow() + ret double %r1 +} + +define double @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__retInTry(i64 %this_closure) { +entry.0: + %r1 = call double @perry_fn_test_gap_7302_invoke_eh_paths_ts__retInTry() + ret double %r1 +} + +define double @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__catchFinallyFail(i64 %this_closure) { +entry.0: + %r1 = call double @perry_fn_test_gap_7302_invoke_eh_paths_ts__catchFinallyFail() + ret double %r1 +} + +define double @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__volatileHazard(i64 %this_closure) { +entry.0: + %r1 = call double @perry_fn_test_gap_7302_invoke_eh_paths_ts__volatileHazard() + ret double %r1 +} + +define double @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__tryFinallyRepropagates(i64 %this_closure) { +entry.0: + %r1 = call double @perry_fn_test_gap_7302_invoke_eh_paths_ts__tryFinallyRepropagates() + ret double %r1 +} + +define internal double @__perry_wrap_perry_unknown_func(i64 %this_closure, double %a0, double %a1, double %a2, double %a3, double %a4) { +entry.0: + ret double 0x7FFC000000000001 +} + +define void @test_gap_7302_invoke_eh_paths_ts__init() { +entry.0: + ret void +} + +define i32 @main() { +entry.0: + call void @js_gc_init() + call void @js_gc_write_barriers_emitted(i32 1) + call void @perry_macos_bundle_chdir() + call void @__perry_init_strings_test_gap_7302_invoke_eh_paths_ts() + %r1 = call double @perry_fn_test_gap_7302_invoke_eh_paths_ts__basic() + %r2 = bitcast double %r1 to i64 + %r3 = call i32 @js_gc_temp_root_push(i64 %r2) + %r4 = call i64 @js_array_alloc(i32 1) + %r5 = call i32 @js_gc_temp_root_push(i64 %r4) + %r6 = call i64 @js_gc_temp_root_get(i32 %r3) + %r7 = bitcast i64 %r6 to double + call void @js_array_push_f64_temp_rooted(i32 %r5, double %r7) + %r8 = call i64 @js_gc_temp_root_get(i32 %r5) + call void @js_console_log_spread(i64 %r8) + call void @js_gc_temp_root_truncate(i32 %r3) + %r9 = call i64 @js_array_alloc(i32 2) + %r10 = call i32 @js_gc_temp_root_push(i64 %r9) + %r11 = select i1 true, i64 9222246136947933188, i64 9222246136947933187 + %r12 = bitcast i64 %r11 to double + %r13 = call double @perry_fn_test_gap_7302_invoke_eh_paths_ts__finBoth(double %r12) + call void @js_array_push_f64_temp_rooted(i32 %r10, double %r13) + %r14 = select i1 false, i64 9222246136947933188, i64 9222246136947933187 + %r15 = bitcast i64 %r14 to double + %r16 = call double @perry_fn_test_gap_7302_invoke_eh_paths_ts__finBoth(double %r15) + call void @js_array_push_f64_temp_rooted(i32 %r10, double %r16) + %r17 = call i64 @js_gc_temp_root_get(i32 %r10) + call void @js_console_log_spread(i64 %r17) + call void @js_gc_temp_root_truncate(i32 %r10) + %r18 = call double @perry_fn_test_gap_7302_invoke_eh_paths_ts__nestedRethrow() + %r19 = bitcast double %r18 to i64 + %r20 = call i32 @js_gc_temp_root_push(i64 %r19) + %r21 = call i64 @js_array_alloc(i32 1) + %r22 = call i32 @js_gc_temp_root_push(i64 %r21) + %r23 = call i64 @js_gc_temp_root_get(i32 %r20) + %r24 = bitcast i64 %r23 to double + call void @js_array_push_f64_temp_rooted(i32 %r22, double %r24) + %r25 = call i64 @js_gc_temp_root_get(i32 %r22) + call void @js_console_log_spread(i64 %r25) + call void @js_gc_temp_root_truncate(i32 %r20) + %r26 = call double @perry_fn_test_gap_7302_invoke_eh_paths_ts__retInTry() + %r27 = bitcast double %r26 to i64 + %r28 = call i32 @js_gc_temp_root_push(i64 %r27) + %r29 = call i64 @js_array_alloc(i32 1) + %r30 = call i32 @js_gc_temp_root_push(i64 %r29) + %r31 = call i64 @js_gc_temp_root_get(i32 %r28) + %r32 = bitcast i64 %r31 to double + call void @js_array_push_f64_temp_rooted(i32 %r30, double %r32) + %r33 = call i64 @js_gc_temp_root_get(i32 %r30) + call void @js_console_log_spread(i64 %r33) + call void @js_gc_temp_root_truncate(i32 %r28) + %r34 = call double @perry_fn_test_gap_7302_invoke_eh_paths_ts__catchFinallyFail() + %r35 = bitcast double %r34 to i64 + %r36 = call i32 @js_gc_temp_root_push(i64 %r35) + %r37 = call i64 @js_array_alloc(i32 1) + %r38 = call i32 @js_gc_temp_root_push(i64 %r37) + %r39 = call i64 @js_gc_temp_root_get(i32 %r36) + %r40 = bitcast i64 %r39 to double + call void @js_array_push_f64_temp_rooted(i32 %r38, double %r40) + %r41 = call i64 @js_gc_temp_root_get(i32 %r38) + call void @js_console_log_spread(i64 %r41) + call void @js_gc_temp_root_truncate(i32 %r36) + %r42 = call double @perry_fn_test_gap_7302_invoke_eh_paths_ts__volatileHazard() + %r43 = bitcast double %r42 to i64 + %r44 = call i32 @js_gc_temp_root_push(i64 %r43) + %r45 = call i64 @js_array_alloc(i32 1) + %r46 = call i32 @js_gc_temp_root_push(i64 %r45) + %r47 = call i64 @js_gc_temp_root_get(i32 %r44) + %r48 = bitcast i64 %r47 to double + call void @js_array_push_f64_temp_rooted(i32 %r46, double %r48) + %r49 = call i64 @js_gc_temp_root_get(i32 %r46) + call void @js_console_log_spread(i64 %r49) + call void @js_gc_temp_root_truncate(i32 %r44) + %r50 = call double @perry_fn_test_gap_7302_invoke_eh_paths_ts__tryFinallyRepropagates() + %r51 = bitcast double %r50 to i64 + %r52 = call i32 @js_gc_temp_root_push(i64 %r51) + %r53 = call i64 @js_array_alloc(i32 1) + %r54 = call i32 @js_gc_temp_root_push(i64 %r53) + %r55 = call i64 @js_gc_temp_root_get(i32 %r52) + %r56 = bitcast i64 %r55 to double + call void @js_array_push_f64_temp_rooted(i32 %r54, double %r56) + %r57 = call i64 @js_gc_temp_root_get(i32 %r54) + call void @js_console_log_spread(i64 %r57) + call void @js_gc_temp_root_truncate(i32 %r52) + %r58 = call i32 @js_promise_run_microtasks_event_loop() + %r59 = call i32 @js_timer_tick_if_refed() + %r60 = call i32 @js_callback_timer_tick() + %r61 = call i32 @js_interval_timer_tick() + %r62 = call i32 @js_promise_run_microtasks_event_loop() + %r63 = call i32 @js_timer_tick_if_refed() + %r64 = call i32 @js_callback_timer_tick() + %r65 = call i32 @js_interval_timer_tick() + %r66 = call i32 @js_promise_run_microtasks_event_loop() + %r67 = call i32 @js_timer_tick_if_refed() + %r68 = call i32 @js_callback_timer_tick() + %r69 = call i32 @js_interval_timer_tick() + %r70 = call i32 @js_promise_run_microtasks_event_loop() + %r71 = call i32 @js_timer_tick_if_refed() + %r72 = call i32 @js_callback_timer_tick() + %r73 = call i32 @js_interval_timer_tick() + call void @js_run_stdlib_pump() + br label %event_loop.header.1 + +event_loop.header.1: + %r74 = call i32 @js_event_loop_host_driven() + %r75 = icmp ne i32 %r74, 0 + br i1 %r75, label %event_loop.host_return.3, label %event_loop.check_pending.2 + +event_loop.check_pending.2: + %r76 = call i32 @js_timer_has_pending() + %r77 = call i32 @js_callback_timer_has_pending() + %r78 = call i32 @js_interval_timer_has_pending() + %r79 = call i32 @js_stdlib_has_active_handles() + %r80 = call i32 @js_microtasks_pending() + %r81 = or i32 %r76, %r77 + %r82 = or i32 %r78, %r79 + %r83 = or i32 %r81, %r82 + %r84 = or i32 %r83, 0 + %r85 = or i32 %r84, %r80 + %r86 = icmp ne i32 %r85, 0 + br i1 %r86, label %event_loop.body.4, label %event_loop.exit.5 + +event_loop.host_return.3: + call void @js_typed_feedback_maybe_dump_trace() + ret i32 0 + +event_loop.body.4: + %r87 = call i32 @js_promise_run_microtasks_event_loop() + %r88 = call i32 @js_timer_tick() + %r89 = call i32 @js_callback_timer_tick() + %r90 = call i32 @js_interval_timer_tick() + call void @js_run_stdlib_pump() + call void @js_wait_for_event() + br label %event_loop.header.1 + +event_loop.exit.5: + call void @js_process_emit_before_exit(double 0x0) + %r91 = call i32 @js_promise_run_microtasks_event_loop() + %r92 = call i32 @js_timer_tick_if_refed() + %r93 = call i32 @js_callback_timer_tick() + %r94 = call i32 @js_interval_timer_tick() + call void @js_process_run_finalization_exit() + call void @js_trace_events_flush_output() + call void @js_promise_report_unhandled_rejections() + call void @js_gc_release_current_thread_collection_side_allocations() + %r95 = call i32 @js_process_pending_exit_code() + call void @js_typed_feedback_maybe_dump_trace() + ret i32 %r95 +} + +define void @__perry_init_strings_test_gap_7302_invoke_eh_paths_ts_chunk0() { +entry.0: + %r1 = call i64 @js_string_from_bytes(ptr @test_gap_7302_invoke_eh_paths_ts_.str.0.bytes, i32 4) + %r2 = call double @js_nanbox_string(i64 %r1) + store double %r2, ptr @test_gap_7302_invoke_eh_paths_ts_.str.0.handle + %r3 = ptrtoint ptr @test_gap_7302_invoke_eh_paths_ts_.str.0.handle to i64 + call void @js_gc_register_global_root(i64 %r3) + %r4 = call i64 @js_string_from_bytes(ptr @test_gap_7302_invoke_eh_paths_ts_.str.1.bytes, i32 7) + %r5 = call double @js_nanbox_string(i64 %r4) + store double %r5, ptr @test_gap_7302_invoke_eh_paths_ts_.str.1.handle + %r6 = ptrtoint ptr @test_gap_7302_invoke_eh_paths_ts_.str.1.handle to i64 + call void @js_gc_register_global_root(i64 %r6) + %r7 = call i64 @js_string_from_bytes(ptr @test_gap_7302_invoke_eh_paths_ts_.str.2.bytes, i32 7) + %r8 = call double @js_nanbox_string(i64 %r7) + store double %r8, ptr @test_gap_7302_invoke_eh_paths_ts_.str.2.handle + %r9 = ptrtoint ptr @test_gap_7302_invoke_eh_paths_ts_.str.2.handle to i64 + call void @js_gc_register_global_root(i64 %r9) + %r10 = call i64 @js_string_from_bytes(ptr @test_gap_7302_invoke_eh_paths_ts_.str.3.bytes, i32 0) + %r11 = call double @js_nanbox_string(i64 %r10) + store double %r11, ptr @test_gap_7302_invoke_eh_paths_ts_.str.3.handle + %r12 = ptrtoint ptr @test_gap_7302_invoke_eh_paths_ts_.str.3.handle to i64 + call void @js_gc_register_global_root(i64 %r12) + %r13 = call i64 @js_string_from_bytes(ptr @test_gap_7302_invoke_eh_paths_ts_.str.4.bytes, i32 1) + %r14 = call double @js_nanbox_string(i64 %r13) + store double %r14, ptr @test_gap_7302_invoke_eh_paths_ts_.str.4.handle + %r15 = ptrtoint ptr @test_gap_7302_invoke_eh_paths_ts_.str.4.handle to i64 + call void @js_gc_register_global_root(i64 %r15) + %r16 = call i64 @js_string_from_bytes(ptr @test_gap_7302_invoke_eh_paths_ts_.str.5.bytes, i32 1) + %r17 = call double @js_nanbox_string(i64 %r16) + store double %r17, ptr @test_gap_7302_invoke_eh_paths_ts_.str.5.handle + %r18 = ptrtoint ptr @test_gap_7302_invoke_eh_paths_ts_.str.5.handle to i64 + call void @js_gc_register_global_root(i64 %r18) + %r19 = call i64 @js_string_from_bytes(ptr @test_gap_7302_invoke_eh_paths_ts_.str.6.bytes, i32 1) + %r20 = call double @js_nanbox_string(i64 %r19) + store double %r20, ptr @test_gap_7302_invoke_eh_paths_ts_.str.6.handle + %r21 = ptrtoint ptr @test_gap_7302_invoke_eh_paths_ts_.str.6.handle to i64 + call void @js_gc_register_global_root(i64 %r21) + %r22 = call i64 @js_string_from_bytes(ptr @test_gap_7302_invoke_eh_paths_ts_.str.7.bytes, i32 1) + %r23 = call double @js_nanbox_string(i64 %r22) + store double %r23, ptr @test_gap_7302_invoke_eh_paths_ts_.str.7.handle + %r24 = ptrtoint ptr @test_gap_7302_invoke_eh_paths_ts_.str.7.handle to i64 + call void @js_gc_register_global_root(i64 %r24) + %r25 = call i64 @js_string_from_bytes(ptr @test_gap_7302_invoke_eh_paths_ts_.str.8.bytes, i32 1) + %r26 = call double @js_nanbox_string(i64 %r25) + store double %r26, ptr @test_gap_7302_invoke_eh_paths_ts_.str.8.handle + %r27 = ptrtoint ptr @test_gap_7302_invoke_eh_paths_ts_.str.8.handle to i64 + call void @js_gc_register_global_root(i64 %r27) + %r28 = call i64 @js_string_from_bytes(ptr @test_gap_7302_invoke_eh_paths_ts_.str.9.bytes, i32 5) + %r29 = call double @js_nanbox_string(i64 %r28) + store double %r29, ptr @test_gap_7302_invoke_eh_paths_ts_.str.9.handle + %r30 = ptrtoint ptr @test_gap_7302_invoke_eh_paths_ts_.str.9.handle to i64 + call void @js_gc_register_global_root(i64 %r30) + %r31 = call i64 @js_string_from_bytes(ptr @test_gap_7302_invoke_eh_paths_ts_.str.10.bytes, i32 6) + %r32 = call double @js_nanbox_string(i64 %r31) + store double %r32, ptr @test_gap_7302_invoke_eh_paths_ts_.str.10.handle + %r33 = ptrtoint ptr @test_gap_7302_invoke_eh_paths_ts_.str.10.handle to i64 + call void @js_gc_register_global_root(i64 %r33) + %r34 = call i64 @js_string_from_bytes(ptr @test_gap_7302_invoke_eh_paths_ts_.str.11.bytes, i32 4) + %r35 = call double @js_nanbox_string(i64 %r34) + store double %r35, ptr @test_gap_7302_invoke_eh_paths_ts_.str.11.handle + %r36 = ptrtoint ptr @test_gap_7302_invoke_eh_paths_ts_.str.11.handle to i64 + call void @js_gc_register_global_root(i64 %r36) + %r37 = call i64 @js_string_from_bytes(ptr @test_gap_7302_invoke_eh_paths_ts_.str.12.bytes, i32 12) + %r38 = call double @js_nanbox_string(i64 %r37) + store double %r38, ptr @test_gap_7302_invoke_eh_paths_ts_.str.12.handle + %r39 = ptrtoint ptr @test_gap_7302_invoke_eh_paths_ts_.str.12.handle to i64 + call void @js_gc_register_global_root(i64 %r39) + %r40 = call i64 @js_string_from_bytes(ptr @test_gap_7302_invoke_eh_paths_ts_.str.13.bytes, i32 1) + %r41 = call double @js_nanbox_string(i64 %r40) + store double %r41, ptr @test_gap_7302_invoke_eh_paths_ts_.str.13.handle + %r42 = ptrtoint ptr @test_gap_7302_invoke_eh_paths_ts_.str.13.handle to i64 + call void @js_gc_register_global_root(i64 %r42) + %r43 = call i64 @js_string_from_bytes(ptr @test_gap_7302_invoke_eh_paths_ts_.str.14.bytes, i32 1) + %r44 = call double @js_nanbox_string(i64 %r43) + store double %r44, ptr @test_gap_7302_invoke_eh_paths_ts_.str.14.handle + %r45 = ptrtoint ptr @test_gap_7302_invoke_eh_paths_ts_.str.14.handle to i64 + call void @js_gc_register_global_root(i64 %r45) + %r46 = call i64 @js_string_from_bytes(ptr @test_gap_7302_invoke_eh_paths_ts_.str.15.bytes, i32 10) + %r47 = call double @js_nanbox_string(i64 %r46) + store double %r47, ptr @test_gap_7302_invoke_eh_paths_ts_.str.15.handle + %r48 = ptrtoint ptr @test_gap_7302_invoke_eh_paths_ts_.str.15.handle to i64 + call void @js_gc_register_global_root(i64 %r48) + %r49 = call i64 @js_string_from_bytes(ptr @test_gap_7302_invoke_eh_paths_ts_.str.16.bytes, i32 13) + %r50 = call double @js_nanbox_string(i64 %r49) + store double %r50, ptr @test_gap_7302_invoke_eh_paths_ts_.str.16.handle + %r51 = ptrtoint ptr @test_gap_7302_invoke_eh_paths_ts_.str.16.handle to i64 + call void @js_gc_register_global_root(i64 %r51) + %r52 = call i64 @js_string_from_bytes(ptr @test_gap_7302_invoke_eh_paths_ts_.str.17.bytes, i32 4) + %r53 = call double @js_nanbox_string(i64 %r52) + store double %r53, ptr @test_gap_7302_invoke_eh_paths_ts_.str.17.handle + %r54 = ptrtoint ptr @test_gap_7302_invoke_eh_paths_ts_.str.17.handle to i64 + call void @js_gc_register_global_root(i64 %r54) + %r55 = call i64 @js_string_from_bytes(ptr @test_gap_7302_invoke_eh_paths_ts_.str.18.bytes, i32 7) + %r56 = call double @js_nanbox_string(i64 %r55) + store double %r56, ptr @test_gap_7302_invoke_eh_paths_ts_.str.18.handle + %r57 = ptrtoint ptr @test_gap_7302_invoke_eh_paths_ts_.str.18.handle to i64 + call void @js_gc_register_global_root(i64 %r57) + %r58 = call i64 @js_string_from_bytes(ptr @test_gap_7302_invoke_eh_paths_ts_.str.19.bytes, i32 10) + %r59 = call double @js_nanbox_string(i64 %r58) + store double %r59, ptr @test_gap_7302_invoke_eh_paths_ts_.str.19.handle + %r60 = ptrtoint ptr @test_gap_7302_invoke_eh_paths_ts_.str.19.handle to i64 + call void @js_gc_register_global_root(i64 %r60) + %r61 = call i64 @js_string_from_bytes(ptr @test_gap_7302_invoke_eh_paths_ts_.str.20.bytes, i32 13) + %r62 = call double @js_nanbox_string(i64 %r61) + store double %r62, ptr @test_gap_7302_invoke_eh_paths_ts_.str.20.handle + %r63 = ptrtoint ptr @test_gap_7302_invoke_eh_paths_ts_.str.20.handle to i64 + call void @js_gc_register_global_root(i64 %r63) + call void @js_register_function_name(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__basic, ptr @.str.0, i32 5) + call void @js_register_function_name(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__finBoth, ptr @.str.1, i32 7) + call void @js_register_function_name(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__nestedRethrow, ptr @.str.2, i32 13) + call void @js_register_function_name(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__retInTry, ptr @.str.3, i32 8) + call void @js_register_function_name(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__catchFinallyFail, ptr @.str.4, i32 16) + call void @js_register_function_name(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__volatileHazard, ptr @.str.5, i32 14) + call void @js_register_function_name(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__tryFinallyRepropagates, ptr @.str.6, i32 22) + call void @js_register_function_source(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__basic, ptr @.str.7, i32 130) + call void @js_register_function_source(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__finBoth, ptr @.str.8, i32 205) + call void @js_register_function_source(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__nestedRethrow, ptr @.str.9, i32 221) + call void @js_register_function_source(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__retInTry, ptr @.str.10, i32 169) + call void @js_register_function_source(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__catchFinallyFail, ptr @.str.11, i32 253) + call void @js_register_function_source(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__volatileHazard, ptr @.str.12, i32 217) + call void @js_register_function_source(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__tryFinallyRepropagates, ptr @.str.13, i32 223) + call void @js_register_closure_arity(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__basic, i32 0) + call void @js_register_closure_arity(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__catchFinallyFail, i32 0) + call void @js_register_closure_arity(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__finBoth, i32 1) + call void @js_register_closure_arity(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__nestedRethrow, i32 0) + call void @js_register_closure_arity(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__retInTry, i32 0) + call void @js_register_closure_arity(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__tryFinallyRepropagates, i32 0) + call void @js_register_closure_arity(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__volatileHazard, i32 0) + call void @js_register_closure_length(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__basic, i32 0) + call void @js_register_closure_length(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__catchFinallyFail, i32 0) + call void @js_register_closure_length(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__finBoth, i32 1) + call void @js_register_closure_length(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__nestedRethrow, i32 0) + call void @js_register_closure_length(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__retInTry, i32 0) + call void @js_register_closure_length(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__tryFinallyRepropagates, i32 0) + call void @js_register_closure_length(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__volatileHazard, i32 0) + call void @js_register_closure_strict_function(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__basic) + call void @js_register_closure_strict_function(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__catchFinallyFail) + call void @js_register_closure_strict_function(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__finBoth) + call void @js_register_closure_strict_function(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__nestedRethrow) + call void @js_register_closure_strict_function(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__retInTry) + call void @js_register_closure_strict_function(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__tryFinallyRepropagates) + call void @js_register_closure_strict_function(ptr @__perry_wrap_perry_fn_test_gap_7302_invoke_eh_paths_ts__volatileHazard) + ret void +} + +define void @__perry_init_strings_test_gap_7302_invoke_eh_paths_ts() { +entry.0: + call void @__perry_init_strings_test_gap_7302_invoke_eh_paths_ts_chunk0() + ret void +} + + +attributes #2 = { nounwind willreturn readnone } + +attributes #3 = { nounwind willreturn readonly } + +attributes #4 = { nounwind willreturn } + +!0 = !{} From 4049aa7cb3e60f27f44218ae133098e28bdc2fd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralph=20K=C3=BCpper?= Date: Mon, 3 Aug 2026 14:39:43 +0200 Subject: [PATCH 2/2] refactor(dialect): split reader into mod/eh/tests for the 2000-line cap The EH constructors pushed dialect.rs to 2153 lines. Splits the invoke/ landingpad construction into dialect/eh.rs and the reader tests into dialect/tests.rs; mod.rs lands at 1947. --- crates/perry-codegen/src/dialect/eh.rs | 128 +++++++++++ .../src/{dialect.rs => dialect/mod.rs} | 215 +----------------- crates/perry-codegen/src/dialect/tests.rs | 101 ++++++++ 3 files changed, 233 insertions(+), 211 deletions(-) create mode 100644 crates/perry-codegen/src/dialect/eh.rs rename crates/perry-codegen/src/{dialect.rs => dialect/mod.rs} (90%) create mode 100644 crates/perry-codegen/src/dialect/tests.rs diff --git a/crates/perry-codegen/src/dialect/eh.rs b/crates/perry-codegen/src/dialect/eh.rs new file mode 100644 index 0000000000..ed7eb26727 --- /dev/null +++ b/crates/perry-codegen/src/dialect/eh.rs @@ -0,0 +1,128 @@ +//! Exception-handling instruction construction for the in-process LLVM +//! reader (#7302): `invoke` edges and `landingpad`. +//! +//! Split out of `dialect/mod.rs` to keep that file under the 2000-line +//! cap; these are the forms Perry's try/catch lowering emits, and they +//! share the parent reader's state (block map, value map, builder). + +use anyhow::{anyhow, bail, Result}; +use inkwell::values::BasicValueEnum; +use inkwell::AddressSpace; + +use super::{ + basic_type, be, indirect_fn_type, rmatch_paren, split_top_level, ty_and_val, unquote, FnReader, +}; + +impl<'ctx, 'm> FnReader<'ctx, 'm> { + /// `[%r =] invoke TY @callee(ARGS) to label %CONT unwind label %PAD` + /// (#7302). Shares the callsite-typed, call-through-pointer semantics + /// of [`call`]; the only additions are the two edges. + pub(super) fn invoke( + &mut self, + dst: Option<&str>, + rest: &str, + ) -> Result>> { + let to_pos = rest + .rfind(" to label %") + .ok_or_else(|| anyhow!("invoke without `to label`"))?; + let head = &rest[..to_pos]; + let edges = &rest[to_pos + " to label %".len()..]; + let (cont_label, unwind_label) = edges + .split_once(" unwind label %") + .ok_or_else(|| anyhow!("invoke without `unwind label`"))?; + let cont = self.block(cont_label.trim()); + let pad = self.block(unwind_label.trim()); + + let callee_pos = head + .find(['@', '%']) + .ok_or_else(|| anyhow!("invoke without callee"))?; + let sig_str = head[..callee_pos].trim().trim_end_matches('*').trim(); + let after = &head[callee_pos..]; + let paren = after + .find('(') + .ok_or_else(|| anyhow!("invoke missing arg list"))?; + let callee = &after[..paren]; + let close = rmatch_paren(after, paren)?; + let args_str = &after[paren + 1..close]; + + // `build_indirect_invoke` takes basic values (not metadata enums + // like the call path), so collect both shapes once. + let mut args: Vec = Vec::new(); + let mut arg_types: Vec = Vec::new(); + for a in split_top_level(args_str) { + let (aty, atok) = ty_and_val(&a)?; + let ty = basic_type(self.ctx, aty)?; + args.push(self.val(ty, atok)?); + arg_types.push(ty.into()); + } + + let name = dst.map(|d| d.trim_start_matches('%')).unwrap_or(""); + let fn_ty = indirect_fn_type(self.ctx, sig_str, &arg_types)?; + let callee_ptr = if let Some(fname) = callee.strip_prefix('@') { + let n = unquote(fname); + let f = match self.module.get_function(&n) { + Some(f) => f, + None if n.starts_with("llvm.") => self.module.add_function(&n, fn_ty, None), + None => bail!("invoke of undeclared @{n}"), + }; + f.as_global_value().as_pointer_value() + } else { + self.val(self.ctx.ptr_type(AddressSpace::default()).into(), callee)? + .into_pointer_value() + }; + let site = self + .builder + .build_indirect_invoke(fn_ty, callee_ptr, &args, cont, pad, name) + .map_err(be)?; + // An invoke terminates its block; the emitted text continues in + // the inline continuation label, which arrives as the next line. + match site.try_as_basic_value() { + inkwell::values::ValueKind::Basic(v) => { + if let Some(d) = dst { + self.vals.insert(d.trim().to_string(), v); + } + Ok(Some(v)) + } + _ => Ok(None), + } + } + + /// `%r = landingpad { ptr, i32 } catch ptr null` (#7302). Perry emits + /// exactly one shape — a catch-all pad whose `{ptr, i32}` result is + /// unused (the thrown value comes from the runtime's rooted TLS slot), + /// so anything else is a dialect drift and bails loudly. + pub(super) fn landingpad(&mut self, dst: &str, rest: &str) -> Result<()> { + let body = rest.trim(); + let clause_pos = body + .find("catch") + .ok_or_else(|| anyhow!("landingpad without a catch clause: {body}"))?; + let ty_tok = body[..clause_pos].trim(); + if ty_tok.replace(' ', "") != "{ptr,i32}" { + bail!("unexpected landingpad type `{ty_tok}`"); + } + if body[clause_pos..].replace(' ', "") != "catchptrnull" { + bail!("unexpected landingpad clauses `{}`", &body[clause_pos..]); + } + let pf = self + .func + .get_personality_function() + .ok_or_else(|| anyhow!("landingpad in a function with no personality"))?; + let ptr_ty = self.ctx.ptr_type(AddressSpace::default()); + let exc_ty = self + .ctx + .struct_type(&[ptr_ty.into(), self.ctx.i32_type().into()], false); + let null = ptr_ty.const_null(); + let v = self + .builder + .build_landing_pad( + exc_ty, + pf, + &[null.into()], + false, + dst.trim_start_matches('%'), + ) + .map_err(be)?; + self.vals.insert(dst.trim().to_string(), v); + Ok(()) + } +} diff --git a/crates/perry-codegen/src/dialect.rs b/crates/perry-codegen/src/dialect/mod.rs similarity index 90% rename from crates/perry-codegen/src/dialect.rs rename to crates/perry-codegen/src/dialect/mod.rs index ad3260c36e..c47fee4d8e 100644 --- a/crates/perry-codegen/src/dialect.rs +++ b/crates/perry-codegen/src/dialect/mod.rs @@ -26,6 +26,10 @@ use inkwell::values::{ }; use inkwell::{AddressSpace, FloatPredicate, IntPredicate}; +mod eh; +#[cfg(test)] +mod tests; + /// Create (only) the function declaration for `fn_text`'s define header, so /// later-defined functions are callable while earlier bodies are read. The /// native path pre-declares every define before reading any body — calls to @@ -784,114 +788,6 @@ impl<'ctx, 'm> FnReader<'ctx, 'm> { } } - /// `[%r =] invoke TY @callee(ARGS) to label %CONT unwind label %PAD` - /// (#7302). Shares the callsite-typed, call-through-pointer semantics - /// of [`call`]; the only additions are the two edges. - fn invoke(&mut self, dst: Option<&str>, rest: &str) -> Result>> { - let to_pos = rest - .rfind(" to label %") - .ok_or_else(|| anyhow!("invoke without `to label`"))?; - let head = &rest[..to_pos]; - let edges = &rest[to_pos + " to label %".len()..]; - let (cont_label, unwind_label) = edges - .split_once(" unwind label %") - .ok_or_else(|| anyhow!("invoke without `unwind label`"))?; - let cont = self.block(cont_label.trim()); - let pad = self.block(unwind_label.trim()); - - let callee_pos = head - .find(['@', '%']) - .ok_or_else(|| anyhow!("invoke without callee"))?; - let sig_str = head[..callee_pos].trim().trim_end_matches('*').trim(); - let after = &head[callee_pos..]; - let paren = after - .find('(') - .ok_or_else(|| anyhow!("invoke missing arg list"))?; - let callee = &after[..paren]; - let close = rmatch_paren(after, paren)?; - let args_str = &after[paren + 1..close]; - - // `build_indirect_invoke` takes basic values (not metadata enums - // like the call path), so collect both shapes once. - let mut args: Vec = Vec::new(); - let mut arg_types: Vec = Vec::new(); - for a in split_top_level(args_str) { - let (aty, atok) = ty_and_val(&a)?; - let ty = basic_type(self.ctx, aty)?; - args.push(self.val(ty, atok)?); - arg_types.push(ty.into()); - } - - let name = dst.map(|d| d.trim_start_matches('%')).unwrap_or(""); - let fn_ty = indirect_fn_type(self.ctx, sig_str, &arg_types)?; - let callee_ptr = if let Some(fname) = callee.strip_prefix('@') { - let n = unquote(fname); - let f = match self.module.get_function(&n) { - Some(f) => f, - None if n.starts_with("llvm.") => self.module.add_function(&n, fn_ty, None), - None => bail!("invoke of undeclared @{n}"), - }; - f.as_global_value().as_pointer_value() - } else { - self.val(self.ctx.ptr_type(AddressSpace::default()).into(), callee)? - .into_pointer_value() - }; - let site = self - .builder - .build_indirect_invoke(fn_ty, callee_ptr, &args, cont, pad, name) - .map_err(be)?; - // An invoke terminates its block; the emitted text continues in - // the inline continuation label, which arrives as the next line. - match site.try_as_basic_value() { - inkwell::values::ValueKind::Basic(v) => { - if let Some(d) = dst { - self.vals.insert(d.trim().to_string(), v); - } - Ok(Some(v)) - } - _ => Ok(None), - } - } - - /// `%r = landingpad { ptr, i32 } catch ptr null` (#7302). Perry emits - /// exactly one shape — a catch-all pad whose `{ptr, i32}` result is - /// unused (the thrown value comes from the runtime's rooted TLS slot), - /// so anything else is a dialect drift and bails loudly. - fn landingpad(&mut self, dst: &str, rest: &str) -> Result<()> { - let body = rest.trim(); - let clause_pos = body - .find("catch") - .ok_or_else(|| anyhow!("landingpad without a catch clause: {body}"))?; - let ty_tok = body[..clause_pos].trim(); - if ty_tok.replace(' ', "") != "{ptr,i32}" { - bail!("unexpected landingpad type `{ty_tok}`"); - } - if body[clause_pos..].replace(' ', "") != "catchptrnull" { - bail!("unexpected landingpad clauses `{}`", &body[clause_pos..]); - } - let pf = self - .func - .get_personality_function() - .ok_or_else(|| anyhow!("landingpad in a function with no personality"))?; - let ptr_ty = self.ctx.ptr_type(AddressSpace::default()); - let exc_ty = self - .ctx - .struct_type(&[ptr_ty.into(), self.ctx.i32_type().into()], false); - let null = ptr_ty.const_null(); - let v = self - .builder - .build_landing_pad( - exc_ty, - pf, - &[null.into()], - false, - dst.trim_start_matches('%'), - ) - .map_err(be)?; - self.vals.insert(dst.trim().to_string(), v); - Ok(()) - } - fn call_asm(&mut self, rest: &str) -> Result<()> { // `sideeffect "ASM", "CONSTR"()` — the only asm perry emits is the // empty barrier, but parse the strings properly anyway. @@ -2048,106 +1944,3 @@ fn apply_flags(inst: Option>, flags: &[&str]) { unsafe { llvm_sys::core::LLVMSetFastMathFlags(inst.as_value_ref(), fmf) }; } } - -#[cfg(test)] -mod tests { - use super::*; - - fn split_corpus(text: &str) -> (String, Vec) { - let mut skeleton = String::new(); - let mut fns = Vec::new(); - let mut cur: Option = None; - for line in text.lines() { - if line.starts_with("define ") { - cur = Some(String::new()); - } - match cur.as_mut() { - Some(f) => { - f.push_str(line); - f.push('\n'); - if line == "}" { - fns.push(cur.take().unwrap()); - } - } - None => { - skeleton.push_str(line); - skeleton.push('\n'); - } - } - } - (skeleton, fns) - } - - /// Every function in a real perry-emitted corpus file must construct - /// natively and pass the LLVM verifier. This is the reader's primary - /// gate: a form it cannot express fails here, not in a user build. - fn corpus_roundtrip(path: &str) { - // The corpora are tracked in-tree alongside this reader, so a missing - // file is a broken checkout, not a branch without artifacts. Skipping - // would make the reader's primary gate pass vacuously — precisely the - // failure mode the Linux bring-up had to rule out by hand. - let text = std::fs::read_to_string(path) - .unwrap_or_else(|e| panic!("corpus file {path} is not readable: {e}")); - let (skeleton, fns) = split_corpus(&text); - let ctx = Context::create(); - let module = crate::inprocess::parse_ir_text(&ctx, &skeleton, "corpus_skel") - .expect("skeleton parses"); - for f in &fns { - predeclare_function_from_text(&ctx, &module, f) - .unwrap_or_else(|e| panic!("predeclare: {e:#}")); - } - let mut n = 0usize; - for f in &fns { - n += add_function_from_text(&ctx, &module, f).unwrap_or_else(|e| panic!("{e:#}")); - } - assert!( - n > 1000, - "expected a real corpus, built only {n} instructions" - ); - module - .verify() - .unwrap_or_else(|e| panic!("verifier rejected native module:\n{}", e.to_string())); - } - - #[test] - fn corpus_spike() { - corpus_roundtrip(concat!( - env!("CARGO_MANIFEST_DIR"), - "/../../experiments/llvm-inprocess-spike/spike_text.ll" - )); - } - - /// #7302: a try/catch/finally corpus — invoke edges, landing pads, - /// the personality clause on the define, and the inline continuation - /// labels an invoke split leaves behind. Without this the reader's EH - /// support would be exercised only by the async spike, which has one - /// shape (the async rejection boundary) and no nesting. - #[test] - fn corpus_exception_handling() { - let path = concat!( - env!("CARGO_MANIFEST_DIR"), - "/../../experiments/llvm-inprocess-spike/eh_text.ll" - ); - // Assert the subject is LIVE: a corpus that lost its EH forms would - // still round-trip, and would silently stop testing invoke. - let text = std::fs::read_to_string(path).expect("eh corpus readable"); - assert!( - text.matches("invoke ").count() >= 20, - "eh corpus has no invoke edges left" - ); - assert!(text.contains("landingpad"), "eh corpus has no landing pad"); - assert!( - text.contains("personality ptr @perry_eh_personality"), - "eh corpus lost its personality clause" - ); - corpus_roundtrip(path); - } - - #[test] - fn corpus_batch_kernel() { - corpus_roundtrip(concat!( - env!("CARGO_MANIFEST_DIR"), - "/../../experiments/llvm-inprocess-spike/batch_kernel.ll" - )); - } -} diff --git a/crates/perry-codegen/src/dialect/tests.rs b/crates/perry-codegen/src/dialect/tests.rs new file mode 100644 index 0000000000..b4f523f19d --- /dev/null +++ b/crates/perry-codegen/src/dialect/tests.rs @@ -0,0 +1,101 @@ +//! Reader tests, split out of `dialect/mod.rs` for the 2000-line cap. + +use super::*; + +fn split_corpus(text: &str) -> (String, Vec) { + let mut skeleton = String::new(); + let mut fns = Vec::new(); + let mut cur: Option = None; + for line in text.lines() { + if line.starts_with("define ") { + cur = Some(String::new()); + } + match cur.as_mut() { + Some(f) => { + f.push_str(line); + f.push('\n'); + if line == "}" { + fns.push(cur.take().unwrap()); + } + } + None => { + skeleton.push_str(line); + skeleton.push('\n'); + } + } + } + (skeleton, fns) +} + +/// Every function in a real perry-emitted corpus file must construct +/// natively and pass the LLVM verifier. This is the reader's primary +/// gate: a form it cannot express fails here, not in a user build. +fn corpus_roundtrip(path: &str) { + // The corpora are tracked in-tree alongside this reader, so a missing + // file is a broken checkout, not a branch without artifacts. Skipping + // would make the reader's primary gate pass vacuously — precisely the + // failure mode the Linux bring-up had to rule out by hand. + let text = std::fs::read_to_string(path) + .unwrap_or_else(|e| panic!("corpus file {path} is not readable: {e}")); + let (skeleton, fns) = split_corpus(&text); + let ctx = Context::create(); + let module = + crate::inprocess::parse_ir_text(&ctx, &skeleton, "corpus_skel").expect("skeleton parses"); + for f in &fns { + predeclare_function_from_text(&ctx, &module, f) + .unwrap_or_else(|e| panic!("predeclare: {e:#}")); + } + let mut n = 0usize; + for f in &fns { + n += add_function_from_text(&ctx, &module, f).unwrap_or_else(|e| panic!("{e:#}")); + } + assert!( + n > 1000, + "expected a real corpus, built only {n} instructions" + ); + module + .verify() + .unwrap_or_else(|e| panic!("verifier rejected native module:\n{}", e.to_string())); +} + +#[test] +fn corpus_spike() { + corpus_roundtrip(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../experiments/llvm-inprocess-spike/spike_text.ll" + )); +} + +/// #7302: a try/catch/finally corpus — invoke edges, landing pads, +/// the personality clause on the define, and the inline continuation +/// labels an invoke split leaves behind. Without this the reader's EH +/// support would be exercised only by the async spike, which has one +/// shape (the async rejection boundary) and no nesting. +#[test] +fn corpus_exception_handling() { + let path = concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../experiments/llvm-inprocess-spike/eh_text.ll" + ); + // Assert the subject is LIVE: a corpus that lost its EH forms would + // still round-trip, and would silently stop testing invoke. + let text = std::fs::read_to_string(path).expect("eh corpus readable"); + assert!( + text.matches("invoke ").count() >= 20, + "eh corpus has no invoke edges left" + ); + assert!(text.contains("landingpad"), "eh corpus has no landing pad"); + assert!( + text.contains("personality ptr @perry_eh_personality"), + "eh corpus lost its personality clause" + ); + corpus_roundtrip(path); +} + +#[test] +fn corpus_batch_kernel() { + corpus_roundtrip(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../experiments/llvm-inprocess-spike/batch_kernel.ll" + )); +}