From 57c75dae317c2b5972b7be3d315a33f52c3c4e70 Mon Sep 17 00:00:00 2001 From: Jonathan Turner Date: Wed, 1 Jul 2009 17:57:14 +0000 Subject: [PATCH] Add && and || operator short-circuiting --- chaiscript/chaiscript_eval.hpp | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/chaiscript/chaiscript_eval.hpp b/chaiscript/chaiscript_eval.hpp index f571b390..8e21e2ef 100644 --- a/chaiscript/chaiscript_eval.hpp +++ b/chaiscript/chaiscript_eval.hpp @@ -139,8 +139,38 @@ namespace chaiscript retval = ss.get_object(node->children[0]->text); } break; + case (Token_Type::Expression) : { + retval = eval_token(ss, node->children[0]); + if (node->children.size() > 1) { + for (i = 1; i < node->children.size(); i += 2) { + bool lhs; + try { + lhs = dispatchkit::boxed_cast(retval); + } + catch (std::exception &e) { + throw EvalError("Condition not boolean", node); + } + if (node->children[i]->text == "&&") { + if (lhs) { + retval = eval_token(ss, node->children[i+1]); + } + else { + retval = dispatchkit::Boxed_Value(false); + } + } + else if (node->children[i]->text == "||") { + if (lhs) { + retval = dispatchkit::Boxed_Value(true); + } + else { + retval = eval_token(ss, node->children[i+1]); + } + } + } + } + } + break; case (Token_Type::Comparison) : - case (Token_Type::Expression) : case (Token_Type::Additive) : case (Token_Type::Multiplicative) : { retval = eval_token(ss, node->children[0]);