Implement interpretation for destructing declaration
This commit is contained in:
+13
-6
@@ -102,6 +102,7 @@ class IrInterpreter(irModule: IrModuleFragment) {
|
|||||||
is IrStringConcatenation -> interpretStringConcatenation(this, data)
|
is IrStringConcatenation -> interpretStringConcatenation(this, data)
|
||||||
is IrFunctionExpression -> interpretFunctionExpression(this, data)
|
is IrFunctionExpression -> interpretFunctionExpression(this, data)
|
||||||
is IrFunctionReference -> interpretFunctionReference(this, data)
|
is IrFunctionReference -> interpretFunctionReference(this, data)
|
||||||
|
is IrComposite -> interpretComposite(this, data)
|
||||||
|
|
||||||
else -> TODO("${this.javaClass} not supported")
|
else -> TODO("${this.javaClass} not supported")
|
||||||
}
|
}
|
||||||
@@ -521,23 +522,22 @@ class IrInterpreter(irModule: IrModuleFragment) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun interpretStatements(statements: List<IrStatement>, data: Frame): Code {
|
private suspend fun interpretStatements(statements: List<IrStatement>, data: Frame): Code {
|
||||||
val newFrame = data.copy()
|
|
||||||
|
|
||||||
var code = Code.NEXT
|
var code = Code.NEXT
|
||||||
val iterator = statements.iterator()
|
val iterator = statements.iterator()
|
||||||
while (code == Code.NEXT && iterator.hasNext()) {
|
while (code == Code.NEXT && iterator.hasNext()) {
|
||||||
code = iterator.next().interpret(newFrame)
|
code = iterator.next().interpret(data)
|
||||||
}
|
}
|
||||||
data.pushReturnValue(newFrame)
|
|
||||||
return code
|
return code
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun interpretBlock(block: IrBlock, data: Frame): Code {
|
private suspend fun interpretBlock(block: IrBlock, data: Frame): Code {
|
||||||
return interpretStatements(block.statements, data)
|
val newFrame = data.copy()
|
||||||
|
return interpretStatements(block.statements, newFrame).apply { data.pushReturnValue(newFrame) }
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun interpretBody(body: IrBody, data: Frame): Code {
|
private suspend fun interpretBody(body: IrBody, data: Frame): Code {
|
||||||
return interpretStatements(body.statements, data)
|
val newFrame = data.copy()
|
||||||
|
return interpretStatements(body.statements, newFrame).apply { data.pushReturnValue(newFrame) }
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun interpretReturn(expression: IrReturn, data: Frame): Code {
|
private suspend fun interpretReturn(expression: IrReturn, data: Frame): Code {
|
||||||
@@ -804,4 +804,11 @@ class IrInterpreter(irModule: IrModuleFragment) {
|
|||||||
data.pushReturnValue(Lambda(reference.symbol.owner, reference.type.classOrNull!!.owner))
|
data.pushReturnValue(Lambda(reference.symbol.owner, reference.type.classOrNull!!.owner))
|
||||||
return Code.NEXT
|
return Code.NEXT
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private suspend fun interpretComposite(expression: IrComposite, data: Frame): Code {
|
||||||
|
return when (expression.origin) {
|
||||||
|
IrStatementOrigin.DESTRUCTURING_DECLARATION -> interpretStatements(expression.statements, data)
|
||||||
|
else -> TODO("${expression.origin} not implemented")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user