From b69a2ea29c808f38a46cc461db89f0514c5226c6 Mon Sep 17 00:00:00 2001 From: agra Date: Mon, 25 May 2026 09:13:36 +0300 Subject: [PATCH] =?UTF-8?q?mem:=20Step=208=20=E2=80=94=20delete=20`context?= =?UTF-8?q?`=20global=20from=20std.sx?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The `context : Context = ---;` global in `library/modules/std.sx` had no remaining readers — all `context.X` lookups in user code resolve through `current_ctx_ref` (Step 5), `push Context.{...}` uses an alloca slot (Step 6), and `allocViaContext` sources from the lowering's current ref. `emitDefaultContextInit` (the only writer) was already removed in Step 5. `inferExprType` for the `context` identifier now returns the registered `Context` type when implicit-ctx is enabled, mirroring the lowering's identifier-handling fast path. Without this, `context.allocator` would type as `s64` (the fallback) and the field access would fail. 11 JNI/ObjC IR snapshots regen — the `@context` LLVM global is gone from each. 152/152 example tests pass. --- library/modules/std.sx | 2 -- src/ir/lower.zig | 5 +++++ tests/expected/ffi-jni-call-03-methodid-sharing.ir | 1 - tests/expected/ffi-jni-call-04-jint-return.ir | 1 - tests/expected/ffi-jni-call-05-jlong-return.ir | 1 - tests/expected/ffi-jni-call-06-jdouble-return.ir | 1 - tests/expected/ffi-jni-call-07-jboolean-return.ir | 1 - tests/expected/ffi-jni-call-08-jobject-return.ir | 1 - tests/expected/ffi-jni-call-09-static.ir | 1 - tests/expected/ffi-jni-class-08-call.ir | 1 - tests/expected/ffi-jni-env-02-lexical-direct.ir | 1 - tests/expected/ffi-objc-call-03-selector-sharing.ir | 1 - tests/expected/ffi-objc-call-06-sret-return.ir | 1 - 13 files changed, 5 insertions(+), 13 deletions(-) diff --git a/library/modules/std.sx b/library/modules/std.sx index 745042f..0a9fe65 100644 --- a/library/modules/std.sx +++ b/library/modules/std.sx @@ -33,8 +33,6 @@ Context :: struct { data: *void; } -context : Context = ---; - // --- Slice & string allocation --- cstring :: (size: s64) -> string { diff --git a/src/ir/lower.zig b/src/ir/lower.zig index bbdddde..ab2ab03 100644 --- a/src/ir/lower.zig +++ b/src/ir/lower.zig @@ -9929,6 +9929,11 @@ pub const Lowering = struct { return binding.ty; } } + // `context` is the implicit-ctx identifier; type is Context + // when the program has registered it (i.e. std.sx imported). + if (self.implicit_ctx_enabled and std.mem.eql(u8, id.name, "context")) { + if (self.module.types.findByName(self.module.types.internString("Context"))) |ty| return ty; + } // Check global variables (e.g., `context : Context`) if (self.global_names.get(id.name)) |gi| { return gi.ty; diff --git a/tests/expected/ffi-jni-call-03-methodid-sharing.ir b/tests/expected/ffi-jni-call-03-methodid-sharing.ir index 7736b02..6f325ee 100644 --- a/tests/expected/ffi-jni-call-03-methodid-sharing.ir +++ b/tests/expected/ffi-jni-call-03-methodid-sharing.ir @@ -1,5 +1,4 @@ -@context = internal global { { ptr, ptr, ptr }, ptr } zeroinitializer @g_should_call = internal global i1 false @__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 [5 x i8] c"noop\00", align 1 diff --git a/tests/expected/ffi-jni-call-04-jint-return.ir b/tests/expected/ffi-jni-call-04-jint-return.ir index be00dd5..f8ada9c 100644 --- a/tests/expected/ffi-jni-call-04-jint-return.ir +++ b/tests/expected/ffi-jni-call-04-jint-return.ir @@ -1,5 +1,4 @@ -@context = internal global { { ptr, ptr, ptr }, ptr } zeroinitializer @g_should_call = internal global i1 false @__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"getCount\00", align 1 diff --git a/tests/expected/ffi-jni-call-05-jlong-return.ir b/tests/expected/ffi-jni-call-05-jlong-return.ir index 6eb7c23..4f60316 100644 --- a/tests/expected/ffi-jni-call-05-jlong-return.ir +++ b/tests/expected/ffi-jni-call-05-jlong-return.ir @@ -1,5 +1,4 @@ -@context = internal global { { ptr, ptr, ptr }, ptr } zeroinitializer @g_should_call = internal global i1 false @__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 [18 x i8] c"currentTimeMillis\00", align 1 diff --git a/tests/expected/ffi-jni-call-06-jdouble-return.ir b/tests/expected/ffi-jni-call-06-jdouble-return.ir index 450c79c..c99f714 100644 --- a/tests/expected/ffi-jni-call-06-jdouble-return.ir +++ b/tests/expected/ffi-jni-call-06-jdouble-return.ir @@ -1,5 +1,4 @@ -@context = internal global { { ptr, ptr, ptr }, ptr } zeroinitializer @g_should_call = internal global i1 false @__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"getValue\00", align 1 diff --git a/tests/expected/ffi-jni-call-07-jboolean-return.ir b/tests/expected/ffi-jni-call-07-jboolean-return.ir index fc3b284..c7a5226 100644 --- a/tests/expected/ffi-jni-call-07-jboolean-return.ir +++ b/tests/expected/ffi-jni-call-07-jboolean-return.ir @@ -1,5 +1,4 @@ -@context = internal global { { ptr, ptr, ptr }, ptr } zeroinitializer @g_should_call = internal global i1 false @__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 [8 x i8] c"isShown\00", align 1 diff --git a/tests/expected/ffi-jni-call-08-jobject-return.ir b/tests/expected/ffi-jni-call-08-jobject-return.ir index 298655c..678dd62 100644 --- a/tests/expected/ffi-jni-call-08-jobject-return.ir +++ b/tests/expected/ffi-jni-call-08-jobject-return.ir @@ -1,5 +1,4 @@ -@context = internal global { { ptr, ptr, ptr }, ptr } zeroinitializer @g_should_call = internal global i1 false @__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 [10 x i8] c"getWindow\00", align 1 diff --git a/tests/expected/ffi-jni-call-09-static.ir b/tests/expected/ffi-jni-call-09-static.ir index 17d369c..4689968 100644 --- a/tests/expected/ffi-jni-call-09-static.ir +++ b/tests/expected/ffi-jni-call-09-static.ir @@ -1,5 +1,4 @@ -@context = internal global { { ptr, ptr, ptr }, ptr } zeroinitializer @g_should_call = internal global i1 false @__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 [4 x i8] c"max\00", align 1 diff --git a/tests/expected/ffi-jni-class-08-call.ir b/tests/expected/ffi-jni-class-08-call.ir index 6ddcbcb..d1011c6 100644 --- a/tests/expected/ffi-jni-class-08-call.ir +++ b/tests/expected/ffi-jni-class-08-call.ir @@ -1,5 +1,4 @@ -@context = internal global { { ptr, ptr, ptr }, ptr } zeroinitializer @g_should_call = internal global i1 false @__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 [10 x i8] c"getWindow\00", align 1 diff --git a/tests/expected/ffi-jni-env-02-lexical-direct.ir b/tests/expected/ffi-jni-env-02-lexical-direct.ir index 1b6d44f..f0b1f08 100644 --- a/tests/expected/ffi-jni-env-02-lexical-direct.ir +++ b/tests/expected/ffi-jni-env-02-lexical-direct.ir @@ -1,5 +1,4 @@ -@context = internal global { { ptr, ptr, ptr }, ptr } zeroinitializer @g_should_call = internal global i1 false @__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 [5 x i8] c"noop\00", align 1 diff --git a/tests/expected/ffi-objc-call-03-selector-sharing.ir b/tests/expected/ffi-objc-call-03-selector-sharing.ir index e7eb4ed..21d5867 100644 --- a/tests/expected/ffi-objc-call-03-selector-sharing.ir +++ b/tests/expected/ffi-objc-call-03-selector-sharing.ir @@ -1,5 +1,4 @@ -@context = internal global { { ptr, ptr, ptr }, ptr } zeroinitializer @OS = internal global i64 0 @ARCH = internal global i64 0 @POINTER_SIZE = internal global i64 8 diff --git a/tests/expected/ffi-objc-call-06-sret-return.ir b/tests/expected/ffi-objc-call-06-sret-return.ir index feb6aeb..2e9b97f 100644 --- a/tests/expected/ffi-objc-call-06-sret-return.ir +++ b/tests/expected/ffi-objc-call-06-sret-return.ir @@ -1,5 +1,4 @@ -@context = internal global { { ptr, ptr, ptr }, ptr } zeroinitializer @OS = internal global i64 0 @ARCH = internal global i64 0 @POINTER_SIZE = internal global i64 8