зеркало из https://github.com/mozilla/gecko-dev.git
Arguments class
This commit is contained in:
Родитель
db16eb9355
Коммит
08f50f8e3b
|
@ -350,7 +350,7 @@ js2val dump(JS2Metadata *meta, const js2val /* thisValue */, js2val argv[], uint
|
|||
stdOut << "type = " << *s->type->name << '\n';
|
||||
printLocalBindings(&s->localBindings, NULL);
|
||||
stdOut << " Instance Bindings:\n";
|
||||
printInstanceVariables(s->type, s->slots);
|
||||
printInstanceVariables(s->type, s->fixedSlots);
|
||||
if (meta->objectType(argv[0]) == meta->functionClass) {
|
||||
FunctionWrapper *fWrap;
|
||||
fWrap = (checked_cast<FunctionInstance *>(fObj))->fWrap;
|
||||
|
@ -370,7 +370,7 @@ js2val dump(JS2Metadata *meta, const js2val /* thisValue */, js2val argv[], uint
|
|||
stdOut << "\n";
|
||||
stdOut << ((c->dynamic) ? " dynamic, " : " non-dynamic, ") << ((c->final) ? "final" : "non-final") << "\n";
|
||||
stdOut << " slotCount = " << c->slotCount << "\n";
|
||||
printLocalBindings(&c->localBindings, c->slots);
|
||||
printLocalBindings(&c->localBindings, c->frameSlots);
|
||||
stdOut << " Instance Bindings:\n";
|
||||
for (InstanceBindingIterator rib = c->instanceBindings.begin(), riend = c->instanceBindings.end(); (rib != riend); rib++) {
|
||||
InstanceBindingEntry *ibe = *rib;
|
||||
|
@ -423,7 +423,7 @@ js2val dump(JS2Metadata *meta, const js2val /* thisValue */, js2val argv[], uint
|
|||
else
|
||||
stdOut << "super = " << *metadata->toString(pkg->super) << '\n';
|
||||
stdOut << ((pkg->sealed) ? "sealed " : "not-sealed ") << '\n';
|
||||
printLocalBindings(&pkg->localBindings, pkg->slots);
|
||||
printLocalBindings(&pkg->localBindings, pkg->frameSlots);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -802,15 +802,6 @@ namespace MetaData {
|
|||
return JS2Class::Delete(meta, base, multiname, env, result);
|
||||
}
|
||||
|
||||
bool JS2ArrayClass::BracketRead(JS2Metadata *meta, js2val *base, js2val indexVal, Phase phase, js2val *rval)
|
||||
{
|
||||
const String *indexStr = meta->toString(indexVal);
|
||||
DEFINE_ROOTKEEPER(rk, indexStr);
|
||||
Multiname *mn = new Multiname(indexStr, meta->publicNamespace);
|
||||
DEFINE_ROOTKEEPER(rk1, mn);
|
||||
return Read(meta, base, mn, NULL, phase, rval);
|
||||
}
|
||||
|
||||
bool JS2ArrayClass::BracketWrite(JS2Metadata *meta, js2val base, js2val indexVal, js2val newValue)
|
||||
{
|
||||
const String *indexStr = meta->toString(indexVal);
|
||||
|
@ -894,6 +885,32 @@ namespace MetaData {
|
|||
return JS2Class::Delete(meta, base, multiname, env, result);
|
||||
}
|
||||
|
||||
bool JS2ArrayClass::BracketRead(JS2Metadata *meta, js2val *base, js2val indexVal, Phase phase, js2val *rval)
|
||||
{
|
||||
const String *indexStr = meta->toString(indexVal);
|
||||
DEFINE_ROOTKEEPER(rk, indexStr);
|
||||
Multiname *mn = new Multiname(indexStr, meta->publicNamespace);
|
||||
DEFINE_ROOTKEEPER(rk1, mn);
|
||||
return Read(meta, base, mn, NULL, phase, rval);
|
||||
}
|
||||
|
||||
bool JS2Class::BracketWrite(JS2Metadata *meta, js2val base, js2val indexVal, js2val newValue)
|
||||
{
|
||||
const String *indexStr = meta->toString(indexVal);
|
||||
DEFINE_ROOTKEEPER(rk, indexStr);
|
||||
Multiname *mn = new Multiname(indexStr, meta->publicNamespace);
|
||||
DEFINE_ROOTKEEPER(rk1, mn);
|
||||
return Write(meta, base, mn, NULL, true, newValue, false);
|
||||
}
|
||||
|
||||
bool JS2Class::BracketDelete(JS2Metadata *meta, js2val base, js2val indexVal, bool *result)
|
||||
{
|
||||
const String *indexStr = meta->toString(indexVal);
|
||||
DEFINE_ROOTKEEPER(rk, indexStr);
|
||||
Multiname *mn = new Multiname(indexStr, meta->publicNamespace);
|
||||
DEFINE_ROOTKEEPER(rk1, mn);
|
||||
return Delete(meta, base, mn, NULL, result);
|
||||
}
|
||||
|
||||
bool JS2Class::Write(JS2Metadata *meta, js2val base, Multiname *multiname, Environment *env, bool createIfMissing, js2val newValue, bool initFlag)
|
||||
{
|
||||
|
@ -959,15 +976,6 @@ namespace MetaData {
|
|||
}
|
||||
}
|
||||
|
||||
bool JS2Class::BracketWrite(JS2Metadata *meta, js2val base, js2val indexVal, js2val newValue)
|
||||
{
|
||||
const String *indexStr = meta->toString(indexVal);
|
||||
DEFINE_ROOTKEEPER(rk, indexStr);
|
||||
Multiname *mn = new Multiname(indexStr, meta->publicNamespace);
|
||||
DEFINE_ROOTKEEPER(rk1, mn);
|
||||
return Write(meta, base, mn, NULL, true, newValue, false);
|
||||
}
|
||||
|
||||
bool JS2Class::Delete(JS2Metadata *meta, js2val base, Multiname *multiname, Environment *env, bool *result)
|
||||
{
|
||||
InstanceMember *mBase = meta->findBaseInstanceMember(this, multiname, ReadWriteAccess);
|
||||
|
@ -1052,15 +1060,6 @@ VariableMemberCommon:
|
|||
}
|
||||
}
|
||||
|
||||
bool JS2Class::BracketDelete(JS2Metadata *meta, js2val base, js2val indexVal, bool *result)
|
||||
{
|
||||
const String *indexStr = meta->toString(indexVal);
|
||||
DEFINE_ROOTKEEPER(rk, indexStr);
|
||||
Multiname *mn = new Multiname(indexStr, meta->publicNamespace);
|
||||
DEFINE_ROOTKEEPER(rk1, mn);
|
||||
return Delete(meta, base, mn, NULL, result);
|
||||
}
|
||||
|
||||
js2val JS2Class::ImplicitCoerce(JS2Metadata *meta, js2val newValue)
|
||||
{
|
||||
if (JS2VAL_IS_NULL(newValue) || meta->objectType(newValue)->isAncestor(this) )
|
||||
|
|
|
@ -164,21 +164,34 @@ namespace MetaData {
|
|||
callThis = meta->toObject(callThis);
|
||||
|
||||
if ((argc > 1) && !JS2VAL_IS_NULL(argv[1]) && !JS2VAL_IS_UNDEFINED(argv[1])) {
|
||||
if (!JS2VAL_IS_OBJECT(argv[1])
|
||||
|| (JS2VAL_TO_OBJECT(argv[1])->kind != SimpleInstanceKind)
|
||||
|| ((checked_cast<SimpleInstance *>(JS2VAL_TO_OBJECT(argv[1])))->type != meta->arrayClass))
|
||||
meta->reportError(Exception::typeError, "Function.apply passed a non-array argument list", meta->engine->errorPos());
|
||||
ArrayInstance *arrInst = checked_cast<ArrayInstance *>(JS2VAL_TO_OBJECT(argv[1]));
|
||||
uint32 length = getLength(meta, arrInst);
|
||||
js2val *argArray = new js2val[length];
|
||||
DEFINE_ARRAYROOTKEEPER(rk, argArray, length);
|
||||
for (uint32 i = 0; i < length; i++)
|
||||
meta->arrayClass->ReadPublic(meta, &argv[1], meta->engine->numberToString(i), RunPhase, &argArray[i]);
|
||||
return meta->invokeFunction(fnInst, callThis, argArray, length, NULL);
|
||||
if (JS2VAL_IS_OBJECT(argv[1])
|
||||
&& (JS2VAL_TO_OBJECT(argv[1])->kind == SimpleInstanceKind)) {
|
||||
SimpleInstance *obj = checked_cast<SimpleInstance *>(JS2VAL_TO_OBJECT(argv[1]));
|
||||
if (obj->type == meta->arrayClass) {
|
||||
ArrayInstance *arrInst = checked_cast<ArrayInstance *>(obj);
|
||||
uint32 length = getLength(meta, arrInst);
|
||||
js2val *argArray = new js2val[length];
|
||||
DEFINE_ARRAYROOTKEEPER(rk, argArray, length);
|
||||
for (uint32 i = 0; i < length; i++)
|
||||
meta->arrayClass->ReadPublic(meta, &argv[1], meta->engine->numberToString(i), RunPhase, &argArray[i]);
|
||||
return meta->invokeFunction(fnInst, callThis, argArray, length, NULL);
|
||||
}
|
||||
else
|
||||
if (obj->type == meta->argumentsClass) {
|
||||
ArgumentsInstance *argInst = checked_cast<ArgumentsInstance *>(obj);
|
||||
uint32 length = getLength(meta, argInst);
|
||||
js2val *argArray = new js2val[length];
|
||||
DEFINE_ARRAYROOTKEEPER(rk, argArray, length);
|
||||
for (uint32 i = 0; i < length; i++)
|
||||
meta->argumentsClass->ReadPublic(meta, &argv[1], meta->engine->numberToString(i), RunPhase, &argArray[i]);
|
||||
return meta->invokeFunction(fnInst, callThis, argArray, length, NULL);
|
||||
}
|
||||
}
|
||||
meta->reportError(Exception::typeError, "Function.apply passed a non-array or argument value", meta->engine->errorPos());
|
||||
return JS2VAL_VOID;
|
||||
}
|
||||
else
|
||||
return meta->invokeFunction(fnInst, callThis, NULL, 0, NULL);
|
||||
|
||||
return meta->invokeFunction(fnInst, callThis, NULL, 0, NULL);
|
||||
}
|
||||
|
||||
void initFunctionObject(JS2Metadata *meta)
|
||||
|
|
|
@ -3118,11 +3118,11 @@ doUnary:
|
|||
LocalBindingEntry *lbe = *bi2;
|
||||
singularFrame->localBindings.insert(lbe->name, lbe->clone());
|
||||
}
|
||||
if (buildSlots && pluralFrame->slots) {
|
||||
size_t count = pluralFrame->slots->size();
|
||||
singularFrame->slots = new std::vector<js2val>(count);
|
||||
if (buildSlots && pluralFrame->frameSlots) {
|
||||
size_t count = pluralFrame->frameSlots->size();
|
||||
singularFrame->frameSlots = new std::vector<js2val>(count);
|
||||
for (size_t i = 0; i < count; i++)
|
||||
(*singularFrame->slots)[i] = (*pluralFrame->slots)[i];
|
||||
(*singularFrame->frameSlots)[i] = (*pluralFrame->frameSlots)[i];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3530,7 +3530,7 @@ rescan:
|
|||
else
|
||||
lbe = *lbeP;
|
||||
result = makeFrameVariable(regionalFrame);
|
||||
(*regionalFrame->slots)[checked_cast<FrameVariable *>(result)->frameSlot] = initVal;
|
||||
(*regionalFrame->frameSlots)[checked_cast<FrameVariable *>(result)->frameSlot] = initVal;
|
||||
LocalBinding *sb = new LocalBinding(ReadWriteAccess, result, true);
|
||||
lbe->bindingList.push_back(LocalBindingEntry::NamespaceBinding(publicNamespace, sb));
|
||||
}
|
||||
|
@ -4008,10 +4008,7 @@ static const uint8 urlCharType[256] =
|
|||
MAKEBUILTINCLASS(classClass, objectClass, false, true, engine->allocStringPtr(&world.identifiers["Class"]), JS2VAL_NULL);
|
||||
MAKEBUILTINCLASS(functionClass, objectClass, true, true, engine->Function_StringAtom, JS2VAL_NULL);
|
||||
MAKEBUILTINCLASS(packageClass, objectClass, true, true, engine->allocStringPtr(&world.identifiers["Package"]), JS2VAL_NULL);
|
||||
MAKEBUILTINCLASS(argumentsClass, objectClass, true, true, engine->allocStringPtr(&world.identifiers["Arguments"]), JS2VAL_NULL);
|
||||
|
||||
|
||||
|
||||
argumentsClass = new JS2ArgumentsClass(objectClass, NULL, new Namespace(engine->private_StringAtom), false, true, engine->allocStringPtr(&world.identifiers["Object"])); argumentsClass->complete = true; argumentsClass->defaultValue = JS2VAL_NULL;
|
||||
|
||||
// A 'forbidden' member, used to mark hidden bindings
|
||||
forbiddenMember = new LocalMember(Member::ForbiddenMember, true);
|
||||
|
@ -4466,19 +4463,19 @@ XXX see EvalAttributeExpression, where identifiers are being handled for now...
|
|||
case FrameVariable::Package:
|
||||
{
|
||||
ASSERT(container->kind == PackageKind);
|
||||
*rval = (*(checked_cast<Package *>(container))->slots)[fv->frameSlot];
|
||||
*rval = (*(checked_cast<Package *>(container))->frameSlots)[fv->frameSlot];
|
||||
}
|
||||
break;
|
||||
case FrameVariable::Local:
|
||||
{
|
||||
ASSERT(container->kind == BlockFrameKind);
|
||||
*rval = (*(checked_cast<NonWithFrame *>(container))->slots)[fv->frameSlot];
|
||||
*rval = (*(checked_cast<NonWithFrame *>(container))->frameSlots)[fv->frameSlot];
|
||||
}
|
||||
break;
|
||||
case FrameVariable::Parameter:
|
||||
{
|
||||
ASSERT(container->kind == ParameterFrameKind);
|
||||
*rval = (*(checked_cast<ParameterFrame *>(container))->slots)[fv->frameSlot];
|
||||
*rval = (*(checked_cast<ParameterFrame *>(container))->frameSlots)[fv->frameSlot];
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -4537,19 +4534,19 @@ XXX see EvalAttributeExpression, where identifiers are being handled for now...
|
|||
case FrameVariable::Package:
|
||||
{
|
||||
ASSERT(container->kind == PackageKind);
|
||||
(*(checked_cast<Package *>(container))->slots)[fv->frameSlot] = newValue;
|
||||
(*(checked_cast<Package *>(container))->frameSlots)[fv->frameSlot] = newValue;
|
||||
}
|
||||
break;
|
||||
case FrameVariable::Local:
|
||||
{
|
||||
ASSERT(container->kind == BlockFrameKind);
|
||||
(*(checked_cast<NonWithFrame *>(container))->slots)[fv->frameSlot] = newValue;
|
||||
(*(checked_cast<NonWithFrame *>(container))->frameSlots)[fv->frameSlot] = newValue;
|
||||
}
|
||||
break;
|
||||
case FrameVariable::Parameter:
|
||||
{
|
||||
ASSERT(container->kind == ParameterFrameKind);
|
||||
(*(checked_cast<ParameterFrame *>(container))->slots)[fv->frameSlot] = newValue;
|
||||
(*(checked_cast<ParameterFrame *>(container))->frameSlots)[fv->frameSlot] = newValue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -4639,7 +4636,7 @@ XXX see EvalAttributeExpression, where identifiers are being handled for now...
|
|||
ASSERT(JS2VAL_IS_OBJECT(thisObjVal)
|
||||
&& (JS2VAL_TO_OBJECT(thisObjVal)->kind == SimpleInstanceKind));
|
||||
JS2Object *thisObj = JS2VAL_TO_OBJECT(thisObjVal);
|
||||
return &checked_cast<SimpleInstance *>(thisObj)->slots[id->slotIndex];
|
||||
return &checked_cast<SimpleInstance *>(thisObj)->fixedSlots[id->slotIndex];
|
||||
}
|
||||
|
||||
|
||||
|
@ -4946,7 +4943,7 @@ XXX see EvalAttributeExpression, where identifiers are being handled for now...
|
|||
InstanceMember *im = ns.second->content;
|
||||
if (im->memberKind == Member::InstanceVariableMember) {
|
||||
InstanceVariable *iv = checked_cast<InstanceVariable *>(im);
|
||||
slots[iv->slotIndex].value = iv->defaultValue;
|
||||
fixedSlots[iv->slotIndex].value = iv->defaultValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -4959,10 +4956,10 @@ XXX see EvalAttributeExpression, where identifiers are being handled for now...
|
|||
sealed(false),
|
||||
super(parent),
|
||||
type(type),
|
||||
slots(new Slot[type->slotCount])
|
||||
fixedSlots(new Slot[type->slotCount])
|
||||
{
|
||||
for (uint32 i = 0; i < type->slotCount; i++) {
|
||||
slots[i].value = JS2VAL_UNINITIALIZED;
|
||||
fixedSlots[i].value = JS2VAL_UNINITIALIZED;
|
||||
}
|
||||
initializeSlots(type);
|
||||
}
|
||||
|
@ -4972,10 +4969,10 @@ XXX see EvalAttributeExpression, where identifiers are being handled for now...
|
|||
{
|
||||
GCMARKOBJECT(type)
|
||||
GCMARKVALUE(super);
|
||||
if (slots) {
|
||||
if (fixedSlots) {
|
||||
ASSERT(type);
|
||||
for (uint32 i = 0; (i < type->slotCount); i++) {
|
||||
GCMARKVALUE(slots[i].value);
|
||||
GCMARKVALUE(fixedSlots[i].value);
|
||||
}
|
||||
}
|
||||
for (LocalBindingIterator bi = localBindings.begin(), bend = localBindings.end(); (bi != bend); bi++) {
|
||||
|
@ -4998,7 +4995,7 @@ XXX see EvalAttributeExpression, where identifiers are being handled for now...
|
|||
}
|
||||
delete lbe;
|
||||
}
|
||||
delete [] slots;
|
||||
delete [] fixedSlots;
|
||||
}
|
||||
|
||||
|
||||
|
@ -5098,10 +5095,10 @@ XXX see EvalAttributeExpression, where identifiers are being handled for now...
|
|||
// on the list (which may need to be created) for gc tracking.
|
||||
uint16 NonWithFrame::allocateSlot()
|
||||
{
|
||||
if (slots == NULL)
|
||||
slots = new std::vector<js2val>;
|
||||
uint16 result = (uint16)(slots->size());
|
||||
slots->push_back(JS2VAL_VOID);
|
||||
if (frameSlots == NULL)
|
||||
frameSlots = new std::vector<js2val>;
|
||||
uint16 result = (uint16)(frameSlots->size());
|
||||
frameSlots->push_back(JS2VAL_VOID);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -5115,8 +5112,8 @@ XXX see EvalAttributeExpression, where identifiers are being handled for now...
|
|||
}
|
||||
delete lbe;
|
||||
}
|
||||
if (slots)
|
||||
delete slots;
|
||||
if (frameSlots)
|
||||
delete frameSlots;
|
||||
}
|
||||
|
||||
// gc-mark all contained JS2Objects and visit contained structures to do likewise
|
||||
|
@ -5130,8 +5127,8 @@ XXX see EvalAttributeExpression, where identifiers are being handled for now...
|
|||
ns.second->content->mark();
|
||||
}
|
||||
}
|
||||
if (slots) {
|
||||
for (std::vector<js2val>::iterator i = slots->begin(), end = slots->end(); (i != end); i++)
|
||||
if (frameSlots) {
|
||||
for (std::vector<js2val>::iterator i = frameSlots->begin(), end = frameSlots->end(); (i != end); i++)
|
||||
GCMARKVALUE(*i);
|
||||
}
|
||||
}
|
||||
|
@ -5167,7 +5164,9 @@ XXX see EvalAttributeExpression, where identifiers are being handled for now...
|
|||
|
||||
void ParameterFrame::instantiate(Environment *env)
|
||||
{
|
||||
env->instantiateFrame(pluralFrame, this, !buildArguments);
|
||||
ASSERT(pluralFrame->kind == ParameterFrameKind);
|
||||
ParameterFrame *plural = checked_cast<ParameterFrame *>(pluralFrame);
|
||||
env->instantiateFrame(pluralFrame, this, !plural->buildArguments);
|
||||
}
|
||||
|
||||
// Assume that instantiate has been called, the plural frame will contain
|
||||
|
@ -5182,20 +5181,24 @@ XXX see EvalAttributeExpression, where identifiers are being handled for now...
|
|||
ArgumentsInstance *argsObj = NULL;
|
||||
DEFINE_ROOTKEEPER(rk2, argsObj);
|
||||
|
||||
uint32 slotCount = (plural->slots) ? plural->slots->size() : 0;
|
||||
// slotCount is the number of slots required by the parameter frame
|
||||
uint32 slotCount = (plural->frameSlots) ? plural->frameSlots->size() : 0;
|
||||
ASSERT(length == slotCount);
|
||||
|
||||
if (plural->buildArguments) {
|
||||
// If we're building an arguments object, the slots for the parameter frame are located
|
||||
// there so that the arguments object itself can survive beyond the life of the function.
|
||||
argsObj = new ArgumentsInstance(meta, meta->objectClass->prototype, meta->argumentsClass);
|
||||
if (slotCount)
|
||||
if (argCount > slotCount)
|
||||
slotCount = argCount;
|
||||
if (slotCount)
|
||||
argsObj->mSlots = new std::vector<js2val>(slotCount);
|
||||
slots = argsObj->mSlots;
|
||||
frameSlots = argsObj->mSlots;
|
||||
// Add the 'arguments' property
|
||||
String name(widenCString("arguments"));
|
||||
ASSERT(localBindings[name] == NULL);
|
||||
LocalBindingEntry *lbe = new LocalBindingEntry(name);
|
||||
LocalBinding *sb = new LocalBinding(ReadAccess, new Variable(meta->arrayClass, OBJECT_TO_JS2VAL(argsObj), true), false);
|
||||
LocalBinding *sb = new LocalBinding(ReadWriteAccess, new Variable(meta->objectClass, OBJECT_TO_JS2VAL(argsObj), false), false);
|
||||
lbe->bindingList.push_back(LocalBindingEntry::NamespaceBinding(meta->publicNamespace, sb));
|
||||
localBindings.insert(name, lbe);
|
||||
}
|
||||
|
@ -5203,17 +5206,17 @@ XXX see EvalAttributeExpression, where identifiers are being handled for now...
|
|||
uint32 i;
|
||||
for (i = 0; (i < argCount); i++) {
|
||||
if (i < slotCount) {
|
||||
(*slots)[i] = argBase[i];
|
||||
(*frameSlots)[i] = argBase[i];
|
||||
}
|
||||
}
|
||||
while (i++ < length) {
|
||||
if (i < slotCount) {
|
||||
(*slots)[i] = JS2VAL_UNDEFINED;
|
||||
}
|
||||
(*frameSlots)[i] = JS2VAL_UNDEFINED;
|
||||
}
|
||||
}
|
||||
if (plural->buildArguments) {
|
||||
setLength(meta, argsObj, argCount);
|
||||
meta->objectClass->WritePublic(meta, OBJECT_TO_JS2VAL(argsObj), meta->engine->allocStringPtr("callee"), true, OBJECT_TO_JS2VAL(fnObj));
|
||||
meta->argumentsClass->WritePublic(meta, OBJECT_TO_JS2VAL(argsObj), meta->engine->allocStringPtr("callee"), true, OBJECT_TO_JS2VAL(fnObj));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5228,7 +5231,7 @@ XXX see EvalAttributeExpression, where identifiers are being handled for now...
|
|||
ParameterFrame::~ParameterFrame()
|
||||
{
|
||||
if (buildArguments) {
|
||||
slots = NULL; // the slots are in the arguments object, let it do the delete
|
||||
frameSlots = NULL; // the slots are in the arguments object, let it do the delete
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -687,12 +687,12 @@ typedef std::vector<js2val> ValueList;
|
|||
class NonWithFrame : public Frame {
|
||||
public:
|
||||
|
||||
NonWithFrame(ObjectKind kind) : Frame(kind), slots(NULL), pluralFrame(NULL) { }
|
||||
NonWithFrame(ObjectKind kind, NonWithFrame *pluralFrame) : Frame(kind), slots(NULL), pluralFrame(pluralFrame) { }
|
||||
NonWithFrame(ObjectKind kind) : Frame(kind), frameSlots(NULL), pluralFrame(NULL) { }
|
||||
NonWithFrame(ObjectKind kind, NonWithFrame *pluralFrame) : Frame(kind), frameSlots(NULL), pluralFrame(pluralFrame) { }
|
||||
|
||||
LocalBindingMap localBindings; // Map of qualified names to members defined in this frame
|
||||
|
||||
ValueList *slots; // temporaries or frame variables allocted in this frame
|
||||
ValueList *frameSlots; // temporaries or frame variables allocted in this frame
|
||||
uint16 allocateSlot();
|
||||
|
||||
virtual void instantiate(Environment * /*env*/) { ASSERT(false); }
|
||||
|
@ -948,7 +948,7 @@ public:
|
|||
js2val super; // Optional link to the next object in this instance's prototype chain
|
||||
bool sealed; // If true, no more local properties may be added to this instance
|
||||
JS2Class *type; // This instance's type
|
||||
Slot *slots; // A set of slots that hold this instance's fixed property values
|
||||
Slot *fixedSlots; // A set of slots that hold this instance's fixed property values
|
||||
|
||||
void initializeSlots(JS2Class *type);
|
||||
|
||||
|
|
|
@ -261,9 +261,9 @@
|
|||
{
|
||||
uint16 slotIndex = BytecodeContainer::getShort(pc);
|
||||
pc += sizeof(short);
|
||||
ASSERT(slotIndex < localFrame->slots->size());
|
||||
ASSERT(slotIndex < localFrame->frameSlots->size());
|
||||
a = top();
|
||||
(*localFrame->slots)[slotIndex] = a;
|
||||
(*localFrame->frameSlots)[slotIndex] = a;
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -271,7 +271,7 @@
|
|||
{
|
||||
uint16 slotIndex = BytecodeContainer::getShort(pc);
|
||||
pc += sizeof(short);
|
||||
ASSERT(slotIndex < localFrame->slots->size());
|
||||
ASSERT(slotIndex < localFrame->frameSlots->size());
|
||||
// XXX some kind of code here?
|
||||
}
|
||||
break;
|
||||
|
@ -280,8 +280,8 @@
|
|||
{
|
||||
uint16 slotIndex = BytecodeContainer::getShort(pc);
|
||||
pc += sizeof(short);
|
||||
ASSERT(slotIndex < localFrame->slots->size());
|
||||
push((*localFrame->slots)[slotIndex]);
|
||||
ASSERT(slotIndex < localFrame->frameSlots->size());
|
||||
push((*localFrame->frameSlots)[slotIndex]);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -290,8 +290,8 @@
|
|||
uint16 slotIndex = BytecodeContainer::getShort(pc);
|
||||
pc += sizeof(short);
|
||||
push(JS2VAL_NULL);
|
||||
ASSERT(slotIndex < localFrame->slots->size());
|
||||
push((*localFrame->slots)[slotIndex]);
|
||||
ASSERT(slotIndex < localFrame->frameSlots->size());
|
||||
push((*localFrame->frameSlots)[slotIndex]);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -300,8 +300,8 @@
|
|||
uint16 slotIndex = BytecodeContainer::getShort(pc);
|
||||
pc += sizeof(short);
|
||||
a = top();
|
||||
ASSERT(slotIndex < packageFrame->slots->size());
|
||||
(*packageFrame->slots)[slotIndex] = a;
|
||||
ASSERT(slotIndex < packageFrame->frameSlots->size());
|
||||
(*packageFrame->frameSlots)[slotIndex] = a;
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -309,7 +309,7 @@
|
|||
{
|
||||
uint16 slotIndex = BytecodeContainer::getShort(pc);
|
||||
pc += sizeof(short);
|
||||
ASSERT(slotIndex < packageFrame->slots->size());
|
||||
ASSERT(slotIndex < packageFrame->frameSlots->size());
|
||||
// XXX some kind of code here?
|
||||
}
|
||||
break;
|
||||
|
@ -318,8 +318,8 @@
|
|||
{
|
||||
uint16 slotIndex = BytecodeContainer::getShort(pc);
|
||||
pc += sizeof(short);
|
||||
ASSERT(slotIndex < packageFrame->slots->size());
|
||||
push((*packageFrame->slots)[slotIndex]);
|
||||
ASSERT(slotIndex < packageFrame->frameSlots->size());
|
||||
push((*packageFrame->frameSlots)[slotIndex]);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -328,8 +328,8 @@
|
|||
uint16 slotIndex = BytecodeContainer::getShort(pc);
|
||||
pc += sizeof(short);
|
||||
push(JS2VAL_NULL);
|
||||
ASSERT(slotIndex < packageFrame->slots->size());
|
||||
push((*packageFrame->slots)[slotIndex]);
|
||||
ASSERT(slotIndex < packageFrame->frameSlots->size());
|
||||
push((*packageFrame->frameSlots)[slotIndex]);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -338,8 +338,8 @@
|
|||
uint16 slotIndex = BytecodeContainer::getShort(pc);
|
||||
pc += sizeof(short);
|
||||
a = top();
|
||||
ASSERT(slotIndex < parameterFrame->slots->size());
|
||||
(*parameterFrame->slots)[slotIndex] = a;
|
||||
ASSERT(slotIndex < parameterFrame->frameSlots->size());
|
||||
(*parameterFrame->frameSlots)[slotIndex] = a;
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -347,7 +347,7 @@
|
|||
{
|
||||
uint16 slotIndex = BytecodeContainer::getShort(pc);
|
||||
pc += sizeof(short);
|
||||
ASSERT(slotIndex < parameterFrame->slots->size());
|
||||
ASSERT(slotIndex < parameterFrame->frameSlots->size());
|
||||
// XXX some kind of code here?
|
||||
}
|
||||
break;
|
||||
|
@ -356,8 +356,8 @@
|
|||
{
|
||||
uint16 slotIndex = BytecodeContainer::getShort(pc);
|
||||
pc += sizeof(short);
|
||||
ASSERT(slotIndex < parameterFrame->slots->size());
|
||||
push((*parameterFrame->slots)[slotIndex]);
|
||||
ASSERT(slotIndex < parameterFrame->frameSlots->size());
|
||||
push((*parameterFrame->frameSlots)[slotIndex]);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -366,8 +366,8 @@
|
|||
uint16 slotIndex = BytecodeContainer::getShort(pc);
|
||||
pc += sizeof(short);
|
||||
push(JS2VAL_NULL);
|
||||
ASSERT(slotIndex < parameterFrame->slots->size());
|
||||
push((*parameterFrame->slots)[slotIndex]);
|
||||
ASSERT(slotIndex < parameterFrame->frameSlots->size());
|
||||
push((*parameterFrame->frameSlots)[slotIndex]);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -380,7 +380,7 @@
|
|||
ASSERT(JS2VAL_IS_OBJECT(b));
|
||||
JS2Object *obj = JS2VAL_TO_OBJECT(b);
|
||||
ASSERT(obj->kind == SimpleInstanceKind);
|
||||
checked_cast<SimpleInstance *>(obj)->slots[slotIndex].value = a;
|
||||
checked_cast<SimpleInstance *>(obj)->fixedSlots[slotIndex].value = a;
|
||||
push(a);
|
||||
}
|
||||
break;
|
||||
|
@ -393,7 +393,7 @@
|
|||
ASSERT(JS2VAL_IS_OBJECT(b));
|
||||
JS2Object *obj = JS2VAL_TO_OBJECT(b);
|
||||
ASSERT(obj->kind == SimpleInstanceKind);
|
||||
push(checked_cast<SimpleInstance *>(obj)->slots[slotIndex].value);
|
||||
push(checked_cast<SimpleInstance *>(obj)->fixedSlots[slotIndex].value);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -405,7 +405,7 @@
|
|||
ASSERT(JS2VAL_IS_OBJECT(b));
|
||||
JS2Object *obj = JS2VAL_TO_OBJECT(b);
|
||||
ASSERT(obj->kind == SimpleInstanceKind);
|
||||
push(checked_cast<SimpleInstance *>(obj)->slots[slotIndex].value);
|
||||
push(checked_cast<SimpleInstance *>(obj)->fixedSlots[slotIndex].value);
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
|
@ -1095,9 +1095,9 @@
|
|||
ASSERT(JS2VAL_IS_OBJECT(baseVal));
|
||||
JS2Object *obj = JS2VAL_TO_OBJECT(baseVal);
|
||||
ASSERT(obj->kind == SimpleInstanceKind);
|
||||
a = checked_cast<SimpleInstance *>(obj)->slots[slotIndex].value;
|
||||
a = checked_cast<SimpleInstance *>(obj)->fixedSlots[slotIndex].value;
|
||||
float64 num = meta->toFloat64(a);
|
||||
checked_cast<SimpleInstance *>(obj)->slots[slotIndex].value = allocNumber(num + 1.0);
|
||||
checked_cast<SimpleInstance *>(obj)->fixedSlots[slotIndex].value = allocNumber(num + 1.0);
|
||||
pushNumber(num);
|
||||
baseVal = JS2VAL_VOID;
|
||||
}
|
||||
|
@ -1110,9 +1110,9 @@
|
|||
ASSERT(JS2VAL_IS_OBJECT(baseVal));
|
||||
JS2Object *obj = JS2VAL_TO_OBJECT(baseVal);
|
||||
ASSERT(obj->kind == SimpleInstanceKind);
|
||||
a = checked_cast<SimpleInstance *>(obj)->slots[slotIndex].value;
|
||||
a = checked_cast<SimpleInstance *>(obj)->fixedSlots[slotIndex].value;
|
||||
float64 num = meta->toFloat64(a);
|
||||
checked_cast<SimpleInstance *>(obj)->slots[slotIndex].value = allocNumber(num - 1.0);
|
||||
checked_cast<SimpleInstance *>(obj)->fixedSlots[slotIndex].value = allocNumber(num - 1.0);
|
||||
pushNumber(num);
|
||||
baseVal = JS2VAL_VOID;
|
||||
}
|
||||
|
@ -1125,10 +1125,10 @@
|
|||
ASSERT(JS2VAL_IS_OBJECT(baseVal));
|
||||
JS2Object *obj = JS2VAL_TO_OBJECT(baseVal);
|
||||
ASSERT(obj->kind == SimpleInstanceKind);
|
||||
a = checked_cast<SimpleInstance *>(obj)->slots[slotIndex].value;
|
||||
a = checked_cast<SimpleInstance *>(obj)->fixedSlots[slotIndex].value;
|
||||
float64 num = meta->toFloat64(a);
|
||||
a = pushNumber(num + 1.0);
|
||||
checked_cast<SimpleInstance *>(obj)->slots[slotIndex].value = a;
|
||||
checked_cast<SimpleInstance *>(obj)->fixedSlots[slotIndex].value = a;
|
||||
baseVal = JS2VAL_VOID;
|
||||
}
|
||||
break;
|
||||
|
@ -1140,10 +1140,10 @@
|
|||
ASSERT(JS2VAL_IS_OBJECT(baseVal));
|
||||
JS2Object *obj = JS2VAL_TO_OBJECT(baseVal);
|
||||
ASSERT(obj->kind == SimpleInstanceKind);
|
||||
a = checked_cast<SimpleInstance *>(obj)->slots[slotIndex].value;
|
||||
a = checked_cast<SimpleInstance *>(obj)->fixedSlots[slotIndex].value;
|
||||
float64 num = meta->toFloat64(a);
|
||||
a = pushNumber(num - 1.0);
|
||||
checked_cast<SimpleInstance *>(obj)->slots[slotIndex].value = a;
|
||||
checked_cast<SimpleInstance *>(obj)->fixedSlots[slotIndex].value = a;
|
||||
baseVal = JS2VAL_VOID;
|
||||
}
|
||||
break;
|
||||
|
@ -1152,10 +1152,10 @@
|
|||
{
|
||||
uint16 slotIndex = BytecodeContainer::getShort(pc);
|
||||
pc += sizeof(short);
|
||||
ASSERT(slotIndex < localFrame->slots->size());
|
||||
a = (*localFrame->slots)[slotIndex];
|
||||
ASSERT(slotIndex < localFrame->frameSlots->size());
|
||||
a = (*localFrame->frameSlots)[slotIndex];
|
||||
float64 num = meta->toFloat64(a);
|
||||
(*localFrame->slots)[slotIndex] = allocNumber(num + 1.0);
|
||||
(*localFrame->frameSlots)[slotIndex] = allocNumber(num + 1.0);
|
||||
pushNumber(num);
|
||||
}
|
||||
break;
|
||||
|
@ -1163,10 +1163,10 @@
|
|||
{
|
||||
uint16 slotIndex = BytecodeContainer::getShort(pc);
|
||||
pc += sizeof(short);
|
||||
ASSERT(slotIndex < localFrame->slots->size());
|
||||
a = (*localFrame->slots)[slotIndex];
|
||||
ASSERT(slotIndex < localFrame->frameSlots->size());
|
||||
a = (*localFrame->frameSlots)[slotIndex];
|
||||
float64 num = meta->toFloat64(a);
|
||||
(*localFrame->slots)[slotIndex] = allocNumber(num - 1.0);
|
||||
(*localFrame->frameSlots)[slotIndex] = allocNumber(num - 1.0);
|
||||
pushNumber(num);
|
||||
}
|
||||
break;
|
||||
|
@ -1174,22 +1174,22 @@
|
|||
{
|
||||
uint16 slotIndex = BytecodeContainer::getShort(pc);
|
||||
pc += sizeof(short);
|
||||
ASSERT(slotIndex < localFrame->slots->size());
|
||||
a = (*localFrame->slots)[slotIndex];
|
||||
ASSERT(slotIndex < localFrame->frameSlots->size());
|
||||
a = (*localFrame->frameSlots)[slotIndex];
|
||||
float64 num = meta->toFloat64(a);
|
||||
a = pushNumber(num + 1.0);
|
||||
(*localFrame->slots)[slotIndex] = a;
|
||||
(*localFrame->frameSlots)[slotIndex] = a;
|
||||
}
|
||||
break;
|
||||
case eFrameSlotPreDec:
|
||||
{
|
||||
uint16 slotIndex = BytecodeContainer::getShort(pc);
|
||||
pc += sizeof(short);
|
||||
ASSERT(slotIndex < localFrame->slots->size());
|
||||
a = (*localFrame->slots)[slotIndex];
|
||||
ASSERT(slotIndex < localFrame->frameSlots->size());
|
||||
a = (*localFrame->frameSlots)[slotIndex];
|
||||
float64 num = meta->toFloat64(a);
|
||||
a = pushNumber(num - 1.0);
|
||||
(*localFrame->slots)[slotIndex] = a;
|
||||
(*localFrame->frameSlots)[slotIndex] = a;
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -1197,10 +1197,10 @@
|
|||
{
|
||||
uint16 slotIndex = BytecodeContainer::getShort(pc);
|
||||
pc += sizeof(short);
|
||||
ASSERT(slotIndex < packageFrame->slots->size());
|
||||
a = (*packageFrame->slots)[slotIndex];
|
||||
ASSERT(slotIndex < packageFrame->frameSlots->size());
|
||||
a = (*packageFrame->frameSlots)[slotIndex];
|
||||
float64 num = meta->toFloat64(a);
|
||||
(*packageFrame->slots)[slotIndex] = allocNumber(num + 1.0);
|
||||
(*packageFrame->frameSlots)[slotIndex] = allocNumber(num + 1.0);
|
||||
pushNumber(num);
|
||||
}
|
||||
break;
|
||||
|
@ -1208,10 +1208,10 @@
|
|||
{
|
||||
uint16 slotIndex = BytecodeContainer::getShort(pc);
|
||||
pc += sizeof(short);
|
||||
ASSERT(slotIndex < packageFrame->slots->size());
|
||||
a = (*packageFrame->slots)[slotIndex];
|
||||
ASSERT(slotIndex < packageFrame->frameSlots->size());
|
||||
a = (*packageFrame->frameSlots)[slotIndex];
|
||||
float64 num = meta->toFloat64(a);
|
||||
(*packageFrame->slots)[slotIndex] = allocNumber(num - 1.0);
|
||||
(*packageFrame->frameSlots)[slotIndex] = allocNumber(num - 1.0);
|
||||
pushNumber(num);
|
||||
}
|
||||
break;
|
||||
|
@ -1219,22 +1219,22 @@
|
|||
{
|
||||
uint16 slotIndex = BytecodeContainer::getShort(pc);
|
||||
pc += sizeof(short);
|
||||
ASSERT(slotIndex < packageFrame->slots->size());
|
||||
a = (*packageFrame->slots)[slotIndex];
|
||||
ASSERT(slotIndex < packageFrame->frameSlots->size());
|
||||
a = (*packageFrame->frameSlots)[slotIndex];
|
||||
float64 num = meta->toFloat64(a);
|
||||
a = pushNumber(num + 1.0);
|
||||
(*packageFrame->slots)[slotIndex] = a;
|
||||
(*packageFrame->frameSlots)[slotIndex] = a;
|
||||
}
|
||||
break;
|
||||
case ePackageSlotPreDec:
|
||||
{
|
||||
uint16 slotIndex = BytecodeContainer::getShort(pc);
|
||||
pc += sizeof(short);
|
||||
ASSERT(slotIndex < packageFrame->slots->size());
|
||||
a = (*packageFrame->slots)[slotIndex];
|
||||
ASSERT(slotIndex < packageFrame->frameSlots->size());
|
||||
a = (*packageFrame->frameSlots)[slotIndex];
|
||||
float64 num = meta->toFloat64(a);
|
||||
a = pushNumber(num - 1.0);
|
||||
(*packageFrame->slots)[slotIndex] = a;
|
||||
(*packageFrame->frameSlots)[slotIndex] = a;
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -1242,10 +1242,10 @@
|
|||
{
|
||||
uint16 slotIndex = BytecodeContainer::getShort(pc);
|
||||
pc += sizeof(short);
|
||||
ASSERT(slotIndex < parameterFrame->slots->size());
|
||||
a = (*parameterFrame->slots)[slotIndex];
|
||||
ASSERT(slotIndex < parameterFrame->frameSlots->size());
|
||||
a = (*parameterFrame->frameSlots)[slotIndex];
|
||||
float64 num = meta->toFloat64(a);
|
||||
(*parameterFrame->slots)[slotIndex] = allocNumber(num + 1.0);
|
||||
(*parameterFrame->frameSlots)[slotIndex] = allocNumber(num + 1.0);
|
||||
pushNumber(num);
|
||||
}
|
||||
break;
|
||||
|
@ -1253,10 +1253,10 @@
|
|||
{
|
||||
uint16 slotIndex = BytecodeContainer::getShort(pc);
|
||||
pc += sizeof(short);
|
||||
ASSERT(slotIndex < parameterFrame->slots->size());
|
||||
a = (*parameterFrame->slots)[slotIndex];
|
||||
ASSERT(slotIndex < parameterFrame->frameSlots->size());
|
||||
a = (*parameterFrame->frameSlots)[slotIndex];
|
||||
float64 num = meta->toFloat64(a);
|
||||
(*parameterFrame->slots)[slotIndex] = allocNumber(num - 1.0);
|
||||
(*parameterFrame->frameSlots)[slotIndex] = allocNumber(num - 1.0);
|
||||
pushNumber(num);
|
||||
}
|
||||
break;
|
||||
|
@ -1264,21 +1264,21 @@
|
|||
{
|
||||
uint16 slotIndex = BytecodeContainer::getShort(pc);
|
||||
pc += sizeof(short);
|
||||
ASSERT(slotIndex < parameterFrame->slots->size());
|
||||
a = (*parameterFrame->slots)[slotIndex];
|
||||
ASSERT(slotIndex < parameterFrame->frameSlots->size());
|
||||
a = (*parameterFrame->frameSlots)[slotIndex];
|
||||
float64 num = meta->toFloat64(a);
|
||||
a = pushNumber(num + 1.0);
|
||||
(*parameterFrame->slots)[slotIndex] = a;
|
||||
(*parameterFrame->frameSlots)[slotIndex] = a;
|
||||
}
|
||||
break;
|
||||
case eParameterSlotPreDec:
|
||||
{
|
||||
uint16 slotIndex = BytecodeContainer::getShort(pc);
|
||||
pc += sizeof(short);
|
||||
ASSERT(slotIndex < parameterFrame->slots->size());
|
||||
a = (*parameterFrame->slots)[slotIndex];
|
||||
ASSERT(slotIndex < parameterFrame->frameSlots->size());
|
||||
a = (*parameterFrame->frameSlots)[slotIndex];
|
||||
float64 num = meta->toFloat64(a);
|
||||
a = pushNumber(num - 1.0);
|
||||
(*parameterFrame->slots)[slotIndex] = a;
|
||||
(*parameterFrame->frameSlots)[slotIndex] = a;
|
||||
}
|
||||
break;
|
||||
|
|
Загрузка…
Ссылка в новой задаче