- SQInteger oper;\r
- switch(tok){\r
- case TK_MINUSEQ: oper = '-'; break;\r
- case TK_PLUSEQ: oper = '+'; break;\r
- case TK_MULEQ: oper = '*'; break;\r
- case TK_DIVEQ: oper = '/'; break;\r
- case TK_MODEQ: oper = '%'; break;\r
- default: oper = 0; //shut up compiler\r
- assert(0); break;\r
- };\r
- if(deref) {\r
- SQInteger val = _fs->PopTarget();\r
- SQInteger key = _fs->PopTarget();\r
- SQInteger src = _fs->PopTarget();\r
- //mixes dest obj and source val in the arg1(hack?)\r
- _fs->AddInstruction(_OP_COMPARITH,_fs->PushTarget(),(src<<16)|val,key,oper);\r
- }\r
- else {\r
- Emit2ArgsOP(_OP_COMPARITHL, oper);\r
+ /* Generate code depending on the expression type */\r
+ switch(etype) {\r
+ case LOCAL:{\r
+ SQInteger p2 = _fs->PopTarget(); //src in OP_GET\r
+ SQInteger p1 = _fs->PopTarget(); //key in OP_GET\r
+ _fs->PushTarget(p1);\r
+ //EmitCompArithLocal(tok, p1, p1, p2);\r
+ _fs->AddInstruction(ChooseArithOpByToken(tok),p1, p2, p1, 0);\r
+ _fs->SnoozeOpt();\r
+ }\r
+ break;\r
+ case OBJECT:\r
+ case BASE:\r
+ {\r
+ SQInteger val = _fs->PopTarget();\r
+ SQInteger key = _fs->PopTarget();\r
+ SQInteger src = _fs->PopTarget();\r
+ /* _OP_COMPARITH mixes dest obj and source val in the arg1 */\r
+ _fs->AddInstruction(_OP_COMPARITH, _fs->PushTarget(), (src<<16)|val, key, ChooseCompArithCharByToken(tok));\r
+ }\r
+ break;\r
+ case OUTER:\r
+ {\r
+ SQInteger val = _fs->TopTarget();\r
+ SQInteger tmp = _fs->PushTarget();\r
+ _fs->AddInstruction(_OP_GETOUTER, tmp, pos);\r
+ _fs->AddInstruction(ChooseArithOpByToken(tok), tmp, val, tmp, 0);\r
+ _fs->AddInstruction(_OP_SETOUTER, tmp, pos, tmp);\r
+ }\r
+ break;\r