authorgravatar for luuk@degram.devLuuk de Gram <luuk@degram.dev> 2021-05-15 17:32:38+02:00
committergravatar for luuk@degram.devLuuk de Gram <luuk@degram.dev> 2021-05-19 10:35:45+02:00
log141a0cbb5a1ffd9e6c47bf859064139143ed8c51
tree712c282ae44f7200741a6a546e51788ce4de0f03
parent9ddede2950b5532c652dddca2d0d726d497c3161
signaturelock-open Commit is signed but in an unrecognized format.

Explicit return & more complex wasm enum test

- When returning within a block, we must use an explicit return opcode. For now always emit the opcode when calling return, rather than using implicit return statements. - Also added a more comprehensive test case to test for enum values using conditions

2 files changed, 24 insertions(+), 1 deletions(-)

src/codegen/wasm.zig+4
......@@ -758,6 +758,7 @@ pub const Context = struct {
758758 // TODO: Implement tail calls
759759 const operand = self.resolveInst(inst.operand);
760760 try self.emitWValue(operand);
761 try self.code.append(wasm.opcode(.@"return"));
761762 return .none;
762763 }
763764
......@@ -903,6 +904,9 @@ pub const Context = struct {
903904 if (enum_full.values.count() != 0) {
904905 const tag_val = enum_full.values.entries.items[field_index.data].key;
905906 try self.emitConstant(src, tag_val, enum_full.tag_ty);
907 } else {
908 try writer.writeByte(wasm.opcode(.i32_const));
909 try leb.writeULEB128(writer, field_index.data);
906910 }
907911 },
908912 else => unreachable,
test/stage2/wasm.zig+20-1
......@@ -391,7 +391,7 @@ pub fn addCases(ctx: *TestContext) !void {
391391 case.addCompareOutput(
392392 \\const Number = enum { One, Two, Three };
393393 \\
394 \\export fn _start() i32 {
394 \\pub export fn _start() i32 {
395395 \\ var number1 = Number.One;
396396 \\ var number2: Number = .Two;
397397 \\ const number3 = @intToEnum(Number, 2);
......@@ -399,5 +399,24 @@ pub fn addCases(ctx: *TestContext) !void {
399399 \\ return @enumToInt(number3);
400400 \\}
401401 , "2\n");
402
403 case.addCompareOutput(
404 \\const Number = enum { One, Two, Three };
405 \\
406 \\pub export fn _start() i32 {
407 \\ var number1 = Number.One;
408 \\ var number2: Number = .Two;
409 \\ const number3 = @intToEnum(Number, 2);
410 \\ if (number1 == number2) return 1;
411 \\ if (number2 == number3) return 1;
412 \\ if (@enumToInt(number1) != 0) return 1;
413 \\ if (@enumToInt(number2) != 1) return 1;
414 \\ if (@enumToInt(number3) != 2) return 1;
415 \\ var x: Number = .Two;
416 \\ if (number2 != x) return 1;
417 \\
418 \\ return @enumToInt(number3);
419 \\}
420 , "2\n");
402421 }
403422}