+++ /dev/null
-/******************************************************************************
- * Icinga 2 *
- * Copyright (C) 2012-2014 Icinga Development Team (http://www.icinga.org) *
- * *
- * This program is free software; you can redistribute it and/or *
- * modify it under the terms of the GNU General Public License *
- * as published by the Free Software Foundation; either version 2 *
- * of the License, or (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the Free Software Foundation *
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. *
- ******************************************************************************/
-
-#include "cli/codegencommand.hpp"
-#include "config/expression.hpp"
-#include "config/configcompiler.hpp"
-#include "config/configcompilercontext.hpp"
-#include "base/logger.hpp"
-
-using namespace icinga;
-
-REGISTER_CLICOMMAND("codegen", CodeGenCommand);
-
-String CodeGenCommand::GetDescription(void) const
-{
- return "Generates native code for an Icinga 2 config file.";
-}
-
-String CodeGenCommand::GetShortDescription(void) const
-{
- return "compiles an Icinga 2 config file";
-}
-
-void CodeGenCommand::InitParameters(boost::program_options::options_description& visibleDesc,
- boost::program_options::options_description& hiddenDesc) const
-{
-}
-
-bool CodeGenCommand::IsHidden(void) const
-{
- return true;
-}
-
-/**
- * The entry point for the "codegen" CLI command.
- *
- * @returns An exit status.
- */
-int CodeGenCommand::Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const
-{
- Logger::SetConsoleLogSeverity(LogWarning);
-
- Expression *expr = ConfigCompiler::CompileStream("<stdin>", &std::cin);
-
- int errors = 0;
-
- BOOST_FOREACH(const ConfigCompilerMessage& message, ConfigCompilerContext::GetInstance()->GetMessages()) {
- String logmsg = String("Config ") + (message.Error ? "error" : "warning") + ": " + message.Text;
-
- if (message.Error) {
- Log(LogCritical, "config", logmsg);
- errors++;
- } else {
- Log(LogWarning, "config", logmsg);
- }
- }
-
- if (errors > 0)
- return 1;
-
- std::cout << "#include \"config/expression.hpp\"" << "\n"
- << "#include \"config/vmops.hpp\"" << "\n"
- << "#include \"base/json.hpp\"" << "\n"
- << "#include \"base/initialize.hpp\"" << "\n"
- << "#include <boost/smart_ptr/make_shared.hpp>" << "\n"
- << "\n"
- << "using namespace icinga;" << "\n"
- << "\n";
-
- std::map<String, String> definitions;
-
- String name = CodeGenExpression(definitions, expr);
-
- BOOST_FOREACH(const DefinitionMap::value_type& kv, definitions) {
- std::cout << "static Value " << kv.first << "(const Object::Ptr& context);" << "\n";
- }
-
- std::cout << "\n"
- << "static Dictionary::Ptr l_ModuleScope = new Dictionary();" << "\n"
- << "\n"
- << "static void RunCode(void)" << "\n"
- << "{" << "\n"
- << " " << name << "(l_ModuleScope);" << "\n"
- << "}" << "\n"
- << "\n"
- << "INITIALIZE_ONCE(RunCode);" << "\n"
- << "\n"
- << "int main(int argc, char **argv)" << "\n"
- << "{" << "\n"
- << " RunCode();" << "\n"
- << " if (l_ModuleScope->Contains(\"__result\"))" << "\n"
- << " std::cout << \"Result: \" << JsonEncode(l_ModuleScope->Get(\"__result\")) << \"\\n\";" << "\n"
- << " else" << "\n"
- << " std::cout << \"No result.\" << \"\\n\";" << "\n"
- << "}" << "\n"
- << "\n";
-
- BOOST_FOREACH(const DefinitionMap::value_type& kv, definitions) {
- std::cout << kv.second << "\n";
- }
-
- delete expr;
-
- return 0;
-}
+++ /dev/null
-/******************************************************************************
- * Icinga 2 *
- * Copyright (C) 2012-2014 Icinga Development Team (http://www.icinga.org) *
- * *
- * This program is free software; you can redistribute it and/or *
- * modify it under the terms of the GNU General Public License *
- * as published by the Free Software Foundation; either version 2 *
- * of the License, or (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the Free Software Foundation *
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. *
- ******************************************************************************/
-
-#include "config/expression.hpp"
-#include "config/vmops.hpp"
-#include "base/object.hpp"
-#include <boost/foreach.hpp>
-
-using namespace icinga;
-
-void LiteralExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- if (m_Value.IsString())
- fp << "String(\"" << m_Value << "\")";
- else if (m_Value.IsNumber())
- fp << m_Value;
- else if (m_Value.IsEmpty())
- fp << "Value()";
- else
- throw std::invalid_argument("Literal expression has invalid type: " + m_Value.GetTypeName());
-}
-
-void VariableExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- fp << "VMOps::Variable(context, \"" << m_Variable << "\")";
-}
-
-void NegateExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- fp << "~(long)(";
- m_Operand->GenerateCode(definitions, fp);
- fp << ")";
-}
-
-void LogicalNegateExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- fp << "!(";
- m_Operand->GenerateCode(definitions, fp);
- fp << ")";
-}
-
-void AddExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- fp << "(";
- m_Operand1->GenerateCode(definitions, fp);
- fp << ") + (";
- m_Operand2->GenerateCode(definitions, fp);
- fp << ")";
-}
-
-void SubtractExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- fp << "(";
- m_Operand1->GenerateCode(definitions, fp);
- fp << ") - (";
- m_Operand2->GenerateCode(definitions, fp);
- fp << ")";
-}
-
-void MultiplyExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- fp << "(";
- m_Operand1->GenerateCode(definitions, fp);
- fp << ") * (";
- m_Operand2->GenerateCode(definitions, fp);
- fp << ")";
-}
-
-void DivideExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- fp << "(";
- m_Operand1->GenerateCode(definitions, fp);
- fp << ") / (";
- m_Operand2->GenerateCode(definitions, fp);
- fp << ")";
-}
-
-void BinaryAndExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- fp << "(";
- m_Operand1->GenerateCode(definitions, fp);
- fp << ") & (";
- m_Operand2->GenerateCode(definitions, fp);
- fp << ")";
-}
-
-void BinaryOrExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- fp << "(";
- m_Operand1->GenerateCode(definitions, fp);
- fp << ") | (";
- m_Operand2->GenerateCode(definitions, fp);
- fp << ")";
-}
-
-void ShiftLeftExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- fp << "(";
- m_Operand1->GenerateCode(definitions, fp);
- fp << ") << (";
- m_Operand2->GenerateCode(definitions, fp);
- fp << ")";
-}
-
-void ShiftRightExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- fp << "(";
- m_Operand1->GenerateCode(definitions, fp);
- fp << ") >> (";
- m_Operand2->GenerateCode(definitions, fp);
- fp << ")";
-}
-
-void EqualExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- fp << "(";
- m_Operand1->GenerateCode(definitions, fp);
- fp << ") == (";
- m_Operand2->GenerateCode(definitions, fp);
- fp << ")";
-}
-
-void NotEqualExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- fp << "(";
- m_Operand1->GenerateCode(definitions, fp);
- fp << ") != (";
- m_Operand2->GenerateCode(definitions, fp);
- fp << ")";
-}
-
-void LessThanExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- fp << "(";
- m_Operand1->GenerateCode(definitions, fp);
- fp << ") < (";
- m_Operand2->GenerateCode(definitions, fp);
- fp << ")";
-}
-
-void GreaterThanExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- fp << "(";
- m_Operand1->GenerateCode(definitions, fp);
- fp << ") > (";
- m_Operand2->GenerateCode(definitions, fp);
- fp << ")";
-}
-
-void LessThanOrEqualExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- fp << "(";
- m_Operand1->GenerateCode(definitions, fp);
- fp << ") <= (";
- m_Operand2->GenerateCode(definitions, fp);
- fp << ")";
-}
-
-void GreaterThanOrEqualExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- fp << "(";
- m_Operand1->GenerateCode(definitions, fp);
- fp << ") >= (";
- m_Operand2->GenerateCode(definitions, fp);
- fp << ")";
-}
-
-void InExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- fp << "!static_cast<Array::Ptr>(";
- m_Operand2->GenerateCode(definitions, fp);
- fp << ")->Contains(";
- m_Operand1->GenerateCode(definitions, fp);
- fp << ")";
-}
-
-void NotInExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- fp << "!static_cast<Array::Ptr>(";
- m_Operand2->GenerateCode(definitions, fp);
- fp << ")->Contains(";
- m_Operand1->GenerateCode(definitions, fp);
- fp << ")";
-}
-
-void LogicalAndExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- fp << "Value(";
- m_Operand1->GenerateCode(definitions, fp);
- fp << ").ToBool() && Value(";
- m_Operand2->GenerateCode(definitions, fp);
- fp << ").ToBool()";
-}
-
-void LogicalOrExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- fp << "Value(";
- m_Operand1->GenerateCode(definitions, fp);
- fp << ").ToBool() || Value(";
- m_Operand2->GenerateCode(definitions, fp);
- fp << ").ToBool()";
-}
-
-void FunctionCallExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- std::ostringstream namebuf, df;
-
- namebuf << "native_fcall_" << reinterpret_cast<uintptr_t>(this);
-
- df << "static Value " << namebuf.str() << "(const Object::Ptr& context)" << "\n"
- << "{" << "\n"
- << " Value funcName = (";
- m_FName->GenerateCode(definitions, df);
- df << ");" << "\n"
- << " std::vector<Value> args;" << "\n";
-
- BOOST_FOREACH(Expression *expr, m_Args) {
- df << " args.push_back(";
- expr->GenerateCode(definitions, df);
- df << ");" << "\n";
- }
-
- df << " return VMOps::FunctionCall(context, funcName, args);" << "\n"
- << "}" << "\n";
-
- definitions[namebuf.str()] = df.str();
-
- fp << namebuf.str() << "(context)";
-}
-
-void ArrayExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- std::ostringstream namebuf, df;
-
- namebuf << "native_array_" << reinterpret_cast<uintptr_t>(this);
-
- df << "static Value " << namebuf.str() << "(const Object::Ptr& context)" << "\n"
- << "{" << "\n"
- << " Array::Ptr result = new Array();" << "\n";
-
- BOOST_FOREACH(Expression *aexpr, m_Expressions) {
- df << " result->Add(";
- aexpr->GenerateCode(definitions, df);
- df << ");" << "\n";
- }
-
- df << " return result;" << "\n"
- << "}" << "\n";
-
- definitions[namebuf.str()] = df.str();
-
- fp << namebuf.str() << "(context)";
-}
-
-void DictExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- std::ostringstream namebuf, df;
-
- namebuf << "native_dict_" << reinterpret_cast<uintptr_t>(this);
-
- df << "static Value " << namebuf.str() << "(const Object::Ptr& ucontext)" << "\n"
- << "{" << "\n";
-
- if (!m_Inline) {
- df << " Dictionary::Ptr result = new Dictionary();" << "\n"
- << " result->Set(\"__parent\", ucontext);" << "\n"
- << " Object::Ptr context = result;" << "\n";
- } else
- df << " Object::Ptr context = ucontext;" << "\n";
-
- df << " do {" << "\n";
-
- BOOST_FOREACH(Expression *expression, m_Expressions) {
- df << " ";
- expression->GenerateCode(definitions, df);
- df << ";" << "\n"
- << " if (VMOps::HasField(context, \"__result\"))" << "\n"
- << " break;" << "\n";
- }
-
- df << " } while (0);" << "\n"
- << "\n";
-
- if (!m_Inline) {
- df << " Dictionary::Ptr xresult = result->ShallowClone();" << "\n"
- << " xresult->Remove(\"__parent\");" << "\n"
- << " return xresult;" << "\n";
- } else
- df << " return Empty;" << "\n";
-
- df << "}" << "\n";
-
- definitions[namebuf.str()] = df.str();
-
- fp << namebuf.str() << "(context)";
-}
-
-void SetExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- std::ostringstream namebuf, df;
-
- namebuf << "native_set_" << reinterpret_cast<uintptr_t>(this);
-
- df << "static Value " << namebuf.str() << "(const Object::Ptr& context)" << "\n"
- << "{" << "\n"
- << " Value parent, object;" << "\n"
- << " String tempindex, index;" << "\n";
-
- for (Array::SizeType i = 0; i < m_Indexer.size(); i++) {
- Expression *indexExpr = m_Indexer[i];
- df << " tempindex = (";
- indexExpr->GenerateCode(definitions, df);
- df << ");" << "\n";
-
- if (i == 0)
- df << " parent = context;" << "\n";
- else
- df << " parent = object;" << "\n";
-
- if (i == m_Indexer.size() - 1) {
- df << " index = tempindex" << ";" << "\n";
-
- /* No need to look up the last indexer's value if this is a direct set */
- if (m_Op == OpSetLiteral)
- break;
- }
-
- df << " object = VMOps::Indexer(context, parent, tempindex);" << "\n";
-
- if (i != m_Indexer.size() - 1) {
- df << " if (object.IsEmpty()) {" << "\n"
- << " object = new Dictionary();" << "\n"
- << " VMOps::SetField(parent, tempindex, object);" << "\n"
- << " }" << "\n";
- }
- }
-
- df << " Value right = (";
- m_Operand2->GenerateCode(definitions, df);
- df << ");" << "\n";
-
- if (m_Op != OpSetLiteral) {
- String opcode;
-
- switch (m_Op) {
- case OpSetAdd:
- opcode = "+";
- break;
- case OpSetSubtract:
- opcode = "-";
- break;
- case OpSetMultiply:
- opcode = "*";
- break;
- case OpSetDivide:
- opcode = "/";
- break;
- default:
- VERIFY(!"Invalid opcode.");
- }
-
- df << " right = object " << opcode << " right;" << "\n";
- }
-
- df << " VMOps::SetField(parent, index, right);" << "\n"
- << " return right;" << "\n"
- << "}" << "\n";
-
- definitions[namebuf.str()] = df.str();
-
- fp << namebuf.str() << "(context)";
-}
-
-void IndexerExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- std::ostringstream namebuf, df;
-
- namebuf << "native_indexer_" << reinterpret_cast<uintptr_t>(this);
-
- df << "static Value " << namebuf.str() << "(const Object::Ptr& context)" << "\n"
- << "{" << "\n"
- << " return VMOps::Indexer(context, (";
- m_Operand1->GenerateCode(definitions, df);
- df << "), (";
- m_Operand2->GenerateCode(definitions, df);
- df << "));" << "\n"
- << "}" << "\n";
-
- definitions[namebuf.str()] = df.str();
-
- fp << namebuf.str() << "(context)";
-}
-
-void ImportExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- std::ostringstream namebuf, df;
-
- namebuf << "native_import_" << reinterpret_cast<uintptr_t>(this);
-
- df << "static Value " << namebuf.str() << "(const Object::Ptr& context)" << "\n"
- << "{" << "\n"
- << " String name = (";
- m_Name->GenerateCode(definitions, df);
- df << ");" << "\n"
- << " String type = VMOps::GetField(context, \"type\");" << "\n"
- << "\n"
- << " ConfigItem::Ptr item = ConfigItem::GetObject(type, name);" << "\n"
- << "\n"
- << " if (!item)" << "\n"
- << " BOOST_THROW_EXCEPTION(ConfigError(\"Import references unknown template: '\" + name + \"' of type '\" + type + \"'\"));" << "\n"
- << "\n"
- << " item->GetExpression()->Evaluate(context);" << "\n"
- << "\n"
- << " return Empty;" << "\n"
- << "}" << "\n";
-
- definitions[namebuf.str()] = df.str();
-
- fp << namebuf.str() << "(context)";
-}
-
-void FunctionExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- std::ostringstream namebuf, df;
-
- namebuf << "native_function_" << reinterpret_cast<uintptr_t>(this);
-
- df << "static Value " << namebuf.str() << "(const Object::Ptr& context)" << "\n"
- << "{" << "\n"
- << " std::vector<String> args;" << "\n";
-
- BOOST_FOREACH(const String& arg, m_Args)
- df << " args.push_back(\"" << arg << "\");" << "\n";
-
- df << " return VMOps::NewFunction(context, \"" << m_Name << "\", args, boost::make_shared<NativeExpression>("
- << CodeGenExpression(definitions, m_Expression.get()) << "));" << "\n"
- << "}" << "\n";
-
- definitions[namebuf.str()] = df.str();
-
- fp << namebuf.str() << "(context)";
-}
-
-void SlotExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- fp << "VMOps::NewSlot(context, \"" << m_Signal << "\", ";
- m_Slot->GenerateCode(definitions, fp);
- fp << ")";
-}
-
-void ApplyExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- std::ostringstream namebuf, df;
-
- namebuf << "native_apply_" << reinterpret_cast<uintptr_t>(this);
-
- df << "static Value " << namebuf.str() << "(const Object::Ptr& context)" << "\n"
- << "{" << "\n"
- << " boost::shared_ptr<Expression> fterm;" << "\n";
-
- if (m_FTerm)
- df << " fterm = boost::make_shared<NativeExpression>(" << CodeGenExpression(definitions, m_FTerm.get()) << ");" << "\n";
-
- df << " boost::shared_ptr<Expression> filter = boost::make_shared<NativeExpression>(" << CodeGenExpression(definitions, m_Filter.get()) << ");" << "\n"
- << " boost::shared_ptr<Expression> expression = boost::make_shared<NativeExpression>(" << CodeGenExpression(definitions, m_Expression.get()) << ");" << "\n"
- << " return VMOps::NewApply(context, \"" << m_Type << "\", \"" << m_Target << "\", (";
- m_Name->GenerateCode(definitions, df);
- df << "), filter, "
- << "\"" << m_FKVar << "\", \"" << m_FVVar << "\", fterm, expression);" << "\n"
- << "}" << "\n";
-
- definitions[namebuf.str()] = df.str();
-
- fp << namebuf.str() << "(context)";
-}
-
-void ObjectExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- std::ostringstream namebuf, df;
-
- namebuf << "native_object_" << reinterpret_cast<uintptr_t>(this);
-
- df << "static Value " << namebuf.str() << "(const Object::Ptr& context)" << "\n"
- << "{" << "\n"
- << " String name;" << "\n";
-
- if (m_Name) {
- df << " name = (";
- m_Name->GenerateCode(definitions, df);
- df << ");" << "\n";
- }
-
- df << " boost::shared_ptr<Expression> filter;" << "\n";
-
- if (m_Filter)
- df << " filter = boost::make_shared<NativeExpression>("
- << CodeGenExpression(definitions, m_Filter.get()) << ");" << "\n";
-
- df << " boost::shared_ptr<Expression> expression = boost::make_shared<NativeExpression>("
- << CodeGenExpression(definitions, m_Expression.get()) << ");" << "\n"
- << " return VMOps::NewObject(context, " << m_Abstract << ", \"" << m_Type << "\", name, filter, \"" << m_Zone << "\", expression);" << "\n"
- << "}" << "\n";
-
- definitions[namebuf.str()] = df.str();
-
- fp << namebuf.str() << "(context)";
-}
-
-void ForExpression::GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
-{
- std::ostringstream namebuf, df;
-
- namebuf << "native_for_" << reinterpret_cast<uintptr_t>(this);
-
- df << "static Value " << namebuf.str() << "(const Object::Ptr& context)" << "\n"
- << "{" << "\n"
- << " static NativeExpression expression("
- << CodeGenExpression(definitions, m_Expression) << ");" << "\n"
- << " return VMOps::For(context, \"" << m_FKVar << "\", \"" << m_FVVar << "\", (";
- m_Value->GenerateCode(definitions, df);
- df << "), &expression);" << "\n"
- << "}" << "\n";
-
- definitions[namebuf.str()] = df.str();
-
- fp << namebuf.str() << "(context)";
-}
-
-String icinga::CodeGenExpression(DefinitionMap& definitions, Expression *expression)
-{
- std::ostringstream namebuf, definitionbuf;
-
- namebuf << "native_expression_" << reinterpret_cast<uintptr_t>(expression);
-
- definitionbuf << "static Value " << namebuf.str() << "(const Object::Ptr& context)" << "\n"
- << "{" << "\n"
- << " return (";
-
- expression->GenerateCode(definitions, definitionbuf);
-
- definitionbuf << ");" << "\n"
- << "}" << "\n";
-
- definitions[namebuf.str()] = definitionbuf.str();
-
- return namebuf.str();
-}
Value Evaluate(VMFrame& frame, DebugHint *dhint = NULL) const;
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const = 0;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fp) const = 0;
virtual const DebugInfo& GetDebugInfo(void) const;
};
return m_Expression->DoEvaluate(frame, dhint);
}
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
- {
- return m_Expression->GenerateCode(definitions, fp);
- }
-
virtual const DebugInfo& GetDebugInfo(void) const
{
return m_Expression->GetDebugInfo();
boost::shared_ptr<Expression> m_Expression;
};
-class I2_CONFIG_API NativeExpression : public Expression
-{
-public:
- typedef Value (*Callback)(VMFrame& frame);
-
- NativeExpression(Callback callback)
- : m_Callback(callback)
- { }
-
-protected:
- virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const
- {
- return m_Callback(frame);
- }
-
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fp) const
- {
- throw std::runtime_error("Native expression does not support codegen.");
- }
-
-private:
- Callback m_Callback;
-};
-
class I2_CONFIG_API LiteralExpression : public Expression
{
public:
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fp) const;
private:
Value m_Value;
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
private:
String m_Variable;
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
};
class I2_CONFIG_API LogicalNegateExpression : public UnaryExpression
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
};
class I2_CONFIG_API AddExpression : public BinaryExpression
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
};
class I2_CONFIG_API SubtractExpression : public BinaryExpression
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
};
class I2_CONFIG_API MultiplyExpression : public BinaryExpression
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
};
class I2_CONFIG_API DivideExpression : public BinaryExpression
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
};
class I2_CONFIG_API BinaryAndExpression : public BinaryExpression
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
};
class I2_CONFIG_API BinaryOrExpression : public BinaryExpression
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
};
class I2_CONFIG_API ShiftLeftExpression : public BinaryExpression
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
};
class I2_CONFIG_API ShiftRightExpression : public BinaryExpression
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
};
class I2_CONFIG_API EqualExpression : public BinaryExpression
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
};
class I2_CONFIG_API NotEqualExpression : public BinaryExpression
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
};
class I2_CONFIG_API LessThanExpression : public BinaryExpression
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
};
class I2_CONFIG_API GreaterThanExpression : public BinaryExpression
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
};
class I2_CONFIG_API LessThanOrEqualExpression : public BinaryExpression
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
};
class I2_CONFIG_API GreaterThanOrEqualExpression : public BinaryExpression
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
};
class I2_CONFIG_API InExpression : public BinaryExpression
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
};
class I2_CONFIG_API NotInExpression : public BinaryExpression
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
};
class I2_CONFIG_API LogicalAndExpression : public BinaryExpression
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
};
class I2_CONFIG_API LogicalOrExpression : public BinaryExpression
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
};
class I2_CONFIG_API FunctionCallExpression : public DebuggableExpression
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
public:
Expression *m_FName;
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
private:
std::vector<Expression *> m_Expressions;
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
private:
std::vector<Expression *> m_Expressions;
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
private:
CombinedSetOp m_Op;
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
};
class I2_CONFIG_API ImportExpression : public DebuggableExpression
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
private:
Expression *m_Name;
};
-I2_CONFIG_API String CodeGenExpression(DefinitionMap& definitions, Expression *expression);
-
class I2_CONFIG_API FunctionExpression : public DebuggableExpression
{
public:
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
private:
String m_Name;
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
private:
String m_Signal;
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
private:
String m_Type;
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
private:
bool m_Abstract;
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
- virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
private:
String m_FKVar;