 						{
 							//trace(StringLib.lpad('', stack.length, '\t') + "[" + call.evalIndex + "] " + compiledParams[call.evalIndex].name);
 							
-							if (call.evalIndex > CONDITION_INDEX)
-							{
-								// handle branching and short-circuiting
-								if (call.evaluatedMethod == OPERATOR_BRANCH || call.evaluatedMethod == OPERATOR_AND)
-									if (call.evalIndex != (call.evaluatedParams[CONDITION_INDEX] ? TRUE_INDEX : FALSE_INDEX))
-										continue;
-								if (call.evaluatedMethod == OPERATOR_OR && call.evalIndex == (call.evaluatedParams[CONDITION_INDEX] ? TRUE_INDEX : FALSE_INDEX))
+							// handle branching and short-circuiting
+							result = BRANCH_LOOKUP[call.evaluatedMethod];
+							if (result !== undefined && call.evalIndex > CONDITION_INDEX)
+								if (result == (call.evalIndex != (call.evaluatedParams[CONDITION_INDEX] ? TRUE_INDEX : FALSE_INDEX)))
 									continue;
-							}
 							
 							if (call.evalIndex == METHOD_INDEX)
 								subCall = call.compiledMethod as CompiledFunctionCall;

					continue;
				
				// if the token starts with a quote, treat it as a String
				if (str.charAt(0) == '"' || str.charAt(0) == "'")
				{
					// parse quoted String, handling '""' escape sequence.
					tokens[i] = new CompiledConstant(str, decodeString(str));
				}
				else
				{

							// variable lookup -- call.compiledMethod is a constant and call.evaluatedMethod is the method name
							result = symbolTable is Function ? symbolTable(call.evaluatedMethod) : symbolTable[call.evaluatedMethod];
							if (result === undefined)
								result = functions[call.evaluatedMethod] || defaultSymbolTable[call.evaluatedMethod];
						}
					}
					catch (e:Error)
