From 4e37ba6e7d53166f373ba6d34767f47d53c169ee Mon Sep 17 00:00:00 2001 From: "rogerl%netscape.com" Date: Fri, 28 Mar 2003 21:48:07 +0000 Subject: [PATCH] !!! BROKEN !!! git-svn-id: svn://10.0.0.236/trunk@140428 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/js2/src/js2array.cpp | 43 ++++++++------------------------- mozilla/js2/src/js2metadata.cpp | 26 +++++++++++++++----- mozilla/js2/src/js2metadata.h | 8 +++--- 3 files changed, 35 insertions(+), 42 deletions(-) diff --git a/mozilla/js2/src/js2array.cpp b/mozilla/js2/src/js2array.cpp index 4b524f2bfb0..6196d235556 100644 --- a/mozilla/js2/src/js2array.cpp +++ b/mozilla/js2/src/js2array.cpp @@ -58,11 +58,10 @@ namespace MetaData { uint32 getLength(JS2Metadata *meta, JS2Object *obj) { - LookupKind lookup(false, JS2VAL_NULL); uint32 length = 0; js2val result; JS2Class *c = meta->objectType(obj); - if (c->readPublic(meta, obj, c, meta->engine->length_StringAtom, &lookup, RunPhase, &result)) + if (c->readPublic(meta, OBJECT_TO_JS2VAL(obj), c, meta->engine->length_StringAtom, RunPhase, &result)) length = toUInt32(meta->toInteger(result)); return length; } @@ -70,40 +69,22 @@ uint32 getLength(JS2Metadata *meta, JS2Object *obj) js2val setLength(JS2Metadata *meta, JS2Object *obj, uint32 newLength) { js2val result = meta->engine->allocNumber(newLength); - if ((obj->kind == SimpleInstanceKind) || (checked_cast(obj)->type == meta->arrayClass)) { uint32 length = getLength(meta, obj); if (newLength < length) { // need to delete all the elements above the new length // XXX (But only for array instances, maybe should have setArrayLength as a specialization) - LookupKind lookup(false, JS2VAL_NULL); bool deleteResult; + JS2Class *c = meta->objectType(obj); for (uint32 i = newLength; i < length; i++) { - meta->mn1->name = meta->engine->numberToString(i); - meta->deleteProperty(OBJECT_TO_JS2VAL(obj), meta->mn1, &lookup, RunPhase, &deleteResult); + c->deletePublic(meta, OBJECT_TO_JS2VAL(obj), c, meta->engine->numberToString(i), &deleteResult); } } } - - if (obj->kind == SimpleInstanceKind) { - // Can't call 'writeDynamicProperty' as that'll just cycle back here for - // ArrayInstances. -/* - DynamicPropertyMap *dMap = &checked_cast(obj)->dynamicProperties; - DynamicPropertyBinding **dpbP = (*dMap)[*meta->engine->length_StringAtom]; - if (dpbP) { - (*dpbP)->v.value = result; - return result; - } - DynamicPropertyBinding *dpb = new DynamicPropertyBinding(*meta->engine->length_StringAtom, DynamicPropertyValue(result, DynamicPropertyValue::PERMANENT)); - checked_cast(obj)->dynamicProperties.insert(dpb->name, dpb); -*/ - } - else { - meta->mn1->name = meta->engine->length_StringAtom; - meta->writeDynamicProperty(obj, meta->mn1, true, result, RunPhase); - } + // XXX if obj is an ArrayInstance, is this necessary? + JS2Class *c = meta->objectType(obj); + c->writePublic(meta, OBJECT_TO_JS2VAL(obj), c, meta->engine->length_StringAtom, true, result); return result; } @@ -122,15 +103,13 @@ js2val Array_Constructor(JS2Metadata *meta, const js2val /*thisValue*/, js2val * meta->reportError(Exception::rangeError, "Array length too large", meta->engine->errorPos()); } else { - meta->mn1->name = meta->engine->numberToString((int32)0); - meta->writeDynamicProperty(arrInst, meta->mn1, true, argv[0], RunPhase); + meta->createDynamicProperty(arrInst, meta->engine->numberToString((int32)0), argv[0], ReadWriteAccess, false, true); } } else { uint32 i; for (i = 0; i < argc; i++) { -// DynamicPropertyBinding *dpb = new DynamicPropertyBinding(*meta->engine->numberToString(i), DynamicPropertyValue(argv[i], DynamicPropertyValue::ENUMERATE)); -// arrInst->dynamicProperties.insert(dpb->name, dpb); + meta->createDynamicProperty(arrInst, meta->engine->numberToString(i), argv[i], ReadWriteAccess, false, true); } setLength(meta, arrInst, i); } @@ -155,8 +134,7 @@ static js2val Array_toString(JS2Metadata *meta, const js2val thisValue, js2val * js2val result; String *s = new String(); for (uint32 i = 0; i < length; i++) { - meta->mn1->name = meta->engine->numberToString(i); - if (meta->readDynamicProperty(arrInst, meta->mn1, &lookup, RunPhase, &result) + if (meta->arrayClass->readPublic(meta, thisValue, meta->arrayClass, meta->engine->numberToString(i), RunPhase, &result)) && !JS2VAL_IS_UNDEFINED(result) && !JS2VAL_IS_NULL(result) ) s->append(*meta->toString(result)); @@ -187,8 +165,7 @@ static js2val Array_toSource(JS2Metadata *meta, const js2val thisValue, js2val * js2val result; String *s = new String(); for (uint32 i = 0; i < length; i++) { - meta->mn1->name = meta->engine->numberToString(i); - if (meta->readDynamicProperty(arrInst, meta->mn1, &lookup, RunPhase, &result) + if (meta->arrayClass->readPublic(meta, thisValue, meta->arrayClass, meta->engine->numberToString(i), RunPhase, &result)) && !JS2VAL_IS_UNDEFINED(result)) s->append(*meta->toString(result)); if (i < (length - 1)) diff --git a/mozilla/js2/src/js2metadata.cpp b/mozilla/js2/src/js2metadata.cpp index 87233aa265c..91815633797 100644 --- a/mozilla/js2/src/js2metadata.cpp +++ b/mozilla/js2/src/js2metadata.cpp @@ -3640,8 +3640,8 @@ XXX see EvalAttributeExpression, where identifiers are being handled for now... Member *JS2Metadata::findCommonMember(js2val base, Multiname *multiname, Access access, bool flat) { Member *m = NULL; - if (JS2VAL_IS_PRIMITIVE(base)) - return NULL; + if (JS2VAL_IS_PRIMITIVE(base)) + return NULL; // XXX call toObject() for E3 compatibility... JS2Object *baseObj = JS2VAL_TO_OBJECT(base); switch (baseObj->kind) { case SimpleInstanceKind: @@ -3825,11 +3825,12 @@ XXX see EvalAttributeExpression, where identifiers are being handled for now... } } - bool defaultReadPublicProperty(JS2Metadata *meta, js2val base, JS2Class *limit, const String *name, LookupKind *lookupKind, Phase phase, js2val *rval) + bool defaultReadPublicProperty(JS2Metadata *meta, js2val base, JS2Class *limit, const String *name, Phase phase, js2val *rval) { // XXX could speed up by pushing knowledge of single namespace? + LookupKind lookup(false, JS2VAL_NULL); Multiname mn(name, meta->publicNamespace); - return defaultReadProperty(meta, base, limit, &mn, lookupKind, phase, rval); + return defaultReadProperty(meta, base, limit, &mn, &lookup, phase, rval); } bool defaultBracketRead(JS2Metadata *meta, js2val base, JS2Class *limit, Multiname *multiname, Phase phase, js2val *rval) @@ -3889,11 +3890,12 @@ XXX see EvalAttributeExpression, where identifiers are being handled for now... } } - bool defaultWriteProperty(JS2Metadata *meta, js2val base, JS2Class *limit, const String *name, LookupKind *lookupKind, bool createIfMissing, js2val newValue) + bool defaultWritePublicProperty(JS2Metadata *meta, js2val base, JS2Class *limit, const String *name, bool createIfMissing, js2val newValue) { // XXX could speed up by pushing knowledge of single namespace? + LookupKind lookup(false, JS2VAL_NULL); Multiname mn(name, meta->publicNamespace); - return defaultWriteProperty(meta, base, limit, &mn, lookupKind, createIfMissing, newValue); + return defaultWriteProperty(meta, base, limit, &mn, &lookup, createIfMissing, newValue); } bool defaultBracketWrite(JS2Metadata *meta, js2val base, JS2Class *limit, Multiname *multiname, js2val newValue) @@ -3967,6 +3969,14 @@ XXX see EvalAttributeExpression, where identifiers are being handled for now... return meta->readInstanceMember(lookupKind->thisObject, objectType(lookupKind->thisObject), m, phase, rval); } + bool defaultDeletePublic(JS2Metadata *meta, js2val base, JS2Class *limit, const String *name, bool *result) + { + // XXX could speed up by pushing knowledge of single namespace & lookup? + LookupKind lookup(false, JS2VAL_NULL); + Multiname mn(name, meta->publicNamespace); + return defaultDeleteProperty(meta, base, limit, &mn, &lookup, result); + } + bool defaultBracketDelete(JS2Metadata *meta, js2val base, JS2Class *limit, Multiname *multiname, Phase phase, js2val *rval) { LookupKind lookup(false, JS2VAL_NULL); @@ -4178,8 +4188,12 @@ XXX see EvalAttributeExpression, where identifiers are being handled for now... read(defaultReadProperty), readPublic(defaultReadPublicProperty), write(defaultWriteProperty), + writePublic(defaultWritePublicProperty), + deleteProperty(defaultDeleteProperty), + deletePublic(defaultDeletePublic), bracketRead(defaultBracketReadProperty), bracketWrite(defaultBracketReadProperty), + bracketDelete(defaultBracketDelete), slotCount(super ? super->slotCount : 0) { diff --git a/mozilla/js2/src/js2metadata.h b/mozilla/js2/src/js2metadata.h index 192f05d3d31..ff3335eea5e 100644 --- a/mozilla/js2/src/js2metadata.h +++ b/mozilla/js2/src/js2metadata.h @@ -60,10 +60,11 @@ typedef js2val (Constructor)(JS2Metadata *meta, const js2val thisValue, js2val * typedef js2val (NativeCode)(JS2Metadata *meta, const js2val thisValue, js2val argv[], uint32 argc); typedef bool (Read)(JS2Metadata *meta, js2val base, JS2Class *limit, Multiname *multiname, LookupKind *lookupKind, Phase phase, js2val *rval); -typedef bool (ReadPublic)(JS2Metadata *meta, js2val base, JS2Class *limit, const String *name, LookupKind *lookupKind, Phase phase, js2val *rval); +typedef bool (ReadPublic)(JS2Metadata *meta, js2val base, JS2Class *limit, const String *name, Phase phase, js2val *rval); typedef bool (Write)(JS2Metadata *meta, js2val base, JS2Class *limit, Multiname *multiname, LookupKind *lookupKind, bool createIfMissing, js2val newValue); -typedef bool (WritePublic)(JS2Metadata *meta, js2val base, JS2Class *limit, const String *name, LookupKind *lookupKind, bool createIfMissing, js2val newValue); +typedef bool (WritePublic)(JS2Metadata *meta, js2val base, JS2Class *limit, const String *name, bool createIfMissing, js2val newValue); typedef bool (DeleteProperty)(JS2Metadata *meta, js2val base, JS2Class *limit, Multiname *multiname, LookupKind *lookupKind, bool *result); +typedef bool (DeletePublic)(JS2Metadata *meta, js2val base, JS2Class *limit, const String *name, bool *result); typedef bool (BracketRead)(JS2Metadata *meta, js2val base, JS2Class *limit, Multiname *multiname, Phase phase, js2val *rval); typedef bool (BracketWrite)(JS2Metadata *meta, js2val base, JS2Class *limit, Multiname *multiname, js2val newValue); typedef bool (BracketDelete)(JS2Metadata *meta, js2val base, JS2Class *limit, Multiname *multiname, bool *result); @@ -636,8 +637,9 @@ public: Read *read; ReadPublic *readPublic; Write *write; - WritePublic *readWrite; + WritePublic *writePublic; DeleteProperty *deleteProperty; + DeletePublic *deletePublic; BracketRead *bracketRead; BracketWrite *bracketWrite; BracketDelete *bracketDelete;