From 121baa8be133b4df7e7d60d6a46517935305c95a Mon Sep 17 00:00:00 2001 From: "rogerl%netscape.com" Date: Thu, 27 Mar 2003 17:04:04 +0000 Subject: [PATCH] Latest !!! BROKEN !!! changes --- js2/src/js2metadata.cpp | 50 +++++++++++++++++++++++++++++++++++++++++ js2/src/js2metadata.h | 12 ---------- 2 files changed, 50 insertions(+), 12 deletions(-) diff --git a/js2/src/js2metadata.cpp b/js2/src/js2metadata.cpp index 7f11b6c8c0a8..5e967bf44a46 100644 --- a/js2/src/js2metadata.cpp +++ b/js2/src/js2metadata.cpp @@ -2892,10 +2892,60 @@ doUnary: if (!requestedMultiname.subsetOf(definedMultiname)) reportError(Exception::definitionError, "Illegal definition", pos); bool goodKind; + switch (m->kind) { + case Member::InstanceVariable: + goodKind = (mOverridden->kind == Member::InstanceVariable); + break; + case Member::InstanceGetter: + goodKind = ((mOverridden->kind == Member::InstanceVariable) + || (mOverridden->kind == Member::InstanceGetter)); + break; + case Member::InstanceSetter: + goodKind = ((mOverridden->kind == Member::InstanceVariable) + || (mOverridden->kind == Member::InstanceSetter)); + break; + case Member::InstanceMethod: + goodKind = (mOverridden->kind == Member::InstanceMethod); + break; + } + if (mOverridden->final || !goodKind) + reportError(Exception::definitionError, "Illegal override", pos); + + InstanceBindingEntry **ibeP = c->instanceBindings[*id]; + if (ibeP) { + for (InstanceBindingEntry::NS_Iterator i = (*ibeP)->begin(), end = (*ibeP)->end(); (i != end); i++) { + InstanceBindingEntry::NamespaceBinding &ns = *i; + if ((ns.second->accesses & access) && (ns.first == *nli)) + reportError(Exception::definitionError, "Illegal override", pos); + } + } + } } + +if mOverridden.final or not goodKind then throw definitionError end if +end if; +if some m2 OE c.instanceMembers satisfies m2.multiname « definedMultiname ! {} and +accessesOverlap(instanceMemberAccesses(m2), accesses) then +throw definitionError +end if; +case overrideMod of +{ none } do +if mBase ! none or searchForOverrides(c, openMultiname, accesses) ! none then +throw definitionError +end if; +{ false } do if mBase ! none then throw definitionError end if; +{ true } do if mBase = none then throw definitionError end if; +{ undefined } do nothing +end case; +m.multiname ¨ definedMultiname; +c.instanceMembers ¨ c.instanceMembers » {m}; +return mOverridden + + + // Find the possible override conflicts that arise from the given id and namespaces // Fall back on the currently open namespace list if no others are specified. OverrideStatus *JS2Metadata::resolveOverrides(JS2Class *c, const String *id, NamespaceList *namespaces, Access access, bool expectMethod, size_t pos) diff --git a/js2/src/js2metadata.h b/js2/src/js2metadata.h index 7afc0a178141..d8f6d74246f7 100644 --- a/js2/src/js2metadata.h +++ b/js2/src/js2metadata.h @@ -473,18 +473,6 @@ public: InstanceMember *content; // The member to which this qualified name was bound }; -// Override status is used to resolve overriden definitions for instance members -#define POTENTIAL_CONFLICT ((InstanceMember *)(-1)) -class OverrideStatus { -public: - OverrideStatus(InstanceMember *overriddenMember, const String *name) - : overriddenMember(overriddenMember), multiname(name) { } - - InstanceMember *overriddenMember; // NULL for none - Multiname multiname; -}; -typedef std::pair OverrideStatusPair; - template class BindingEntry { public: