diff --git a/mozilla/js2/src/bytecodegen.cpp b/mozilla/js2/src/bytecodegen.cpp index 55b3db68509..9495be7f2b3 100644 --- a/mozilla/js2/src/bytecodegen.cpp +++ b/mozilla/js2/src/bytecodegen.cpp @@ -728,7 +728,7 @@ bool ByteCodeGen::genCodeForStatement(StmtNode *p, ByteCodeGen *static_cg, uint3 VariableBinding *v = vs->bindings; bool isStatic = (vs->attributeValue->mTrueFlags & Property::Static) == Property::Static; while (v) { - Reference *ref = mScopeChain->getName(*v->name, CURRENT_ATTR, Write); + Reference *ref = mScopeChain->getName(*v->name, vs->attributeValue->mNamespaceList, Write); ASSERT(ref); // must have been added previously by collectNames if (v->initializer) { if (isStatic && (static_cg != NULL)) { diff --git a/mozilla/js2/src/js2execution.cpp b/mozilla/js2/src/js2execution.cpp index 41736f11180..f14877df5c5 100644 --- a/mozilla/js2/src/js2execution.cpp +++ b/mozilla/js2/src/js2execution.cpp @@ -1407,12 +1407,12 @@ JSValue Context::interpret(uint8 *pc, uint8 *endPC) NamespaceList *t = a1->mNamespaceList; while (t) { - x->mNamespaceList = new NamespaceList(&t->mName, x->mNamespaceList); + x->mNamespaceList = new NamespaceList(t->mName, x->mNamespaceList); t = t->mNext; } t = a2->mNamespaceList; while (t) { - x->mNamespaceList = new NamespaceList(&t->mName, x->mNamespaceList); + x->mNamespaceList = new NamespaceList(t->mName, x->mNamespaceList); t = t->mNext; } if (a1->mExtendArgument) diff --git a/mozilla/js2/src/js2runtime.cpp b/mozilla/js2/src/js2runtime.cpp index 182c4c91091..02622d92185 100644 --- a/mozilla/js2/src/js2runtime.cpp +++ b/mozilla/js2/src/js2runtime.cpp @@ -94,11 +94,9 @@ Attribute *Context::executeAttributes(ExprNode *attr) } - -// find a property by the given name, and then check to see if there's any -// overlap between the supplied attribute list and the property's list. -// ***** REWRITE ME -- matching attribute lists for inclusion is a bad idea. -// XXX it's re-written a little bit, but is still doing linear searching (o^2) ... +// Find a property with the given name, but make sure it's in +// the supplied namespace. XXX speed up! XXX +// PropertyIterator JSObject::findNamespacedProperty(const String &name, NamespaceList *names) { for (PropertyIterator i = mProperties.lower_bound(name), @@ -796,7 +794,7 @@ void ScopeChain::collectNames(StmtNode *p) { ClassStmtNode *classStmt = checked_cast(p); const StringAtom *name = &classStmt->name; - JSType *thisClass = new JSType(name, NULL); + JSType *thisClass = new JSType(m_cx, name, NULL); m_cx->setAttributeValue(classStmt, 0); // XXX default attribute for a class? @@ -863,6 +861,12 @@ void ScopeChain::collectNames(StmtNode *p) if (p->getKind() == StmtNode::Const) vs->attributeValue->mTrueFlags |= Property::Const; bool isStatic = (vs->attributeValue->mTrueFlags & Property::Static) == Property::Static; + if ((vs->attributeValue->mTrueFlags & Property::Private) == Property::Private) { + JSType *theClass = topClass(); + if (theClass == NULL) + m_cx->reportError(Exception::typeError, "Private can only be used inside a class"); + vs->attributeValue->mNamespaceList = new NamespaceList(theClass->mPrivateNamespace, vs->attributeValue->mNamespaceList); + } while (v) { if (isStatic) @@ -1229,12 +1233,13 @@ Reference *JSType::genReference(bool hasBase, const String& name, NamespaceList return NULL; } -JSType::JSType(const StringAtom *name, JSType *super) +JSType::JSType(Context *cx, const StringAtom *name, JSType *super) : JSObject(Type_Type), mSuperType(super), mVariableCount(0), mInstanceInitializer(NULL), mClassName(name), + mPrivateNamespace(&cx->mWorld.identifiers[*name + " private"]), mIsDynamic(false), mUninitializedValue(kNullValue), mPrototypeObject(NULL) @@ -1255,6 +1260,7 @@ JSType::JSType(JSType *xClass) // used for constructing the static component mVariableCount(0), mInstanceInitializer(NULL), mClassName(NULL), + mPrivateNamespace(NULL), mIsDynamic(false), mUninitializedValue(kNullValue), mPrototypeObject(NULL) @@ -1729,14 +1735,23 @@ void Context::assureStackSpace(uint32 s) void Context::initClass(JSType *type, ClassDef *cdef, PrototypeFunctions *pdef) { mScopeChain->addScope(type); - type->setDefaultConstructor(this, new JSFunction(cdef->defCon, Object_Type)); + JSFunction *constructor = new JSFunction(cdef->defCon, Object_Type); + constructor->setClass(type); + FunctionName *fnName = new FunctionName(); + fnName->name = type->mClassName; + constructor->setFunctionName(fnName); + type->setDefaultConstructor(this, constructor); // the prototype functions are defined in the prototype object... if (pdef) { for (uint32 i = 0; i < pdef->mCount; i++) { JSFunction *fun = new JSFunction(pdef->mDef[i].imp, pdef->mDef[i].result); + fun->setClass(type); + StringAtom *name = &mWorld.identifiers[widenCString(pdef->mDef[i].name)]; + FunctionName *fnName = new FunctionName(); + fun->setFunctionName(fnName); fun->setArgCounts(pdef->mDef[i].length, 0, false); - type->mPrototypeObject->defineVariable(this, widenCString(pdef->mDef[i].name), + type->mPrototypeObject->defineVariable(this, *name, //widenCString(pdef->mDef[i].name), (NamespaceList *)(NULL), pdef->mDef[i].result, JSValue(fun)); @@ -1770,21 +1785,21 @@ void Context::initBuiltins() { "NamedArgument", NULL, &kNullValue }, }; - Object_Type = new JSType(&mWorld.identifiers[widenCString(builtInClasses[0].name)], NULL); + Object_Type = new JSType(this, &mWorld.identifiers[widenCString(builtInClasses[0].name)], NULL); Object_Type->mIsDynamic = true; // XXX aren't all the built-ins thus? - Type_Type = new JSType(&mWorld.identifiers[widenCString(builtInClasses[1].name)], Object_Type); - Function_Type = new JSType(&mWorld.identifiers[widenCString(builtInClasses[2].name)], Object_Type); - Number_Type = new JSType(&mWorld.identifiers[widenCString(builtInClasses[3].name)], Object_Type); - Integer_Type = new JSType(&mWorld.identifiers[widenCString(builtInClasses[4].name)], Object_Type); - String_Type = new JSStringType(&mWorld.identifiers[widenCString(builtInClasses[5].name)], Object_Type); - Array_Type = new JSArrayType(&mWorld.identifiers[widenCString(builtInClasses[6].name)], Object_Type); - Boolean_Type = new JSType(&mWorld.identifiers[widenCString(builtInClasses[7].name)], Object_Type); - Void_Type = new JSType(&mWorld.identifiers[widenCString(builtInClasses[8].name)], Object_Type); - Unit_Type = new JSType(&mWorld.identifiers[widenCString(builtInClasses[9].name)], Object_Type); - Attribute_Type = new JSType(&mWorld.identifiers[widenCString(builtInClasses[10].name)], Object_Type); - NamedArgument_Type = new JSType(&mWorld.identifiers[widenCString(builtInClasses[11].name)], Object_Type); + Type_Type = new JSType(this, &mWorld.identifiers[widenCString(builtInClasses[1].name)], Object_Type); + Function_Type = new JSType(this, &mWorld.identifiers[widenCString(builtInClasses[2].name)], Object_Type); + Number_Type = new JSType(this, &mWorld.identifiers[widenCString(builtInClasses[3].name)], Object_Type); + Integer_Type = new JSType(this, &mWorld.identifiers[widenCString(builtInClasses[4].name)], Object_Type); + String_Type = new JSStringType(this, &mWorld.identifiers[widenCString(builtInClasses[5].name)], Object_Type); + Array_Type = new JSArrayType(this, &mWorld.identifiers[widenCString(builtInClasses[6].name)], Object_Type); + Boolean_Type = new JSType(this, &mWorld.identifiers[widenCString(builtInClasses[7].name)], Object_Type); + Void_Type = new JSType(this, &mWorld.identifiers[widenCString(builtInClasses[8].name)], Object_Type); + Unit_Type = new JSType(this, &mWorld.identifiers[widenCString(builtInClasses[9].name)], Object_Type); + Attribute_Type = new JSType(this, &mWorld.identifiers[widenCString(builtInClasses[10].name)], Object_Type); + NamedArgument_Type = new JSType(this, &mWorld.identifiers[widenCString(builtInClasses[11].name)], Object_Type); String_Type->defineVariable(this, widenCString("fromCharCode"), NULL, String_Type, JSValue(new JSFunction(String_fromCharCode, String_Type))); diff --git a/mozilla/js2/src/js2runtime.h b/mozilla/js2/src/js2runtime.h index bf75e523507..7535e43d68b 100644 --- a/mozilla/js2/src/js2runtime.h +++ b/mozilla/js2/src/js2runtime.h @@ -678,7 +678,7 @@ XXX ...couldn't get this to work... class JSType : public JSObject { public: - JSType(const StringAtom *name, JSType *super); + JSType(Context *cx, const StringAtom *name, JSType *super); JSType(JSType *xClass); // used for constructing the static component type virtual ~JSType() { } // keeping gcc happy @@ -768,6 +768,7 @@ XXX ...couldn't get this to work... // the 'vtable' MethodList mMethods; const StringAtom *mClassName; + const StringAtom *mPrivateNamespace; JSFunction *mUnaryOperators[OperatorCount]; // XXX too wasteful @@ -776,6 +777,7 @@ XXX ...couldn't get this to work... JSObject *mPrototypeObject; // becomes the prototype for any instance + void printSlotsNStuff(Formatter& f) const; }; @@ -803,8 +805,8 @@ XXX ...couldn't get this to work... class JSArrayType : public JSType { public: - JSArrayType(const StringAtom *name, JSType *super) - : JSType(name, super) + JSArrayType(Context *cx, const StringAtom *name, JSType *super) + : JSType(cx, name, super) { } virtual ~JSArrayType() { } // keeping gcc happy @@ -837,8 +839,8 @@ XXX ...couldn't get this to work... class JSStringType : public JSType { public: - JSStringType(const StringAtom *name, JSType *super) - : JSType(name, super) + JSStringType(Context *cx, const StringAtom *name, JSType *super) + : JSType(cx, name, super) { } virtual ~JSStringType() { } // keeping gcc happy diff --git a/mozilla/js2/src/property.h b/mozilla/js2/src/property.h index 990be68043f..0fe7fbae7fe 100644 --- a/mozilla/js2/src/property.h +++ b/mozilla/js2/src/property.h @@ -131,9 +131,9 @@ namespace JS2Runtime { Formatter& operator<<(Formatter& f, const Property& prop); struct NamespaceList { - NamespaceList(const String *name, NamespaceList *next) : mName(*name), mNext(next) { } + NamespaceList(const StringAtom *name, NamespaceList *next) : mName(name), mNext(next) { } - const String mName; + const StringAtom *mName; NamespaceList *mNext; }; diff --git a/mozilla/js2/src/winbuild/dikdik.dsw b/mozilla/js2/src/winbuild/dikdik.dsw index 80a9b2e20e0..b5c5821c3cf 100644 --- a/mozilla/js2/src/winbuild/dikdik.dsw +++ b/mozilla/js2/src/winbuild/dikdik.dsw @@ -29,11 +29,14 @@ Package=<4> Begin Project Dependency Project_Dep_Name DikDik End Project Dependency + Begin Project Dependency + Project_Dep_Name fdlibm + End Project Dependency }}} ############################################################################### -Project: "fdlibm"=.\fdlibm\fdlibm.dsp - Package Owner=<4> +Project: "fdlibm"=.\fdlibm.dsp - Package Owner=<4> Package=<5> {{{