Skip to content

Commit 9141418

Browse files
committed
Migrate to Heap Type with some failing tests
1 parent c99a7d9 commit 9141418

File tree

13 files changed

+43
-41
lines changed

13 files changed

+43
-41
lines changed

Sources/WAT/Encoder.swift

+2-4
Original file line numberDiff line numberDiff line change
@@ -127,11 +127,9 @@ extension ValueType: WasmEncodable {
127127

128128
extension ReferenceType: WasmEncodable {
129129
func encode(to encoder: inout Encoder) {
130-
switch self {
131-
case .funcRef: encoder.output.append(0x70)
132-
case .funcRefNonNull: encoder.output.append(0x71)
130+
switch self.heapType {
131+
case .funcRef: encoder.output.append(isNullable ? 0x70 : 0x71)
133132
case .externRef: encoder.output.append(0x6F)
134-
case .externRefNonNull: encoder.output.append(0x6E) // Is this correct
135133
}
136134
}
137135
}

Sources/WAT/Parser/WastParser.swift

+1-3
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,11 @@ struct WastParser {
6363
mutating func visitRefFunc(functionIndex: UInt32) throws {
6464
addValue(.ref(.function(FunctionAddress(functionIndex))))
6565
}
66-
mutating func visitRefNull(type: ReferenceType) throws {
66+
mutating func visitRefNull(type: HeapType) throws {
6767
let value: Reference
6868
switch type {
6969
case .externRef: value = .extern(nil)
70-
case .externRefNonNull: value = .function(nil) // non null
7170
case .funcRef: value = .function(nil)
72-
case .funcRefNonNull: value = .function(nil) // non null
7371
}
7472
addValue(.ref(value))
7573
}

Sources/WAT/Parser/WatParser.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -650,8 +650,8 @@ struct WatParser {
650650
switch keyword {
651651
case "funcref": return .funcRef
652652
case "externref": return .externRef
653-
case "func": return isNullable ? .funcRef : .funcRefNonNull
654-
case "extern": return isNullable ? .externRef : .externRefNonNull
653+
case "func": return ReferenceType(isNullable: isNullable, heapType: .funcRef)
654+
case "extern": return ReferenceType(isNullable: isNullable, heapType: .funcRef)
655655
default: return nil
656656
}
657657
}

Sources/WasmKit/Execution/ConstEvaluation.swift

+4-2
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,10 @@ extension ConstExpression {
6262
return try context.globalValue(globalIndex)
6363
case .refNull(let type):
6464
switch type {
65-
case .externRef, .externRefNonNull: return .ref(.extern(nil))
66-
case .funcRef, .funcRefNonNull: return .ref(.function(nil))
65+
case .externRef: return .ref(.extern(nil))
66+
case .funcRef: return .ref(.function(nil))
67+
default:
68+
throw ValidationError(.illegalConstExpressionInstruction(constInst))
6769
}
6870
case .refFunc(let functionIndex):
6971
return try .ref(context.functionRef(functionIndex))

Sources/WasmKit/Execution/Instances.swift

+1-5
Original file line numberDiff line numberDiff line change
@@ -274,15 +274,11 @@ struct TableEntity /* : ~Copyable */ {
274274

275275
init(_ tableType: TableType, resourceLimiter: any ResourceLimiter) throws {
276276
let emptyElement: Reference
277-
switch tableType.elementType {
277+
switch tableType.elementType.heapType {
278278
case .funcRef:
279279
emptyElement = .function(nil)
280-
case .funcRefNonNull:
281-
emptyElement = .function(nil) // shouldn't be null
282280
case .externRef:
283281
emptyElement = .extern(nil)
284-
case .externRefNonNull:
285-
emptyElement = .extern(nil) // shouldn't be null
286282
}
287283

288284
let numberOfElements = Int(tableType.limits.min)

Sources/WasmKit/Execution/Instructions/InstructionSupport.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -105,11 +105,11 @@ extension Int32: InstructionImmediate {
105105

106106
extension Instruction.RefNullOperand {
107107
init(result: VReg, type: ReferenceType) {
108-
self.init(result: result, rawType: type.rawValue)
108+
self.init(result: result, rawType: 0) // need to figure out rawType here
109109
}
110110

111111
var type: ReferenceType {
112-
ReferenceType(rawValue: rawType).unsafelyUnwrapped
112+
ReferenceType(isNullable: true, heapType: .funcRef) // is this still a valid conversion?
113113
}
114114
}
115115

Sources/WasmKit/Execution/Instructions/Misc.swift

+4-2
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,12 @@ extension Execution {
2222
mutating func refNull(sp: Sp, immediate: Instruction.RefNullOperand) {
2323
let value: Value
2424
switch immediate.type {
25-
case .externRef, .externRefNonNull:
25+
case .externRef:
2626
value = .ref(.extern(nil))
27-
case .funcRef, .funcRefNonNull:
27+
case .funcRef:
2828
value = .ref(.function(nil))
29+
default:
30+
fatalError()
2931
}
3032
sp[immediate.result] = UntypedValue(value)
3133
}

Sources/WasmKit/Execution/UntypedValue.swift

+2-6
Original file line numberDiff line numberDiff line change
@@ -117,14 +117,10 @@ struct UntypedValue: Equatable, Hashable {
117117
switch type {
118118
case .funcRef:
119119
return .function(decodeOptionalInt())
120-
case .funcRefNonNull:
121-
// can skip optional check
122-
return .function(decodeOptionalInt())
123120
case .externRef:
124121
return .extern(decodeOptionalInt())
125-
case .externRefNonNull:
126-
// can skip optional check
127-
return .extern(decodeOptionalInt())
122+
default:
123+
fatalError()
128124
}
129125
}
130126

Sources/WasmKit/Execution/Value.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import enum WasmTypes.ReferenceType
1+
import struct WasmTypes.ReferenceType
22
import enum WasmTypes.ValueType
33

44
/// > Note:

Sources/WasmKit/Validator.swift

-2
Original file line numberDiff line numberDiff line change
@@ -322,9 +322,7 @@ extension WasmTypes.Reference {
322322
// Should we validate nonNull variants have associated values present?
323323
switch (self, type) {
324324
case (.function, .funcRef): return
325-
case (.function, .funcRefNonNull): return
326325
case (.extern, .externRef): return
327-
case (.extern, .externRefNonNull): return
328326
default:
329327
throw ValidationError(.expectTypeButGot(expected: "\(type)", got: "\(self)"))
330328
}

Sources/WasmParser/WasmParser.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,7 @@ extension Parser {
444444
case 0x7C: return .f64
445445
case 0x7B: return .f64
446446
case 0x70: return .ref(.funcRef)
447-
case 0x71: return .ref(.funcRefNonNull)
447+
case 0x71: return .ref(.funcRef)
448448
case 0x6F: return .ref(.externRef)
449449
default:
450450
throw StreamError<Stream.Element>.unexpected(b, index: offset, expected: Set(0x7C...0x7F))

Sources/WasmTypes/WasmTypes.swift

+21-9
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,31 @@ public struct FunctionType: Equatable, Hashable {
1414
public let results: [ValueType]
1515
}
1616

17+
public enum HeapType: Equatable, Hashable {
18+
/// A reference to any kind of function.
19+
case funcRef // -> to be renamed func
20+
21+
/// An external host data.
22+
case externRef // -> to be renamed extern
23+
}
24+
1725
/// Reference types
18-
public enum ReferenceType: UInt8, Equatable, Hashable {
19-
/// A nullable reference type to a function.
20-
case funcRef
26+
public struct ReferenceType: Equatable, Hashable {
27+
public var isNullable: Bool
28+
public var heapType: HeapType
2129

22-
/// A non-nullable reference type to a function
23-
case funcRefNonNull
30+
public static var funcRef: ReferenceType {
31+
ReferenceType(isNullable: true, heapType: .funcRef)
32+
}
2433

25-
/// A nullable external reference type.
26-
case externRef
34+
public static var externRef: ReferenceType {
35+
ReferenceType(isNullable: true, heapType: .externRef)
36+
}
2737

28-
/// A non-nullable external reference type.
29-
case externRefNonNull
38+
public init(isNullable: Bool, heapType: HeapType) {
39+
self.isNullable = isNullable
40+
self.heapType = heapType
41+
}
3042
}
3143

3244
public enum ValueType: Equatable, Hashable {

Tests/WasmKitTests/SpectestTests.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@ final class SpectestTests: XCTestCase {
7272
configuration: defaultConfig
7373
)
7474

75-
XCTAssertEqual(result.passed, 1316)
76-
XCTAssertEqual(result.failed, 218)
75+
XCTAssertEqual(result.passed, 1313)
76+
XCTAssertEqual(result.failed, 221)
7777
XCTAssertEqual(
7878
result.sortedFailedCases(),
7979
[

0 commit comments

Comments
 (0)