Short-circuiting "and" and "or" operators

git-svn-id: svn://svn.code.sf.net/p/magicseteditor/code/trunk@1461 0fc631ac-6414-0410-93d0-97cfa31319b6
This commit is contained in:
twanvl
2010-07-23 23:52:34 +00:00
parent 603442e75b
commit 0625cd0aff
6 changed files with 65 additions and 6 deletions
+17 -3
View File
@@ -663,15 +663,29 @@ void parseOper(TokenIterator& input, Script& script, Precedence minPrec, Instruc
parseOper(input, script, PREC_SET, I_SET_VAR, instr.data);
}
else if (minPrec <= PREC_AND && token==_("orelse"))parseOper(input, script, PREC_ADD, I_BINARY, I_OR_ELSE);
else if (minPrec <= PREC_AND && token==_("and")) parseOper(input, script, PREC_CMP, I_BINARY, I_AND);
else if (minPrec <= PREC_AND && token==_("and")) {
// short-circuiting and:
// "XXX and YYY"
// becomes
// XXX
// I_JUMP_SC_AND after # if top==false then goto after else pop
// YYY
// after:
unsigned jmpSC = script.addInstruction(I_JUMP_SC_AND);
parseOper(input, script, PREC_CMP);
script.comeFrom(jmpSC);
}
else if (minPrec <= PREC_AND && token==_("or" )) {
Token t = input.peek();
if (t == _("else")) {// or else
input.read(); // skip else
// TODO: deprecate "or else" in favor of "orelse"
parseOper(input, script, PREC_ADD, I_BINARY, I_OR_ELSE);
parseOper(input, script, PREC_ADD, I_BINARY, I_OR_ELSE);
} else {
parseOper(input, script, PREC_CMP, I_BINARY, I_OR);
// short-circuiting or
unsigned jmpSC = script.addInstruction(I_JUMP_SC_OR);
parseOper(input, script, PREC_CMP);
script.comeFrom(jmpSC);
}
}
else if (minPrec <= PREC_AND && token==_("xor")) parseOper(input, script, PREC_CMP, I_BINARY, I_XOR);