aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian <c@ethdev.com>2015-01-28 15:50:53 +0800
committerchriseth <c@ethdev.com>2015-04-22 17:33:25 +0800
commit83cc8dfe008341948306fd38e5405429753cb8d0 (patch)
treef9e8fca70aad6cbea6681f445414bb763a1637cd
parenta44bcb6909478543151cac871fdbbc4909ad54aa (diff)
downloaddexon-solidity-83cc8dfe008341948306fd38e5405429753cb8d0.tar
dexon-solidity-83cc8dfe008341948306fd38e5405429753cb8d0.tar.gz
dexon-solidity-83cc8dfe008341948306fd38e5405429753cb8d0.tar.bz2
dexon-solidity-83cc8dfe008341948306fd38e5405429753cb8d0.tar.lz
dexon-solidity-83cc8dfe008341948306fd38e5405429753cb8d0.tar.xz
dexon-solidity-83cc8dfe008341948306fd38e5405429753cb8d0.tar.zst
dexon-solidity-83cc8dfe008341948306fd38e5405429753cb8d0.zip
JSON compiler.
-rw-r--r--ASTJsonConverter.cpp17
-rw-r--r--ASTJsonConverter.h5
-rw-r--r--Compiler.h4
-rw-r--r--CompilerContext.h4
-rw-r--r--CompilerStack.cpp7
-rw-r--r--CompilerStack.h3
6 files changed, 30 insertions, 10 deletions
diff --git a/ASTJsonConverter.cpp b/ASTJsonConverter.cpp
index c30e4ca2..be89de92 100644
--- a/ASTJsonConverter.cpp
+++ b/ASTJsonConverter.cpp
@@ -78,10 +78,16 @@ ASTJsonConverter::ASTJsonConverter(ASTNode const& _ast): m_ast(&_ast)
void ASTJsonConverter::print(ostream& _stream)
{
- m_ast->accept(*this);
+ process();
_stream << m_astJson;
}
+Json::Value const& ASTJsonConverter::json()
+{
+ process();
+ return m_astJson;
+}
+
bool ASTJsonConverter::visit(ImportDirective const& _node)
{
addJsonNode("Import", { make_pair("file", _node.getIdentifier())});
@@ -460,9 +466,16 @@ void ASTJsonConverter::endVisit(Literal const&)
{
}
+void ASTJsonConverter::process()
+{
+ if (!processed)
+ m_ast->accept(*this);
+ processed = true;
+}
+
string ASTJsonConverter::getType(Expression const& _expression)
{
- return (_expression.getType()) ? _expression.getType()->toString() : "Unknown";
+ return (_expression.getType()) ? _expression.getType()->toString() : "Unknown";
}
}
diff --git a/ASTJsonConverter.h b/ASTJsonConverter.h
index 30a92e66..56502ab3 100644
--- a/ASTJsonConverter.h
+++ b/ASTJsonConverter.h
@@ -44,6 +44,7 @@ public:
ASTJsonConverter(ASTNode const& _ast);
/// Output the json representation of the AST to _stream.
void print(std::ostream& _stream);
+ Json::Value const& json();
bool visit(ImportDirective const& _node) override;
bool visit(ContractDefinition const& _node) override;
@@ -114,6 +115,7 @@ public:
void endVisit(Literal const&) override;
private:
+ void process();
void addKeyValue(Json::Value& _obj, std::string const& _key, std::string const& _val);
void addJsonNode(std::string const& _nodeName,
std::initializer_list<std::pair<std::string const, std::string const>> _list,
@@ -123,8 +125,9 @@ private:
{
solAssert(!m_jsonNodePtrs.empty(), "Uneven json nodes stack. Internal error.");
m_jsonNodePtrs.pop();
- };
+ }
+ bool processed = false;
Json::Value m_astJson;
std::stack<Json::Value*> m_jsonNodePtrs;
std::string m_source;
diff --git a/Compiler.h b/Compiler.h
index d476ec68..c3c3b9dc 100644
--- a/Compiler.h
+++ b/Compiler.h
@@ -43,9 +43,9 @@ public:
bytes getRuntimeBytecode() { return m_runtimeContext.getAssembledBytecode(m_optimize);}
/// @arg _sourceCodes is the map of input files to source code strings
/// @arg _inJsonFromat shows whether the out should be in Json format
- void streamAssembly(std::ostream& _stream, StringMap const& _sourceCodes = StringMap(), bool _inJsonFormat = false) const
+ Json::Value streamAssembly(std::ostream& _stream, StringMap const& _sourceCodes = StringMap(), bool _inJsonFormat = false) const
{
- m_context.streamAssembly(_stream, _sourceCodes, _inJsonFormat);
+ return m_context.streamAssembly(_stream, _sourceCodes, _inJsonFormat);
}
/// @returns Assembly items of the normal compiler context
eth::AssemblyItems const& getAssemblyItems() const { return m_context.getAssembly().getItems(); }
diff --git a/CompilerContext.h b/CompilerContext.h
index 34a3f97c..0ca6369d 100644
--- a/CompilerContext.h
+++ b/CompilerContext.h
@@ -123,9 +123,9 @@ public:
eth::Assembly const& getAssembly() const { return m_asm; }
/// @arg _sourceCodes is the map of input files to source code strings
/// @arg _inJsonFormat shows whether the out should be in Json format
- void streamAssembly(std::ostream& _stream, StringMap const& _sourceCodes = StringMap(), bool _inJsonFormat = false) const
+ Json::Value streamAssembly(std::ostream& _stream, StringMap const& _sourceCodes = StringMap(), bool _inJsonFormat = false) const
{
- m_asm.stream(_stream, "", _sourceCodes, _inJsonFormat);
+ return m_asm.stream(_stream, "", _sourceCodes, _inJsonFormat);
}
bytes getAssembledBytecode(bool _optimize = false) { return m_asm.optimise(_optimize).assemble(); }
diff --git a/CompilerStack.cpp b/CompilerStack.cpp
index d6274e2c..a2a17831 100644
--- a/CompilerStack.cpp
+++ b/CompilerStack.cpp
@@ -184,13 +184,16 @@ dev::h256 CompilerStack::getContractCodeHash(string const& _contractName) const
return dev::sha3(getRuntimeBytecode(_contractName));
}
-void CompilerStack::streamAssembly(ostream& _outStream, string const& _contractName, StringMap _sourceCodes, bool _inJsonFormat) const
+Json::Value CompilerStack::streamAssembly(ostream& _outStream, string const& _contractName, StringMap _sourceCodes, bool _inJsonFormat) const
{
Contract const& contract = getContract(_contractName);
if (contract.compiler)
- contract.compiler->streamAssembly(_outStream, _sourceCodes, _inJsonFormat);
+ return contract.compiler->streamAssembly(_outStream, _sourceCodes, _inJsonFormat);
else
+ {
_outStream << "Contract not fully implemented" << endl;
+ return Json::Value();
+ }
}
string const& CompilerStack::getInterface(string const& _contractName) const
diff --git a/CompilerStack.h b/CompilerStack.h
index 2e7c217d..6f90a846 100644
--- a/CompilerStack.h
+++ b/CompilerStack.h
@@ -28,6 +28,7 @@
#include <memory>
#include <vector>
#include <boost/noncopyable.hpp>
+#include <json/json.h>
#include <libdevcore/Common.h>
#include <libdevcore/FixedHash.h>
@@ -104,7 +105,7 @@ public:
/// @arg _sourceCodes is the map of input files to source code strings
/// @arg _inJsonFromat shows whether the out should be in Json format
/// Prerequisite: Successful compilation.
- void streamAssembly(std::ostream& _outStream, std::string const& _contractName = "", StringMap _sourceCodes = StringMap(), bool _inJsonFormat = false) const;
+ Json::Value streamAssembly(std::ostream& _outStream, std::string const& _contractName = "", StringMap _sourceCodes = StringMap(), bool _inJsonFormat = false) const;
/// Returns a string representing the contract interface in JSON.
/// Prerequisite: Successful call to parse or compile.