@@ -41,7 +41,7 @@ namespace solidity
4141{
4242
4343const map<string, string> StandardSources = map<string, string>{
44- {" coin" , R"( import "CoinReg";import "Config";import "configUser";contract coin is configUser{function coin(string3 name, uint denom) {CoinReg(Config(configAddr()).lookup(3)).register(name, denom);}})" },
44+ /* {"coin", R"(import "CoinReg";import "Config";import "configUser";contract coin is configUser{function coin(string3 name, uint denom) {CoinReg(Config(configAddr()).lookup(3)).register(name, denom);}})"},
4545 {"Coin", R"(contract Coin{function isApprovedFor(address _target,address _proxy)constant returns(bool _r){}function isApproved(address _proxy)constant returns(bool _r){}function sendCoinFrom(address _from,uint256 _val,address _to){}function coinBalanceOf(address _a)constant returns(uint256 _r){}function sendCoin(uint256 _val,address _to){}function coinBalance()constant returns(uint256 _r){}function approve(address _a){}})"},
4646 {"CoinReg", R"(contract CoinReg{function count()constant returns(uint256 r){}function info(uint256 i)constant returns(address addr,string3 name,uint256 denom){}function register(string3 name,uint256 denom){}function unregister(){}})"},
4747 {"configUser", R"(contract configUser{function configAddr()constant returns(address a){ return 0xc6d9d2cd449a754c494264e1809c50e34d64562b;}})"},
@@ -51,7 +51,7 @@ const map<string, string> StandardSources = map<string, string>{
5151 {"NameReg", R"(contract NameReg{function register(string32 name){}function addressOf(string32 name)constant returns(address addr){}function unregister(){}function nameOf(address addr)constant returns(string32 name){}})"},
5252 {"owned", R"(contract owned{function owned(){owner = msg.sender;}modifier onlyowner(){if(msg.sender==owner)_}address owner;})"},
5353 {"service", R"(import "Config";import "configUser";contract service is configUser{function service(uint _n){Config(configAddr()).register(_n, this);}})"},
54- {" std" , R"( import "owned";import "mortal";import "Config";import "configUser";import "NameReg";import "named";)" }
54+ {"std", R"(import "owned";import "mortal";import "Config";import "configUser";import "NameReg";import "named";)"}*/
5555};
5656
5757CompilerStack::CompilerStack (bool _addStandardSources):
@@ -65,14 +65,14 @@ bool CompilerStack::addSource(string const& _name, string const& _content)
6565{
6666 bool existed = m_sources.count (_name) != 0 ;
6767 reset (true );
68- m_sources[_name].scanner = make_shared<Scanner>(CharStream (_content), _name);
68+ m_sources[_name].scanner = make_shared<Scanner>(CharStream (expanded ( _content) ), _name);
6969 return existed;
7070}
7171
7272void CompilerStack::setSource (string const & _sourceCode)
7373{
7474 reset ();
75- addSource (" " , _sourceCode);
75+ addSource (" " , expanded ( _sourceCode) );
7676}
7777
7878void CompilerStack::parse ()
@@ -125,6 +125,55 @@ vector<string> CompilerStack::getContractNames() const
125125 return contractNames;
126126}
127127
128+ // //// BEGIN: TEMPORARY ONLY
129+ // / remove once import works properly and we have genesis contracts
130+
131+ string CompilerStack::expanded (string const & _sourceCode)
132+ {
133+ const map<string, string> c_standardSources = map<string, string>{
134+ { " Config" , " contract Config{function lookup(uint256 service)constant returns(address a){}function kill(){}function unregister(uint256 id){}function register(uint256 id,address service){}}" },
135+ { " Coin" , " contract Coin{function isApprovedFor(address _target,address _proxy)constant returns(bool _r){}function isApproved(address _proxy)constant returns(bool _r){}function sendCoinFrom(address _from,uint256 _val,address _to){}function coinBalanceOf(address _a)constant returns(uint256 _r){}function sendCoin(uint256 _val,address _to){}function coinBalance()constant returns(uint256 _r){}function approve(address _a){}}" },
136+ { " CoinReg" , " contract CoinReg{function count()constant returns(uint256 r){}function info(uint256 i)constant returns(address addr,string3 name,uint256 denom){}function register(string3 name,uint256 denom){}function unregister(){}}" },
137+ { " coin" , " #require CoinReg\n contract coin {function coin(string3 name, uint denom) {CoinReg(Config().lookup(3)).register(name, denom);}}" },
138+ { " service" , " #require Config\n contract service{function service(uint _n){Config().register(_n, this);}}" },
139+ { " owned" , " contract owned{function owned(){owner = msg.sender;}modifier onlyowner(){if(msg.sender==owner)_}address owner;}" },
140+ { " mortal" , " #require owned\n contract mortal is owned {function kill() { if (msg.sender == owner) suicide(owner); }}" },
141+ { " NameReg" , " contract NameReg{function register(string32 name){}function addressOf(string32 name)constant returns(address addr){}function unregister(){}function nameOf(address addr)constant returns(string32 name){}}" },
142+ { " named" , " #require Config NameReg\n contract named {function named(string32 name) {NameReg(Config().lookup(1)).register(name);}}" },
143+ { " std" , " #require owned mortal Config NameReg named" },
144+ };
145+
146+ string sub;
147+ set<string> got;
148+ function<string (string const &)> localExpanded;
149+ localExpanded = [&](string const & s) -> string
150+ {
151+ string ret = s;
152+ for (size_t p = 0 ; p != string::npos;)
153+ if ((p = ret.find (" #require " )) != string::npos)
154+ {
155+ string n = ret.substr (p + 9 , ret.find_first_of (' \n ' , p + 9 ) - p - 9 );
156+ ret.replace (p, n.size () + 9 , " " );
157+ vector<string> rs;
158+ boost::split (rs, n, boost::is_any_of (" \t ," ), boost::token_compress_on);
159+ for (auto const & r: rs)
160+ if (!got.count (r))
161+ {
162+ if (c_standardSources.count (r))
163+ sub.append (" \n " + localExpanded (c_standardSources.at (r)) + " \n " );
164+ got.insert (r);
165+ }
166+ }
167+ // TODO: remove once we have genesis contracts.
168+ else if ((p = ret.find (" Config()" )) != string::npos)
169+ ret.replace (p, 8 , " Config(0xc6d9d2cd449a754c494264e1809c50e34d64562b)" );
170+ return ret;
171+ };
172+ return sub + localExpanded (_sourceCode);
173+ }
174+
175+ // //// END: TEMPORARY ONLY
176+
128177void CompilerStack::compile (bool _optimize)
129178{
130179 if (!m_parseSuccessful)
0 commit comments