ctypes_generation/generate.py works on py3 + deterministic on py2 & py3

This commit is contained in:
hakril
2024-05-20 13:05:55 +02:00
parent 9ce6fcef9c
commit 44ac6356e1
6 changed files with 591 additions and 423 deletions
-14
View File
@@ -134,20 +134,6 @@ class WinFuncParser(Parser):
return res
def dbg_lexer(data):
for i in Lexer(data).token_generation():
print i
def dbg_parser(data):
return WinFuncParser(data).parse()
def dbg_validate(data):
return validate_structs(Parser(data).parse())
if __name__ == "__main__":
import sys
data = open(sys.argv[1], 'r').read()
+10 -7
View File
@@ -4,9 +4,12 @@ import os.path
import re
import glob
import textwrap
import StringIO
import pprint
try:
from StringIO import StringIO
except ImportError:
from io import StringIO # Py3
import pprint
import shutil
import dummy_wintypes
@@ -73,7 +76,7 @@ class StructureParsedFile(ParsedFile):
def compute_imports_exports_for_struct(self, struct):
self.asser_struct_not_already_in_import(struct)
if any(x in self.imports for x in [struct.name] + struct.typedef.keys()):
if any(x in self.imports for x in [struct.name] + list(struct.typedef)):
print("Export <{0}> defined after first use".format(struct.name))
raise ValueError("LOL")
if struct.name is not None: # Anonymous structs
@@ -94,7 +97,7 @@ class StructureParsedFile(ParsedFile):
self.add_imports(*nb_rep.get_names())
def asser_struct_not_already_in_import(self, struct):
for sname in [struct.name] + struct.typedef.keys():
for sname in [struct.name] + list(struct.typedef):
try:
already_used = self.imports_by_struct[sname]
raise ValueError("Structure <{0}> is defined after being used in <{1}>".format(sname, already_used))
@@ -277,7 +280,7 @@ class CtypesGenerator(object):
def __init__(self, parsed_files, template):
self.files = parsed_files # Already in generation order
self.template = template # MAKE BETTER
self.result = StringIO.StringIO()
self.result = StringIO()
self.imported_name = set([])
def add_import_name(self, name):
@@ -327,7 +330,7 @@ class CtypesGenerator(object):
class NoTemplatedGenerator(CtypesGenerator):
def __init__(self, parsed_files):
self.files = parsed_files # Already in generation order
self.result = StringIO.StringIO()
self.result = StringIO()
self.imported_name = set([])
def copy_template(self):
@@ -627,7 +630,7 @@ def generate_walker(namelist, target_module):
class MetaFileGenerator(NoTemplatedGenerator):
def __init__(self):
self.result = StringIO.StringIO()
self.result = StringIO()
self.modules = []
def add_exportlist(self, name, modname, exports):
+6 -3
View File
@@ -1,5 +1,8 @@
import collections
import StringIO
try:
from StringIO import StringIO
except ImportError:
from io import StringIO # Py3
TupleToken = collections.namedtuple('Token', ['value'])
@@ -189,8 +192,8 @@ class Parser(object):
data = data.replace("\\\n", "")
# Step 4 Remove comments:
ins = StringIO.StringIO(data)
outs = StringIO.StringIO()
ins = StringIO(data)
outs = StringIO()
in_str = False
res = []
-10
View File
@@ -212,16 +212,6 @@ class SimpleTypesParser(Parser):
self.next_token()
return results
def dbg_lexer(data):
for i in Lexer(data).token_generation():
print i
def dbg_parser(data):
return WinStructParser(data).parse()
def dbg_validate(data):
return validate_structs(Parser(data).parse())
if __name__ == "__main__":
import sys
+2 -2
View File
@@ -177,7 +177,7 @@ class WinStruct(object):
def generate_typedef_ctypes(self):
typedef_ctypes = []
for typedef_name, value in self.typedef.items():
for typedef_name, value in sorted(self.typedef.items()):
str_value = self.name
if typedef_name == str_value: # Do not generate "X= X" line (anonymous structs gen this)
continue
@@ -237,7 +237,7 @@ class WinEnum(object):
lines += [" values = [{0}]".format(", ".join([name for i, name in self.fields]))]
lines += [" mapper = FlagMapper(*values)".format(self.name)]
for typedef_name, value in self.typedef.items():
for typedef_name, value in sorted(self.typedef.items()):
str_value = self.name
if typedef_name == str_value: # Do not generate "X= X" line (anonymous enum gen this)
continue
File diff suppressed because it is too large Load Diff