1 /* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
6 #include "config/i2-config.hpp"
7 #include "base/debuginfo.hpp"
8 #include "base/array.hpp"
9 #include "base/dictionary.hpp"
10 #include "base/function.hpp"
11 #include "base/exception.hpp"
12 #include "base/scriptframe.hpp"
13 #include "base/convert.hpp"
22 DebugHint(Dictionary::Ptr hints = nullptr)
23 : m_Hints(std::move(hints))
26 DebugHint(Dictionary::Ptr&& hints)
27 : m_Hints(std::move(hints))
30 void AddMessage(const String& message, const DebugInfo& di)
32 GetMessages()->Add(new Array({ message, di.Path, di.FirstLine, di.FirstColumn, di.LastLine, di.LastColumn }));
35 DebugHint GetChild(const String& name)
37 const Dictionary::Ptr& children = GetChildren();
40 Dictionary::Ptr child;
42 if (!children->Get(name, &vchild)) {
43 child = new Dictionary();
44 children->Set(name, child);
48 return DebugHint(child);
51 Dictionary::Ptr ToDictionary() const
57 Dictionary::Ptr m_Hints;
58 Array::Ptr m_Messages;
59 Dictionary::Ptr m_Children;
61 const Array::Ptr& GetMessages()
67 m_Hints = new Dictionary();
71 if (!m_Hints->Get("messages", &vmessages)) {
72 m_Messages = new Array();
73 m_Hints->Set("messages", m_Messages);
75 m_Messages = vmessages;
80 const Dictionary::Ptr& GetChildren()
86 m_Hints = new Dictionary();
90 if (!m_Hints->Get("properties", &vchildren)) {
91 m_Children = new Dictionary();
92 m_Hints->Set("properties", m_Children);
94 m_Children = vchildren;
120 typedef std::map<String, String> DefinitionMap;
125 enum ExpressionResultCode
136 struct ExpressionResult
140 ExpressionResult(T value, ExpressionResultCode code = ResultOK)
141 : m_Value(std::move(value)), m_Code(code)
144 operator const Value&() const
149 const Value& GetValue() const
154 ExpressionResultCode GetCode() const
161 ExpressionResultCode m_Code;
164 #define CHECK_RESULT(res) \
166 if (res.GetCode() != ResultOK) \
170 #define CHECK_RESULT_LOOP(res) \
171 if (res.GetCode() == ResultReturn) \
173 if (res.GetCode() == ResultContinue) \
175 if (res.GetCode() == ResultBreak) \
184 Expression() = default;
185 Expression(const Expression&) = delete;
186 virtual ~Expression();
188 Expression& operator=(const Expression&) = delete;
190 ExpressionResult Evaluate(ScriptFrame& frame, DebugHint *dhint = nullptr) const;
191 virtual bool GetReference(ScriptFrame& frame, bool init_dict, Value *parent, String *index, DebugHint **dhint = nullptr) const;
192 virtual const DebugInfo& GetDebugInfo() const;
194 virtual ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const = 0;
196 static boost::signals2::signal<void (ScriptFrame& frame, ScriptError *ex, const DebugInfo& di)> OnBreakpoint;
198 static void ScriptBreakpoint(ScriptFrame& frame, ScriptError *ex, const DebugInfo& di);
201 std::unique_ptr<Expression> MakeIndexer(ScopeSpecifier scopeSpec, const String& index);
203 class OwnedExpression final : public Expression
206 OwnedExpression(std::shared_ptr<Expression> expression)
207 : m_Expression(std::move(expression))
211 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override
213 return m_Expression->DoEvaluate(frame, dhint);
216 const DebugInfo& GetDebugInfo() const override
218 return m_Expression->GetDebugInfo();
222 std::shared_ptr<Expression> m_Expression;
225 class LiteralExpression final : public Expression
228 LiteralExpression(Value value = Value());
230 const Value& GetValue() const
236 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
242 inline LiteralExpression *MakeLiteralRaw(const Value& literal = Value())
244 return new LiteralExpression(literal);
247 inline std::unique_ptr<LiteralExpression> MakeLiteral(const Value& literal = Value())
249 return std::unique_ptr<LiteralExpression>(MakeLiteralRaw(literal));
252 class DebuggableExpression : public Expression
255 DebuggableExpression(DebugInfo debugInfo = DebugInfo())
256 : m_DebugInfo(std::move(debugInfo))
260 const DebugInfo& GetDebugInfo() const final;
262 DebugInfo m_DebugInfo;
265 class UnaryExpression : public DebuggableExpression
268 UnaryExpression(std::unique_ptr<Expression> operand, const DebugInfo& debugInfo = DebugInfo())
269 : DebuggableExpression(debugInfo), m_Operand(std::move(operand))
273 std::unique_ptr<Expression> m_Operand;
276 class BinaryExpression : public DebuggableExpression
279 BinaryExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
280 : DebuggableExpression(debugInfo), m_Operand1(std::move(operand1)), m_Operand2(std::move(operand2))
284 std::unique_ptr<Expression> m_Operand1;
285 std::unique_ptr<Expression> m_Operand2;
288 class VariableExpression final : public DebuggableExpression
291 VariableExpression(String variable, std::vector<std::shared_ptr<Expression> > imports, const DebugInfo& debugInfo = DebugInfo());
293 String GetVariable() const
299 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
300 bool GetReference(ScriptFrame& frame, bool init_dict, Value *parent, String *index, DebugHint **dhint) const override;
304 std::vector<std::shared_ptr<Expression> > m_Imports;
306 friend void BindToScope(std::unique_ptr<Expression>& expr, ScopeSpecifier scopeSpec);
309 class DerefExpression final : public UnaryExpression
312 DerefExpression(std::unique_ptr<Expression> operand, const DebugInfo& debugInfo = DebugInfo())
313 : UnaryExpression(std::move(operand), debugInfo)
317 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
318 bool GetReference(ScriptFrame& frame, bool init_dict, Value *parent, String *index, DebugHint **dhint) const override;
321 class RefExpression final : public UnaryExpression
324 RefExpression(std::unique_ptr<Expression> operand, const DebugInfo& debugInfo = DebugInfo())
325 : UnaryExpression(std::move(operand), debugInfo)
329 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
332 class NegateExpression final : public UnaryExpression
335 NegateExpression(std::unique_ptr<Expression> operand, const DebugInfo& debugInfo = DebugInfo())
336 : UnaryExpression(std::move(operand), debugInfo)
340 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
343 class LogicalNegateExpression final : public UnaryExpression
346 LogicalNegateExpression(std::unique_ptr<Expression> operand, const DebugInfo& debugInfo = DebugInfo())
347 : UnaryExpression(std::move(operand), debugInfo)
351 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
354 class AddExpression final : public BinaryExpression
357 AddExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
358 : BinaryExpression(std::move(operand1), std::move(operand2), debugInfo)
362 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
365 class SubtractExpression final : public BinaryExpression
368 SubtractExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
369 : BinaryExpression(std::move(operand1), std::move(operand2), debugInfo)
373 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
376 class MultiplyExpression final : public BinaryExpression
379 MultiplyExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
380 : BinaryExpression(std::move(operand1), std::move(operand2), debugInfo)
384 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
387 class DivideExpression final : public BinaryExpression
390 DivideExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
391 : BinaryExpression(std::move(operand1), std::move(operand2), debugInfo)
395 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
398 class ModuloExpression final : public BinaryExpression
401 ModuloExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
402 : BinaryExpression(std::move(operand1), std::move(operand2), debugInfo)
406 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
409 class XorExpression final : public BinaryExpression
412 XorExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
413 : BinaryExpression(std::move(operand1), std::move(operand2), debugInfo)
417 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
420 class BinaryAndExpression final : public BinaryExpression
423 BinaryAndExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
424 : BinaryExpression(std::move(operand1), std::move(operand2), debugInfo)
428 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
431 class BinaryOrExpression final : public BinaryExpression
434 BinaryOrExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
435 : BinaryExpression(std::move(operand1), std::move(operand2), debugInfo)
439 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
442 class ShiftLeftExpression final : public BinaryExpression
445 ShiftLeftExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
446 : BinaryExpression(std::move(operand1), std::move(operand2), debugInfo)
450 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
453 class ShiftRightExpression final : public BinaryExpression
456 ShiftRightExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
457 : BinaryExpression(std::move(operand1), std::move(operand2), debugInfo)
461 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
464 class EqualExpression final : public BinaryExpression
467 EqualExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
468 : BinaryExpression(std::move(operand1), std::move(operand2), debugInfo)
472 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
475 class NotEqualExpression final : public BinaryExpression
478 NotEqualExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
479 : BinaryExpression(std::move(operand1), std::move(operand2), debugInfo)
483 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
486 class LessThanExpression final : public BinaryExpression
489 LessThanExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
490 : BinaryExpression(std::move(operand1), std::move(operand2), debugInfo)
494 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
497 class GreaterThanExpression final : public BinaryExpression
500 GreaterThanExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
501 : BinaryExpression(std::move(operand1), std::move(operand2), debugInfo)
505 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
508 class LessThanOrEqualExpression final : public BinaryExpression
511 LessThanOrEqualExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
512 : BinaryExpression(std::move(operand1), std::move(operand2), debugInfo)
516 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
519 class GreaterThanOrEqualExpression final : public BinaryExpression
522 GreaterThanOrEqualExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
523 : BinaryExpression(std::move(operand1), std::move(operand2), debugInfo)
527 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
530 class InExpression final : public BinaryExpression
533 InExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
534 : BinaryExpression(std::move(operand1), std::move(operand2), debugInfo)
538 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
541 class NotInExpression final : public BinaryExpression
544 NotInExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
545 : BinaryExpression(std::move(operand1), std::move(operand2), debugInfo)
549 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
552 class LogicalAndExpression final : public BinaryExpression
555 LogicalAndExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
556 : BinaryExpression(std::move(operand1), std::move(operand2), debugInfo)
560 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
563 class LogicalOrExpression final : public BinaryExpression
566 LogicalOrExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
567 : BinaryExpression(std::move(operand1), std::move(operand2), debugInfo)
571 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
574 class FunctionCallExpression final : public DebuggableExpression
577 FunctionCallExpression(std::unique_ptr<Expression> fname, std::vector<std::unique_ptr<Expression> >&& args, const DebugInfo& debugInfo = DebugInfo())
578 : DebuggableExpression(debugInfo), m_FName(std::move(fname)), m_Args(std::move(args))
582 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
585 std::unique_ptr<Expression> m_FName;
586 std::vector<std::unique_ptr<Expression> > m_Args;
589 class ArrayExpression final : public DebuggableExpression
592 ArrayExpression(std::vector<std::unique_ptr<Expression > >&& expressions, const DebugInfo& debugInfo = DebugInfo())
593 : DebuggableExpression(debugInfo), m_Expressions(std::move(expressions))
597 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
600 std::vector<std::unique_ptr<Expression> > m_Expressions;
603 class DictExpression final : public DebuggableExpression
606 DictExpression(std::vector<std::unique_ptr<Expression> >&& expressions = {}, const DebugInfo& debugInfo = DebugInfo())
607 : DebuggableExpression(debugInfo), m_Expressions(std::move(expressions))
613 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
616 std::vector<std::unique_ptr<Expression> > m_Expressions;
617 bool m_Inline{false};
619 friend void BindToScope(std::unique_ptr<Expression>& expr, ScopeSpecifier scopeSpec);
622 class SetConstExpression final : public UnaryExpression
625 SetConstExpression(const String& name, std::unique_ptr<Expression> operand, const DebugInfo& debugInfo = DebugInfo())
626 : UnaryExpression(std::move(operand), debugInfo), m_Name(name)
632 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
635 class SetExpression final : public BinaryExpression
638 SetExpression(std::unique_ptr<Expression> operand1, CombinedSetOp op, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
639 : BinaryExpression(std::move(operand1), std::move(operand2), debugInfo), m_Op(op)
642 void SetOverrideFrozen();
645 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
649 bool m_OverrideFrozen{false};
651 friend void BindToScope(std::unique_ptr<Expression>& expr, ScopeSpecifier scopeSpec);
654 class ConditionalExpression final : public DebuggableExpression
657 ConditionalExpression(std::unique_ptr<Expression> condition, std::unique_ptr<Expression> true_branch, std::unique_ptr<Expression> false_branch, const DebugInfo& debugInfo = DebugInfo())
658 : DebuggableExpression(debugInfo), m_Condition(std::move(condition)), m_TrueBranch(std::move(true_branch)), m_FalseBranch(std::move(false_branch))
662 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
665 std::unique_ptr<Expression> m_Condition;
666 std::unique_ptr<Expression> m_TrueBranch;
667 std::unique_ptr<Expression> m_FalseBranch;
670 class WhileExpression final : public DebuggableExpression
673 WhileExpression(std::unique_ptr<Expression> condition, std::unique_ptr<Expression> loop_body, const DebugInfo& debugInfo = DebugInfo())
674 : DebuggableExpression(debugInfo), m_Condition(std::move(condition)), m_LoopBody(std::move(loop_body))
678 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
681 std::unique_ptr<Expression> m_Condition;
682 std::unique_ptr<Expression> m_LoopBody;
686 class ReturnExpression final : public UnaryExpression
689 ReturnExpression(std::unique_ptr<Expression> expression, const DebugInfo& debugInfo = DebugInfo())
690 : UnaryExpression(std::move(expression), debugInfo)
694 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
697 class BreakExpression final : public DebuggableExpression
700 BreakExpression(const DebugInfo& debugInfo = DebugInfo())
701 : DebuggableExpression(debugInfo)
705 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
708 class ContinueExpression final : public DebuggableExpression
711 ContinueExpression(const DebugInfo& debugInfo = DebugInfo())
712 : DebuggableExpression(debugInfo)
716 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
719 class GetScopeExpression final : public Expression
722 GetScopeExpression(ScopeSpecifier scopeSpec)
723 : m_ScopeSpec(scopeSpec)
727 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
730 ScopeSpecifier m_ScopeSpec;
733 class IndexerExpression final : public BinaryExpression
736 IndexerExpression(std::unique_ptr<Expression> operand1, std::unique_ptr<Expression> operand2, const DebugInfo& debugInfo = DebugInfo())
737 : BinaryExpression(std::move(operand1), std::move(operand2), debugInfo)
740 void SetOverrideFrozen();
743 bool m_OverrideFrozen{false};
745 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
746 bool GetReference(ScriptFrame& frame, bool init_dict, Value *parent, String *index, DebugHint **dhint) const override;
748 friend void BindToScope(std::unique_ptr<Expression>& expr, ScopeSpecifier scopeSpec);
751 void BindToScope(std::unique_ptr<Expression>& expr, ScopeSpecifier scopeSpec);
753 class ThrowExpression final : public DebuggableExpression
756 ThrowExpression(std::unique_ptr<Expression> message, bool incompleteExpr, const DebugInfo& debugInfo = DebugInfo())
757 : DebuggableExpression(debugInfo), m_Message(std::move(message)), m_IncompleteExpr(incompleteExpr)
761 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
764 std::unique_ptr<Expression> m_Message;
765 bool m_IncompleteExpr;
768 class ImportExpression final : public DebuggableExpression
771 ImportExpression(std::unique_ptr<Expression> name, const DebugInfo& debugInfo = DebugInfo())
772 : DebuggableExpression(debugInfo), m_Name(std::move(name))
776 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
779 std::unique_ptr<Expression> m_Name;
782 class ImportDefaultTemplatesExpression final : public DebuggableExpression
785 ImportDefaultTemplatesExpression(const DebugInfo& debugInfo = DebugInfo())
786 : DebuggableExpression(debugInfo)
790 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
793 class FunctionExpression final : public DebuggableExpression
796 FunctionExpression(String name, std::vector<String> args,
797 std::map<String, std::unique_ptr<Expression> >&& closedVars, std::unique_ptr<Expression> expression, const DebugInfo& debugInfo = DebugInfo())
798 : DebuggableExpression(debugInfo), m_Name(std::move(name)), m_Args(std::move(args)), m_ClosedVars(std::move(closedVars)), m_Expression(std::move(expression))
802 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
806 std::vector<String> m_Args;
807 std::map<String, std::unique_ptr<Expression> > m_ClosedVars;
808 std::shared_ptr<Expression> m_Expression;
811 class ApplyExpression final : public DebuggableExpression
814 ApplyExpression(String type, String target, std::unique_ptr<Expression> name,
815 std::unique_ptr<Expression> filter, String package, String fkvar, String fvvar,
816 std::unique_ptr<Expression> fterm, std::map<String, std::unique_ptr<Expression> >&& closedVars, bool ignoreOnError,
817 std::unique_ptr<Expression> expression, const DebugInfo& debugInfo = DebugInfo())
818 : DebuggableExpression(debugInfo), m_Type(std::move(type)), m_Target(std::move(target)),
819 m_Name(std::move(name)), m_Filter(std::move(filter)), m_Package(std::move(package)), m_FKVar(std::move(fkvar)), m_FVVar(std::move(fvvar)),
820 m_FTerm(std::move(fterm)), m_IgnoreOnError(ignoreOnError), m_ClosedVars(std::move(closedVars)),
821 m_Expression(std::move(expression))
825 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
830 std::unique_ptr<Expression> m_Name;
831 std::shared_ptr<Expression> m_Filter;
835 std::shared_ptr<Expression> m_FTerm;
836 bool m_IgnoreOnError;
837 std::map<String, std::unique_ptr<Expression> > m_ClosedVars;
838 std::shared_ptr<Expression> m_Expression;
841 class NamespaceExpression final : public DebuggableExpression
844 NamespaceExpression(std::unique_ptr<Expression> expression, const DebugInfo& debugInfo = DebugInfo())
845 : DebuggableExpression(debugInfo), m_Expression(std::move(expression))
849 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
852 std::shared_ptr<Expression> m_Expression;
855 class ObjectExpression final : public DebuggableExpression
858 ObjectExpression(bool abstract, std::unique_ptr<Expression> type, std::unique_ptr<Expression> name, std::unique_ptr<Expression> filter,
859 String zone, String package, std::map<String, std::unique_ptr<Expression> >&& closedVars,
860 bool defaultTmpl, bool ignoreOnError, std::unique_ptr<Expression> expression, const DebugInfo& debugInfo = DebugInfo())
861 : DebuggableExpression(debugInfo), m_Abstract(abstract), m_Type(std::move(type)),
862 m_Name(std::move(name)), m_Filter(std::move(filter)), m_Zone(std::move(zone)), m_Package(std::move(package)), m_DefaultTmpl(defaultTmpl),
863 m_IgnoreOnError(ignoreOnError), m_ClosedVars(std::move(closedVars)), m_Expression(std::move(expression))
867 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
871 std::unique_ptr<Expression> m_Type;
872 std::unique_ptr<Expression> m_Name;
873 std::shared_ptr<Expression> m_Filter;
877 bool m_IgnoreOnError;
878 std::map<String, std::unique_ptr<Expression> > m_ClosedVars;
879 std::shared_ptr<Expression> m_Expression;
882 class ForExpression final : public DebuggableExpression
885 ForExpression(String fkvar, String fvvar, std::unique_ptr<Expression> value, std::unique_ptr<Expression> expression, const DebugInfo& debugInfo = DebugInfo())
886 : DebuggableExpression(debugInfo), m_FKVar(std::move(fkvar)), m_FVVar(std::move(fvvar)), m_Value(std::move(value)), m_Expression(std::move(expression))
890 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
895 std::unique_ptr<Expression> m_Value;
896 std::unique_ptr<Expression> m_Expression;
899 class LibraryExpression final : public UnaryExpression
902 LibraryExpression(std::unique_ptr<Expression> expression, const DebugInfo& debugInfo = DebugInfo())
903 : UnaryExpression(std::move(expression), debugInfo)
907 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
917 class IncludeExpression final : public DebuggableExpression
920 IncludeExpression(String relativeBase, std::unique_ptr<Expression> path, std::unique_ptr<Expression> pattern, std::unique_ptr<Expression> name,
921 IncludeType type, bool searchIncludes, String zone, String package, const DebugInfo& debugInfo = DebugInfo())
922 : DebuggableExpression(debugInfo), m_RelativeBase(std::move(relativeBase)), m_Path(std::move(path)), m_Pattern(std::move(pattern)),
923 m_Name(std::move(name)), m_Type(type), m_SearchIncludes(searchIncludes), m_Zone(std::move(zone)), m_Package(std::move(package))
927 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
930 String m_RelativeBase;
931 std::unique_ptr<Expression> m_Path;
932 std::unique_ptr<Expression> m_Pattern;
933 std::unique_ptr<Expression> m_Name;
935 bool m_SearchIncludes;
940 class BreakpointExpression final : public DebuggableExpression
943 BreakpointExpression(const DebugInfo& debugInfo = DebugInfo())
944 : DebuggableExpression(debugInfo)
948 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
951 class TryExceptExpression final : public DebuggableExpression
954 TryExceptExpression(std::unique_ptr<Expression> tryBody, std::unique_ptr<Expression> exceptBody, const DebugInfo& debugInfo = DebugInfo())
955 : DebuggableExpression(debugInfo), m_TryBody(std::move(tryBody)), m_ExceptBody(std::move(exceptBody))
959 ExpressionResult DoEvaluate(ScriptFrame& frame, DebugHint *dhint) const override;
962 std::unique_ptr<Expression> m_TryBody;
963 std::unique_ptr<Expression> m_ExceptBody;
968 #endif /* EXPRESSION_H */