def setPlaceholderActiveType(activeTypeName): actactiveTypeName = activeTypeName.lower() if (not activeTypeName in ActiveTypeHelper._activeTypeId): ActiveTypeHelper._activeTypeId[ activeTypeName] = globalTypeTable.enterNamedType( activeTypeName, None) entry = globalTypeTable.lookupTypeId( ActiveTypeHelper._activeTypeId[activeTypeName]) entry.setReferenced() entry.setTypeEntryToGlobal()
def activateSymtabEntry(aUnit, var, activeTypeName): ''' change a symbols type information to the active type ''' if (not ActiveTypeHelper.isActive(aUnit, var, 0, activeTypeName)): symTabEntry = aUnit.symtab.lookup_name(var) expTypeEntry = globalTypeTable.lookupTypeId(symTabEntry.typetab_id) if isinstance(expTypeEntry.entryKind, TypetabEntry.BuiltInEntryKind): symTabEntry.typetab_id = ActiveTypeHelper.getActiveTypeId( activeTypeName) else: ActiveTypeHelper.__activateTypetabEntry( expTypeEntry, activeTypeName)
def markTypeAsReferenced(self, markAlsoAsGlobal): # for checking that all entries in type table are referenced by a symtab entry DebugManager.debug(self.__class__.__name__ + ":" + sys._getframe().f_code.co_name + " for " + self.debug()) if self.typetab_id: aTypeTabEntry = globalTypeTable.lookupTypeId(self.typetab_id) aTypeTabEntry.setReferenced() if markAlsoAsGlobal: aTypeTabEntry.setTypeEntryToGlobal() if (isinstance(self.entryKind, SymtabEntry.InterfaceEntryKind)): for gi in self.genericInfo.resolvableTo.values(): gi.markTypeAsReferenced(markAlsoAsGlobal) for arg in gi.specificFormalArgs.args.values(): arg[1].markTypeAsReferenced(markAlsoAsGlobal)
def enterType(self, newType, localSymtab): DebugManager.debug('\t\t' + sys._getframe().f_code.co_name + ': entering type ' + str(newType) + ' for ' + self.debug()) if not newType: raise SymtabError(sys._getframe().f_code.co_name + ': newType is None!', entry=self) if (self.typetab_id and (not (globalTypeTable.lookupTypeId(self.typetab_id).isExternal() and isinstance(self.entryKind, self.SubroutineEntryKind)))): # assume a name clash raise SymtabError( sys._getframe().f_code.co_name + ': name clash because the declaration for this symbol conflicts with an earlier declaration using the same name', entry=self) if isinstance(self.entryKind, self.ProcedureEntryKind): DebugManager.debug( '\t\t' + sys._getframe().f_code.co_name + ': entering type information tells us that this procedure is a function)' ) self.entryKind = self.FunctionEntryKind() newStmt = newType[0](newType[1], [], []) self.typetab_id = globalTypeTable.getType(newStmt, localSymtab)
def typePrint(self): return globalTypeTable.lookupTypeId(self.typetab_id).debug()
def ourTypePrint(type): return globalTypeTable.lookupTypeId(type).debug()