mirror of
https://github.com/hakril/PythonForWindows
synced 2026-06-08 14:31:45 +00:00
ctypes_generation/generate.py works on py3 + deterministic on py2 & py3
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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 = []
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
+573
-387
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user