feat(arc): waittill undefined param (#149)
This commit is contained in:
parent
008d545bdb
commit
4721acaa4c
@ -302,7 +302,10 @@ auto compiler::emit_stmt_waittill(stmt_waittill const& stm) -> void
|
|||||||
|
|
||||||
for (auto const& entry : stm.args->list)
|
for (auto const& entry : stm.args->list)
|
||||||
{
|
{
|
||||||
emit_opcode(opcode::OP_SafeSetWaittillVariableFieldCached, fmt::format("{}", variable_access(entry->as<expr_identifier>())));
|
if (entry->is<expr_undefined>())
|
||||||
|
emit_opcode(opcode::OP_SafeDecTop);
|
||||||
|
else
|
||||||
|
emit_opcode(opcode::OP_SafeSetWaittillVariableFieldCached, fmt::format("{}", variable_access(entry->as<expr_identifier>())));
|
||||||
}
|
}
|
||||||
|
|
||||||
emit_opcode(opcode::OP_ClearParams);
|
emit_opcode(opcode::OP_ClearParams);
|
||||||
@ -2003,12 +2006,15 @@ auto compiler::process_stmt_waittill(stmt_waittill const& stm) -> void
|
|||||||
{
|
{
|
||||||
for (auto const& entry : stm.args->list)
|
for (auto const& entry : stm.args->list)
|
||||||
{
|
{
|
||||||
if (!entry->is<expr_identifier>())
|
if (!entry->is<expr_identifier>() && !entry->is<expr_undefined>())
|
||||||
{
|
{
|
||||||
throw comp_error(entry->loc(), "illegal waittill param, must be a local variable");
|
throw comp_error(entry->loc(), "illegal waittill param, must be a local variable or undefined");
|
||||||
}
|
}
|
||||||
|
|
||||||
variable_register(entry->as<expr_identifier>());
|
if (entry->is<expr_identifier>())
|
||||||
|
{
|
||||||
|
variable_register(entry->as<expr_identifier>());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -192,6 +192,7 @@ auto decompiler::decompile_instruction(instruction const& inst, bool last) -> vo
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case opcode::OP_GetUndefined:
|
case opcode::OP_GetUndefined:
|
||||||
|
case opcode::OP_SafeDecTop:
|
||||||
{
|
{
|
||||||
stack_.push(expr_undefined::make(loc));
|
stack_.push(expr_undefined::make(loc));
|
||||||
break;
|
break;
|
||||||
@ -1118,7 +1119,6 @@ auto decompiler::decompile_instruction(instruction const& inst, bool last) -> vo
|
|||||||
case opcode::OP_CheckClearParams:
|
case opcode::OP_CheckClearParams:
|
||||||
case opcode::OP_CastFieldObject:
|
case opcode::OP_CastFieldObject:
|
||||||
case opcode::OP_CastBool:
|
case opcode::OP_CastBool:
|
||||||
case opcode::OP_SafeDecTop:
|
|
||||||
break;
|
break;
|
||||||
case opcode::OP_CreateLocalVariable:
|
case opcode::OP_CreateLocalVariable:
|
||||||
case opcode::OP_RemoveLocalVariables:
|
case opcode::OP_RemoveLocalVariables:
|
||||||
|
Loading…
Reference in New Issue
Block a user