+ unsigned char *text(reinterpret_cast<unsigned char *>(alloc.Alloc(size)));
+ int cursor(0);
+ for (vector<ScriptToken *>::const_iterator i(s.begin()), end(s.end()); i != end; ++i) {
+ if ((*i)->GetType() == ScriptToken::LABEL) {
+ continue;
+ }
+ if ((*i)->GetType() != ScriptToken::COMMAND) {
+ throw Error("unexpected script token");
+ }
+ const string &cmd((*i)->CommandName());
+ if (cmd == "move") {
+ ++i;
+ const string ®((*i)->RegisterName());
+ ++i;
+ if (reg == "a0") {
+ text[cursor] = Script::CODE_MOVE_A0;
+ ++cursor;
+ ReadScriptAddress(**i, text + cursor);
+ cursor += sizeof(void *);
+ } else if (reg == "a1") {
+ text[cursor] = Script::CODE_MOVE_A1;
+ ++cursor;
+ ReadScriptAddress(**i, text + cursor);
+ cursor += sizeof(void *);
+ } else if (reg == "i0") {
+ text[cursor] = Script::CODE_MOVE_I0;
+ ++cursor;
+ ReadScriptInteger(**i, text + cursor);
+ cursor += sizeof(int);
+ } else if (reg == "i1") {
+ text[cursor] = Script::CODE_MOVE_I1;
+ ++cursor;
+ ReadScriptInteger(**i, text + cursor);
+ cursor += sizeof(int);
+ } else if (reg == "v0") {
+ text[cursor] = Script::CODE_MOVE_V0;
+ ++cursor;
+ ReadScriptVector(**i, text + cursor);
+ cursor += sizeof(Vector<int>);
+ } else if (reg == "v1") {
+ text[cursor] = Script::CODE_MOVE_V1;
+ ++cursor;
+ ReadScriptVector(**i, text + cursor);
+ cursor += sizeof(Vector<int>);
+ } else {
+ throw Error("unknown register " + reg);
+ }
+ } else if (cmd == "add") {
+ ++i;
+ const string ®((*i)->RegisterName());
+ ++i;
+ if (reg == "i0") {
+ text[cursor] = Script::CODE_ADD_I0;
+ ++cursor;
+ ReadScriptInteger(**i, text + cursor);
+ cursor += sizeof(int);
+ } else if (reg == "i1") {
+ text[cursor] = Script::CODE_ADD_I1;
+ ++cursor;
+ ReadScriptInteger(**i, text + cursor);
+ cursor += sizeof(int);
+ } else if (reg == "v0") {
+ text[cursor] = Script::CODE_ADD_V0;
+ ++cursor;
+ ReadScriptVector(**i, text + cursor);
+ cursor += sizeof(Vector<int>);
+ } else if (reg == "v1") {
+ text[cursor] = Script::CODE_ADD_V1;
+ ++cursor;
+ ReadScriptVector(**i, text + cursor);
+ cursor += sizeof(Vector<int>);
+ } else {
+ throw Error("unexpected register " + reg);
+ }
+ } else if (cmd == "mod") {
+ ++i;
+ const string ®((*i)->RegisterName());
+ ++i;
+ if (reg == "i0") {
+ text[cursor] = Script::CODE_MOD_I0;
+ ++cursor;
+ ReadScriptInteger(**i, text + cursor);
+ cursor += sizeof(int);
+ } else if (reg == "i1") {
+ text[cursor] = Script::CODE_MOD_I1;
+ ++cursor;
+ ReadScriptInteger(**i, text + cursor);
+ cursor += sizeof(int);
+ } else {
+ throw Error("unexpected register " + reg);
+ }
+ } else if (cmd == "rand") {
+ ++i;
+ const string ®((*i)->RegisterName());
+ if (reg == "i0") {
+ text[cursor] = Script::CODE_RAND_I0;
+ ++cursor;
+ } else if (reg == "i1") {
+ text[cursor] = Script::CODE_RAND_I1;
+ ++cursor;
+ } else {
+ throw Error("unexpected register " + reg);
+ }
+ } else if (cmd == "sysc") {
+ text[cursor] = Script::CODE_SYSCALL;
+ ++cursor;
+ } else {
+ throw Error("unknown command " + cmd);
+ }