From 836583d7f7f0fe3fe4a6de1d9f05fb10f240c901 Mon Sep 17 00:00:00 2001 From: agra Date: Wed, 3 Jun 2026 10:26:45 +0300 Subject: [PATCH] test(backend): pin JNI constructor (FindClass//NewObject) before A7.3 extraction (A7.3 scaffolding coverage fix) Codex review of 91651e3 noted no .ir snapshot pinned emitJniConstructor's distinct FindClass -> GetMethodID("") -> NewObject shape; 1402/1418/1408 cover regular/ static GetMethodID slot caching, not constructor emission. Add examples/expected/1425-ffi-jni-main-03-ctor.ir (FindClass x4 / GetMethodID x4 / NewObject x2 / ), path-free + idempotent, trailing newline trimmed. Suite count unchanged (snapshot on an existing example). Gate: zig build, zig build test, bash tests/run_examples.sh -> 361/0 (git diff --check clean; only the intended ctor snapshot added). --- .../expected/1425-ffi-jni-main-03-ctor.ir | 313 ++++++++++++++++++ 1 file changed, 313 insertions(+) create mode 100644 examples/expected/1425-ffi-jni-main-03-ctor.ir diff --git a/examples/expected/1425-ffi-jni-main-03-ctor.ir b/examples/expected/1425-ffi-jni-main-03-ctor.ir new file mode 100644 index 0000000..9068155 --- /dev/null +++ b/examples/expected/1425-ffi-jni-main-03-ctor.ir @@ -0,0 +1,313 @@ + +@OS = internal global i64 0 +@ARCH = internal global i64 0 +@POINTER_SIZE = internal global i64 8 +@g_held_view = internal global ptr null +@__sx_default_context = internal global { { ptr, ptr, ptr }, ptr } { { ptr, ptr, ptr } { ptr null, ptr @__thunk_CAllocator_Allocator_alloc, ptr @__thunk_CAllocator_Allocator_dealloc }, ptr null } +@str = private unnamed_addr constant [9 x i8] c"onCreate\00", align 1 +@str.1 = private unnamed_addr constant [23 x i8] c"(Landroid/os/Bundle;)V\00", align 1 +@jni.parent.path = private unnamed_addr constant [21 x i8] c"android/app/Activity\00", align 1 +@str.2 = private unnamed_addr constant [7 x i8] c"\00", align 1 +@str.3 = private unnamed_addr constant [29 x i8] c"(Landroid/content/Context;)V\00", align 1 +@jni.ctor.path = private unnamed_addr constant [25 x i8] c"android/view/SurfaceView\00", align 1 + +; Function Attrs: nounwind +declare void @out(ptr) #0 + +declare ptr @malloc(i64) + +declare void @free(ptr) + +declare ptr @memcpy(ptr, ptr, i64) + +declare ptr @memset(ptr, i32, i64) + +; Function Attrs: nounwind +define internal ptr @CAllocator.alloc(ptr %0, ptr %1, i64 %2) #0 { +entry: + %alloca = alloca ptr, align 8 + store ptr %1, ptr %alloca, align 8 + %allocaN = alloca i64, align 8 + store i64 %2, ptr %allocaN, align 8 + %load = load i64, ptr %allocaN, align 8 + %call = call ptr @malloc(i64 %load) + ret ptr %call +} + +; Function Attrs: nounwind +define internal void @CAllocator.dealloc(ptr %0, ptr %1, ptr %2) #0 { +entry: + %alloca = alloca ptr, align 8 + store ptr %1, ptr %alloca, align 8 + %allocaN = alloca ptr, align 8 + store ptr %2, ptr %allocaN, align 8 + %load = load ptr, ptr %allocaN, align 8 + call void @free(ptr %load) + ret void +} + +; Function Attrs: nounwind +declare i64 @GPA.init(ptr) #0 + +; Function Attrs: nounwind +declare ptr @GPA.alloc(ptr, ptr, i64) #0 + +; Function Attrs: nounwind +declare void @GPA.dealloc(ptr, ptr, ptr) #0 + +; Function Attrs: nounwind +declare void @Arena.add_chunk(ptr, ptr, i64) #0 + +; Function Attrs: nounwind +declare void @Arena.init(ptr sret({ ptr, i64, { ptr, ptr, ptr } }), ptr, ptr, i64) #0 + +; Function Attrs: nounwind +declare void @Arena.reset(ptr, ptr) #0 + +; Function Attrs: nounwind +declare void @Arena.deinit(ptr, ptr) #0 + +; Function Attrs: nounwind +declare ptr @Arena.alloc(ptr, ptr, i64) #0 + +; Function Attrs: nounwind +declare void @Arena.dealloc(ptr, ptr, ptr) #0 + +; Function Attrs: nounwind +declare ptr @BufAlloc.init(ptr, ptr, i64) #0 + +; Function Attrs: nounwind +declare void @BufAlloc.reset(ptr, ptr) #0 + +; Function Attrs: nounwind +declare ptr @BufAlloc.alloc(ptr, ptr, i64) #0 + +; Function Attrs: nounwind +declare void @BufAlloc.dealloc(ptr, ptr, ptr) #0 + +; Function Attrs: nounwind +declare void @TrackingAllocator.init(ptr sret({ { ptr, ptr, ptr }, i64, i64, i64 }), ptr, ptr) #0 + +; Function Attrs: nounwind +declare i64 @TrackingAllocator.leak_count(ptr, ptr) #0 + +; Function Attrs: nounwind +declare void @TrackingAllocator.report(ptr, ptr) #0 + +; Function Attrs: nounwind +declare ptr @TrackingAllocator.alloc(ptr, ptr, i64) #0 + +; Function Attrs: nounwind +declare void @TrackingAllocator.dealloc(ptr, ptr, ptr) #0 + +; Function Attrs: nounwind +declare ptr @cstring(ptr, i64) #0 + +; Function Attrs: nounwind +declare ptr @int_to_string(ptr, i64) #0 + +; Function Attrs: nounwind +declare ptr @bool_to_string(ptr, i1) #0 + +; Function Attrs: nounwind +declare ptr @float_to_string(ptr, double) #0 + +; Function Attrs: nounwind +declare void @hex_group(ptr, ptr, i64, i64) #0 + +; Function Attrs: nounwind +declare ptr @int_to_hex_string(ptr, i64) #0 + +; Function Attrs: nounwind +declare ptr @concat(ptr, ptr, ptr) #0 + +; Function Attrs: nounwind +declare ptr @substr(ptr, ptr, i64, i64) #0 + +; Function Attrs: nounwind +declare ptr @xml_escape(ptr, ptr) #0 + +; Function Attrs: nounwind +declare ptr @path_join(ptr, ptr) #0 + +; Function Attrs: nounwind +declare ptr @any_to_string(ptr, [2 x i64]) #0 + +; Function Attrs: nounwind +declare ptr @build_format(ptr, ptr) #0 + +; Function Attrs: nounwind +declare void @BuildOptions.add_link_flag(i64, ptr) #0 + +; Function Attrs: nounwind +declare void @BuildOptions.add_framework(i64, ptr) #0 + +; Function Attrs: nounwind +declare void @BuildOptions.set_output_path(i64, ptr) #0 + +; Function Attrs: nounwind +declare void @BuildOptions.set_wasm_shell(i64, ptr) #0 + +; Function Attrs: nounwind +declare void @BuildOptions.add_asset_dir(i64, ptr, ptr) #0 + +; Function Attrs: nounwind +declare i64 @BuildOptions.asset_dir_count(i64) #0 + +; Function Attrs: nounwind +declare ptr @BuildOptions.asset_dir_src_at(i64, i64) #0 + +; Function Attrs: nounwind +declare ptr @BuildOptions.asset_dir_dest_at(i64, i64) #0 + +; Function Attrs: nounwind +declare void @BuildOptions.set_post_link_callback(i64, ptr) #0 + +; Function Attrs: nounwind +declare void @BuildOptions.set_post_link_module(i64, ptr) #0 + +; Function Attrs: nounwind +declare ptr @BuildOptions.binary_path(i64) #0 + +; Function Attrs: nounwind +declare void @BuildOptions.set_bundle_path(i64, ptr) #0 + +; Function Attrs: nounwind +declare void @BuildOptions.set_bundle_id(i64, ptr) #0 + +; Function Attrs: nounwind +declare void @BuildOptions.set_codesign_identity(i64, ptr) #0 + +; Function Attrs: nounwind +declare void @BuildOptions.set_provisioning_profile(i64, ptr) #0 + +; Function Attrs: nounwind +declare ptr @BuildOptions.bundle_path(i64) #0 + +; Function Attrs: nounwind +declare ptr @BuildOptions.bundle_id(i64) #0 + +; Function Attrs: nounwind +declare ptr @BuildOptions.codesign_identity(i64) #0 + +; Function Attrs: nounwind +declare ptr @BuildOptions.provisioning_profile(i64) #0 + +; Function Attrs: nounwind +declare ptr @BuildOptions.target_triple(i64) #0 + +; Function Attrs: nounwind +declare i1 @BuildOptions.is_macos(i64) #0 + +; Function Attrs: nounwind +declare i1 @BuildOptions.is_ios(i64) #0 + +; Function Attrs: nounwind +declare i1 @BuildOptions.is_ios_device(i64) #0 + +; Function Attrs: nounwind +declare i1 @BuildOptions.is_ios_simulator(i64) #0 + +; Function Attrs: nounwind +declare i1 @BuildOptions.is_android(i64) #0 + +; Function Attrs: nounwind +declare i64 @BuildOptions.framework_count(i64) #0 + +; Function Attrs: nounwind +declare ptr @BuildOptions.framework_at(i64, i64) #0 + +; Function Attrs: nounwind +declare i64 @BuildOptions.framework_path_count(i64) #0 + +; Function Attrs: nounwind +declare ptr @BuildOptions.framework_path_at(i64, i64) #0 + +; Function Attrs: nounwind +declare void @BuildOptions.set_manifest_path(i64, ptr) #0 + +; Function Attrs: nounwind +declare void @BuildOptions.set_keystore_path(i64, ptr) #0 + +; Function Attrs: nounwind +declare ptr @BuildOptions.manifest_path(i64) #0 + +; Function Attrs: nounwind +declare ptr @BuildOptions.keystore_path(i64) #0 + +; Function Attrs: nounwind +declare i64 @BuildOptions.jni_main_count(i64) #0 + +; Function Attrs: nounwind +declare ptr @BuildOptions.jni_main_foreign_path_at(i64, i64) #0 + +; Function Attrs: nounwind +declare ptr @BuildOptions.jni_main_java_source_at(i64, i64) #0 + +; Function Attrs: nounwind +declare i64 @build_options() #0 + +; Function Attrs: nounwind +define i32 @main() #0 { +entry: + ret i32 0 +} + +; Function Attrs: nounwind +define internal ptr @__thunk_CAllocator_Allocator_alloc(ptr %0, ptr %1, i64 %2) #0 { +entry: + %call = call ptr @CAllocator.alloc(ptr %0, ptr %1, i64 %2) + ret ptr %call +} + +; Function Attrs: nounwind +define internal void @__thunk_CAllocator_Allocator_dealloc(ptr %0, ptr %1, ptr %2) #0 { +entry: + call void @CAllocator.dealloc(ptr %0, ptr %1, ptr %2) + ret void +} + +; Function Attrs: nounwind +define void @Java_co_swipelab_sxjnictor_SxApp_sx_1onCreate(ptr %0, ptr %1, ptr %2) #0 { +entry: + %alloca = alloca ptr, align 8 + store ptr %0, ptr %alloca, align 8 + %allocaN = alloca ptr, align 8 + store ptr %1, ptr %allocaN, align 8 + %allocaN = alloca ptr, align 8 + store ptr %2, ptr %allocaN, align 8 + %load = load ptr, ptr %alloca, align 8 + %loadN = load ptr, ptr %allocaN, align 8 + %loadN = load ptr, ptr %allocaN, align 8 + %jni.ifs = load ptr, ptr %load, align 8 + %3 = getelementptr inbounds ptr, ptr %jni.ifs, i32 6 + %jni.FindClass = load ptr, ptr %3, align 8 + %jni.parent.cls = call ptr %jni.FindClass(ptr %load, ptr @jni.parent.path) + %4 = getelementptr inbounds ptr, ptr %jni.ifs, i32 33 + %jni.GetMethodID = load ptr, ptr %4, align 8 + %jni.mid = call ptr %jni.GetMethodID(ptr %load, ptr %jni.parent.cls, ptr @str, ptr @str.1) + %jni.parent.cls.slot = alloca ptr, align 8 + store ptr %jni.parent.cls, ptr %jni.parent.cls.slot, align 8 + %5 = getelementptr inbounds ptr, ptr %jni.ifs, i32 91 + %jni.callfn.nonvirtual = load ptr, ptr %5, align 8 + call void %jni.callfn.nonvirtual(ptr %load, ptr %loadN, ptr %jni.parent.cls, ptr %jni.mid, ptr %loadN) + %allocaN = alloca ptr, align 8 + %loadN = load ptr, ptr %allocaN, align 8 + store ptr %loadN, ptr %allocaN, align 8 + %loadN = load ptr, ptr %allocaN, align 8 + %jni.ifs8 = load ptr, ptr %load, align 8 + %6 = getelementptr inbounds ptr, ptr %jni.ifs8, i32 6 + %jni.FindClass9 = load ptr, ptr %6, align 8 + %jni.ctor.cls = call ptr %jni.FindClass9(ptr %load, ptr @jni.ctor.path) + %7 = getelementptr inbounds ptr, ptr %jni.ifs8, i32 33 + %jni.GetMethodID10 = load ptr, ptr %7, align 8 + %jni.ctor.mid = call ptr %jni.GetMethodID10(ptr %load, ptr %jni.ctor.cls, ptr @str.2, ptr @str.3) + %8 = getelementptr inbounds ptr, ptr %jni.ifs8, i32 28 + %jni.NewObject = load ptr, ptr %8, align 8 + %jni.new.obj = call ptr %jni.NewObject(ptr %load, ptr %jni.ctor.cls, ptr %jni.ctor.mid, ptr %loadN) + %allocaN = alloca ptr, align 8 + store ptr %jni.new.obj, ptr %allocaN, align 8 + %loadN = load ptr, ptr %allocaN, align 8 + store ptr %loadN, ptr @g_held_view, align 8 + ret void +}