Lines Matching refs:self
116 def __init__(self, msg=None):
117 full_msg = 'Missing generator options object self.genOpts'
126 def __init__(self, msg=None):
127 full_msg = 'Missing Registry object self.registry'
136 def __init__(self, msg=None):
137 full_msg = 'Missing Conventions object self.genOpts.conventions'
149 def __init__(self,
224 self.conventions = conventions
228 self.filename = filename
231 self.genpath = genpath
234 self.directory = directory
237 self.apiname = apiname
240 self.mergeApiNames = mergeApiNames
243 self.profile = profile
246 self.versions = self.emptyRegex(versions)
250 self.emitversions = self.emptyRegex(emitversions)
256 self.defaultExtensions = defaultExtensions
261 self.addExtensions = self.emptyRegex(addExtensions)
265 self.removeExtensions = self.emptyRegex(removeExtensions)
270 self.emitExtensions = self.emptyRegex(emitExtensions)
275 self.emitSpirv = self.emptyRegex(emitSpirv)
279 self.emitFormats = self.emptyRegex(emitFormats)
283 self.reparentEnums = reparentEnums
287 self.sortProcedure = sortProcedure
293 self.codeGenerator = False
296 self.registry = None
299 self.requireCommandAliases = requireCommandAliases
303 self.requireDepends = requireDepends
306 def emptyRegex(self, pat):
333 def breakName(self, name, msg):
344 def __init__(self, errFile=sys.stderr, warnFile=sys.stderr, diagFile=sys.stdout):
349 self.outFile = None
350 self.errFile = errFile
351 self.warnFile = warnFile
352 self.diagFile = diagFile
354 self.featureName = None
357 self.genOpts = None
360 self.registry = None
363 self.featureDictionary = {}
367 self.extBase = 1000000000
368 self.extBlockSize = 1000
369 self.madeDirs = {}
373 self.apidict = None
376 self.file_suffix = ''
378 def logMsg(self, level, *args):
391 if self.errFile is not None:
392 write(strfile.getvalue(), file=self.errFile)
395 if self.warnFile is not None:
396 write('WARNING:', *args, file=self.warnFile)
398 if self.diagFile is not None:
399 write('DIAG:', *args, file=self.diagFile)
404 def enumToValue(self, elem, needsNum, bitwidth = 32,
436 if self.genOpts is None:
438 if self.genOpts.conventions is None:
458 self.logMsg('diag', 'Enum', name, '-> value [', numVal, ',', value, ']')
469 self.logMsg('diag', 'Enum', name, '-> bitpos [', numVal, ',', value, ']')
479 self.logMsg('diag', 'Enum', name, 'offset =', offset,
484 numVal = self.extBase + (extnumber - 1) * self.extBlockSize + offset
489 self.logMsg('diag', 'Enum', name, '-> offset [', numVal, ',', value, ']')
499 return self.enumToValue(sib, needsNum)
503 def checkDuplicateEnums(self, enums):
518 (numVal, strVal) = self.enumToValue(elem, True)
530 # self.logMsg('info', 'checkDuplicateEnums: Duplicate enum (' + name +
533 self.logMsg('warn', 'checkDuplicateEnums: Duplicate enum (' + name
546 self.logMsg('error', msg)
559 def misracstyle(self):
562 def misracppstyle(self):
565 def buildEnumCDecl(self, expand, groupinfo, groupName):
567 if self.genOpts is None:
569 if self.genOpts.conventions is None:
579 if self.genOpts.conventions.constFlagBits and groupElem.get('type') == 'bitmask':
587 self.logMsg('error', 'Invalid value for bitwidth attribute (', groupElem.get('bitwidth'), ') for ', groupName, ' - must be an integer value\n')
596 if bitwidth > 32 or self.misracppstyle():
598 if self.misracstyle():
604 self.logMsg('error', 'Invalid value for bitwidth attribute (', groupElem.get('bitwidth'), ') for bitmask type ', groupName, ' - must be less than or equal to 64\n')
607 return self.buildEnumCDecl_BitmaskOrDefine(groupinfo, groupName, bitwidth, usedefine)
611 self.logMsg('error', 'Invalid value for bitwidth attribute (', groupElem.get('bitwidth'), ') for enum type ', groupName, ' - must be less than or equal to 32\n')
614 return self.buildEnumCDecl_Enum(expand, groupinfo, groupName)
616 def buildEnumCDecl_BitmaskOrDefine(self, groupinfo, groupName, bitwidth, usedefine):
639 enums = self.checkDuplicateEnums(enums)
652 (numVal, strVal) = self.enumToValue(elem, True, bitwidth, True)
657 self.logMsg('error', 'Allowable range for flag types in C is [', minValidValue, ',', maxValidValue, '], but', name, 'flag has a value outside of this (', strVal, ')\n')
660 decl = self.genRequirements(name, mustBeFound = False)
662 if self.isEnumRequired(elem):
669 elif self.misracppstyle():
676 alias = self.registry.tree.find("enums/enum[@name='" + strVal + "']")
678 (numVal, strVal) = self.enumToValue(alias, True, bitwidth, True)
680 self.logMsg('error', 'No such alias {} for enum {}'.format(strVal, name))
698 def buildEnumCDecl_Enum(self, expand, groupinfo, groupName):
728 enums = self.checkDuplicateEnums(enums)
749 (numVal, strVal) = self.enumToValue(elem, True)
753 if self.isEnumRequired(elem):
761 requirements = self.genRequirements(name, mustBeFound = False)
777 self.logMsg('error', 'Allowable range for C enum types is [', minValidValue, ',', maxValidValue, '], but', name, 'has a value outside of this (', strVal, ')\n')
803 if (self.genOpts.codeGenerator or
804 self.conventions.generate_max_enum_in_docs):
818 def buildConstantCDecl(self, enuminfo, name, alias):
825 (_, strVal) = self.enumToValue(enuminfo.elem, False)
827 if self.misracppstyle() and enuminfo.elem.get('type') and not alias:
859 def makeDir(self, path):
863 self.logMsg('diag', 'OutputGenerator::makeDir(' + path + ')')
864 if path not in self.madeDirs:
869 self.madeDirs[path] = None
871 def beginFile(self, genOpts):
876 self.genOpts = genOpts
877 if self.genOpts is None:
879 if self.genOpts.conventions is None:
881 self.should_insert_may_alias_macro = \
882 self.genOpts.conventions.should_insert_may_alias_macro(self.genOpts)
883 self.file_suffix = self.genOpts.conventions.file_suffix
888 if self.genOpts.genpath is not None:
890 sys.path.insert(0, self.genOpts.genpath)
892 self.apidict = apimap
894 self.apidict = None
896 self.conventions = genOpts.conventions
899 if self.genOpts.filename is not None:
900 self.outFile = tempfile.NamedTemporaryFile(mode='w', encoding='utf-8', newline='\n', delete=False)
902 self.outFile = sys.stdout
904 def endFile(self):
905 if self.errFile:
906 self.errFile.flush()
907 if self.warnFile:
908 self.warnFile.flush()
909 if self.diagFile:
910 self.diagFile.flush()
911 if self.outFile:
912 self.outFile.flush()
913 if self.outFile != sys.stdout and self.outFile != sys.stderr:
914 self.outFile.close()
916 if self.genOpts is None:
921 if self.genOpts.filename is not None:
923 directory = Path(self.genOpts.directory)
926 shutil.copy(self.outFile.name, self.genOpts.directory + '/' + self.genOpts.filename)
927 os.remove(self.outFile.name)
928 self.genOpts = None
930 def beginFeature(self, interface, emit):
935 self.emit = emit
936 self.featureName = interface.get('name')
938 self.featureExtraProtect = interface.get('protect')
940 def endFeature(self):
944 self.featureName = None
945 self.featureExtraProtect = None
947 def genRequirements(self, name, mustBeFound = True):
961 def validateFeature(self, featureType, featureName):
963 if self.featureName is None:
967 def genType(self, typeinfo, name, alias):
973 self.validateFeature('type', name)
975 def genStruct(self, typeinfo, typeName, alias):
981 self.validateFeature('struct', typeName)
990 def genGroup(self, groupinfo, groupName, alias):
997 self.validateFeature('group', groupName)
999 def genEnum(self, enuminfo, typeName, alias):
1006 self.validateFeature('enum', typeName)
1008 def genCmd(self, cmd, cmdinfo, alias):
1014 self.validateFeature('command', cmdinfo)
1016 def genSpirv(self, spirv, spirvinfo, alias):
1024 def genFormat(self, format, formatinfo, alias):
1032 def genSyncStage(self, stageinfo):
1040 def genSyncAccess(self, accessinfo):
1048 def genSyncPipeline(self, pipelineinfo):
1056 def makeProtoName(self, name, tail):
1062 if self.genOpts is None:
1064 return self.genOpts.apientry + name + tail
1066 def makeTypedefName(self, name, tail):
1068 if self.genOpts is None:
1070 return '(' + self.genOpts.apientryp + 'PFN_' + name + tail + ')'
1072 def makeCParamDecl(self, param, aligncol):
1080 if self.genOpts is None:
1082 if self.genOpts.conventions is None:
1092 if self.should_insert_may_alias_macro and self.genOpts.conventions.is_voidpointer_alias(elem.tag, text, tail):
1094 tail = self.genOpts.conventions.make_voidpointer_alias(tail)
1096 self.logMsg('diag', 'Aligning parameter', elem.text, 'to column', self.genOpts.alignFuncParam)
1105 self.logMsg('diag', 'Adjust length of parameter decl from', oldLen, 'to', newLen, ':', paramdecl)
1107 if (self.misracppstyle() and prefix.find('const ') != -1):
1124 def getCParamTypeLength(self, param):
1130 if self.genOpts is None:
1132 if self.genOpts.conventions is None:
1142 if self.should_insert_may_alias_macro and self.genOpts.conventions.is_voidpointer_alias(elem.tag, text, tail):
1144 tail = self.genOpts.conventions.make_voidpointer_alias(tail)
1148 self.logMsg('diag', 'Identifying length of', elem.text, 'as', newLen)
1153 def getMaxCParamTypeLength(self, info):
1158 lengths = (self.getCParamTypeLength(member)
1162 def getHandleParent(self, typename):
1164 if self.registry is None:
1167 info = self.registry.typedict.get(typename)
1177 def iterateHandleAncestors(self, typename):
1179 current = self.getHandleParent(typename)
1182 current = self.getHandleParent(current)
1184 def getHandleAncestors(self, typename):
1186 return list(self.iterateHandleAncestors(typename))
1188 def getTypeCategory(self, typename):
1190 if self.registry is None:
1193 info = self.registry.typedict.get(typename)
1202 def isStructAlwaysValid(self, structname):
1205 if not self.conventions:
1207 if self.registry is None:
1210 if self.conventions.type_always_valid(structname):
1213 category = self.getTypeCategory(structname)
1214 if self.conventions.category_requires_validation(category):
1217 info = self.registry.typedict.get(structname)
1219 self.logMsg('error', f'isStructAlwaysValid({structname}) - structure not found in typedict')
1225 if member_name in (self.conventions.structtype_member_name,
1226 self.conventions.nextpointer_member_name):
1234 if member_type in ('void', 'char') or self.paramIsArray(member) or self.paramIsPointer(member):
1237 if self.conventions.type_always_valid(member_type):
1240 member_category = self.getTypeCategory(member_type)
1242 if self.conventions.category_requires_validation(member_category):
1246 if self.isStructAlwaysValid(member_type) is False:
1251 def paramIsArray(self, param):
1258 def paramIsPointer(self, param):
1266 def isEnumRequired(self, elem):
1272 self.logMsg('diag', 'isEnumRequired:', elem.get('name'),
1285 if self.genOpts.defaultExtensions == elem.get('supported'):
1287 elif re.match(self.genOpts.addExtensions, extname) is not None:
1290 required = re.match(self.genOpts.emitversions, elem.get('version')) is not None
1296 def makeCDecls(self, cmd):
1301 if self.genOpts is None:
1306 pdecl = self.genOpts.apicall
1325 pdecl += self.makeProtoName(text, tail)
1326 tdecl += self.makeTypedefName(text, tail)
1331 if self.genOpts.alignFuncParam == 0:
1340 # Uses: self.indentFuncProto
1341 # self.indentFuncPointer
1342 # self.alignFuncParam
1347 indentdecl += ',\n'.join(self.makeCParamDecl(p, self.genOpts.alignFuncParam)
1356 if self.misracppstyle():
1383 def newline(self):
1385 write('', file=self.outFile)
1387 def setRegistry(self, registry):
1388 self.registry = registry