mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-11 12:25:53 +00:00
GC related bugs in array.
This commit is contained in:
parent
a51ba6641a
commit
d71c529a47
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -2539,6 +2539,7 @@ doUnary:
|
||||
for (NamespaceListIterator n = nsList->begin(), end = nsList->end(); (n != end); n++) {
|
||||
GCMARKOBJECT(*n)
|
||||
}
|
||||
JS2Object::mark(name);
|
||||
}
|
||||
|
||||
/************************************************************************************
|
||||
|
@ -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());
|
||||
|
@ -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(""));
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user