Actually do endow ether.

Standard extension.
This commit is contained in:
Gav Wood 2014-05-30 14:47:13 +02:00
parent b64a96199f
commit 78c0baa026
3 changed files with 26 additions and 0 deletions

View File

@ -32,6 +32,7 @@ bytes eth::compileLLL(string const& _src, bool _opt, vector<string>* _errors)
try try
{ {
CompilerState cs; CompilerState cs;
cs.populateStandard();
auto f = CodeFragment::compile(_src, cs); auto f = CodeFragment::compile(_src, cs);
if (_opt) if (_opt)
f.optimise(); f.optimise();
@ -58,6 +59,7 @@ std::string eth::compileLLLToAsm(std::string const& _src, bool _opt, std::vector
try try
{ {
CompilerState cs; CompilerState cs;
cs.populateStandard();
auto f = CodeFragment::compile(_src, cs); auto f = CodeFragment::compile(_src, cs);
if (_opt) if (_opt)
f.optimise(); f.optimise();

View File

@ -20,6 +20,7 @@
*/ */
#include "CompilerState.h" #include "CompilerState.h"
#include "CodeFragment.h"
using namespace std; using namespace std;
using namespace eth; using namespace eth;
@ -35,3 +36,25 @@ CodeFragment const& CompilerState::getDef(std::string const& _s)
else else
return NullCodeFragment; return NullCodeFragment;
} }
void CompilerState::populateStandard()
{
static const string s = "{"
"(def 'gav 0x8a40bfaa73256b60764c1bf40675a99083efb075)"
"(def 'send (to value) (call (- (gas) 21) to value 0 0 0 0))"
#if 0
"(def 'send (gaslimit to value) (call gaslimit to value 0 0 0 0))"
"(def 'alloc (len) (asm msize 0 1 len msize add sub mstore8))"
"(def 'msg (gaslimit to value data datasize outsize) { [32]:outsize [0]:(alloc @32) (call gaslimit to value data datasize @0 @32) @0 })"
"(def 'msg (gaslimit to value data datasize) { (call gaslimit to value data datasize 0 32) @0 })"
"(def 'msg (gaslimit to value data) { [0]:data (msg gaslimit to value 0 32) })"
"(def 'create (to value code) { [0]:(msize) (create to value @0 (lll code @0)) })"
"(def 'sha3 (val) { [0]:val (sha3 0 32) })"
"(def 'return (val) { [0]:val (return 0 32) })"
"(def 'makeperm (name pos) { (def name (sload pos)) (def name (v) (sstore pos v)) } )"
"(def 'permcount 0)"
"(def 'perm (name) { (makeperm name permcount) (def 'permcount (+ permcount 1)) } )"
#endif
"}";
CodeFragment::compile(s, *this);
}

View File

@ -37,6 +37,7 @@ struct Macro
struct CompilerState struct CompilerState
{ {
CodeFragment const& getDef(std::string const& _s); CodeFragment const& getDef(std::string const& _s);
void populateStandard();
std::map<std::string, unsigned> vars; std::map<std::string, unsigned> vars;
std::map<std::string, CodeFragment> defs; std::map<std::string, CodeFragment> defs;