@@ -29,27 +29,81 @@ extension Processor: TracedProcessor {
29
29
30
30
extension Instruction : CustomStringConvertible {
31
31
var description : String {
32
- // TODO: opcode specific rendering
33
- " \( opcode) \( payload) "
34
- }
35
- }
36
-
37
- extension Instruction . Payload : CustomStringConvertible {
38
- var description : String {
39
- // var result = ""
40
- // if hasCondition {
41
- // result += "\(condition) "
42
- // }
43
- // if hasPayload {
44
- // let payload: TypedInt<_Boo> = payload()
45
- // result += payload.description
46
- // }
47
- // return result
48
-
49
- // TODO: Without bit packing our representation, what
50
- // should we do? I'd say a payload cannot be printed
51
- // in isolation of the instruction...
52
- return " \( rawValue) "
32
+ switch opcode {
33
+ case . advance:
34
+ return " \( opcode) \( payload. distance) "
35
+ case . assertBy:
36
+ return " \( opcode) \( payload. assertion) "
37
+ case . backreference:
38
+ return " \( opcode) \( payload. capture. rawValue) "
39
+ case . beginCapture:
40
+ return " \( opcode) \( payload. capture. rawValue) "
41
+ case . branch:
42
+ return " \( opcode) \( payload. addr) "
43
+ case . captureValue:
44
+ let ( val, cap) = payload. pairedValueCapture
45
+ return " \( opcode) vals[ \( val) ] -> captures[ \( cap) ] "
46
+ case . condBranchSamePosition:
47
+ let ( addr, pos) = payload. pairedAddrPos
48
+ return " \( opcode) \( addr) pos[ \( pos) ] "
49
+ case . condBranchZeroElseDecrement:
50
+ let ( addr, int) = payload. pairedAddrInt
51
+ return " \( opcode) \( addr) int[ \( int) ] "
52
+ case . consumeBy:
53
+ return " \( opcode) consumer[ \( payload. consumer) ] "
54
+ case . endCapture:
55
+ return " \( opcode) \( payload. capture. rawValue) "
56
+ case . match:
57
+ let ( isCaseInsensitive, reg) = payload. elementPayload
58
+ if isCaseInsensitive {
59
+ return " matchCaseInsensitive char[ \( reg) ] "
60
+ } else {
61
+ return " match char[ \( reg) ] "
62
+ }
63
+ case . matchBitset:
64
+ let ( isScalar, reg) = payload. bitsetPayload
65
+ if isScalar {
66
+ return " matchBitsetScalar bitset[ \( reg) ] "
67
+ } else {
68
+ return " matchBitset bitset[ \( reg) ] "
69
+ }
70
+ case . matchBuiltin:
71
+ let payload = payload. characterClassPayload
72
+ return " matchBuiltin \( payload. cc) ( \( payload. isInverted) ) "
73
+ case . matchBy:
74
+ let ( matcherReg, valReg) = payload. pairedMatcherValue
75
+ return " \( opcode) match[ \( matcherReg) ] -> val[ \( valReg) ] "
76
+ case . matchScalar:
77
+ let ( scalar, caseInsensitive, boundaryCheck) = payload. scalarPayload
78
+ if caseInsensitive {
79
+ return " matchScalarCaseInsensitive \( scalar) boundaryCheck: \( boundaryCheck) "
80
+ } else {
81
+ return " matchScalar \( scalar) boundaryCheck: \( boundaryCheck) "
82
+ }
83
+ case . moveCurrentPosition:
84
+ let reg = payload. position
85
+ return " \( opcode) -> pos[ \( reg) ] "
86
+ case . moveImmediate:
87
+ let ( imm, reg) = payload. pairedImmediateInt
88
+ return " \( opcode) \( imm) -> int[ \( reg) ] "
89
+ case . quantify:
90
+ let payload = payload. quantify
91
+ return " \( opcode) \( payload. type) \( payload. minTrips) \( payload. extraTrips? . description ?? " unbounded " ) "
92
+ case . save:
93
+ let resumeAddr = payload. addr
94
+ return " \( opcode) \( resumeAddr) "
95
+ case . saveAddress:
96
+ let resumeAddr = payload. addr
97
+ return " \( opcode) \( resumeAddr) "
98
+ case . splitSaving:
99
+ let ( nextPC, resumeAddr) = payload. pairedAddrAddr
100
+ return " \( opcode) saving: \( resumeAddr) jumpingTo: \( nextPC) "
101
+ case . transformCapture:
102
+ let ( cap, trans) = payload. pairedCaptureTransform
103
+ return " \( opcode) trans[ \( trans) ]( \( cap) ) "
104
+ default :
105
+ return " \( opcode) "
106
+ }
53
107
}
54
108
}
55
109
@@ -62,7 +116,9 @@ extension Processor.SavePoint {
62
116
if rangeIsEmpty {
63
117
posStr = " <none> "
64
118
} else {
65
- posStr = " \( rangeStart!... rangeEnd!) "
119
+ let startStr = " \( input. distance ( from: input. startIndex, to: rangeStart!) ) "
120
+ let endStr = " \( input. distance ( from: input. startIndex, to: rangeEnd!) ) "
121
+ posStr = " \( startStr) ... \( endStr) "
66
122
}
67
123
}
68
124
return """
0 commit comments