Skip to content
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.github.tarcv.zandronum.debotc

import com.github.tarcv.zandronum.debotc.BaseNode.HasNonStackDeps.NON_STACK_DEPS
import com.github.tarcv.zandronum.debotc.BotCommandReturnType.*
import com.github.tarcv.zandronum.debotc.StackChangingNode.AddsTo.*
import com.github.tarcv.zandronum.debotc.StackChangingNode.ArgumentHolder
Expand Down Expand Up @@ -124,7 +125,7 @@ enum class BotCommand(
RETURNVAL_VOID -> DONT_PUSHES_TO_STACK
}

return FunctionNode(readableName, args, addsTo)
return FunctionNode(readableName, args, addsTo, NON_STACK_DEPS)
}
}

Expand Down
114 changes: 69 additions & 45 deletions src/commonMain/kotlin/com/github/tarcv/zandronum/debotc/DataHeaders.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.github.tarcv.zandronum.debotc

import com.github.tarcv.zandronum.debotc.BaseNode.HasNonStackDeps.NON_STACK_DEPS
import com.github.tarcv.zandronum.debotc.StackChangingNode.AddsTo.*
import com.github.tarcv.zandronum.debotc.StackChangingNode.ArgumentHolder.Companion.createNormalStackArgument
import com.github.tarcv.zandronum.debotc.StackChangingNode.Companion.consumesNormalStack
Expand Down Expand Up @@ -235,85 +236,113 @@ enum class DataHeaders(requiredArgs: Int = 0)
DH_ASSIGNGLOBALVAR(1) {
override fun processAndCreateNode(command: Command, vmState: VmState): BaseNode {
vmState.defineGlobalVariable(command.arguments[0])
return CustomStackConsumingNode(1, DONT_PUSHES_TO_STACK) { stackArgs -> "\$global${command.arguments[0]} = ${stackArgs[0]};" }
return CustomStackConsumingNode(1, DONT_PUSHES_TO_STACK, NON_STACK_DEPS) { stackArgs ->
"\$global${command.arguments[0]} = ${stackArgs[0]}"
}
}
},
DH_ADDGLOBALVAR(1) {
override fun processAndCreateNode(command: Command, vmState: VmState): BaseNode {
vmState.defineGlobalVariable(command.arguments[0])
return CustomStackConsumingNode(1, DONT_PUSHES_TO_STACK) { stackArgs -> "\$global${command.arguments[0]} += ${stackArgs[0]};" }
return CustomStackConsumingNode(1, DONT_PUSHES_TO_STACK, NON_STACK_DEPS) { stackArgs ->
"\$global${command.arguments[0]} += ${stackArgs[0]}"
}
}
},
DH_SUBGLOBALVAR(1) {
override fun processAndCreateNode(command: Command, vmState: VmState): BaseNode {
vmState.defineGlobalVariable(command.arguments[0])
return CustomStackConsumingNode(1, DONT_PUSHES_TO_STACK) { stackArgs -> "\$global${command.arguments[0]} -= ${stackArgs[0]};" }
return CustomStackConsumingNode(1, DONT_PUSHES_TO_STACK, NON_STACK_DEPS) { stackArgs ->
"\$global${command.arguments[0]} -= ${stackArgs[0]}"
}
}
},
DH_MULGLOBALVAR(1) {
override fun processAndCreateNode(command: Command, vmState: VmState): BaseNode {
vmState.defineGlobalVariable(command.arguments[0])
return CustomStackConsumingNode(1, DONT_PUSHES_TO_STACK) { stackArgs -> "\$global${command.arguments[0]} *= ${stackArgs[0]};" }
return CustomStackConsumingNode(1, DONT_PUSHES_TO_STACK, NON_STACK_DEPS) { stackArgs ->
"\$global${command.arguments[0]} *= ${stackArgs[0]}"
}
}
},
DH_DIVGLOBALVAR(1) {
override fun processAndCreateNode(command: Command, vmState: VmState): BaseNode {
vmState.defineGlobalVariable(command.arguments[0])
return CustomStackConsumingNode(1, DONT_PUSHES_TO_STACK) { stackArgs -> "\$global${command.arguments[0]} /= ${stackArgs[0]};" }
return CustomStackConsumingNode(1, DONT_PUSHES_TO_STACK, NON_STACK_DEPS) { stackArgs ->
"\$global${command.arguments[0]} /= ${stackArgs[0]}"
}
}
},
DH_MODGLOBALVAR(1) {
override fun processAndCreateNode(command: Command, vmState: VmState): BaseNode {
vmState.defineGlobalVariable(command.arguments[0])
return CustomStackConsumingNode(1, DONT_PUSHES_TO_STACK) { stackArgs -> "\$global${command.arguments[0]} %= ${stackArgs[0]};" }
return CustomStackConsumingNode(1, DONT_PUSHES_TO_STACK, NON_STACK_DEPS) { stackArgs ->
"\$global${command.arguments[0]} %= ${stackArgs[0]}"
}
}
},
DH_INCLOCALVAR(1) {
override fun processAndCreateNode(command: Command, vmState: VmState): BaseNode {
vmState.defineStateVariable(command.arguments[0])
return CustomStackConsumingNode(0, DONT_PUSHES_TO_STACK) { "\$local${command.arguments[0]}++;" }
return CustomStackConsumingNode(0, DONT_PUSHES_TO_STACK, NON_STACK_DEPS) {
"\$local${command.arguments[0]}++"
}
}
},
DH_DECLOCALVAR(1) {
override fun processAndCreateNode(command: Command, vmState: VmState): BaseNode {
vmState.defineStateVariable(command.arguments[0])
return CustomStackConsumingNode(0, DONT_PUSHES_TO_STACK) { "\$local${command.arguments[0]}--;" }
return CustomStackConsumingNode(0, DONT_PUSHES_TO_STACK, NON_STACK_DEPS) {
"\$local${command.arguments[0]}--"
}
}
},
DH_ASSIGNLOCALVAR(1) {
override fun processAndCreateNode(command: Command, vmState: VmState): BaseNode {
vmState.defineStateVariable(command.arguments[0])
return CustomStackConsumingNode(1, DONT_PUSHES_TO_STACK) { stackArgs -> "\$local${command.arguments[0]} = ${stackArgs[0]};" }
return CustomStackConsumingNode(1, DONT_PUSHES_TO_STACK, NON_STACK_DEPS) { stackArgs ->
"\$local${command.arguments[0]} = ${stackArgs[0]}"
}
}
},
DH_ADDLOCALVAR(1) {
override fun processAndCreateNode(command: Command, vmState: VmState): BaseNode {
vmState.defineStateVariable(command.arguments[0])
return CustomStackConsumingNode(1, DONT_PUSHES_TO_STACK) { stackArgs -> "\$local${command.arguments[0]} += ${stackArgs[0]};" }
return CustomStackConsumingNode(1, DONT_PUSHES_TO_STACK, NON_STACK_DEPS) { stackArgs ->
"\$local${command.arguments[0]} += ${stackArgs[0]}"
}
}
},
DH_SUBLOCALVAR(1) {
override fun processAndCreateNode(command: Command, vmState: VmState): BaseNode {
vmState.defineStateVariable(command.arguments[0])
return CustomStackConsumingNode(1, DONT_PUSHES_TO_STACK) { stackArgs -> "\$local${command.arguments[0]} -= ${stackArgs[0]};" }
return CustomStackConsumingNode(1, DONT_PUSHES_TO_STACK, NON_STACK_DEPS) { stackArgs ->
"\$local${command.arguments[0]} -= ${stackArgs[0]}"
}
}
},
DH_MULLOCALVAR(1) {
override fun processAndCreateNode(command: Command, vmState: VmState): BaseNode {
vmState.defineStateVariable(command.arguments[0])
return CustomStackConsumingNode(1, DONT_PUSHES_TO_STACK) { stackArgs -> "\$local${command.arguments[0]} *= ${stackArgs[0]};" }
return CustomStackConsumingNode(1, DONT_PUSHES_TO_STACK, NON_STACK_DEPS) { stackArgs ->
"\$local${command.arguments[0]} *= ${stackArgs[0]}"
}
}
},
DH_DIVLOCALVAR(1) {
override fun processAndCreateNode(command: Command, vmState: VmState): BaseNode {
vmState.defineStateVariable(command.arguments[0])
return CustomStackConsumingNode(1, DONT_PUSHES_TO_STACK) { stackArgs -> "\$local${command.arguments[0]} /= ${stackArgs[0]};" }
return CustomStackConsumingNode(1, DONT_PUSHES_TO_STACK, NON_STACK_DEPS) { stackArgs ->
"\$local${command.arguments[0]} /= ${stackArgs[0]}"
}
}
},
DH_MODLOCALVAR(1) {
override fun processAndCreateNode(command: Command, vmState: VmState): BaseNode {
vmState.defineStateVariable(command.arguments[0])
return CustomStackConsumingNode(1, DONT_PUSHES_TO_STACK) { stackArgs -> "\$local${command.arguments[0]} %= ${stackArgs[0]};" }
return CustomStackConsumingNode(1, DONT_PUSHES_TO_STACK, NON_STACK_DEPS) { stackArgs ->
"\$local${command.arguments[0]} %= ${stackArgs[0]}"
}
}
},
DH_CASEGOTO(2) {
Expand All @@ -332,64 +361,64 @@ enum class DataHeaders(requiredArgs: Int = 0)
},
DH_INCGLOBALARRAY(1) {
override fun processAndCreateNode(command: Command, vmState: VmState): BaseNode {
return CustomStackConsumingNode(1, DONT_PUSHES_TO_STACK) { stackArgs ->
return CustomStackConsumingNode(1, DONT_PUSHES_TO_STACK, NON_STACK_DEPS) { stackArgs ->
vmState.defineGlobalArray(command.arguments[0])
"\$globalArray${command.arguments[0]}[${stackArgs[0]}]++;"
"\$globalArray${command.arguments[0]}[${stackArgs[0]}]++"
}
}
},
DH_DECGLOBALARRAY(1) {
override fun processAndCreateNode(command: Command, vmState: VmState): BaseNode {
return CustomStackConsumingNode(1, DONT_PUSHES_TO_STACK) { stackArgs ->
return CustomStackConsumingNode(1, DONT_PUSHES_TO_STACK, NON_STACK_DEPS) { stackArgs ->
vmState.defineGlobalArray(command.arguments[0])
"\$globalArray${command.arguments[0]}[${stackArgs[0]}]--;" }
"\$globalArray${command.arguments[0]}[${stackArgs[0]}]--" }
}
},
DH_ASSIGNGLOBALARRAY(1) {
override fun processAndCreateNode(command: Command, vmState: VmState): BaseNode {
return CustomStackConsumingNode(2, DONT_PUSHES_TO_STACK) { stackArgs ->
return CustomStackConsumingNode(2, DONT_PUSHES_TO_STACK, NON_STACK_DEPS) { stackArgs ->
vmState.defineGlobalArray(command.arguments[0])
"\$globalArray${command.arguments[0]}[${stackArgs[0]}] = ${stackArgs[1]};" }
"\$globalArray${command.arguments[0]}[${stackArgs[0]}] = ${stackArgs[1]}" }
}
},
DH_ADDGLOBALARRAY(1) {
override fun processAndCreateNode(command: Command, vmState: VmState): BaseNode {
return CustomStackConsumingNode(2, DONT_PUSHES_TO_STACK) { stackArgs ->
return CustomStackConsumingNode(2, DONT_PUSHES_TO_STACK, NON_STACK_DEPS) { stackArgs ->
vmState.defineGlobalArray(command.arguments[0])
"\$globalArray${command.arguments[0]}[${stackArgs[0]}] += ${stackArgs[1]};" }
"\$globalArray${command.arguments[0]}[${stackArgs[0]}] += ${stackArgs[1]}" }
}
},
DH_SUBGLOBALARRAY(1) {
override fun processAndCreateNode(command: Command, vmState: VmState): BaseNode {
return CustomStackConsumingNode(2, DONT_PUSHES_TO_STACK) { stackArgs ->
return CustomStackConsumingNode(2, DONT_PUSHES_TO_STACK, NON_STACK_DEPS) { stackArgs ->
vmState.defineGlobalArray(command.arguments[0])
"\$globalArray${command.arguments[0]}[${stackArgs[0]}] -= ${stackArgs[1]};" }
"\$globalArray${command.arguments[0]}[${stackArgs[0]}] -= ${stackArgs[1]}" }
}
},
DH_MULGLOBALARRAY(1) {
override fun processAndCreateNode(command: Command, vmState: VmState): BaseNode {
return CustomStackConsumingNode(2, DONT_PUSHES_TO_STACK) { stackArgs ->
return CustomStackConsumingNode(2, DONT_PUSHES_TO_STACK, NON_STACK_DEPS) { stackArgs ->
vmState.defineGlobalArray(command.arguments[0])
"\$globalArray${command.arguments[0]}[${stackArgs[0]}] *= ${stackArgs[1]};" }
"\$globalArray${command.arguments[0]}[${stackArgs[0]}] *= ${stackArgs[1]}" }
}
},
DH_DIVGLOBALARRAY(1) {
override fun processAndCreateNode(command: Command, vmState: VmState): BaseNode {
return CustomStackConsumingNode(2, DONT_PUSHES_TO_STACK) { stackArgs ->
return CustomStackConsumingNode(2, DONT_PUSHES_TO_STACK, NON_STACK_DEPS) { stackArgs ->
vmState.defineGlobalArray(command.arguments[0])
"\$globalArray${command.arguments[0]}[${stackArgs[0]}] /= ${stackArgs[1]};" }
"\$globalArray${command.arguments[0]}[${stackArgs[0]}] /= ${stackArgs[1]}" }
}
},
DH_MODGLOBALARRAY(1) {
override fun processAndCreateNode(command: Command, vmState: VmState): BaseNode {
return CustomStackConsumingNode(2, DONT_PUSHES_TO_STACK) { stackArgs ->
return CustomStackConsumingNode(2, DONT_PUSHES_TO_STACK, NON_STACK_DEPS) { stackArgs ->
vmState.defineGlobalArray(command.arguments[0])
"\$globalArray${command.arguments[0]}[${stackArgs[0]}] %= ${stackArgs[1]};" }
"\$globalArray${command.arguments[0]}[${stackArgs[0]}] %= ${stackArgs[1]}" }
}
},
DH_PUSHGLOBALARRAY(1) {
override fun processAndCreateNode(command: Command, vmState: VmState): BaseNode {
return CustomStackConsumingNode(1, ADDS_TO_NORMAL_STACK) { stackArgs ->
return CustomStackConsumingNode(1, ADDS_TO_NORMAL_STACK, NON_STACK_DEPS) { stackArgs ->
vmState.defineGlobalArray(command.arguments[0])
"\$globalArray${command.arguments[0]}[${stackArgs[0]}]" }
}
Expand All @@ -399,33 +428,28 @@ enum class DataHeaders(requiredArgs: Int = 0)
return object : StackChangingNode(
consumesNormalStack(2),
arrayOf(
ReturnPrototype(ADDS_TO_NORMAL_STACK, {arguments -> "${arguments[1]}"}),
ReturnPrototype(ADDS_TO_NORMAL_STACK, {arguments -> "${arguments[0]}"})
ReturnPrototype(ADDS_TO_NORMAL_STACK) { arguments -> "${arguments[1]}"},
ReturnPrototype(ADDS_TO_NORMAL_STACK) { arguments -> "${arguments[0]}"}
)
) {
override val asText: String
get() = "(swap last stack items)"
}
) {}
}
},
DH_DUP{
override fun processAndCreateNode(command: Command, vmState: VmState): BaseNode {
return object : StackChangingNode(
consumesNormalStack(1),
arrayOf(
ReturnPrototype(ADDS_TO_NORMAL_STACK, {arguments -> "${arguments[0]}"}),
ReturnPrototype(ADDS_TO_NORMAL_STACK, {arguments -> "${arguments[0]}"})
ReturnPrototype(ADDS_TO_NORMAL_STACK) { arguments -> "${arguments[0]}"},
ReturnPrototype(ADDS_TO_NORMAL_STACK) { arguments -> "${arguments[0]}"}
)

) {
override val asText: String
get() = "(duplicate stack item)"
}
) {}
}
},
DH_ARRAYSET{
override fun processAndCreateNode(command: Command, vmState: VmState): BaseNode {
return FunctionNode("memset", consumesNormalStack(3), DONT_PUSHES_TO_STACK)
return FunctionNode("memset", consumesNormalStack(3), DONT_PUSHES_TO_STACK,
NON_STACK_DEPS)
}
},

Expand All @@ -439,5 +463,5 @@ enum class DataHeaders(requiredArgs: Int = 0)
}

private fun dropFromStack(): BaseNode {
return DropStackNode("// item dropped from stack")
return DropStackNode()
}
Loading