Split arguments[] values on delete.

This commit is contained in:
rogerl%netscape.com 2003-06-03 23:00:51 +00:00
Родитель 27532df85f
Коммит 63778b6278
3 изменённых файлов: 50 добавлений и 6 удалений

Просмотреть файл

@ -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();