From e4a70d59c1908ca3697842576ebf103c62cfb386 Mon Sep 17 00:00:00 2001 From: "beard%netscape.com" Date: Wed, 28 Jun 2000 16:15:06 +0000 Subject: [PATCH] GET_STATIC/SET_STATIC/STATIC_XCR now use an index rather than a name. Implemented GET_PROP/SET_PROP for class objects (looks up slot dynamically, etc.) git-svn-id: svn://10.0.0.236/trunk@73412 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/js/js2/interpreter.cpp | 42 +++++++++++++++++++++++---------- mozilla/js2/src/interpreter.cpp | 42 +++++++++++++++++++++++---------- 2 files changed, 60 insertions(+), 24 deletions(-) diff --git a/mozilla/js/js2/interpreter.cpp b/mozilla/js/js2/interpreter.cpp index 1bf2609a530..df3475539c1 100644 --- a/mozilla/js/js2/interpreter.cpp +++ b/mozilla/js/js2/interpreter.cpp @@ -686,13 +686,16 @@ JSValue Context::interpret(ICodeModule* iCode, const JSValues& args) GetProp* gp = static_cast(instruction); JSValue& value = (*registers)[src1(gp).first]; if (value.isObject()) { - JSObject* object = value.object; - // REVISIT: when we implement statics with slots. if (value.isType()) { - JSClass* c = dynamic_cast(object); - if (c) object = c->getScope(); + // REVISIT: should signal error if slot doesn't exist. + JSClass* thisClass = dynamic_cast(value.type); + if (thisClass && thisClass->hasStatic(*src2(gp))) { + const JSSlot& slot = thisClass->getSlot(*src2(gp)); + (*registers)[dst(gp).first] = (*thisClass)[slot.mIndex]; + } + } else { + (*registers)[dst(gp).first] = value.object->getProperty(*src2(gp)); } - (*registers)[dst(gp).first] = object->getProperty(*src2(gp)); } // XXX runtime error } @@ -702,13 +705,16 @@ JSValue Context::interpret(ICodeModule* iCode, const JSValues& args) SetProp* sp = static_cast(instruction); JSValue& value = (*registers)[dst(sp).first]; if (value.isObject()) { - JSObject* object = value.object; - // REVISIT: when we implement statics with slots. if (value.isType()) { - JSClass* c = dynamic_cast(object); - if (c) object = c->getScope(); + // REVISIT: should signal error if slot doesn't exist. + JSClass* thisClass = dynamic_cast(value.object); + if (thisClass && thisClass->hasStatic(*src1(sp))) { + const JSSlot& slot = thisClass->getSlot(*src1(sp)); + (*thisClass)[slot.mIndex] = (*registers)[src2(sp).first]; + } + } else { + value.object->setProperty(*src1(sp), (*registers)[src2(sp).first]); } - object->setProperty(*src1(sp), (*registers)[src2(sp).first]); } } break; @@ -716,14 +722,14 @@ JSValue Context::interpret(ICodeModule* iCode, const JSValues& args) { GetStatic* gs = static_cast(instruction); JSClass* c = src1(gs); - (*registers)[dst(gs).first] = c->getScope()->getVariable(*src2(gs)); + (*registers)[dst(gs).first] = (*c)[src2(gs)]; } break; case SET_STATIC: { SetStatic* ss = static_cast(instruction); JSClass* c = dst(ss); - c->getScope()->setProperty(*src1(ss), (*registers)[src2(ss).first]); + (*c)[src1(ss)] = (*registers)[src2(ss).first]; } break; /* @@ -910,6 +916,18 @@ using JSString throughout. (*inst)[src2(sx)] = r; } break; + + case STATIC_XCR: + { + StaticXcr *sx = static_cast(instruction); + JSValue& dest = (*registers)[dst(sx).first]; + JSClass* thisClass = src1(sx); + JSValue r = (*thisClass)[src2(sx)].toNumber(); + dest = r; + r.f64 += val4(sx); + (*thisClass)[src2(sx)] = r; + } + break; case NAME_XCR: { diff --git a/mozilla/js2/src/interpreter.cpp b/mozilla/js2/src/interpreter.cpp index 1bf2609a530..df3475539c1 100644 --- a/mozilla/js2/src/interpreter.cpp +++ b/mozilla/js2/src/interpreter.cpp @@ -686,13 +686,16 @@ JSValue Context::interpret(ICodeModule* iCode, const JSValues& args) GetProp* gp = static_cast(instruction); JSValue& value = (*registers)[src1(gp).first]; if (value.isObject()) { - JSObject* object = value.object; - // REVISIT: when we implement statics with slots. if (value.isType()) { - JSClass* c = dynamic_cast(object); - if (c) object = c->getScope(); + // REVISIT: should signal error if slot doesn't exist. + JSClass* thisClass = dynamic_cast(value.type); + if (thisClass && thisClass->hasStatic(*src2(gp))) { + const JSSlot& slot = thisClass->getSlot(*src2(gp)); + (*registers)[dst(gp).first] = (*thisClass)[slot.mIndex]; + } + } else { + (*registers)[dst(gp).first] = value.object->getProperty(*src2(gp)); } - (*registers)[dst(gp).first] = object->getProperty(*src2(gp)); } // XXX runtime error } @@ -702,13 +705,16 @@ JSValue Context::interpret(ICodeModule* iCode, const JSValues& args) SetProp* sp = static_cast(instruction); JSValue& value = (*registers)[dst(sp).first]; if (value.isObject()) { - JSObject* object = value.object; - // REVISIT: when we implement statics with slots. if (value.isType()) { - JSClass* c = dynamic_cast(object); - if (c) object = c->getScope(); + // REVISIT: should signal error if slot doesn't exist. + JSClass* thisClass = dynamic_cast(value.object); + if (thisClass && thisClass->hasStatic(*src1(sp))) { + const JSSlot& slot = thisClass->getSlot(*src1(sp)); + (*thisClass)[slot.mIndex] = (*registers)[src2(sp).first]; + } + } else { + value.object->setProperty(*src1(sp), (*registers)[src2(sp).first]); } - object->setProperty(*src1(sp), (*registers)[src2(sp).first]); } } break; @@ -716,14 +722,14 @@ JSValue Context::interpret(ICodeModule* iCode, const JSValues& args) { GetStatic* gs = static_cast(instruction); JSClass* c = src1(gs); - (*registers)[dst(gs).first] = c->getScope()->getVariable(*src2(gs)); + (*registers)[dst(gs).first] = (*c)[src2(gs)]; } break; case SET_STATIC: { SetStatic* ss = static_cast(instruction); JSClass* c = dst(ss); - c->getScope()->setProperty(*src1(ss), (*registers)[src2(ss).first]); + (*c)[src1(ss)] = (*registers)[src2(ss).first]; } break; /* @@ -910,6 +916,18 @@ using JSString throughout. (*inst)[src2(sx)] = r; } break; + + case STATIC_XCR: + { + StaticXcr *sx = static_cast(instruction); + JSValue& dest = (*registers)[dst(sx).first]; + JSClass* thisClass = src1(sx); + JSValue r = (*thisClass)[src2(sx)].toNumber(); + dest = r; + r.f64 += val4(sx); + (*thisClass)[src2(sx)] = r; + } + break; case NAME_XCR: {