diff --git a/mozilla/js2/src/js2array.cpp b/mozilla/js2/src/js2array.cpp index 1d6fc0f8004..6b44e41e6b4 100644 --- a/mozilla/js2/src/js2array.cpp +++ b/mozilla/js2/src/js2array.cpp @@ -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(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; } diff --git a/mozilla/js2/src/js2engine.cpp b/mozilla/js2/src/js2engine.cpp index 04e07562524..23a635dbee7 100644 --- a/mozilla/js2/src/js2engine.cpp +++ b/mozilla/js2/src/js2engine.cpp @@ -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); } diff --git a/mozilla/js2/src/js2engine.h b/mozilla/js2/src/js2engine.h index 2f631918735..9fb6f9c5810 100644 --- a/mozilla/js2/src/js2engine.h +++ b/mozilla/js2/src/js2engine.h @@ -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; diff --git a/mozilla/js2/src/js2metadata.cpp b/mozilla/js2/src/js2metadata.cpp index 84bdcc51c59..99edced9783 100644 --- a/mozilla/js2/src/js2metadata.cpp +++ b/mozilla/js2/src/js2metadata.cpp @@ -2539,6 +2539,7 @@ doUnary: for (NamespaceListIterator n = nsList->begin(), end = nsList->end(); (n != end); n++) { GCMARKOBJECT(*n) } + JS2Object::mark(name); } /************************************************************************************ diff --git a/mozilla/js2/src/js2op_invocation.cpp b/mozilla/js2/src/js2op_invocation.cpp index 00f1eba2f95..31001e52587 100644 --- a/mozilla/js2/src/js2op_invocation.cpp +++ b/mozilla/js2/src/js2op_invocation.cpp @@ -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(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(obj)->type->getName()); diff --git a/mozilla/js2/src/js2string.cpp b/mozilla/js2/src/js2string.cpp index e7610ff9cce..9e0ef116bdc 100644 --- a/mozilla/js2/src/js2string.cpp +++ b/mozilla/js2/src/js2string.cpp @@ -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("")); } diff --git a/mozilla/js2/src/js2value.h b/mozilla/js2/src/js2value.h index e077e85d06a..c72bb6c42b7 100644 --- a/mozilla/js2/src/js2value.h +++ b/mozilla/js2/src/js2value.h @@ -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