Remove the C++ code generator

refs #7699
This commit is contained in:
Gunnar Beutner 2014-11-22 19:23:42 +01:00
parent f5766f9118
commit 037b886584
6 changed files with 1 additions and 802 deletions

View File

@ -16,7 +16,6 @@
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
set(cli_SOURCES
codegencommand.cpp
nodeaddcommand.cpp nodeblackandwhitelistcommand.cpp nodelistcommand.cpp noderemovecommand.cpp
nodesetcommand.cpp nodesetupcommand.cpp nodeupdateconfigcommand.cpp nodewizardcommand.cpp nodeutility.cpp
clicommand.cpp

View File

@ -1,121 +0,0 @@
/******************************************************************************
* 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;
}

View File

@ -1,51 +0,0 @@
/******************************************************************************
* 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. *
******************************************************************************/
#ifndef CODEGENCOMMAND_H
#define CODEGENCOMMAND_H
#include "base/dictionary.hpp"
#include "base/array.hpp"
#include "cli/clicommand.hpp"
#include <ostream>
namespace icinga
{
/**
* The "variable get" command.
*
* @ingroup cli
*/
class CodeGenCommand : public CLICommand
{
public:
DECLARE_PTR_TYPEDEFS(CodeGenCommand);
virtual String GetDescription(void) const;
virtual String GetShortDescription(void) const;
virtual bool IsHidden(void) const;
void InitParameters(boost::program_options::options_description& visibleDesc,
boost::program_options::options_description& hiddenDesc) const;
virtual int Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const;
};
}
#endif /* CODEGENCOMMAND_H */

View File

@ -34,7 +34,7 @@ set(config_SOURCES
applyrule.cpp base-type.conf base-type.cpp
configcompilercontext.cpp configcompiler.cpp configitembuilder.cpp
configitem.cpp ${FLEX_config_lexer_OUTPUTS} ${BISON_config_parser_OUTPUTS}
configtype.cpp expression.cpp expression-codegen.cpp objectrule.cpp typerule.cpp typerulelist.cpp
configtype.cpp expression.cpp objectrule.cpp typerule.cpp typerulelist.cpp
)
if(ICINGA2_UNITY_BUILD)

View File

@ -1,563 +0,0 @@
/******************************************************************************
* 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();
}

View File

@ -114,7 +114,6 @@ public:
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;
};
@ -133,11 +132,6 @@ protected:
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();
@ -147,30 +141,6 @@ private:
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:
@ -178,7 +148,6 @@ public:
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fp) const;
private:
Value m_Value;
@ -246,7 +215,6 @@ public:
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
private:
String m_Variable;
@ -261,7 +229,6 @@ public:
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
@ -273,7 +240,6 @@ public:
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
@ -285,7 +251,6 @@ public:
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
@ -297,7 +262,6 @@ public:
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
@ -309,7 +273,6 @@ public:
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
@ -321,7 +284,6 @@ public:
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
@ -333,7 +295,6 @@ public:
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
@ -345,7 +306,6 @@ public:
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
@ -357,7 +317,6 @@ public:
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
@ -369,7 +328,6 @@ public:
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
@ -381,7 +339,6 @@ public:
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
@ -393,7 +350,6 @@ public:
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
@ -405,7 +361,6 @@ public:
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
@ -417,7 +372,6 @@ public:
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
@ -429,7 +383,6 @@ public:
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
@ -441,7 +394,6 @@ public:
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
@ -453,7 +405,6 @@ public:
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
@ -465,7 +416,6 @@ public:
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
@ -477,7 +427,6 @@ public:
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
@ -489,7 +438,6 @@ public:
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
@ -509,7 +457,6 @@ public:
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
public:
Expression *m_FName;
@ -531,7 +478,6 @@ public:
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
private:
std::vector<Expression *> m_Expressions;
@ -554,7 +500,6 @@ public:
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
private:
std::vector<Expression *> m_Expressions;
@ -578,7 +523,6 @@ public:
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
private:
CombinedSetOp m_Op;
@ -597,7 +541,6 @@ public:
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
@ -614,14 +557,11 @@ public:
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:
@ -632,7 +572,6 @@ public:
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
private:
String m_Name;
@ -650,7 +589,6 @@ public:
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
private:
String m_Signal;
@ -676,7 +614,6 @@ public:
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
private:
String m_Type;
@ -707,7 +644,6 @@ public:
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
private:
bool m_Abstract;
@ -734,7 +670,6 @@ public:
protected:
virtual Value DoEvaluate(VMFrame& frame, DebugHint *dhint) const;
virtual void GenerateCode(DefinitionMap& definitions, std::ostream& fpg) const;
private:
String m_FKVar;