: m_Operator(op), m_Operand1(operand1), m_Operand2(operand2), m_DebugInfo(di)
{ }
-Value AExpression::Evaluate(const Dictionary::Ptr& locals) const
+Value AExpression::Evaluate(const Dictionary::Ptr& locals, DebugHint *dhint) const
{
try {
#ifdef _DEBUG
}
#endif /* _DEBUG */
- return m_Operator(this, locals);
+ return m_Operator(this, locals, dhint);
} catch (const std::exception& ex) {
if (boost::get_error_info<boost::errinfo_nested_exception>(ex))
throw;
DumpOperand(stream, m_Operand2, indent + 1);
}
-Value AExpression::EvaluateOperand1(const Dictionary::Ptr& locals) const
+Value AExpression::EvaluateOperand1(const Dictionary::Ptr& locals, DebugHint *dhint) const
{
- return static_cast<AExpression::Ptr>(m_Operand1)->Evaluate(locals);
+ return static_cast<AExpression::Ptr>(m_Operand1)->Evaluate(locals, dhint);
}
-Value AExpression::EvaluateOperand2(const Dictionary::Ptr& locals) const
+Value AExpression::EvaluateOperand2(const Dictionary::Ptr& locals, DebugHint *dhint) const
{
- return static_cast<AExpression::Ptr>(m_Operand2)->Evaluate(locals);
+ return static_cast<AExpression::Ptr>(m_Operand2)->Evaluate(locals, dhint);
}
-Value AExpression::OpLiteral(const AExpression *expr, const Dictionary::Ptr&)
+Value AExpression::OpLiteral(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
return expr->m_Operand1;
}
-Value AExpression::OpVariable(const AExpression *expr, const Dictionary::Ptr& locals)
+Value AExpression::OpVariable(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
Dictionary::Ptr scope = locals;
return ScriptVariable::Get(expr->m_Operand1);
}
-Value AExpression::OpNegate(const AExpression *expr, const Dictionary::Ptr& locals)
+Value AExpression::OpNegate(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
return ~(long)expr->EvaluateOperand1(locals);
}
-Value AExpression::OpLogicalNegate(const AExpression *expr, const Dictionary::Ptr& locals)
+Value AExpression::OpLogicalNegate(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
return !expr->EvaluateOperand1(locals).ToBool();
}
-Value AExpression::OpAdd(const AExpression *expr, const Dictionary::Ptr& locals)
+Value AExpression::OpAdd(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
return expr->EvaluateOperand1(locals) + expr->EvaluateOperand2(locals);
}
-Value AExpression::OpSubtract(const AExpression *expr, const Dictionary::Ptr& locals)
+Value AExpression::OpSubtract(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
return expr->EvaluateOperand1(locals) - expr->EvaluateOperand2(locals);
}
-Value AExpression::OpMultiply(const AExpression *expr, const Dictionary::Ptr& locals)
+Value AExpression::OpMultiply(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
return expr->EvaluateOperand1(locals) * expr->EvaluateOperand2(locals);
}
-Value AExpression::OpDivide(const AExpression *expr, const Dictionary::Ptr& locals)
+Value AExpression::OpDivide(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
return expr->EvaluateOperand1(locals) / expr->EvaluateOperand2(locals);
}
-Value AExpression::OpBinaryAnd(const AExpression *expr, const Dictionary::Ptr& locals)
+Value AExpression::OpBinaryAnd(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
return expr->EvaluateOperand1(locals) & expr->EvaluateOperand2(locals);
}
-Value AExpression::OpBinaryOr(const AExpression *expr, const Dictionary::Ptr& locals)
+Value AExpression::OpBinaryOr(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
return expr->EvaluateOperand1(locals) | expr->EvaluateOperand2(locals);
}
-Value AExpression::OpShiftLeft(const AExpression *expr, const Dictionary::Ptr& locals)
+Value AExpression::OpShiftLeft(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
return expr->EvaluateOperand1(locals) << expr->EvaluateOperand2(locals);
}
-Value AExpression::OpShiftRight(const AExpression *expr, const Dictionary::Ptr& locals)
+Value AExpression::OpShiftRight(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
return expr->EvaluateOperand1(locals) >> expr->EvaluateOperand2(locals);
}
-Value AExpression::OpEqual(const AExpression *expr, const Dictionary::Ptr& locals)
+Value AExpression::OpEqual(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
return expr->EvaluateOperand1(locals) == expr->EvaluateOperand2(locals);
}
-Value AExpression::OpNotEqual(const AExpression *expr, const Dictionary::Ptr& locals)
+Value AExpression::OpNotEqual(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
return expr->EvaluateOperand1(locals) != expr->EvaluateOperand2(locals);
}
-Value AExpression::OpLessThan(const AExpression *expr, const Dictionary::Ptr& locals)
+Value AExpression::OpLessThan(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
return expr->EvaluateOperand1(locals) < expr->EvaluateOperand2(locals);
}
-Value AExpression::OpGreaterThan(const AExpression *expr, const Dictionary::Ptr& locals)
+Value AExpression::OpGreaterThan(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
return expr->EvaluateOperand1(locals) > expr->EvaluateOperand2(locals);
}
-Value AExpression::OpLessThanOrEqual(const AExpression *expr, const Dictionary::Ptr& locals)
+Value AExpression::OpLessThanOrEqual(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
return expr->EvaluateOperand1(locals) <= expr->EvaluateOperand2(locals);
}
-Value AExpression::OpGreaterThanOrEqual(const AExpression *expr, const Dictionary::Ptr& locals)
+Value AExpression::OpGreaterThanOrEqual(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
return expr->EvaluateOperand1(locals) >= expr->EvaluateOperand2(locals);
}
-Value AExpression::OpIn(const AExpression *expr, const Dictionary::Ptr& locals)
+Value AExpression::OpIn(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
Value right = expr->EvaluateOperand2(locals);
return found;
}
-Value AExpression::OpNotIn(const AExpression *expr, const Dictionary::Ptr& locals)
+Value AExpression::OpNotIn(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
- return !OpIn(expr, locals);
+ return !OpIn(expr, locals, dhint);
}
-Value AExpression::OpLogicalAnd(const AExpression *expr, const Dictionary::Ptr& locals)
+Value AExpression::OpLogicalAnd(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
return expr->EvaluateOperand1(locals).ToBool() && expr->EvaluateOperand2(locals).ToBool();
}
-Value AExpression::OpLogicalOr(const AExpression *expr, const Dictionary::Ptr& locals)
+Value AExpression::OpLogicalOr(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
return expr->EvaluateOperand1(locals).ToBool() || expr->EvaluateOperand2(locals).ToBool();
}
-Value AExpression::OpFunctionCall(const AExpression *expr, const Dictionary::Ptr& locals)
+Value AExpression::OpFunctionCall(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
Value funcName = expr->EvaluateOperand1(locals);
return func->Invoke(arguments);
}
-Value AExpression::OpArray(const AExpression *expr, const Dictionary::Ptr& locals)
+Value AExpression::OpArray(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
Array::Ptr arr = expr->m_Operand1;
Array::Ptr result = make_shared<Array>();
return result;
}
-Value AExpression::OpDict(const AExpression *expr, const Dictionary::Ptr& locals)
+Value AExpression::OpDict(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
Array::Ptr arr = expr->m_Operand1;
bool in_place = expr->m_Operand2;
for (Array::SizeType index = 0; index < arr->GetLength(); index++) {
const AExpression::Ptr& aexpr = arr->Get(index);
Dictionary::Ptr alocals = in_place ? locals : result;
- aexpr->Evaluate(alocals);
+ aexpr->Evaluate(alocals, dhint);
if (alocals->Contains("__result"))
break;
return xresult;
}
-Value AExpression::OpSet(const AExpression *expr, const Dictionary::Ptr& locals)
+Value AExpression::OpSet(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
Value index = expr->EvaluateOperand1(locals);
- Value right = expr->EvaluateOperand2(locals);
+ DebugHint *sdhint = dhint->GetChild(index);
+ Value right = expr->EvaluateOperand2(locals, sdhint);
locals->Set(index, right);
+ sdhint->AddMessage("=", expr->m_DebugInfo);
return right;
}
-Value AExpression::OpSetPlus(const AExpression *expr, const Dictionary::Ptr& locals)
+Value AExpression::OpSetPlus(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
Value index = expr->EvaluateOperand1(locals);
Value left = locals->Get(index);
xlocals->Set("__parent", locals);
}
- Value result = left + expr->EvaluateOperand2(xlocals);
+ DebugHint *sdhint = dhint->GetChild(index);
+ Value result = left + expr->EvaluateOperand2(xlocals, sdhint);
if (exp_right->m_Operator == &AExpression::OpDict) {
Dictionary::Ptr dict = result;
}
locals->Set(index, result);
+ sdhint->AddMessage("+=", expr->m_DebugInfo);
+
return result;
}
-Value AExpression::OpSetMinus(const AExpression *expr, const Dictionary::Ptr& locals)
+Value AExpression::OpSetMinus(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
Value index = expr->EvaluateOperand1(locals);
Value left = locals->Get(index);
xlocals->Set("__parent", locals);
}
- Value result = left - expr->EvaluateOperand2(xlocals);
+ DebugHint *sdhint = dhint->GetChild(index);
+ Value result = left - expr->EvaluateOperand2(xlocals, sdhint);
if (exp_right->m_Operator == &AExpression::OpDict) {
Dictionary::Ptr dict = result;
}
locals->Set(index, result);
+ sdhint->AddMessage("-=", expr->m_DebugInfo);
+
return result;
}
-Value AExpression::OpSetMultiply(const AExpression *expr, const Dictionary::Ptr& locals)
+Value AExpression::OpSetMultiply(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
Value index = expr->EvaluateOperand1(locals);
Value left = locals->Get(index);
xlocals->Set("__parent", locals);
}
- Value result = left * expr->EvaluateOperand2(xlocals);
+ DebugHint *sdhint = dhint->GetChild(index);
+ Value result = left * expr->EvaluateOperand2(xlocals, sdhint);
if (exp_right->m_Operator == &AExpression::OpDict) {
Dictionary::Ptr dict = result;
}
locals->Set(index, result);
+ sdhint->AddMessage("*=", expr->m_DebugInfo);
+
return result;
}
-Value AExpression::OpSetDivide(const AExpression *expr, const Dictionary::Ptr& locals)
+Value AExpression::OpSetDivide(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
Value index = expr->EvaluateOperand1(locals);
Value left = locals->Get(index);
xlocals->Set("__parent", locals);
}
- Value result = left / expr->EvaluateOperand2(xlocals);
+ DebugHint *sdhint = dhint->GetChild(index);
+ Value result = left / expr->EvaluateOperand2(xlocals, sdhint);
if (exp_right->m_Operator == &AExpression::OpDict) {
Dictionary::Ptr dict = result;
}
locals->Set(index, result);
+ sdhint->AddMessage("/=", expr->m_DebugInfo);
+
return result;
}
-Value AExpression::OpIndexer(const AExpression *expr, const Dictionary::Ptr& locals)
+Value AExpression::OpIndexer(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
Value value = expr->EvaluateOperand1(locals);
Value index = expr->EvaluateOperand2(locals);
}
}
-Value AExpression::OpImport(const AExpression *expr, const Dictionary::Ptr& locals)
+Value AExpression::OpImport(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
Value type = expr->EvaluateOperand1(locals);
Value name = expr->EvaluateOperand2(locals);
if (!item)
BOOST_THROW_EXCEPTION(ConfigError("Import references unknown template: '" + name + "'"));
- item->GetExpressionList()->Evaluate(locals);
+ item->GetExpressionList()->Evaluate(locals, dhint);
return Empty;
}
return locals->Get("__result");
}
-Value AExpression::OpFunction(const AExpression* expr, const Dictionary::Ptr& locals)
+Value AExpression::OpFunction(const AExpression* expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
Array::Ptr left = expr->m_Operand1;
AExpression::Ptr aexpr = left->Get(1);
return func;
}
-Value AExpression::OpApply(const AExpression* expr, const Dictionary::Ptr& locals)
+Value AExpression::OpApply(const AExpression* expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
Array::Ptr left = expr->m_Operand1;
AExpression::Ptr exprl = expr->m_Operand2;
AExpression::Ptr aname = left->Get(2);
AExpression::Ptr filter = left->Get(3);
- String name = aname->Evaluate(locals);
+ String name = aname->Evaluate(locals, dhint);
ApplyRule::AddRule(type, target, name, exprl, filter, expr->m_DebugInfo, locals);
return Empty;
}
-Value AExpression::OpObject(const AExpression* expr, const Dictionary::Ptr& locals)
+Value AExpression::OpObject(const AExpression* expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
Array::Ptr left = expr->m_Operand1;
AExpression::Ptr exprl = expr->m_Operand2;
AExpression::Ptr filter = left->Get(3);
String zone = left->Get(4);
- String name = aname->Evaluate(locals);
+ String name = aname->Evaluate(locals, dhint);
ConfigItemBuilder::Ptr item = make_shared<ConfigItemBuilder>(expr->m_DebugInfo);
return Empty;
}
-Value AExpression::OpFor(const AExpression* expr, const Dictionary::Ptr& locals)
+Value AExpression::OpFor(const AExpression* expr, const Dictionary::Ptr& locals, DebugHint *dhint)
{
Array::Ptr left = expr->m_Operand1;
String varname = left->Get(0);
AExpression::Ptr aexpr = left->Get(1);
AExpression::Ptr ascope = expr->m_Operand2;
- Array::Ptr arr = aexpr->Evaluate(locals);
+ Array::Ptr arr = aexpr->Evaluate(locals, dhint);
ObjectLock olock(arr);
BOOST_FOREACH(const Value& value, arr) {
xlocals->Set("__parent", locals);
xlocals->Set(varname, value);
- ascope->Evaluate(xlocals);
+ ascope->Evaluate(xlocals, dhint);
}
return Empty;
}
+
+Dictionary::Ptr DebugHint::ToDictionary(void) const
+{
+ Dictionary::Ptr result = make_shared<Dictionary>();
+
+ Array::Ptr messages = make_shared<Array>();
+ typedef std::pair<String, DebugInfo> MessageType;
+ BOOST_FOREACH(const MessageType& message, Messages) {
+ Array::Ptr amsg = make_shared<Array>();
+ amsg->Add(message.first);
+ amsg->Add(message.second.Path);
+ amsg->Add(message.second.FirstLine);
+ amsg->Add(message.second.FirstColumn);
+ amsg->Add(message.second.LastLine);
+ amsg->Add(message.second.LastColumn);
+ messages->Add(amsg);
+ }
+
+ result->Set("messages", messages);
+
+ Dictionary::Ptr properties = make_shared<Dictionary>();
+
+ typedef std::map<String, DebugHint>::value_type ChildType;
+ BOOST_FOREACH(const ChildType& kv, Children) {
+ properties->Set(kv.first, kv.second.ToDictionary());
+ }
+
+ result->Set("properties", properties);
+
+ return result;
+}
+
namespace icinga
{
+struct DebugHint
+{
+ std::vector<std::pair<String, DebugInfo> > Messages;
+ std::map<String, DebugHint> Children;
+
+ inline void AddMessage(const String& message, const DebugInfo& di)
+ {
+ Messages.push_back(std::make_pair(message, di));
+ }
+
+ inline DebugHint *GetChild(const String& name)
+ {
+ return &Children[name];
+ }
+
+ Dictionary::Ptr ToDictionary(void) const;
+};
+
/**
* @ingroup config
*/
public:
DECLARE_PTR_TYPEDEFS(AExpression);
- typedef Value (*OpCallback)(const AExpression *, const Dictionary::Ptr&);
+ typedef Value (*OpCallback)(const AExpression *, const Dictionary::Ptr&, DebugHint *dhint);
AExpression(OpCallback op, const Value& operand1, const DebugInfo& di);
AExpression(OpCallback op, const Value& operand1, const Value& operand2, const DebugInfo& di);
- Value Evaluate(const Dictionary::Ptr& locals) const;
+ Value Evaluate(const Dictionary::Ptr& locals, DebugHint *dhint = NULL) const;
void MakeInline(void);
void Dump(std::ostream& stream, int indent = 0) const;
- static Value OpLiteral(const AExpression *expr, const Dictionary::Ptr& locals);
- static Value OpVariable(const AExpression *expr, const Dictionary::Ptr& locals);
- static Value OpNegate(const AExpression *expr, const Dictionary::Ptr& locals);
- static Value OpLogicalNegate(const AExpression *expr, const Dictionary::Ptr& locals);
- static Value OpAdd(const AExpression *expr, const Dictionary::Ptr& locals);
- static Value OpSubtract(const AExpression *expr, const Dictionary::Ptr& locals);
- static Value OpMultiply(const AExpression *expr, const Dictionary::Ptr& locals);
- static Value OpDivide(const AExpression *expr, const Dictionary::Ptr& locals);
- static Value OpBinaryAnd(const AExpression *expr, const Dictionary::Ptr& locals);
- static Value OpBinaryOr(const AExpression *expr, const Dictionary::Ptr& locals);
- static Value OpShiftLeft(const AExpression *expr, const Dictionary::Ptr& locals);
- static Value OpShiftRight(const AExpression *expr, const Dictionary::Ptr& locals);
- static Value OpEqual(const AExpression *expr, const Dictionary::Ptr& locals);
- static Value OpNotEqual(const AExpression *expr, const Dictionary::Ptr& locals);
- static Value OpLessThan(const AExpression *expr, const Dictionary::Ptr& locals);
- static Value OpGreaterThan(const AExpression *expr, const Dictionary::Ptr& locals);
- static Value OpLessThanOrEqual(const AExpression *expr, const Dictionary::Ptr& locals);
- static Value OpGreaterThanOrEqual(const AExpression *expr, const Dictionary::Ptr& locals);
- static Value OpIn(const AExpression *expr, const Dictionary::Ptr& locals);
- static Value OpNotIn(const AExpression *expr, const Dictionary::Ptr& locals);
- static Value OpLogicalAnd(const AExpression *expr, const Dictionary::Ptr& locals);
- static Value OpLogicalOr(const AExpression *expr, const Dictionary::Ptr& locals);
- static Value OpFunctionCall(const AExpression *expr, const Dictionary::Ptr& locals);
- static Value OpArray(const AExpression *expr, const Dictionary::Ptr& locals);
- static Value OpDict(const AExpression *expr, const Dictionary::Ptr& locals);
- static Value OpSet(const AExpression *expr, const Dictionary::Ptr& locals);
- static Value OpSetPlus(const AExpression *expr, const Dictionary::Ptr& locals);
- static Value OpSetMinus(const AExpression *expr, const Dictionary::Ptr& locals);
- static Value OpSetMultiply(const AExpression *expr, const Dictionary::Ptr& locals);
- static Value OpSetDivide(const AExpression *expr, const Dictionary::Ptr& locals);
- static Value OpIndexer(const AExpression *expr, const Dictionary::Ptr& locals);
- static Value OpImport(const AExpression *expr, const Dictionary::Ptr& locals);
- static Value OpFunction(const AExpression* expr, const Dictionary::Ptr& locals);
- static Value OpApply(const AExpression* expr, const Dictionary::Ptr& locals);
- static Value OpObject(const AExpression* expr, const Dictionary::Ptr& locals);
- static Value OpFor(const AExpression* expr, const Dictionary::Ptr& locals);
+ static Value OpLiteral(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpVariable(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpNegate(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpLogicalNegate(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpAdd(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpSubtract(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpMultiply(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpDivide(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpBinaryAnd(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpBinaryOr(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpShiftLeft(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpShiftRight(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpEqual(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpNotEqual(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpLessThan(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpGreaterThan(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpLessThanOrEqual(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpGreaterThanOrEqual(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpIn(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpNotIn(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpLogicalAnd(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpLogicalOr(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpFunctionCall(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpArray(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpDict(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpSet(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpSetPlus(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpSetMinus(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpSetMultiply(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpSetDivide(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpIndexer(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpImport(const AExpression *expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpFunction(const AExpression* expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpApply(const AExpression* expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpObject(const AExpression* expr, const Dictionary::Ptr& locals, DebugHint *dhint);
+ static Value OpFor(const AExpression* expr, const Dictionary::Ptr& locals, DebugHint *dhint);
private:
OpCallback m_Operator;
Value m_Operand2;
DebugInfo m_DebugInfo;
- Value EvaluateOperand1(const Dictionary::Ptr& locals) const;
- Value EvaluateOperand2(const Dictionary::Ptr& locals) const;
+ Value EvaluateOperand1(const Dictionary::Ptr& locals, DebugHint *dhint = NULL) const;
+ Value EvaluateOperand2(const Dictionary::Ptr& locals, DebugHint *dhint = NULL) const;
static void DumpOperand(std::ostream& stream, const Value& operand, int indent);