Skip to content

Commit 13ee326

Browse files
committed
refactor control execution instructions
1 parent ed36ed9 commit 13ee326

File tree

7 files changed

+151
-48
lines changed

7 files changed

+151
-48
lines changed

executor/invoker/src/commonMain/kotlin/io/github/charlietap/chasm/executor/invoker/instruction/control/BlockExecutor.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import com.github.michaelbull.result.Result
66
import com.github.michaelbull.result.binding
77
import io.github.charlietap.chasm.ast.instruction.ControlInstruction
88
import io.github.charlietap.chasm.ast.instruction.Instruction
9+
import io.github.charlietap.chasm.executor.invoker.context.ExecutionContext
910
import io.github.charlietap.chasm.executor.invoker.instruction.InstructionBlockExecutor
1011
import io.github.charlietap.chasm.executor.runtime.Arity
1112
import io.github.charlietap.chasm.executor.runtime.Stack
@@ -17,6 +18,17 @@ import io.github.charlietap.chasm.executor.runtime.store.Store
1718

1819
internal typealias BlockExecutor = (Store, Stack, ControlInstruction.BlockType, List<Instruction>) -> Result<Unit, InvocationError>
1920

21+
internal inline fun BlockExecutor(
22+
context: ExecutionContext,
23+
instruction: ControlInstruction.Block,
24+
): Result<Unit, InvocationError> =
25+
BlockExecutor(
26+
store = context.store,
27+
stack = context.stack,
28+
blockType = instruction.blockType,
29+
instructions = instruction.instructions,
30+
)
31+
2032
internal inline fun BlockExecutor(
2133
store: Store,
2234
stack: Stack,

executor/invoker/src/commonMain/kotlin/io/github/charlietap/chasm/executor/invoker/instruction/control/BrOnCastExecutor.kt

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package io.github.charlietap.chasm.executor.invoker.instruction.control
33
import com.github.michaelbull.result.Result
44
import com.github.michaelbull.result.binding
55
import com.github.michaelbull.result.toResultOr
6+
import io.github.charlietap.chasm.ast.instruction.ControlInstruction
67
import io.github.charlietap.chasm.ast.module.Index
78
import io.github.charlietap.chasm.ast.type.ReferenceType
89
import io.github.charlietap.chasm.executor.invoker.context.ExecutionContext
@@ -21,17 +22,30 @@ internal typealias BrOnCastExecutor = (ExecutionContext, Index.LabelIndex, Refer
2122

2223
internal fun BrOnCastExecutor(
2324
context: ExecutionContext,
24-
labelIndex: Index.LabelIndex,
25-
referenceType1: ReferenceType,
26-
referenceType2: ReferenceType,
27-
breakIfMatches: Boolean,
25+
instruction: ControlInstruction.BrOnCast,
26+
): Result<Unit, InvocationError> =
27+
BrOnCastExecutor(
28+
context = context,
29+
labelIndex = instruction.labelIndex,
30+
referenceType1 = instruction.srcReferenceType,
31+
referenceType2 = instruction.dstReferenceType,
32+
breakIfMatches = true,
33+
referenceTypeSubstitutor = ::ReferenceTypeSubstitutor,
34+
referenceTypeMatcher = ::ReferenceTypeMatcher,
35+
typeOfReferenceValue = ::TypeOfReferenceValue,
36+
breakExecutor = ::BreakExecutor,
37+
)
38+
39+
internal fun BrOnCastFailExecutor(
40+
context: ExecutionContext,
41+
instruction: ControlInstruction.BrOnCastFail,
2842
): Result<Unit, InvocationError> =
2943
BrOnCastExecutor(
3044
context = context,
31-
labelIndex = labelIndex,
32-
referenceType1 = referenceType1,
33-
referenceType2 = referenceType2,
34-
breakIfMatches = breakIfMatches,
45+
labelIndex = instruction.labelIndex,
46+
referenceType1 = instruction.srcReferenceType,
47+
referenceType2 = instruction.dstReferenceType,
48+
breakIfMatches = false,
3549
referenceTypeSubstitutor = ::ReferenceTypeSubstitutor,
3650
referenceTypeMatcher = ::ReferenceTypeMatcher,
3751
typeOfReferenceValue = ::TypeOfReferenceValue,

executor/invoker/src/commonMain/kotlin/io/github/charlietap/chasm/executor/invoker/instruction/control/BreakExecutor.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ package io.github.charlietap.chasm.executor.invoker.instruction.control
44

55
import com.github.michaelbull.result.Result
66
import com.github.michaelbull.result.binding
7+
import io.github.charlietap.chasm.ast.instruction.ControlInstruction
78
import io.github.charlietap.chasm.ast.module.Index
9+
import io.github.charlietap.chasm.executor.invoker.context.ExecutionContext
810
import io.github.charlietap.chasm.executor.invoker.ext.index
911
import io.github.charlietap.chasm.executor.runtime.Stack
1012
import io.github.charlietap.chasm.executor.runtime.error.InvocationError
@@ -16,6 +18,15 @@ import io.github.charlietap.chasm.executor.runtime.instruction.AdminInstruction
1618

1719
internal typealias BreakExecutor = (Stack, Index.LabelIndex) -> Result<Unit, InvocationError>
1820

21+
internal inline fun BreakExecutor(
22+
context: ExecutionContext,
23+
instruction: ControlInstruction.Br,
24+
): Result<Unit, InvocationError> =
25+
BreakExecutor(
26+
stack = context.stack,
27+
labelIndex = instruction.labelIndex,
28+
)
29+
1930
internal inline fun BreakExecutor(
2031
stack: Stack,
2132
labelIndex: Index.LabelIndex,

executor/invoker/src/commonMain/kotlin/io/github/charlietap/chasm/executor/invoker/instruction/control/ControlInstructionExecutor.kt

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package io.github.charlietap.chasm.executor.invoker.instruction.control
22

3-
import com.github.michaelbull.result.Err
43
import com.github.michaelbull.result.Result
54
import com.github.michaelbull.result.binding
65
import io.github.charlietap.chasm.ast.instruction.ControlInstruction
@@ -30,10 +29,13 @@ internal fun ControlInstructionExecutor(
3029
brOnNullExecutor = ::BrOnNullExecutor,
3130
brOnNonNullExecutor = ::BrOnNonNullExecutor,
3231
brOnCastExecutor = ::BrOnCastExecutor,
32+
brOnCastFailExecutor = ::BrOnCastFailExecutor,
33+
nopExecutor = ::NopExecutor,
3334
returnExecutor = ::ReturnExecutor,
3435
throwExecutor = ::ThrowExecutor,
3536
throwRefExecutor = ::ThrowRefExecutor,
3637
tryTableExecutor = ::TryTableExecutor,
38+
unreachableExecutor = ::UnreachableExecutor,
3739
)
3840

3941
internal inline fun ControlInstructionExecutor(
@@ -45,28 +47,30 @@ internal inline fun ControlInstructionExecutor(
4547
crossinline returnCallIndirectExecutor: Executor<ControlInstruction.ReturnCallIndirect>,
4648
crossinline callRefExecutor: Executor<ControlInstruction.CallRef>,
4749
crossinline returnCallRefExecutor: Executor<ControlInstruction.ReturnCallRef>,
48-
crossinline blockExecutor: BlockExecutor,
50+
crossinline blockExecutor: Executor<ControlInstruction.Block>,
4951
crossinline loopExecutor: Executor<ControlInstruction.Loop>,
5052
crossinline ifExecutor: Executor<ControlInstruction.If>,
51-
crossinline breakExecutor: BreakExecutor,
53+
crossinline breakExecutor: Executor<ControlInstruction.Br>,
5254
crossinline brIfExecutor: Executor<ControlInstruction.BrIf>,
5355
crossinline brTableExecutor: Executor<ControlInstruction.BrTable>,
5456
crossinline brOnNullExecutor: Executor<ControlInstruction.BrOnNull>,
5557
crossinline brOnNonNullExecutor: Executor<ControlInstruction.BrOnNonNull>,
56-
crossinline brOnCastExecutor: BrOnCastExecutor,
58+
crossinline brOnCastExecutor: Executor<ControlInstruction.BrOnCast>,
59+
crossinline brOnCastFailExecutor: Executor<ControlInstruction.BrOnCastFail>,
60+
crossinline nopExecutor: Executor<ControlInstruction.Nop>,
5761
crossinline returnExecutor: Executor<ControlInstruction.Return>,
5862
crossinline throwExecutor: Executor<ControlInstruction.Throw>,
5963
crossinline throwRefExecutor: Executor<ControlInstruction.ThrowRef>,
6064
crossinline tryTableExecutor: Executor<ControlInstruction.TryTable>,
65+
crossinline unreachableExecutor: Executor<ControlInstruction.Unreachable>,
6166
): Result<Unit, InvocationError> = binding {
62-
val (stack, store) = context
6367
when (instruction) {
64-
is ControlInstruction.Nop -> Unit
65-
is ControlInstruction.Unreachable -> Err(InvocationError.Trap.TrapEncountered).bind<Unit>()
66-
is ControlInstruction.Block -> blockExecutor(store, stack, instruction.blockType, instruction.instructions).bind()
68+
is ControlInstruction.Nop -> nopExecutor(context, instruction).bind()
69+
is ControlInstruction.Unreachable -> unreachableExecutor(context, instruction).bind()
70+
is ControlInstruction.Block -> blockExecutor(context, instruction).bind()
6771
is ControlInstruction.Loop -> loopExecutor(context, instruction).bind()
6872
is ControlInstruction.If -> ifExecutor(context, instruction).bind()
69-
is ControlInstruction.Br -> breakExecutor(stack, instruction.labelIndex).bind()
73+
is ControlInstruction.Br -> breakExecutor(context, instruction).bind()
7074
is ControlInstruction.BrIf -> brIfExecutor(context, instruction).bind()
7175
is ControlInstruction.BrTable -> brTableExecutor(context, instruction).bind()
7276
is ControlInstruction.BrOnNull -> brOnNullExecutor(context, instruction).bind()
@@ -78,10 +82,8 @@ internal inline fun ControlInstructionExecutor(
7882
is ControlInstruction.ReturnCallIndirect -> returnCallIndirectExecutor(context, instruction).bind()
7983
is ControlInstruction.CallRef -> callRefExecutor(context, instruction).bind()
8084
is ControlInstruction.ReturnCallRef -> returnCallRefExecutor(context, instruction).bind()
81-
is ControlInstruction.BrOnCast ->
82-
brOnCastExecutor(context, instruction.labelIndex, instruction.srcReferenceType, instruction.dstReferenceType, true).bind()
83-
is ControlInstruction.BrOnCastFail ->
84-
brOnCastExecutor(context, instruction.labelIndex, instruction.srcReferenceType, instruction.dstReferenceType, false).bind()
85+
is ControlInstruction.BrOnCast -> brOnCastExecutor(context, instruction).bind()
86+
is ControlInstruction.BrOnCastFail -> brOnCastFailExecutor(context, instruction).bind()
8587
is ControlInstruction.Throw -> throwExecutor(context, instruction).bind()
8688
is ControlInstruction.ThrowRef -> throwRefExecutor(context, instruction).bind()
8789
is ControlInstruction.TryTable -> tryTableExecutor(context, instruction).bind()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package io.github.charlietap.chasm.executor.invoker.instruction.control
2+
3+
import com.github.michaelbull.result.Ok
4+
import com.github.michaelbull.result.Result
5+
import io.github.charlietap.chasm.ast.instruction.ControlInstruction
6+
import io.github.charlietap.chasm.executor.invoker.context.ExecutionContext
7+
import io.github.charlietap.chasm.executor.runtime.error.InvocationError
8+
9+
internal inline fun NopExecutor(
10+
context: ExecutionContext,
11+
instruction: ControlInstruction.Nop,
12+
): Result<Unit, InvocationError> = Ok(Unit)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package io.github.charlietap.chasm.executor.invoker.instruction.control
2+
3+
import com.github.michaelbull.result.Err
4+
import com.github.michaelbull.result.Result
5+
import io.github.charlietap.chasm.ast.instruction.ControlInstruction
6+
import io.github.charlietap.chasm.executor.invoker.context.ExecutionContext
7+
import io.github.charlietap.chasm.executor.runtime.error.InvocationError
8+
9+
internal inline fun UnreachableExecutor(
10+
context: ExecutionContext,
11+
instruction: ControlInstruction.Unreachable,
12+
): Result<Unit, InvocationError> = Err(InvocationError.Trap.TrapEncountered)

0 commit comments

Comments
 (0)