def __init__(self, filename, parseData): # Read the configuration file. glbl = {} execfile(filename, glbl) config = glbl['DOMInterfaces'] # Build descriptors for all the interfaces we have in the parse data. # This allows callers to specify a subset of interfaces by filtering # |parseData|. self.descriptors = [] self.interfaces = {} self.maxProtoChainLength = 0 for thing in parseData: # Servo does not support external interfaces. if isinstance(thing, IDLExternalInterface): raise WebIDLError( "Servo does not support external interfaces.", [thing.location]) assert not thing.isType() if not thing.isInterface() and not thing.isNamespace(): continue iface = thing self.interfaces[iface.identifier.name] = iface if iface.identifier.name not in config: # Completely skip consequential interfaces with no descriptor # if they have no interface object because chances are we # don't need to do anything interesting with them. if iface.isConsequential() and not iface.hasInterfaceObject(): continue entry = {} else: entry = config[iface.identifier.name] if not isinstance(entry, list): assert isinstance(entry, dict) entry = [entry] self.descriptors.extend( [Descriptor(self, iface, x) for x in entry]) # Mark the descriptors for which only a single nativeType implements # an interface. for descriptor in self.descriptors: intefaceName = descriptor.interface.identifier.name otherDescriptors = [ d for d in self.descriptors if d.interface.identifier.name == intefaceName ] descriptor.uniqueImplementation = len(otherDescriptors) == 1 self.enums = [e for e in parseData if e.isEnum()] self.typedefs = [e for e in parseData if e.isTypedef()] self.dictionaries = [d for d in parseData if d.isDictionary()] self.callbacks = [ c for c in parseData if c.isCallback() and not c.isInterface() ] # Keep the descriptor list sorted for determinism. self.descriptors.sort(lambda x, y: cmp(x.name, y.name))
def __init__(self, filename, parseData): # Read the configuration file. glbl = {} exec(compile(open(filename).read(), filename, 'exec'), glbl) config = glbl['DOMInterfaces'] # Build descriptors for all the interfaces we have in the parse data. # This allows callers to specify a subset of interfaces by filtering # |parseData|. self.descriptors = [] self.interfaces = {} self.maxProtoChainLength = 0 for thing in parseData: # Servo does not support external interfaces. if isinstance(thing, IDLExternalInterface): raise WebIDLError( "Servo does not support external interfaces.", [thing.location]) assert not thing.isType() if not thing.isInterface() and not thing.isNamespace(): continue iface = thing self.interfaces[iface.identifier.name] = iface if iface.identifier.name not in config: entry = {} else: entry = config[iface.identifier.name] if not isinstance(entry, list): assert isinstance(entry, dict) entry = [entry] self.descriptors.extend( [Descriptor(self, iface, x) for x in entry]) # Mark the descriptors for which only a single nativeType implements # an interface. for descriptor in self.descriptors: intefaceName = descriptor.interface.identifier.name otherDescriptors = [ d for d in self.descriptors if d.interface.identifier.name == intefaceName ] descriptor.uniqueImplementation = len(otherDescriptors) == 1 self.enums = [e for e in parseData if e.isEnum()] self.typedefs = [e for e in parseData if e.isTypedef()] self.dictionaries = [d for d in parseData if d.isDictionary()] self.callbacks = [ c for c in parseData if c.isCallback() and not c.isInterface() ] # Keep the descriptor list sorted for determinism. def cmp(x, y): return (x > y) - (x < y) self.descriptors.sort( key=functools.cmp_to_key(lambda x, y: cmp(x.name, y.name)))