зеркало из https://github.com/mozilla/pjs.git
Split arguments[] values on delete.
This commit is contained in:
Родитель
27532df85f
Коммит
63778b6278
|
@ -855,7 +855,10 @@ namespace MetaData {
|
|||
&& (multiname->nsList->back() == meta->publicNamespace)
|
||||
&& isValidIndex(multiname->name, index)
|
||||
&& (index < args->mSlots->size())) {
|
||||
*rval = (*args->mSlots)[index];
|
||||
if (args->mSplit[index])
|
||||
*rval = (*args->mSplitValue)[index];
|
||||
else
|
||||
*rval = (*args->mSlots)[index];
|
||||
return true;
|
||||
}
|
||||
else
|
||||
|
@ -873,7 +876,10 @@ namespace MetaData {
|
|||
&& (multiname->nsList->back() == meta->publicNamespace)
|
||||
&& isValidIndex(multiname->name, index)
|
||||
&& (index < args->mSlots->size())) {
|
||||
(*args->mSlots)[index] = newValue;
|
||||
if (args->mSplit[index])
|
||||
(*args->mSplitValue)[index] = newValue;
|
||||
else
|
||||
(*args->mSlots)[index] = newValue;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
|
@ -882,7 +888,23 @@ namespace MetaData {
|
|||
|
||||
bool JS2ArgumentsClass::Delete(JS2Metadata *meta, js2val base, Multiname *multiname, Environment *env, bool *result)
|
||||
{
|
||||
return JS2Class::Delete(meta, base, multiname, env, result);
|
||||
ASSERT(JS2VAL_IS_OBJECT(base));
|
||||
JS2Object *obj = JS2VAL_TO_OBJECT(base);
|
||||
ArgumentsInstance *args = checked_cast<ArgumentsInstance *>(obj);
|
||||
|
||||
uint32 index;
|
||||
if ((multiname->nsList->size() == 1)
|
||||
&& (multiname->nsList->back() == meta->publicNamespace)
|
||||
&& isValidIndex(multiname->name, index)
|
||||
&& (index < args->mSlots->size())) {
|
||||
if (!args->mSplitValue)
|
||||
args->mSplitValue = new std::vector<js2val>(slotCount);
|
||||
args->mSplit[index] = true;
|
||||
(*args->mSplitValue)[index] = JS2VAL_VOID;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
return JS2Class::Delete(meta, base, multiname, env, result);
|
||||
}
|
||||
|
||||
bool JS2ArrayClass::BracketRead(JS2Metadata *meta, js2val *base, js2val indexVal, Phase phase, js2val *rval)
|
||||
|
|
|
@ -5066,12 +5066,20 @@ XXX see EvalAttributeExpression, where identifiers are being handled for now...
|
|||
for (uint32 i = 0; i < mSlots->size(); i++)
|
||||
GCMARKVALUE((*mSlots)[i]);
|
||||
}
|
||||
if (mSplitValue) {
|
||||
for (uint32 i = 0; i < mSlots->size(); i++)
|
||||
GCMARKVALUE((*mSplitValue)[i]);
|
||||
}
|
||||
}
|
||||
|
||||
ArgumentsInstance::~ArgumentsInstance()
|
||||
{
|
||||
if (mSlots)
|
||||
delete mSlots;
|
||||
if (mSplit)
|
||||
delete mSplit;
|
||||
if (mSplitValue)
|
||||
delete mSplitValue;
|
||||
}
|
||||
|
||||
/************************************************************************************
|
||||
|
@ -5175,6 +5183,7 @@ XXX see EvalAttributeExpression, where identifiers are being handled for now...
|
|||
// Pad out to 'length' args with undefined values if argCount is insufficient
|
||||
void ParameterFrame::assignArguments(JS2Metadata *meta, JS2Object *fnObj, js2val *argBase, uint32 argCount, uint32 length)
|
||||
{
|
||||
uint32 i;
|
||||
ASSERT(pluralFrame->kind == ParameterFrameKind);
|
||||
ParameterFrame *plural = checked_cast<ParameterFrame *>(pluralFrame);
|
||||
|
||||
|
@ -5191,8 +5200,12 @@ XXX see EvalAttributeExpression, where identifiers are being handled for now...
|
|||
argsObj = new ArgumentsInstance(meta, meta->objectClass->prototype, meta->argumentsClass);
|
||||
if (argCount > slotCount)
|
||||
slotCount = argCount;
|
||||
if (slotCount)
|
||||
if (slotCount) {
|
||||
argsObj->mSlots = new std::vector<js2val>(slotCount);
|
||||
argsObj->mSplit = new bool[slotCount];
|
||||
for (i = 0; (i < slotCount); i++)
|
||||
argsObj->mSplit[i] = false;
|
||||
}
|
||||
frameSlots = argsObj->mSlots;
|
||||
// Add the 'arguments' property
|
||||
String name(widenCString("arguments"));
|
||||
|
@ -5203,7 +5216,6 @@ XXX see EvalAttributeExpression, where identifiers are being handled for now...
|
|||
localBindings.insert(name, lbe);
|
||||
}
|
||||
|
||||
uint32 i;
|
||||
for (i = 0; (i < argCount); i++) {
|
||||
if (i < slotCount) {
|
||||
(*frameSlots)[i] = argBase[i];
|
||||
|
|
|
@ -1059,11 +1059,21 @@ public:
|
|||
virtual ~RegExpInstance() { }
|
||||
};
|
||||
|
||||
|
||||
// Instances of Arguments class:
|
||||
// The n arguments supplied to a function are also stored in a variable 'arguments' with properties [0] ..[n]
|
||||
// FrameVariable references from the ParameterFrame are directed to this array because the FrameParameter's
|
||||
// slot list points here instead.
|
||||
// When an element in arguments[] is deleted, that splits the alias. New values added afterwards are kept in a
|
||||
// separate value list instead.
|
||||
class ArgumentsInstance : public SimpleInstance {
|
||||
public:
|
||||
ArgumentsInstance(JS2Metadata *meta, js2val parent, JS2Class *type) : SimpleInstance(meta, parent, type), mSlots(NULL) { }
|
||||
ArgumentsInstance(JS2Metadata *meta, js2val parent, JS2Class *type)
|
||||
: SimpleInstance(meta, parent, type), mSlots(NULL), mSplit(NULL), mSplitValue(NULL) { }
|
||||
|
||||
ValueList *mSlots;
|
||||
bool *mSplit;
|
||||
ValueList *mSplitValue;
|
||||
|
||||
virtual void markChildren();
|
||||
virtual ~ArgumentsInstance();
|
||||
|
|
Загрузка…
Ссылка в новой задаче