aboutsummaryrefslogtreecommitdiffstats
path: root/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'main.cpp')
-rw-r--r--main.cpp62
1 files changed, 50 insertions, 12 deletions
diff --git a/main.cpp b/main.cpp
index 96e834ff..38295dcc 100644
--- a/main.cpp
+++ b/main.cpp
@@ -92,7 +92,11 @@ int main(int argc, char** argv)
("ast", po::value<OutputType>(),
"Request to output the AST of the contract. " outputTypeStr)
("asm", po::value<OutputType>(),
- "Request to output the EVM assembly of the contract. " outputTypeStr);
+ "Request to output the EVM assembly of the contract. " outputTypeStr)
+ ("opcodes", po::value<OutputType>(),
+ "Request to output the Opcodes of the contract. " outputTypeStr)
+ ("binary", po::value<OutputType>(),
+ "Request to output the contract in binary (hexadecimal). " outputTypeStr);
// All positional options should be interpreted as input files
po::positional_options_description p;
@@ -207,16 +211,17 @@ int main(int argc, char** argv)
}
vector<string> contracts = compiler.getContractNames();
- // do we need EVM assembly?
- if (vm.count("asm"))
+ for (string const& contract: contracts)
{
- auto choice = vm["asm"].as<OutputType>();
- for (string const& contract: contracts)
+ cout << endl << "======= " << contract << " =======" << endl;
+
+ // do we need EVM assembly?
+ if (vm.count("asm"))
{
+ auto choice = vm["asm"].as<OutputType>();
if (choice != OutputType::FILE)
{
- cout << endl << "======= " << contract << " =======" << endl
- << "EVM assembly:" << endl;
+ cout << "EVM assembly:" << endl;
compiler.streamAssembly(cout, contract);
}
@@ -227,16 +232,49 @@ int main(int argc, char** argv)
outFile.close();
}
}
- }
+ // do we need opcodes?
+ if (vm.count("opcodes"))
+ {
+ auto choice = vm["opcodes"].as<OutputType>();
+ if (choice != OutputType::FILE)
+ {
+ cout << "Opcodes:" << endl;
+ cout << eth::disassemble(compiler.getBytecode(contract)) << endl;
+ }
+
+ if (choice != OutputType::STDOUT)
+ {
+ ofstream outFile(contract + ".opcodes");
+ outFile << eth::disassemble(compiler.getBytecode(contract));
+ outFile.close();
+ }
+ }
+
+ // do we need binary?
+ if (vm.count("binary"))
+ {
+ auto choice = vm["binary"].as<OutputType>();
+ if (choice != OutputType::FILE)
+ {
+ cout << "Binary:" << endl;
+ cout << toHex(compiler.getBytecode(contract)) << endl;
+ }
+
+ if (choice != OutputType::STDOUT)
+ { // TODO: Think, if we really want that? Could simply output to normal binary
+ ofstream outFile(contract + ".bin");
+ outFile << toHex(compiler.getBytecode(contract));
+ outFile.close();
+ }
+ }
+
+ } // end of contracts iteration
cout << endl << "Contracts:" << endl;
for (string const& contract: contracts)
{
- cout << "Opcodes:" << endl
- << eth::disassemble(compiler.getBytecode(contract)) << endl
- << "Binary: " << toHex(compiler.getBytecode(contract)) << endl
- << "Interface specification: " << compiler.getJsonDocumentation(contract, DocumentationType::ABI_INTERFACE) << endl
+ cout << "Interface specification: " << compiler.getJsonDocumentation(contract, DocumentationType::ABI_INTERFACE) << endl
<< "Natspec user documentation: " << compiler.getJsonDocumentation(contract, DocumentationType::NATSPEC_USER) << endl
<< "Natspec developer documentation: " << compiler.getJsonDocumentation(contract, DocumentationType::NATSPEC_DEV) << endl;
}