GC related bugs in array.

This commit is contained in:
rogerl%netscape.com 2003-02-24 22:20:10 +00:00
parent a51ba6641a
commit d71c529a47
7 changed files with 36 additions and 28 deletions

View File

@ -87,7 +87,7 @@ js2val setLength(JS2Metadata *meta, JS2Object *obj, uint32 length)
}
}
*/
const DynamicPropertyMap::value_type e(*meta->engine->length_StringAtom, DynamicPropertyValue(result));
const DynamicPropertyMap::value_type e(*meta->engine->length_StringAtom, DynamicPropertyValue(result, DynamicPropertyValue::PERMANENT));
checked_cast<PrototypeInstance *>(obj)->dynamicProperties.insert(e);
}
else {
@ -300,8 +300,10 @@ static js2val Array_reverse(JS2Metadata *meta, const js2val thisValue, js2val *
JS2Object *thisObj = JS2VAL_TO_OBJECT(thisValue);
uint32 length = getLength(meta, thisObj);
Multiname mn1(NULL, meta->publicNamespace);
Multiname mn2(NULL, meta->publicNamespace);
Multiname *mn1 = new Multiname(NULL, meta->publicNamespace);
Multiname *mn2 = new Multiname(NULL, meta->publicNamespace);
JS2Object::RootIterator ri1 = JS2Object::addRoot(&mn1);
JS2Object::RootIterator ri2 = JS2Object::addRoot(&mn2);
LookupKind lookup(false, JS2VAL_NULL);
uint32 halfway = length / 2;
@ -310,35 +312,37 @@ static js2val Array_reverse(JS2Metadata *meta, const js2val thisValue, js2val *
bool deleteResult;
js2val result1 = JS2VAL_UNDEFINED;
js2val result2 = JS2VAL_UNDEFINED;
mn1.name = meta->engine->numberToString(k);
mn2.name = meta->engine->numberToString(length - k - 1);
mn1->name = meta->engine->numberToString(k);
mn2->name = meta->engine->numberToString(length - k - 1);
if (meta->hasOwnProperty(thisObj, mn1.name)) {
if (meta->hasOwnProperty(thisObj, mn2.name)) {
meta->readDynamicProperty(thisObj, &mn1, &lookup, RunPhase, &result1);
meta->readDynamicProperty(thisObj, &mn2, &lookup, RunPhase, &result2);
meta->writeDynamicProperty(thisObj, &mn1, true, result2, RunPhase);
meta->writeDynamicProperty(thisObj, &mn2, true, result1, RunPhase);
if (meta->hasOwnProperty(thisObj, mn1->name)) {
if (meta->hasOwnProperty(thisObj, mn2->name)) {
meta->readDynamicProperty(thisObj, mn1, &lookup, RunPhase, &result1);
meta->readDynamicProperty(thisObj, mn2, &lookup, RunPhase, &result2);
meta->writeDynamicProperty(thisObj, mn1, true, result2, RunPhase);
meta->writeDynamicProperty(thisObj, mn2, true, result1, RunPhase);
}
else {
meta->readDynamicProperty(thisObj, &mn1, &lookup, RunPhase, &result1);
meta->writeDynamicProperty(thisObj, &mn2, true, result1, RunPhase);
meta->deleteProperty(thisValue, &mn1, &lookup, RunPhase, &deleteResult);
meta->readDynamicProperty(thisObj, mn1, &lookup, RunPhase, &result1);
meta->writeDynamicProperty(thisObj, mn2, true, result1, RunPhase);
meta->deleteProperty(thisValue, mn1, &lookup, RunPhase, &deleteResult);
}
}
else {
if (meta->hasOwnProperty(thisObj, mn2.name)) {
meta->readDynamicProperty(thisObj, &mn2, &lookup, RunPhase, &result2);
meta->writeDynamicProperty(thisObj, &mn1, true, result2, RunPhase);
meta->deleteProperty(thisValue, &mn2, &lookup, RunPhase, &deleteResult);
if (meta->hasOwnProperty(thisObj, mn2->name)) {
meta->readDynamicProperty(thisObj, mn2, &lookup, RunPhase, &result2);
meta->writeDynamicProperty(thisObj, mn1, true, result2, RunPhase);
meta->deleteProperty(thisValue, mn2, &lookup, RunPhase, &deleteResult);
}
else {
meta->deleteProperty(thisValue, &mn1, &lookup, RunPhase, &deleteResult);
meta->deleteProperty(thisValue, &mn2, &lookup, RunPhase, &deleteResult);
meta->deleteProperty(thisValue, mn1, &lookup, RunPhase, &deleteResult);
meta->deleteProperty(thisValue, mn2, &lookup, RunPhase, &deleteResult);
}
}
}
JS2Object::removeRoot(ri1);
JS2Object::removeRoot(ri2);
return thisValue;
}

View File

@ -393,6 +393,7 @@ namespace MetaData {
INIT_STRINGATOM(private),
INIT_STRINGATOM(Function),
INIT_STRINGATOM(Object),
INIT_STRINGATOM(object),
Empty_StringAtom(&world.identifiers[""]),
Dollar_StringAtom(&world.identifiers["$"]),
INIT_STRINGATOM(prototype),
@ -890,6 +891,7 @@ namespace MetaData {
JS2Object::mark(private_StringAtom);
JS2Object::mark(Function_StringAtom);
JS2Object::mark(Object_StringAtom);
JS2Object::mark(object_StringAtom);
JS2Object::mark(Empty_StringAtom);
JS2Object::mark(Dollar_StringAtom);
JS2Object::mark(prototype_StringAtom);
@ -954,9 +956,9 @@ namespace MetaData {
nameList = new const String *[dMap->size()];
length = 0;
for (DynamicPropertyIterator i = dMap->begin(), end = dMap->end(); (i != end); i++) {
nameList[length++] = &i->first;
if (i->second.flags & DynamicPropertyValue::ENUMERATE)
nameList[length++] = &i->first;
}
ASSERT(length == dMap->size());
it = 0;
return (length != 0);
}

View File

@ -248,6 +248,7 @@ public:
const String *private_StringAtom;
const String *Function_StringAtom;
const String *Object_StringAtom;
const String *object_StringAtom;
const String *Empty_StringAtom;
const String *Dollar_StringAtom;
const String *prototype_StringAtom;

View File

@ -2539,6 +2539,7 @@ doUnary:
for (NamespaceListIterator n = nsList->begin(), end = nsList->end(); (n != end); n++) {
GCMARKOBJECT(*n)
}
JS2Object::mark(name);
}
/************************************************************************************

View File

@ -337,7 +337,7 @@
else {
ASSERT(JS2VAL_IS_OBJECT(a));
if (JS2VAL_IS_NULL(a))
a = STRING_TO_JS2VAL(Object_StringAtom);
a = STRING_TO_JS2VAL(object_StringAtom);
else {
JS2Object *obj = JS2VAL_TO_OBJECT(a);
switch (obj->kind) {
@ -355,11 +355,11 @@
if (checked_cast<PrototypeInstance *>(obj)->type == meta->functionClass)
a = STRING_TO_JS2VAL(Function_StringAtom);
else
a = STRING_TO_JS2VAL(Object_StringAtom);
a = STRING_TO_JS2VAL(object_StringAtom);
break;
case PackageKind:
case GlobalObjectKind:
a = STRING_TO_JS2VAL(Object_StringAtom);
a = STRING_TO_JS2VAL(object_StringAtom);
break;
case SimpleInstanceKind:
a = STRING_TO_JS2VAL(checked_cast<SimpleInstance *>(obj)->type->getName());

View File

@ -75,7 +75,7 @@ js2val String_Constructor(JS2Metadata *meta, const js2val /*thisValue*/, js2val
static js2val String_Call(JS2Metadata *meta, const js2val thisValue, js2val argv[], uint32 argc)
{
if (argc > 0)
return STRING_TO_JS2VAL(meta->engine->allocStringPtr(meta->toString(argv[0])));
return STRING_TO_JS2VAL(meta->toString(argv[0]));
else
return STRING_TO_JS2VAL(meta->engine->allocStringPtr(""));
}

View File

@ -63,7 +63,7 @@
that a variable has to have it's initializer run */
#define JS2VAL_IS_FUTURE(v) (v == JS2VAL_FUTUREVALUE)
#define JS2VAL_IS_SPECIALREF(v) ( (v & ~0xF0) == 0 )
#define JS2VAL_IS_SPECIALREF(v) (v && ((v | 0xF0) == 0xF0))
/* Type tag bitfield length and derived macros. */
#define JS2VAL_TAGBITS 4