feat: 添加跳转指令支持及条件语句编译实现
This commit is contained in:
@@ -89,12 +89,34 @@ namespace Fig
|
||||
case OpCode::Exit: {
|
||||
return Value::GetNullInstance();
|
||||
}
|
||||
|
||||
case OpCode::LoadK: {
|
||||
std::uint16_t bx = decodeBx(inst);
|
||||
registers[a] = k[bx]; // constants
|
||||
break;
|
||||
}
|
||||
|
||||
case OpCode::Return: {
|
||||
return registers[a];
|
||||
}
|
||||
|
||||
case OpCode::Jmp: {
|
||||
std::int16_t sbx = decodeSBx(inst);
|
||||
ip += sbx;
|
||||
break;
|
||||
}
|
||||
|
||||
case OpCode::JmpIfFalse: {
|
||||
Value &v = registers[a];
|
||||
bool cond = v.AsBool(); // 条件类型 Compiler检查
|
||||
if (!cond)
|
||||
{
|
||||
std::int16_t sbx = decodeSBx(inst);
|
||||
ip += sbx;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case OpCode::Mov: {
|
||||
std::uint16_t bx = decodeBx(inst);
|
||||
registers[a] = registers[bx];
|
||||
@@ -113,9 +135,6 @@ namespace Fig
|
||||
BINARY_COMPARE_OP(GreaterEqual, >=);
|
||||
BINARY_COMPARE_OP(LessEqual, <=);
|
||||
|
||||
case OpCode::Return: {
|
||||
return registers[a];
|
||||
}
|
||||
|
||||
default: {
|
||||
assert(false && "VM: Unknown OpCode encountered!");
|
||||
|
||||
Reference in New Issue
Block a user