Closed
Bug 742213
Opened 13 years ago
Closed 12 years ago
isDistinguishableFrom should check whether two interfaces can be implemented by the same object
Categories
(Core :: DOM: Core & HTML, defect)
Tracking
()
RESOLVED
FIXED
mozilla16
People
(Reporter: bzbarsky, Assigned: bzbarsky)
References
(Blocks 1 open bug)
Details
Attachments
(1 file)
12.26 KB,
patch
|
justin.lebar+bug
:
review+
|
Details | Diff | Splinter Review |
Instead of just assuming two different interfaces are always distinguishable.
Assignee | ||
Comment 1•12 years ago
|
||
Implementation plan:
On each IDLInterface C, store the following set of interfaces:
{ C, interfaces C is ancestor of, interfaces C is consequential interface of }
then A and B are distinguishable (ignoring typed array stuff and callbacks) if and only if A.getThisSet() intersect B.getThisSet() is empty.
Assignee | ||
Comment 2•12 years ago
|
||
Attachment #633224 -
Flags: review?(khuey)
Assignee | ||
Updated•12 years ago
|
Assignee: nobody → bzbarsky
Whiteboard: [need review]
Assignee | ||
Updated•12 years ago
|
Attachment #633224 -
Flags: review?(khuey) → review?(justin.lebar+bug)
Comment 3•12 years ago
|
||
Where is test_distinguishability coming from? It's not in my inbound tree.
Comment 4•12 years ago
|
||
> { C, interfaces C is ancestor of, interfaces C is consequential interface of }
This is the same as
{ C, interfaces C is a consequential interface of },
because if C is an ancestor of X, then C is a consequential interface of X, right? So this is really just the converse (I don't like "inverse" here) of the consequential relation (union {C}, anyway).
Comment 5•12 years ago
|
||
Comment on attachment 633224 [details] [diff] [review]
isDistinguishableFrom should correctly check whether two interfaces can be implemented on the same object.
>diff --git a/dom/bindings/parser/WebIDL.py b/dom/bindings/parser/WebIDL.py
>--- a/dom/bindings/parser/WebIDL.py
>+++ b/dom/bindings/parser/WebIDL.py
>@@ -367,16 +367,17 @@ class IDLInterface(IDLObjectWithScope):
> assert not parent or isinstance(parent, IDLIdentifierPlaceholder)
>
> self.parent = parent
> self._callback = False
> self._finished = False
> self.members = list(members) # clone the list
> self.implementedInterfaces = set()
> self._consequential = False
>+ self.interfacesImplyingSelf = set([self])
I struggled with this for a while, and I think a simple explanation for this field is, the field contains the interfaces that |self| is a part of. I think it's worth documenting that. I also think the name could be improved, too; maybe interfacesBasedOnSelf?
>@@ -508,18 +529,19 @@ class IDLInterface(IDLObjectWithScope):
> specialMembersSeen.add(memberType)
>
> def isInterface(self):
> return True
>
> def isExternal(self):
> return False
>
>- def setConsequential(self):
>+ def setConsequential(self, other):
> self._consequential = True
>+ self.interfacesImplyingSelf.add(other)
Maybe now |setConsequentialTo|?
>+ if other.isSpiderMonkeyInterface():
>+ # Just let |other| handle things
>+ return other.isDistinguishableFrom(self)
>+ assert self.isGeckoInterface() and other.isGeckoInterface()
>+ if self.inner.isExternal() or other.unroll().inner.isExternal():
>+ return self != other
>+ return (len(self.inner.interfacesImplyingSelf &
>+ other.unroll().inner.interfacesImplyingSelf) == 0 and
So two interfaces A and B are distinguishable if no object implements or inherits-from both A and B.
This creates really tight coupling -- my union or override can break if some bozo implements an object in some completely irrelevant spec. But I guess we have to do this because we have no concept of an explicit cast.
Attachment #633224 -
Flags: review?(justin.lebar+bug) → review+
Comment 6•12 years ago
|
||
> because if C is an ancestor of X, then C is a consequential interface of X, right?
Wrong. :)
Assignee | ||
Comment 7•12 years ago
|
||
> Where is test_distinguishability coming from?
Bug 764698.
> because if C is an ancestor of X, then C is a consequential interface of X, right?
As you discovered, wrong.
> I also think the name could be improved, too; maybe interfacesBasedOnSelf?
Will do. And will document.
> Maybe now |setConsequentialTo|?
Hmm. Or setConsequentialOf? Preference? Or even setIsConsequentialInterfaceOf?
Fully agreed with the last two paragraphs of comment 5.
Comment 8•12 years ago
|
||
I like setIsConsequentialInterfaceOf more than setConsequentialOf, and have no preference between setIsConsequentialInterfaceOf and set{Is,}ConsequentialTo.
Assignee | ||
Comment 9•12 years ago
|
||
setIsConsequentialInterfaceOf it is.
Assignee | ||
Comment 10•12 years ago
|
||
Flags: in-testsuite+
Whiteboard: [need review]
Target Milestone: --- → mozilla16
Comment 11•12 years ago
|
||
Status: NEW → RESOLVED
Closed: 12 years ago
Resolution: --- → FIXED
Updated•6 years ago
|
Component: DOM → DOM: Core & HTML
You need to log in
before you can comment on or make changes to this bug.
Description
•