Merge pull request #8481 from roc-lang/fix-panics

Fix some panics
This commit is contained in:
Richard Feldman 2025-11-27 20:52:10 -05:00 committed by GitHub
commit 735e243c28
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 40 additions and 4 deletions

View file

@ -2371,6 +2371,7 @@ pub const Interpreter = struct {
},
.e_dot_access => |dot_access| {
const receiver_ct_var = can.ModuleEnv.varFrom(dot_access.receiver);
const receiver_rt_var = try self.translateTypeVar(self.env, receiver_ct_var);
var receiver_value = try self.evalExprMinimal(dot_access.receiver, roc_ops, receiver_rt_var);
defer receiver_value.decref(&self.runtime_layout_store, roc_ops);

View file

@ -29,6 +29,7 @@ fn parseCheckAndEvalModule(src: []const u8) !struct {
evaluator: ComptimeEvaluator,
problems: *check.problem.Store,
builtin_module: builtin_loading.LoadedModule,
checker: *Check,
} {
const gpa = test_allocator;
@ -83,8 +84,10 @@ fn parseCheckAndEvalModule(src: []const u8) !struct {
// Resolve imports - map each import to its index in imported_envs
module_env.imports.resolveImports(module_env, &imported_envs);
var checker = try Check.init(gpa, &module_env.types, module_env, &imported_envs, null, &module_env.store.regions, builtin_ctx);
defer checker.deinit();
const checker = try gpa.create(Check);
errdefer gpa.destroy(checker);
checker.* = try Check.init(gpa, &module_env.types, module_env, &imported_envs, null, &module_env.store.regions, builtin_ctx);
errdefer checker.deinit();
try checker.checkFile();
@ -92,13 +95,14 @@ fn parseCheckAndEvalModule(src: []const u8) !struct {
problems.* = .{};
const builtin_types = BuiltinTypes.init(builtin_indices, builtin_module.env, builtin_module.env, builtin_module.env);
const evaluator = try ComptimeEvaluator.init(gpa, module_env, &imported_envs, problems, builtin_types, null, &checker.import_mapping);
const evaluator = try ComptimeEvaluator.init(gpa, module_env, &imported_envs, problems, builtin_types, builtin_module.env, &checker.import_mapping);
return .{
.module_env = module_env,
.evaluator = evaluator,
.problems = problems,
.builtin_module = builtin_module,
.checker = checker,
};
}
@ -109,6 +113,12 @@ fn cleanupEvalModule(result: anytype) void {
var problems_mut = result.problems;
problems_mut.deinit(test_allocator);
test_allocator.destroy(result.problems);
// Deinit checker (must happen after evaluator since evaluator holds pointer to import_mapping)
var checker_mut = result.checker;
checker_mut.deinit();
test_allocator.destroy(result.checker);
result.module_env.deinit();
test_allocator.destroy(result.module_env);
@ -1201,7 +1211,6 @@ test "e_low_level_lambda - Str.drop_suffix suffix longer than string" {
defer test_allocator.free(value);
try testing.expectEqualStrings("\"hi\"", value);
}
// U8 conversion tests
test "e_low_level_lambda - U8.to_i16 safe widening" {
@ -1821,3 +1830,29 @@ test "e_low_level_lambda - Str.join_with roundtrip with split_on" {
defer test_allocator.free(value);
try testing.expectEqualStrings("\"hello world\"", value);
}
test "e_low_level_lambda - U8.plus basic" {
const src =
\\a : U8
\\a = 5
\\b : U8
\\b = 3
\\x : U8
\\x = U8.plus(a, b)
;
const value = try evalModuleAndGetInt(src, 2);
try testing.expectEqual(@as(i128, 8), value);
}
test "e_low_level_lambda - U8.plus method call syntax" {
const src =
\\a : U8
\\a = 5
\\b : U8
\\b = 3
\\x : U8
\\x = a.plus(b)
;
const value = try evalModuleAndGetInt(src, 2);
try testing.expectEqual(@as(i128, 8), value);
}