Fixes to support ICodeModule operand type (via name in global object) and
TRUE/FALSE/NULL/CLASS instructions. git-svn-id: svn://10.0.0.236/trunk@85531 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
parent
cd9c3af789
commit
de77d1777b
@ -13,6 +13,7 @@
|
||||
BRANCH_TRUE, /* target label, condition */
|
||||
CALL, /* result, target, args */
|
||||
CAST, /* dest, rvalue, toType */
|
||||
CLASS, /* dest, obj */
|
||||
COMPARE_EQ, /* dest, source1, source2 */
|
||||
COMPARE_GE, /* dest, source1, source2 */
|
||||
COMPARE_GT, /* dest, source1, source2 */
|
||||
@ -34,10 +35,12 @@
|
||||
GET_STATIC, /* dest, class, index */
|
||||
INSTANCEOF, /* dest, source1, source2 */
|
||||
JSR, /* target */
|
||||
LOAD_BOOLEAN, /* dest, immediate value (boolean) */
|
||||
LOAD_FALSE, /* dest */
|
||||
LOAD_IMMEDIATE, /* dest, immediate value (double) */
|
||||
LOAD_NAME, /* dest, name */
|
||||
LOAD_NULL, /* dest */
|
||||
LOAD_STRING, /* dest, immediate value (string) */
|
||||
LOAD_TRUE, /* dest */
|
||||
MOVE, /* dest, source */
|
||||
MULTIPLY, /* dest, source1, source2 */
|
||||
NAME_XCR, /* dest, name, value */
|
||||
@ -204,6 +207,22 @@
|
||||
}
|
||||
};
|
||||
|
||||
class Class : public Instruction_2<TypedRegister, TypedRegister> {
|
||||
public:
|
||||
/* dest, obj */
|
||||
Class (TypedRegister aOp1, TypedRegister aOp2) :
|
||||
Instruction_2<TypedRegister, TypedRegister>
|
||||
(CLASS, aOp1, aOp2) {};
|
||||
virtual Formatter& print(Formatter& f) {
|
||||
f << opcodeNames[CLASS] << "\t" << mOp1 << ", " << mOp2;
|
||||
return f;
|
||||
}
|
||||
virtual Formatter& printOperands(Formatter& f, const JSValues& registers) {
|
||||
f << getRegisterValue(registers, mOp1.first) << ", " << getRegisterValue(registers, mOp2.first);
|
||||
return f;
|
||||
}
|
||||
};
|
||||
|
||||
class CompareEQ : public Instruction_3<TypedRegister, TypedRegister, TypedRegister> {
|
||||
public:
|
||||
/* dest, source1, source2 */
|
||||
@ -531,14 +550,14 @@
|
||||
}
|
||||
};
|
||||
|
||||
class LoadBoolean : public Instruction_2<TypedRegister, bool> {
|
||||
class LoadFalse : public Instruction_1<TypedRegister> {
|
||||
public:
|
||||
/* dest, immediate value (boolean) */
|
||||
LoadBoolean (TypedRegister aOp1, bool aOp2) :
|
||||
Instruction_2<TypedRegister, bool>
|
||||
(LOAD_BOOLEAN, aOp1, aOp2) {};
|
||||
/* dest */
|
||||
LoadFalse (TypedRegister aOp1) :
|
||||
Instruction_1<TypedRegister>
|
||||
(LOAD_FALSE, aOp1) {};
|
||||
virtual Formatter& print(Formatter& f) {
|
||||
f << opcodeNames[LOAD_BOOLEAN] << "\t" << mOp1 << ", " << "'" << ((mOp2) ? "true" : "false") << "'";
|
||||
f << opcodeNames[LOAD_FALSE] << "\t" << mOp1;
|
||||
return f;
|
||||
}
|
||||
virtual Formatter& printOperands(Formatter& f, const JSValues& registers) {
|
||||
@ -579,6 +598,22 @@
|
||||
}
|
||||
};
|
||||
|
||||
class LoadNull : public Instruction_1<TypedRegister> {
|
||||
public:
|
||||
/* dest */
|
||||
LoadNull (TypedRegister aOp1) :
|
||||
Instruction_1<TypedRegister>
|
||||
(LOAD_NULL, aOp1) {};
|
||||
virtual Formatter& print(Formatter& f) {
|
||||
f << opcodeNames[LOAD_NULL] << "\t" << mOp1;
|
||||
return f;
|
||||
}
|
||||
virtual Formatter& printOperands(Formatter& f, const JSValues& registers) {
|
||||
f << getRegisterValue(registers, mOp1.first);
|
||||
return f;
|
||||
}
|
||||
};
|
||||
|
||||
class LoadString : public Instruction_2<TypedRegister, JSString*> {
|
||||
public:
|
||||
/* dest, immediate value (string) */
|
||||
@ -595,6 +630,22 @@
|
||||
}
|
||||
};
|
||||
|
||||
class LoadTrue : public Instruction_1<TypedRegister> {
|
||||
public:
|
||||
/* dest */
|
||||
LoadTrue (TypedRegister aOp1) :
|
||||
Instruction_1<TypedRegister>
|
||||
(LOAD_TRUE, aOp1) {};
|
||||
virtual Formatter& print(Formatter& f) {
|
||||
f << opcodeNames[LOAD_TRUE] << "\t" << mOp1;
|
||||
return f;
|
||||
}
|
||||
virtual Formatter& printOperands(Formatter& f, const JSValues& registers) {
|
||||
f << getRegisterValue(registers, mOp1.first);
|
||||
return f;
|
||||
}
|
||||
};
|
||||
|
||||
class Move : public Instruction_2<TypedRegister, TypedRegister> {
|
||||
public:
|
||||
/* dest, source */
|
||||
@ -1186,6 +1237,7 @@
|
||||
"BRANCH_TRUE ",
|
||||
"CALL ",
|
||||
"CAST ",
|
||||
"CLASS ",
|
||||
"COMPARE_EQ ",
|
||||
"COMPARE_GE ",
|
||||
"COMPARE_GT ",
|
||||
@ -1207,10 +1259,12 @@
|
||||
"GET_STATIC ",
|
||||
"INSTANCEOF ",
|
||||
"JSR ",
|
||||
"LOAD_BOOLEAN ",
|
||||
"LOAD_FALSE ",
|
||||
"LOAD_IMMEDIATE ",
|
||||
"LOAD_NAME ",
|
||||
"LOAD_NULL ",
|
||||
"LOAD_STRING ",
|
||||
"LOAD_TRUE ",
|
||||
"MOVE ",
|
||||
"MULTIPLY ",
|
||||
"NAME_XCR ",
|
||||
|
||||
@ -222,11 +222,29 @@ namespace ICodeASM {
|
||||
}
|
||||
|
||||
string8_citer
|
||||
ICodeParser::parseICodeModuleOperand (string8_citer /*begin*/,
|
||||
string8_citer end, string ** /*rval*/)
|
||||
ICodeParser::parseICodeModuleOperand (string8_citer begin,
|
||||
string8_citer end,
|
||||
VM::ICodeModule **rval)
|
||||
{
|
||||
NOT_REACHED ("ICode modules are hard, lets go shopping.");
|
||||
TokenLocation tl = seekTokenStart (begin, end);
|
||||
|
||||
if (tl.estimate != teString)
|
||||
throw JSParseException (eidExpectString);
|
||||
|
||||
string8 *str;
|
||||
end = lexString8 (tl.begin, end, &str);
|
||||
StringAtom &typename_atom = mCx->getWorld().identifiers[str->c_str()];
|
||||
delete str;
|
||||
JSTypes::JSValue jsv =
|
||||
mCx->getGlobalObject()->getVariable(typename_atom);
|
||||
if (!jsv.isFunction()) {
|
||||
ASSERT(false);
|
||||
}
|
||||
*rval = jsv.function->getICode();
|
||||
|
||||
return end;
|
||||
// NOT_REACHED ("ICode modules are hard, lets go shopping.");
|
||||
// return end;
|
||||
}
|
||||
|
||||
string8_citer
|
||||
@ -417,7 +435,7 @@ namespace ICodeASM {
|
||||
CASE_TYPE(ExprNodeKind, ExprNode::Kind, static_cast);
|
||||
CASE_TYPE(Bool, bool, static_cast);
|
||||
CASE_TYPE(Double, double, static_cast);
|
||||
CASE_TYPE(ICodeModule, string *, reinterpret_cast);
|
||||
CASE_TYPE(ICodeModule, VM::ICodeModule *, reinterpret_cast);
|
||||
CASE_TYPE(JSClass, JSTypes::JSType *, reinterpret_cast);
|
||||
CASE_TYPE(JSString, JSTypes::JSString *, reinterpret_cast);
|
||||
CASE_TYPE(JSFunction, string *, reinterpret_cast);
|
||||
|
||||
@ -118,7 +118,7 @@ namespace ICodeASM {
|
||||
double *rval);
|
||||
string8_citer
|
||||
parseICodeModuleOperand (string8_citer begin, string8_citer end,
|
||||
string8 **rval);
|
||||
VM::ICodeModule **rval);
|
||||
string8_citer
|
||||
parseJSClassOperand (string8_citer begin, string8_citer end,
|
||||
JSTypes::JSType **rval);
|
||||
|
||||
@ -169,7 +169,7 @@ ICodeModule *ICodeGenerator::complete(JSType *resultType)
|
||||
}
|
||||
}
|
||||
*/
|
||||
ICodeModule* module = new ICodeModule(iCode,
|
||||
ICodeModule* module = new ICodeModule(iCode,
|
||||
variableList,
|
||||
parameterList,
|
||||
mPermanentRegister.size(),
|
||||
@ -218,8 +218,10 @@ TypedRegister ICodeGenerator::loadString(const StringAtom &value)
|
||||
TypedRegister ICodeGenerator::loadBoolean(bool value)
|
||||
{
|
||||
TypedRegister dest(getTempRegister(), &Boolean_Type);
|
||||
LoadBoolean *instr = new LoadBoolean(dest, value);
|
||||
iCode->push_back(instr);
|
||||
if (value)
|
||||
iCode->push_back(new LoadTrue(dest));
|
||||
else
|
||||
iCode->push_back(new LoadFalse(dest));
|
||||
return dest;
|
||||
}
|
||||
|
||||
|
||||
@ -45,7 +45,7 @@
|
||||
namespace JavaScript {
|
||||
namespace ICodeASM {
|
||||
|
||||
static uint icodemap_size = 75;
|
||||
static uint icodemap_size = 78;
|
||||
|
||||
static struct {
|
||||
char *name;
|
||||
@ -61,6 +61,7 @@ namespace ICodeASM {
|
||||
{"BRANCH_TRUE", {otLabel, otRegister}},
|
||||
{"CALL", {otRegister, otRegister, otArgumentList}},
|
||||
{"CAST", {otRegister, otRegister, otJSType}},
|
||||
{"CLASS", {otRegister, otRegister}},
|
||||
{"COMPARE_EQ", {otRegister, otRegister, otRegister}},
|
||||
{"COMPARE_GE", {otRegister, otRegister, otRegister}},
|
||||
{"COMPARE_GT", {otRegister, otRegister, otRegister}},
|
||||
@ -82,10 +83,12 @@ namespace ICodeASM {
|
||||
{"GET_STATIC", {otRegister, otJSClass, otUInt32}},
|
||||
{"INSTANCEOF", {otRegister, otRegister, otRegister}},
|
||||
{"JSR", {otLabel}},
|
||||
{"LOAD_BOOLEAN", {otRegister, otBool}},
|
||||
{"LOAD_FALSE", {otRegister}},
|
||||
{"LOAD_IMMEDIATE", {otRegister, otDouble}},
|
||||
{"LOAD_NAME", {otRegister, otStringAtom}},
|
||||
{"LOAD_NULL", {otRegister}},
|
||||
{"LOAD_STRING", {otRegister, otJSString}},
|
||||
{"LOAD_TRUE", {otRegister}},
|
||||
{"MOVE", {otRegister, otRegister}},
|
||||
{"MULTIPLY", {otRegister, otRegister, otRegister}},
|
||||
{"NAME_XCR", {otRegister, otStringAtom, otDouble}},
|
||||
@ -167,198 +170,207 @@ namespace ICodeASM {
|
||||
i = new Cast (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), reinterpret_cast<JSType*>(node->operand[2].data));
|
||||
break;
|
||||
case 10:
|
||||
i = new CompareEQ (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new Class (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0));
|
||||
break;
|
||||
case 11:
|
||||
i = new CompareGE (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new CompareEQ (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 12:
|
||||
i = new CompareGT (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new CompareGE (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 13:
|
||||
i = new CompareIN (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new CompareGT (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 14:
|
||||
i = new CompareLE (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new CompareIN (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 15:
|
||||
i = new CompareLT (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new CompareLE (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 16:
|
||||
i = new CompareNE (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new CompareLT (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 17:
|
||||
i = new Debugger ();
|
||||
i = new CompareNE (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 18:
|
||||
i = new DeleteProp (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), reinterpret_cast<const StringAtom*>(node->operand[2].data));
|
||||
i = new Debugger ();
|
||||
break;
|
||||
case 19:
|
||||
i = new DirectCall (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<JSFunction*>(node->operand[1].data), reinterpret_cast<ArgumentList*>(node->operand[2].data));
|
||||
i = new DeleteProp (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), reinterpret_cast<const StringAtom*>(node->operand[2].data));
|
||||
break;
|
||||
case 20:
|
||||
i = new Divide (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new DirectCall (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<JSFunction*>(node->operand[1].data), reinterpret_cast<ArgumentList*>(node->operand[2].data));
|
||||
break;
|
||||
case 21:
|
||||
i = new ElemXcr (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0), static_cast<double>(node->operand[3].data));
|
||||
i = new Divide (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 22:
|
||||
i = new GenericBinaryOP (TypedRegister(static_cast<Register>(node->operand[0].data), 0), static_cast<ExprNode::Kind>(node->operand[1].data), TypedRegister(static_cast<Register>(node->operand[2].data), 0), TypedRegister(static_cast<Register>(node->operand[3].data), 0));
|
||||
i = new ElemXcr (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0), static_cast<double>(node->operand[3].data));
|
||||
break;
|
||||
case 23:
|
||||
i = new GetClosure (TypedRegister(static_cast<Register>(node->operand[0].data), 0), static_cast<uint32>(node->operand[1].data));
|
||||
i = new GenericBinaryOP (TypedRegister(static_cast<Register>(node->operand[0].data), 0), static_cast<ExprNode::Kind>(node->operand[1].data), TypedRegister(static_cast<Register>(node->operand[2].data), 0), TypedRegister(static_cast<Register>(node->operand[3].data), 0));
|
||||
break;
|
||||
case 24:
|
||||
i = new GetElement (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new GetClosure (TypedRegister(static_cast<Register>(node->operand[0].data), 0), static_cast<uint32>(node->operand[1].data));
|
||||
break;
|
||||
case 25:
|
||||
i = new GetMethod (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), static_cast<uint32>(node->operand[2].data));
|
||||
i = new GetElement (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 26:
|
||||
i = new GetProp (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), reinterpret_cast<const StringAtom*>(node->operand[2].data));
|
||||
i = new GetMethod (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), static_cast<uint32>(node->operand[2].data));
|
||||
break;
|
||||
case 27:
|
||||
i = new GetSlot (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), static_cast<uint32>(node->operand[2].data));
|
||||
i = new GetProp (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), reinterpret_cast<const StringAtom*>(node->operand[2].data));
|
||||
break;
|
||||
case 28:
|
||||
i = new GetStatic (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<JSClass*>(node->operand[1].data), static_cast<uint32>(node->operand[2].data));
|
||||
i = new GetSlot (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), static_cast<uint32>(node->operand[2].data));
|
||||
break;
|
||||
case 29:
|
||||
i = new Instanceof (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new GetStatic (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<JSClass*>(node->operand[1].data), static_cast<uint32>(node->operand[2].data));
|
||||
break;
|
||||
case 30:
|
||||
i = new Jsr (reinterpret_cast<Label*>(node->operand[0].data));
|
||||
i = new Instanceof (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 31:
|
||||
i = new LoadBoolean (TypedRegister(static_cast<Register>(node->operand[0].data), 0), static_cast<bool>(node->operand[1].data));
|
||||
i = new Jsr (reinterpret_cast<Label*>(node->operand[0].data));
|
||||
break;
|
||||
case 32:
|
||||
i = new LoadImmediate (TypedRegister(static_cast<Register>(node->operand[0].data), 0), static_cast<double>(node->operand[1].data));
|
||||
i = new LoadFalse (TypedRegister(static_cast<Register>(node->operand[0].data), 0));
|
||||
break;
|
||||
case 33:
|
||||
i = new LoadName (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<const StringAtom*>(node->operand[1].data));
|
||||
i = new LoadImmediate (TypedRegister(static_cast<Register>(node->operand[0].data), 0), static_cast<double>(node->operand[1].data));
|
||||
break;
|
||||
case 34:
|
||||
i = new LoadString (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<JSString*>(node->operand[1].data));
|
||||
i = new LoadName (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<const StringAtom*>(node->operand[1].data));
|
||||
break;
|
||||
case 35:
|
||||
i = new Move (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0));
|
||||
i = new LoadNull (TypedRegister(static_cast<Register>(node->operand[0].data), 0));
|
||||
break;
|
||||
case 36:
|
||||
i = new Multiply (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new LoadString (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<JSString*>(node->operand[1].data));
|
||||
break;
|
||||
case 37:
|
||||
i = new NameXcr (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<const StringAtom*>(node->operand[1].data), static_cast<double>(node->operand[2].data));
|
||||
i = new LoadTrue (TypedRegister(static_cast<Register>(node->operand[0].data), 0));
|
||||
break;
|
||||
case 38:
|
||||
i = new Negate (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0));
|
||||
i = new Move (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0));
|
||||
break;
|
||||
case 39:
|
||||
i = new NewArray (TypedRegister(static_cast<Register>(node->operand[0].data), 0));
|
||||
i = new Multiply (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 40:
|
||||
i = new NewClass (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<JSClass*>(node->operand[1].data));
|
||||
i = new NameXcr (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<const StringAtom*>(node->operand[1].data), static_cast<double>(node->operand[2].data));
|
||||
break;
|
||||
case 41:
|
||||
i = new NewClosure (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<ICodeModule*>(node->operand[1].data));
|
||||
i = new Negate (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0));
|
||||
break;
|
||||
case 42:
|
||||
i = new NewFunction (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<ICodeModule*>(node->operand[1].data));
|
||||
i = new NewArray (TypedRegister(static_cast<Register>(node->operand[0].data), 0));
|
||||
break;
|
||||
case 43:
|
||||
i = new NewObject (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0));
|
||||
i = new NewClass (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<JSClass*>(node->operand[1].data));
|
||||
break;
|
||||
case 44:
|
||||
i = new Nop ();
|
||||
i = new NewClosure (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<ICodeModule*>(node->operand[1].data));
|
||||
break;
|
||||
case 45:
|
||||
i = new Not (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0));
|
||||
i = new NewFunction (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<ICodeModule*>(node->operand[1].data));
|
||||
break;
|
||||
case 46:
|
||||
i = new Or (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new NewObject (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0));
|
||||
break;
|
||||
case 47:
|
||||
i = new Posate (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0));
|
||||
i = new Nop ();
|
||||
break;
|
||||
case 48:
|
||||
i = new PropXcr (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), reinterpret_cast<const StringAtom*>(node->operand[2].data), static_cast<double>(node->operand[3].data));
|
||||
i = new Not (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0));
|
||||
break;
|
||||
case 49:
|
||||
i = new Remainder (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new Or (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 50:
|
||||
i = new Return (TypedRegister(static_cast<Register>(node->operand[0].data), 0));
|
||||
i = new Posate (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0));
|
||||
break;
|
||||
case 51:
|
||||
i = new ReturnVoid ();
|
||||
i = new PropXcr (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), reinterpret_cast<const StringAtom*>(node->operand[2].data), static_cast<double>(node->operand[3].data));
|
||||
break;
|
||||
case 52:
|
||||
i = new Rts ();
|
||||
i = new Remainder (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 53:
|
||||
i = new SaveName (reinterpret_cast<const StringAtom*>(node->operand[0].data), TypedRegister(static_cast<Register>(node->operand[1].data), 0));
|
||||
i = new Return (TypedRegister(static_cast<Register>(node->operand[0].data), 0));
|
||||
break;
|
||||
case 54:
|
||||
i = new SetElement (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new ReturnVoid ();
|
||||
break;
|
||||
case 55:
|
||||
i = new SetProp (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<const StringAtom*>(node->operand[1].data), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new Rts ();
|
||||
break;
|
||||
case 56:
|
||||
i = new SetSlot (TypedRegister(static_cast<Register>(node->operand[0].data), 0), static_cast<uint32>(node->operand[1].data), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new SaveName (reinterpret_cast<const StringAtom*>(node->operand[0].data), TypedRegister(static_cast<Register>(node->operand[1].data), 0));
|
||||
break;
|
||||
case 57:
|
||||
i = new SetStatic (reinterpret_cast<JSClass*>(node->operand[0].data), static_cast<uint32>(node->operand[1].data), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new SetElement (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 58:
|
||||
i = new Shiftleft (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new SetProp (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<const StringAtom*>(node->operand[1].data), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 59:
|
||||
i = new Shiftright (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new SetSlot (TypedRegister(static_cast<Register>(node->operand[0].data), 0), static_cast<uint32>(node->operand[1].data), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 60:
|
||||
i = new SlotXcr (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), static_cast<uint32>(node->operand[2].data), static_cast<double>(node->operand[3].data));
|
||||
i = new SetStatic (reinterpret_cast<JSClass*>(node->operand[0].data), static_cast<uint32>(node->operand[1].data), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 61:
|
||||
i = new StaticXcr (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<JSClass*>(node->operand[1].data), static_cast<uint32>(node->operand[2].data), static_cast<double>(node->operand[3].data));
|
||||
i = new Shiftleft (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 62:
|
||||
i = new StrictEQ (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new Shiftright (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 63:
|
||||
i = new StrictNE (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new SlotXcr (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), static_cast<uint32>(node->operand[2].data), static_cast<double>(node->operand[3].data));
|
||||
break;
|
||||
case 64:
|
||||
i = new Subtract (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new StaticXcr (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<JSClass*>(node->operand[1].data), static_cast<uint32>(node->operand[2].data), static_cast<double>(node->operand[3].data));
|
||||
break;
|
||||
case 65:
|
||||
i = new Super (TypedRegister(static_cast<Register>(node->operand[0].data), 0));
|
||||
i = new StrictEQ (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 66:
|
||||
i = new Test (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0));
|
||||
i = new StrictNE (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 67:
|
||||
i = new Throw (TypedRegister(static_cast<Register>(node->operand[0].data), 0));
|
||||
i = new Subtract (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 68:
|
||||
i = new Tryin (reinterpret_cast<Label*>(node->operand[0].data), reinterpret_cast<Label*>(node->operand[1].data));
|
||||
i = new Super (TypedRegister(static_cast<Register>(node->operand[0].data), 0));
|
||||
break;
|
||||
case 69:
|
||||
i = new Tryout ();
|
||||
i = new Test (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0));
|
||||
break;
|
||||
case 70:
|
||||
i = new Ushiftright (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new Throw (TypedRegister(static_cast<Register>(node->operand[0].data), 0));
|
||||
break;
|
||||
case 71:
|
||||
i = new VarXcr (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), static_cast<double>(node->operand[2].data));
|
||||
i = new Tryin (reinterpret_cast<Label*>(node->operand[0].data), reinterpret_cast<Label*>(node->operand[1].data));
|
||||
break;
|
||||
case 72:
|
||||
i = new Within (TypedRegister(static_cast<Register>(node->operand[0].data), 0));
|
||||
i = new Tryout ();
|
||||
break;
|
||||
case 73:
|
||||
i = new Without ();
|
||||
i = new Ushiftright (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 74:
|
||||
i = new VarXcr (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), static_cast<double>(node->operand[2].data));
|
||||
break;
|
||||
case 75:
|
||||
i = new Within (TypedRegister(static_cast<Register>(node->operand[0].data), 0));
|
||||
break;
|
||||
case 76:
|
||||
i = new Without ();
|
||||
break;
|
||||
case 77:
|
||||
i = new Xor (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
|
||||
|
||||
@ -542,6 +542,12 @@ JSValue Context::interpret(ICodeModule* iCode, const JSValues& args)
|
||||
(*registers)[dst(c).first] = (*registers)[src1(c).first].convert(toType);
|
||||
}
|
||||
break;
|
||||
case CLASS:
|
||||
{
|
||||
Class* c = static_cast<Class*>(instruction);
|
||||
ASSERT((*registers)[src1(c).first].isObject());
|
||||
(*registers)[dst(c).first] = (*registers)[src1(c).first].object->getType();
|
||||
}
|
||||
case SUPER:
|
||||
{
|
||||
Super* su = static_cast<Super*>(instruction);
|
||||
@ -1104,10 +1110,16 @@ using JSString throughout.
|
||||
(*registers)[dst(ls).first] = src1(ls);
|
||||
}
|
||||
break;
|
||||
case LOAD_BOOLEAN:
|
||||
case LOAD_TRUE:
|
||||
{
|
||||
LoadBoolean* lb = static_cast<LoadBoolean*>(instruction);
|
||||
(*registers)[dst(lb).first] = src1(lb);
|
||||
LoadTrue* lt = static_cast<LoadTrue*>(instruction);
|
||||
(*registers)[dst(lt).first] = true;
|
||||
}
|
||||
break;
|
||||
case LOAD_FALSE:
|
||||
{
|
||||
LoadFalse* lf = static_cast<LoadFalse*>(instruction);
|
||||
(*registers)[dst(lf).first] = false;
|
||||
}
|
||||
break;
|
||||
case BRANCH:
|
||||
|
||||
@ -40,7 +40,29 @@
|
||||
</function>
|
||||
|
||||
|
||||
<function name="anon_1" type="Integer">
|
||||
<parameter name="b"/>
|
||||
GET_CLOSURE R2, 0 <!-- acquire access to frame immediately below (statically) -->
|
||||
GET_SLOT R3, R2, 1 <!-- closure slots referenced by index == register number -->
|
||||
GENERIC_BINARY_OP R3, Add, R3, R1
|
||||
RETURN R3
|
||||
</function>
|
||||
|
||||
<function name="f" type="Integer">
|
||||
<parameter name="a"/> <!-- R0 = this, R1 = a -->
|
||||
NEW_CLOSURE R2, "anon_1" <!-- all functions are entered by name into the gloabl object, this is a bit hokey -->
|
||||
LOAD_IMMEDIATE R3, 1
|
||||
CALL R3, R2, (R3)
|
||||
RETURN R3
|
||||
</function>
|
||||
|
||||
<script>
|
||||
LOAD_NAME R1, "f" <!-- demo'ing use of closures -->
|
||||
LOAD_IMMEDIATE R2, 77
|
||||
CALL R3, R1, (R2)
|
||||
LOAD_NAME R1, "print"
|
||||
CALL R1, R1, (R3)
|
||||
|
||||
LOAD_NAME R1, "fn1"
|
||||
CALL R1, R1, ()
|
||||
|
||||
|
||||
@ -145,11 +145,23 @@ $ops{"LOAD_IMMEDIATE"} =
|
||||
rem => "dest, immediate value (double)",
|
||||
params => [ ("TypedRegister", "double" ) ]
|
||||
};
|
||||
$ops{"LOAD_BOOLEAN"} =
|
||||
$ops{"LOAD_NULL"} =
|
||||
{
|
||||
super => "Instruction_2",
|
||||
rem => "dest, immediate value (boolean)",
|
||||
params => [ ("TypedRegister", "bool" ) ]
|
||||
super => "Instruction_1",
|
||||
rem => "dest",
|
||||
params => [ ("TypedRegister") ]
|
||||
};
|
||||
$ops{"LOAD_TRUE"} =
|
||||
{
|
||||
super => "Instruction_1",
|
||||
rem => "dest",
|
||||
params => [ ("TypedRegister" ) ]
|
||||
};
|
||||
$ops{"LOAD_FALSE"} =
|
||||
{
|
||||
super => "Instruction_1",
|
||||
rem => "dest",
|
||||
params => [ ("TypedRegister" ) ]
|
||||
};
|
||||
$ops{"LOAD_STRING"} =
|
||||
{
|
||||
@ -416,5 +428,11 @@ $ops{"CAST"} =
|
||||
rem => "dest, rvalue, toType",
|
||||
params => [ ("TypedRegister", "TypedRegister", "JSType*") ]
|
||||
};
|
||||
$ops{"CLASS"} =
|
||||
{
|
||||
super => "Instruction_2",
|
||||
rem => "dest, obj",
|
||||
params => [ ("TypedRegister", "TypedRegister") ]
|
||||
};
|
||||
|
||||
1;
|
||||
|
||||
@ -13,6 +13,7 @@
|
||||
BRANCH_TRUE, /* target label, condition */
|
||||
CALL, /* result, target, args */
|
||||
CAST, /* dest, rvalue, toType */
|
||||
CLASS, /* dest, obj */
|
||||
COMPARE_EQ, /* dest, source1, source2 */
|
||||
COMPARE_GE, /* dest, source1, source2 */
|
||||
COMPARE_GT, /* dest, source1, source2 */
|
||||
@ -34,10 +35,12 @@
|
||||
GET_STATIC, /* dest, class, index */
|
||||
INSTANCEOF, /* dest, source1, source2 */
|
||||
JSR, /* target */
|
||||
LOAD_BOOLEAN, /* dest, immediate value (boolean) */
|
||||
LOAD_FALSE, /* dest */
|
||||
LOAD_IMMEDIATE, /* dest, immediate value (double) */
|
||||
LOAD_NAME, /* dest, name */
|
||||
LOAD_NULL, /* dest */
|
||||
LOAD_STRING, /* dest, immediate value (string) */
|
||||
LOAD_TRUE, /* dest */
|
||||
MOVE, /* dest, source */
|
||||
MULTIPLY, /* dest, source1, source2 */
|
||||
NAME_XCR, /* dest, name, value */
|
||||
@ -204,6 +207,22 @@
|
||||
}
|
||||
};
|
||||
|
||||
class Class : public Instruction_2<TypedRegister, TypedRegister> {
|
||||
public:
|
||||
/* dest, obj */
|
||||
Class (TypedRegister aOp1, TypedRegister aOp2) :
|
||||
Instruction_2<TypedRegister, TypedRegister>
|
||||
(CLASS, aOp1, aOp2) {};
|
||||
virtual Formatter& print(Formatter& f) {
|
||||
f << opcodeNames[CLASS] << "\t" << mOp1 << ", " << mOp2;
|
||||
return f;
|
||||
}
|
||||
virtual Formatter& printOperands(Formatter& f, const JSValues& registers) {
|
||||
f << getRegisterValue(registers, mOp1.first) << ", " << getRegisterValue(registers, mOp2.first);
|
||||
return f;
|
||||
}
|
||||
};
|
||||
|
||||
class CompareEQ : public Instruction_3<TypedRegister, TypedRegister, TypedRegister> {
|
||||
public:
|
||||
/* dest, source1, source2 */
|
||||
@ -531,14 +550,14 @@
|
||||
}
|
||||
};
|
||||
|
||||
class LoadBoolean : public Instruction_2<TypedRegister, bool> {
|
||||
class LoadFalse : public Instruction_1<TypedRegister> {
|
||||
public:
|
||||
/* dest, immediate value (boolean) */
|
||||
LoadBoolean (TypedRegister aOp1, bool aOp2) :
|
||||
Instruction_2<TypedRegister, bool>
|
||||
(LOAD_BOOLEAN, aOp1, aOp2) {};
|
||||
/* dest */
|
||||
LoadFalse (TypedRegister aOp1) :
|
||||
Instruction_1<TypedRegister>
|
||||
(LOAD_FALSE, aOp1) {};
|
||||
virtual Formatter& print(Formatter& f) {
|
||||
f << opcodeNames[LOAD_BOOLEAN] << "\t" << mOp1 << ", " << "'" << ((mOp2) ? "true" : "false") << "'";
|
||||
f << opcodeNames[LOAD_FALSE] << "\t" << mOp1;
|
||||
return f;
|
||||
}
|
||||
virtual Formatter& printOperands(Formatter& f, const JSValues& registers) {
|
||||
@ -579,6 +598,22 @@
|
||||
}
|
||||
};
|
||||
|
||||
class LoadNull : public Instruction_1<TypedRegister> {
|
||||
public:
|
||||
/* dest */
|
||||
LoadNull (TypedRegister aOp1) :
|
||||
Instruction_1<TypedRegister>
|
||||
(LOAD_NULL, aOp1) {};
|
||||
virtual Formatter& print(Formatter& f) {
|
||||
f << opcodeNames[LOAD_NULL] << "\t" << mOp1;
|
||||
return f;
|
||||
}
|
||||
virtual Formatter& printOperands(Formatter& f, const JSValues& registers) {
|
||||
f << getRegisterValue(registers, mOp1.first);
|
||||
return f;
|
||||
}
|
||||
};
|
||||
|
||||
class LoadString : public Instruction_2<TypedRegister, JSString*> {
|
||||
public:
|
||||
/* dest, immediate value (string) */
|
||||
@ -595,6 +630,22 @@
|
||||
}
|
||||
};
|
||||
|
||||
class LoadTrue : public Instruction_1<TypedRegister> {
|
||||
public:
|
||||
/* dest */
|
||||
LoadTrue (TypedRegister aOp1) :
|
||||
Instruction_1<TypedRegister>
|
||||
(LOAD_TRUE, aOp1) {};
|
||||
virtual Formatter& print(Formatter& f) {
|
||||
f << opcodeNames[LOAD_TRUE] << "\t" << mOp1;
|
||||
return f;
|
||||
}
|
||||
virtual Formatter& printOperands(Formatter& f, const JSValues& registers) {
|
||||
f << getRegisterValue(registers, mOp1.first);
|
||||
return f;
|
||||
}
|
||||
};
|
||||
|
||||
class Move : public Instruction_2<TypedRegister, TypedRegister> {
|
||||
public:
|
||||
/* dest, source */
|
||||
@ -1186,6 +1237,7 @@
|
||||
"BRANCH_TRUE ",
|
||||
"CALL ",
|
||||
"CAST ",
|
||||
"CLASS ",
|
||||
"COMPARE_EQ ",
|
||||
"COMPARE_GE ",
|
||||
"COMPARE_GT ",
|
||||
@ -1207,10 +1259,12 @@
|
||||
"GET_STATIC ",
|
||||
"INSTANCEOF ",
|
||||
"JSR ",
|
||||
"LOAD_BOOLEAN ",
|
||||
"LOAD_FALSE ",
|
||||
"LOAD_IMMEDIATE ",
|
||||
"LOAD_NAME ",
|
||||
"LOAD_NULL ",
|
||||
"LOAD_STRING ",
|
||||
"LOAD_TRUE ",
|
||||
"MOVE ",
|
||||
"MULTIPLY ",
|
||||
"NAME_XCR ",
|
||||
|
||||
@ -222,11 +222,29 @@ namespace ICodeASM {
|
||||
}
|
||||
|
||||
string8_citer
|
||||
ICodeParser::parseICodeModuleOperand (string8_citer /*begin*/,
|
||||
string8_citer end, string ** /*rval*/)
|
||||
ICodeParser::parseICodeModuleOperand (string8_citer begin,
|
||||
string8_citer end,
|
||||
VM::ICodeModule **rval)
|
||||
{
|
||||
NOT_REACHED ("ICode modules are hard, lets go shopping.");
|
||||
TokenLocation tl = seekTokenStart (begin, end);
|
||||
|
||||
if (tl.estimate != teString)
|
||||
throw JSParseException (eidExpectString);
|
||||
|
||||
string8 *str;
|
||||
end = lexString8 (tl.begin, end, &str);
|
||||
StringAtom &typename_atom = mCx->getWorld().identifiers[str->c_str()];
|
||||
delete str;
|
||||
JSTypes::JSValue jsv =
|
||||
mCx->getGlobalObject()->getVariable(typename_atom);
|
||||
if (!jsv.isFunction()) {
|
||||
ASSERT(false);
|
||||
}
|
||||
*rval = jsv.function->getICode();
|
||||
|
||||
return end;
|
||||
// NOT_REACHED ("ICode modules are hard, lets go shopping.");
|
||||
// return end;
|
||||
}
|
||||
|
||||
string8_citer
|
||||
@ -417,7 +435,7 @@ namespace ICodeASM {
|
||||
CASE_TYPE(ExprNodeKind, ExprNode::Kind, static_cast);
|
||||
CASE_TYPE(Bool, bool, static_cast);
|
||||
CASE_TYPE(Double, double, static_cast);
|
||||
CASE_TYPE(ICodeModule, string *, reinterpret_cast);
|
||||
CASE_TYPE(ICodeModule, VM::ICodeModule *, reinterpret_cast);
|
||||
CASE_TYPE(JSClass, JSTypes::JSType *, reinterpret_cast);
|
||||
CASE_TYPE(JSString, JSTypes::JSString *, reinterpret_cast);
|
||||
CASE_TYPE(JSFunction, string *, reinterpret_cast);
|
||||
|
||||
@ -118,7 +118,7 @@ namespace ICodeASM {
|
||||
double *rval);
|
||||
string8_citer
|
||||
parseICodeModuleOperand (string8_citer begin, string8_citer end,
|
||||
string8 **rval);
|
||||
VM::ICodeModule **rval);
|
||||
string8_citer
|
||||
parseJSClassOperand (string8_citer begin, string8_citer end,
|
||||
JSTypes::JSType **rval);
|
||||
|
||||
@ -169,7 +169,7 @@ ICodeModule *ICodeGenerator::complete(JSType *resultType)
|
||||
}
|
||||
}
|
||||
*/
|
||||
ICodeModule* module = new ICodeModule(iCode,
|
||||
ICodeModule* module = new ICodeModule(iCode,
|
||||
variableList,
|
||||
parameterList,
|
||||
mPermanentRegister.size(),
|
||||
@ -218,8 +218,10 @@ TypedRegister ICodeGenerator::loadString(const StringAtom &value)
|
||||
TypedRegister ICodeGenerator::loadBoolean(bool value)
|
||||
{
|
||||
TypedRegister dest(getTempRegister(), &Boolean_Type);
|
||||
LoadBoolean *instr = new LoadBoolean(dest, value);
|
||||
iCode->push_back(instr);
|
||||
if (value)
|
||||
iCode->push_back(new LoadTrue(dest));
|
||||
else
|
||||
iCode->push_back(new LoadFalse(dest));
|
||||
return dest;
|
||||
}
|
||||
|
||||
|
||||
@ -45,7 +45,7 @@
|
||||
namespace JavaScript {
|
||||
namespace ICodeASM {
|
||||
|
||||
static uint icodemap_size = 75;
|
||||
static uint icodemap_size = 78;
|
||||
|
||||
static struct {
|
||||
char *name;
|
||||
@ -61,6 +61,7 @@ namespace ICodeASM {
|
||||
{"BRANCH_TRUE", {otLabel, otRegister}},
|
||||
{"CALL", {otRegister, otRegister, otArgumentList}},
|
||||
{"CAST", {otRegister, otRegister, otJSType}},
|
||||
{"CLASS", {otRegister, otRegister}},
|
||||
{"COMPARE_EQ", {otRegister, otRegister, otRegister}},
|
||||
{"COMPARE_GE", {otRegister, otRegister, otRegister}},
|
||||
{"COMPARE_GT", {otRegister, otRegister, otRegister}},
|
||||
@ -82,10 +83,12 @@ namespace ICodeASM {
|
||||
{"GET_STATIC", {otRegister, otJSClass, otUInt32}},
|
||||
{"INSTANCEOF", {otRegister, otRegister, otRegister}},
|
||||
{"JSR", {otLabel}},
|
||||
{"LOAD_BOOLEAN", {otRegister, otBool}},
|
||||
{"LOAD_FALSE", {otRegister}},
|
||||
{"LOAD_IMMEDIATE", {otRegister, otDouble}},
|
||||
{"LOAD_NAME", {otRegister, otStringAtom}},
|
||||
{"LOAD_NULL", {otRegister}},
|
||||
{"LOAD_STRING", {otRegister, otJSString}},
|
||||
{"LOAD_TRUE", {otRegister}},
|
||||
{"MOVE", {otRegister, otRegister}},
|
||||
{"MULTIPLY", {otRegister, otRegister, otRegister}},
|
||||
{"NAME_XCR", {otRegister, otStringAtom, otDouble}},
|
||||
@ -167,198 +170,207 @@ namespace ICodeASM {
|
||||
i = new Cast (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), reinterpret_cast<JSType*>(node->operand[2].data));
|
||||
break;
|
||||
case 10:
|
||||
i = new CompareEQ (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new Class (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0));
|
||||
break;
|
||||
case 11:
|
||||
i = new CompareGE (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new CompareEQ (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 12:
|
||||
i = new CompareGT (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new CompareGE (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 13:
|
||||
i = new CompareIN (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new CompareGT (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 14:
|
||||
i = new CompareLE (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new CompareIN (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 15:
|
||||
i = new CompareLT (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new CompareLE (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 16:
|
||||
i = new CompareNE (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new CompareLT (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 17:
|
||||
i = new Debugger ();
|
||||
i = new CompareNE (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 18:
|
||||
i = new DeleteProp (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), reinterpret_cast<const StringAtom*>(node->operand[2].data));
|
||||
i = new Debugger ();
|
||||
break;
|
||||
case 19:
|
||||
i = new DirectCall (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<JSFunction*>(node->operand[1].data), reinterpret_cast<ArgumentList*>(node->operand[2].data));
|
||||
i = new DeleteProp (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), reinterpret_cast<const StringAtom*>(node->operand[2].data));
|
||||
break;
|
||||
case 20:
|
||||
i = new Divide (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new DirectCall (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<JSFunction*>(node->operand[1].data), reinterpret_cast<ArgumentList*>(node->operand[2].data));
|
||||
break;
|
||||
case 21:
|
||||
i = new ElemXcr (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0), static_cast<double>(node->operand[3].data));
|
||||
i = new Divide (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 22:
|
||||
i = new GenericBinaryOP (TypedRegister(static_cast<Register>(node->operand[0].data), 0), static_cast<ExprNode::Kind>(node->operand[1].data), TypedRegister(static_cast<Register>(node->operand[2].data), 0), TypedRegister(static_cast<Register>(node->operand[3].data), 0));
|
||||
i = new ElemXcr (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0), static_cast<double>(node->operand[3].data));
|
||||
break;
|
||||
case 23:
|
||||
i = new GetClosure (TypedRegister(static_cast<Register>(node->operand[0].data), 0), static_cast<uint32>(node->operand[1].data));
|
||||
i = new GenericBinaryOP (TypedRegister(static_cast<Register>(node->operand[0].data), 0), static_cast<ExprNode::Kind>(node->operand[1].data), TypedRegister(static_cast<Register>(node->operand[2].data), 0), TypedRegister(static_cast<Register>(node->operand[3].data), 0));
|
||||
break;
|
||||
case 24:
|
||||
i = new GetElement (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new GetClosure (TypedRegister(static_cast<Register>(node->operand[0].data), 0), static_cast<uint32>(node->operand[1].data));
|
||||
break;
|
||||
case 25:
|
||||
i = new GetMethod (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), static_cast<uint32>(node->operand[2].data));
|
||||
i = new GetElement (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 26:
|
||||
i = new GetProp (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), reinterpret_cast<const StringAtom*>(node->operand[2].data));
|
||||
i = new GetMethod (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), static_cast<uint32>(node->operand[2].data));
|
||||
break;
|
||||
case 27:
|
||||
i = new GetSlot (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), static_cast<uint32>(node->operand[2].data));
|
||||
i = new GetProp (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), reinterpret_cast<const StringAtom*>(node->operand[2].data));
|
||||
break;
|
||||
case 28:
|
||||
i = new GetStatic (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<JSClass*>(node->operand[1].data), static_cast<uint32>(node->operand[2].data));
|
||||
i = new GetSlot (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), static_cast<uint32>(node->operand[2].data));
|
||||
break;
|
||||
case 29:
|
||||
i = new Instanceof (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new GetStatic (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<JSClass*>(node->operand[1].data), static_cast<uint32>(node->operand[2].data));
|
||||
break;
|
||||
case 30:
|
||||
i = new Jsr (reinterpret_cast<Label*>(node->operand[0].data));
|
||||
i = new Instanceof (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 31:
|
||||
i = new LoadBoolean (TypedRegister(static_cast<Register>(node->operand[0].data), 0), static_cast<bool>(node->operand[1].data));
|
||||
i = new Jsr (reinterpret_cast<Label*>(node->operand[0].data));
|
||||
break;
|
||||
case 32:
|
||||
i = new LoadImmediate (TypedRegister(static_cast<Register>(node->operand[0].data), 0), static_cast<double>(node->operand[1].data));
|
||||
i = new LoadFalse (TypedRegister(static_cast<Register>(node->operand[0].data), 0));
|
||||
break;
|
||||
case 33:
|
||||
i = new LoadName (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<const StringAtom*>(node->operand[1].data));
|
||||
i = new LoadImmediate (TypedRegister(static_cast<Register>(node->operand[0].data), 0), static_cast<double>(node->operand[1].data));
|
||||
break;
|
||||
case 34:
|
||||
i = new LoadString (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<JSString*>(node->operand[1].data));
|
||||
i = new LoadName (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<const StringAtom*>(node->operand[1].data));
|
||||
break;
|
||||
case 35:
|
||||
i = new Move (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0));
|
||||
i = new LoadNull (TypedRegister(static_cast<Register>(node->operand[0].data), 0));
|
||||
break;
|
||||
case 36:
|
||||
i = new Multiply (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new LoadString (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<JSString*>(node->operand[1].data));
|
||||
break;
|
||||
case 37:
|
||||
i = new NameXcr (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<const StringAtom*>(node->operand[1].data), static_cast<double>(node->operand[2].data));
|
||||
i = new LoadTrue (TypedRegister(static_cast<Register>(node->operand[0].data), 0));
|
||||
break;
|
||||
case 38:
|
||||
i = new Negate (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0));
|
||||
i = new Move (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0));
|
||||
break;
|
||||
case 39:
|
||||
i = new NewArray (TypedRegister(static_cast<Register>(node->operand[0].data), 0));
|
||||
i = new Multiply (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 40:
|
||||
i = new NewClass (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<JSClass*>(node->operand[1].data));
|
||||
i = new NameXcr (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<const StringAtom*>(node->operand[1].data), static_cast<double>(node->operand[2].data));
|
||||
break;
|
||||
case 41:
|
||||
i = new NewClosure (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<ICodeModule*>(node->operand[1].data));
|
||||
i = new Negate (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0));
|
||||
break;
|
||||
case 42:
|
||||
i = new NewFunction (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<ICodeModule*>(node->operand[1].data));
|
||||
i = new NewArray (TypedRegister(static_cast<Register>(node->operand[0].data), 0));
|
||||
break;
|
||||
case 43:
|
||||
i = new NewObject (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0));
|
||||
i = new NewClass (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<JSClass*>(node->operand[1].data));
|
||||
break;
|
||||
case 44:
|
||||
i = new Nop ();
|
||||
i = new NewClosure (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<ICodeModule*>(node->operand[1].data));
|
||||
break;
|
||||
case 45:
|
||||
i = new Not (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0));
|
||||
i = new NewFunction (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<ICodeModule*>(node->operand[1].data));
|
||||
break;
|
||||
case 46:
|
||||
i = new Or (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new NewObject (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0));
|
||||
break;
|
||||
case 47:
|
||||
i = new Posate (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0));
|
||||
i = new Nop ();
|
||||
break;
|
||||
case 48:
|
||||
i = new PropXcr (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), reinterpret_cast<const StringAtom*>(node->operand[2].data), static_cast<double>(node->operand[3].data));
|
||||
i = new Not (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0));
|
||||
break;
|
||||
case 49:
|
||||
i = new Remainder (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new Or (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 50:
|
||||
i = new Return (TypedRegister(static_cast<Register>(node->operand[0].data), 0));
|
||||
i = new Posate (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0));
|
||||
break;
|
||||
case 51:
|
||||
i = new ReturnVoid ();
|
||||
i = new PropXcr (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), reinterpret_cast<const StringAtom*>(node->operand[2].data), static_cast<double>(node->operand[3].data));
|
||||
break;
|
||||
case 52:
|
||||
i = new Rts ();
|
||||
i = new Remainder (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 53:
|
||||
i = new SaveName (reinterpret_cast<const StringAtom*>(node->operand[0].data), TypedRegister(static_cast<Register>(node->operand[1].data), 0));
|
||||
i = new Return (TypedRegister(static_cast<Register>(node->operand[0].data), 0));
|
||||
break;
|
||||
case 54:
|
||||
i = new SetElement (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new ReturnVoid ();
|
||||
break;
|
||||
case 55:
|
||||
i = new SetProp (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<const StringAtom*>(node->operand[1].data), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new Rts ();
|
||||
break;
|
||||
case 56:
|
||||
i = new SetSlot (TypedRegister(static_cast<Register>(node->operand[0].data), 0), static_cast<uint32>(node->operand[1].data), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new SaveName (reinterpret_cast<const StringAtom*>(node->operand[0].data), TypedRegister(static_cast<Register>(node->operand[1].data), 0));
|
||||
break;
|
||||
case 57:
|
||||
i = new SetStatic (reinterpret_cast<JSClass*>(node->operand[0].data), static_cast<uint32>(node->operand[1].data), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new SetElement (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 58:
|
||||
i = new Shiftleft (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new SetProp (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<const StringAtom*>(node->operand[1].data), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 59:
|
||||
i = new Shiftright (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new SetSlot (TypedRegister(static_cast<Register>(node->operand[0].data), 0), static_cast<uint32>(node->operand[1].data), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 60:
|
||||
i = new SlotXcr (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), static_cast<uint32>(node->operand[2].data), static_cast<double>(node->operand[3].data));
|
||||
i = new SetStatic (reinterpret_cast<JSClass*>(node->operand[0].data), static_cast<uint32>(node->operand[1].data), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 61:
|
||||
i = new StaticXcr (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<JSClass*>(node->operand[1].data), static_cast<uint32>(node->operand[2].data), static_cast<double>(node->operand[3].data));
|
||||
i = new Shiftleft (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 62:
|
||||
i = new StrictEQ (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new Shiftright (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 63:
|
||||
i = new StrictNE (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new SlotXcr (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), static_cast<uint32>(node->operand[2].data), static_cast<double>(node->operand[3].data));
|
||||
break;
|
||||
case 64:
|
||||
i = new Subtract (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new StaticXcr (TypedRegister(static_cast<Register>(node->operand[0].data), 0), reinterpret_cast<JSClass*>(node->operand[1].data), static_cast<uint32>(node->operand[2].data), static_cast<double>(node->operand[3].data));
|
||||
break;
|
||||
case 65:
|
||||
i = new Super (TypedRegister(static_cast<Register>(node->operand[0].data), 0));
|
||||
i = new StrictEQ (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 66:
|
||||
i = new Test (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0));
|
||||
i = new StrictNE (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 67:
|
||||
i = new Throw (TypedRegister(static_cast<Register>(node->operand[0].data), 0));
|
||||
i = new Subtract (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 68:
|
||||
i = new Tryin (reinterpret_cast<Label*>(node->operand[0].data), reinterpret_cast<Label*>(node->operand[1].data));
|
||||
i = new Super (TypedRegister(static_cast<Register>(node->operand[0].data), 0));
|
||||
break;
|
||||
case 69:
|
||||
i = new Tryout ();
|
||||
i = new Test (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0));
|
||||
break;
|
||||
case 70:
|
||||
i = new Ushiftright (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
i = new Throw (TypedRegister(static_cast<Register>(node->operand[0].data), 0));
|
||||
break;
|
||||
case 71:
|
||||
i = new VarXcr (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), static_cast<double>(node->operand[2].data));
|
||||
i = new Tryin (reinterpret_cast<Label*>(node->operand[0].data), reinterpret_cast<Label*>(node->operand[1].data));
|
||||
break;
|
||||
case 72:
|
||||
i = new Within (TypedRegister(static_cast<Register>(node->operand[0].data), 0));
|
||||
i = new Tryout ();
|
||||
break;
|
||||
case 73:
|
||||
i = new Without ();
|
||||
i = new Ushiftright (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
case 74:
|
||||
i = new VarXcr (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), static_cast<double>(node->operand[2].data));
|
||||
break;
|
||||
case 75:
|
||||
i = new Within (TypedRegister(static_cast<Register>(node->operand[0].data), 0));
|
||||
break;
|
||||
case 76:
|
||||
i = new Without ();
|
||||
break;
|
||||
case 77:
|
||||
i = new Xor (TypedRegister(static_cast<Register>(node->operand[0].data), 0), TypedRegister(static_cast<Register>(node->operand[1].data), 0), TypedRegister(static_cast<Register>(node->operand[2].data), 0));
|
||||
break;
|
||||
|
||||
|
||||
@ -542,6 +542,12 @@ JSValue Context::interpret(ICodeModule* iCode, const JSValues& args)
|
||||
(*registers)[dst(c).first] = (*registers)[src1(c).first].convert(toType);
|
||||
}
|
||||
break;
|
||||
case CLASS:
|
||||
{
|
||||
Class* c = static_cast<Class*>(instruction);
|
||||
ASSERT((*registers)[src1(c).first].isObject());
|
||||
(*registers)[dst(c).first] = (*registers)[src1(c).first].object->getType();
|
||||
}
|
||||
case SUPER:
|
||||
{
|
||||
Super* su = static_cast<Super*>(instruction);
|
||||
@ -1104,10 +1110,16 @@ using JSString throughout.
|
||||
(*registers)[dst(ls).first] = src1(ls);
|
||||
}
|
||||
break;
|
||||
case LOAD_BOOLEAN:
|
||||
case LOAD_TRUE:
|
||||
{
|
||||
LoadBoolean* lb = static_cast<LoadBoolean*>(instruction);
|
||||
(*registers)[dst(lb).first] = src1(lb);
|
||||
LoadTrue* lt = static_cast<LoadTrue*>(instruction);
|
||||
(*registers)[dst(lt).first] = true;
|
||||
}
|
||||
break;
|
||||
case LOAD_FALSE:
|
||||
{
|
||||
LoadFalse* lf = static_cast<LoadFalse*>(instruction);
|
||||
(*registers)[dst(lf).first] = false;
|
||||
}
|
||||
break;
|
||||
case BRANCH:
|
||||
|
||||
@ -40,7 +40,29 @@
|
||||
</function>
|
||||
|
||||
|
||||
<function name="anon_1" type="Integer">
|
||||
<parameter name="b"/>
|
||||
GET_CLOSURE R2, 0 <!-- acquire access to frame immediately below (statically) -->
|
||||
GET_SLOT R3, R2, 1 <!-- closure slots referenced by index == register number -->
|
||||
GENERIC_BINARY_OP R3, Add, R3, R1
|
||||
RETURN R3
|
||||
</function>
|
||||
|
||||
<function name="f" type="Integer">
|
||||
<parameter name="a"/> <!-- R0 = this, R1 = a -->
|
||||
NEW_CLOSURE R2, "anon_1" <!-- all functions are entered by name into the gloabl object, this is a bit hokey -->
|
||||
LOAD_IMMEDIATE R3, 1
|
||||
CALL R3, R2, (R3)
|
||||
RETURN R3
|
||||
</function>
|
||||
|
||||
<script>
|
||||
LOAD_NAME R1, "f" <!-- demo'ing use of closures -->
|
||||
LOAD_IMMEDIATE R2, 77
|
||||
CALL R3, R1, (R2)
|
||||
LOAD_NAME R1, "print"
|
||||
CALL R1, R1, (R3)
|
||||
|
||||
LOAD_NAME R1, "fn1"
|
||||
CALL R1, R1, ()
|
||||
|
||||
|
||||
@ -145,11 +145,23 @@ $ops{"LOAD_IMMEDIATE"} =
|
||||
rem => "dest, immediate value (double)",
|
||||
params => [ ("TypedRegister", "double" ) ]
|
||||
};
|
||||
$ops{"LOAD_BOOLEAN"} =
|
||||
$ops{"LOAD_NULL"} =
|
||||
{
|
||||
super => "Instruction_2",
|
||||
rem => "dest, immediate value (boolean)",
|
||||
params => [ ("TypedRegister", "bool" ) ]
|
||||
super => "Instruction_1",
|
||||
rem => "dest",
|
||||
params => [ ("TypedRegister") ]
|
||||
};
|
||||
$ops{"LOAD_TRUE"} =
|
||||
{
|
||||
super => "Instruction_1",
|
||||
rem => "dest",
|
||||
params => [ ("TypedRegister" ) ]
|
||||
};
|
||||
$ops{"LOAD_FALSE"} =
|
||||
{
|
||||
super => "Instruction_1",
|
||||
rem => "dest",
|
||||
params => [ ("TypedRegister" ) ]
|
||||
};
|
||||
$ops{"LOAD_STRING"} =
|
||||
{
|
||||
@ -416,5 +428,11 @@ $ops{"CAST"} =
|
||||
rem => "dest, rvalue, toType",
|
||||
params => [ ("TypedRegister", "TypedRegister", "JSType*") ]
|
||||
};
|
||||
$ops{"CLASS"} =
|
||||
{
|
||||
super => "Instruction_2",
|
||||
rem => "dest, obj",
|
||||
params => [ ("TypedRegister", "TypedRegister") ]
|
||||
};
|
||||
|
||||
1;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user