diff --git a/src/cs_gen.cc b/src/cs_gen.cc index dbfa675b..5e4067b6 100644 --- a/src/cs_gen.cc +++ b/src/cs_gen.cc @@ -1540,7 +1540,7 @@ compilecomv: if (!more) { if (op1 == (CsCodeBlock | (len1 << 8))) { gs.code[start1] = (len1 << 8) | - CsCodeJumpFalse; + CsCodeJumpB | CsCodeFlagFalse; gs.code[start1 + 1] = CsCodeEnterResult; gs.code[start1 + len1] = ( gs.code[start1 + len1] & ~CsCodeRetMask @@ -1556,7 +1556,7 @@ compilecomv: if (op1 == (CsCodeBlock | (len1 << 8))) { gs.code[start1] = ( (start2 - start1) << 8 - ) | CsCodeJumpFalse; + ) | CsCodeJumpB | CsCodeFlagFalse; gs.code[start1 + 1] = CsCodeEnterResult; gs.code[start1 + len1] = ( gs.code[start1 + len1] & ~CsCodeRetMask @@ -1570,7 +1570,8 @@ compilecomv: } else if (op1 == (CsCodeEmpty | (len1 << 8))) { gs.code[start1] = CsCodeNull | (inst2 & CsCodeRetMask); - gs.code[start2] = (len2 << 8) | CsCodeJumpTrue; + gs.code[start2] = (len2 << 8) + | CsCodeJumpB | CsCodeFlagTrue; gs.code[start2 + 1] = CsCodeEnterResult; gs.code[start2 + len2] = ( gs.code[start2 + len2] & ~CsCodeRetMask @@ -1653,8 +1654,8 @@ compilecomv: ); } else { ostd::Uint32 op = (id->get_type_raw() == CsIdAnd) - ? CsCodeJumpResultFalse - : CsCodeJumpResultTrue; + ? (CsCodeJumpResult | CsCodeFlagFalse) + : (CsCodeJumpResult | CsCodeFlagTrue); gs.code.push(op); end = gs.code.size(); while ((start + 1) < end) { diff --git a/src/cs_vm.cc b/src/cs_vm.cc index 2778ec99..fe95a93d 100644 --- a/src/cs_vm.cc +++ b/src/cs_vm.cc @@ -253,10 +253,10 @@ static ostd::Uint32 *skipcode( } case CsCodeBlock: case CsCodeJump: - case CsCodeJumpTrue: - case CsCodeJumpFalse: - case CsCodeJumpResultTrue: - case CsCodeJumpResultFalse: { + case CsCodeJumpB | CsCodeFlagTrue: + case CsCodeJumpB | CsCodeFlagFalse: + case CsCodeJumpResult | CsCodeFlagTrue: + case CsCodeJumpResult | CsCodeFlagFalse: { ostd::Uint32 len = op >> 8; code += len; continue; @@ -694,21 +694,21 @@ static ostd::Uint32 *runcode(CsState &cs, ostd::Uint32 *code, CsValue &result) { code += len; continue; } - case CsCodeJumpTrue: { + case CsCodeJumpB | CsCodeFlagTrue: { ostd::Uint32 len = op >> 8; if (args[--numargs].get_bool()) { code += len; } continue; } - case CsCodeJumpFalse: { + case CsCodeJumpB | CsCodeFlagFalse: { ostd::Uint32 len = op >> 8; if (!args[--numargs].get_bool()) { code += len; } continue; } - case CsCodeJumpResultTrue: { + case CsCodeJumpResult | CsCodeFlagTrue: { ostd::Uint32 len = op >> 8; --numargs; if (args[numargs].get_type() == CsValueType::Code) { @@ -721,7 +721,7 @@ static ostd::Uint32 *runcode(CsState &cs, ostd::Uint32 *code, CsValue &result) { } continue; } - case CsCodeJumpResultFalse: { + case CsCodeJumpResult | CsCodeFlagFalse: { ostd::Uint32 len = op >> 8; --numargs; if (args[numargs].get_type() == CsValueType::Code) { diff --git a/src/cs_vm.hh b/src/cs_vm.hh index 5e9e4171..cf66205c 100644 --- a/src/cs_vm.hh +++ b/src/cs_vm.hh @@ -75,8 +75,7 @@ enum { CsCodePrint, CsCodeLocal, CsCodeDo, CsCodeDoArgs, - CsCodeJump, CsCodeJumpTrue, CsCodeJumpFalse, - CsCodeJumpResultTrue, CsCodeJumpResultFalse, + CsCodeJump, CsCodeJumpB, CsCodeJumpResult, CsCodeOpMask = 0x3F, CsCodeRet = 6, @@ -87,6 +86,10 @@ enum { CsRetString = CsValString << CsCodeRet, CsRetInt = CsValInt << CsCodeRet, CsRetFloat = CsValFloat << CsCodeRet, + + /* CsCodeJumpB, CsCodeJumpResult */ + CsCodeFlagTrue = 1 << CsCodeRet, + CsCodeFlagFalse = 0 << CsCodeRet }; struct CsSharedState {