Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit d6d2c0d

Browse files
committed
More tweaks for C++ support. Still doesn't seem to break anything:-)
1 parent 8960c7e commit d6d2c0d

3 files changed

Lines changed: 47 additions & 10 deletions

File tree

Tools/bgen/bgen/bgenType.py

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,15 @@ def __init__(self, typeName, fmt):
1919
self.typeName = typeName
2020
self.fmt = fmt
2121

22-
def declare(self, name):
22+
def declare(self, name, reference=False):
2323
"""Declare a variable of the type with a given name.
2424
2525
Example: int.declare('spam') prints "int spam;"
2626
"""
27-
Output("%s %s;", self.typeName, name)
27+
if reference:
28+
Output("%s& %s;", self.typeName, name)
29+
else:
30+
Output("%s %s;", self.typeName, name)
2831

2932
def getargs(self):
3033
return self.getargsFormat(), self.getargsArgs()
@@ -64,6 +67,11 @@ def passOutput(self, name):
6467
"""
6568
return "&" + name
6669

70+
def passReference(self, name):
71+
"""Return an argument for C++ pass-by-reference.
72+
Default is to call passInput().
73+
"""
74+
return self.passInput(name)
6775
def errorCheck(self, name):
6876
"""Check for an error returned in the variable.
6977
@@ -172,7 +180,7 @@ def __init__(self, substitute):
172180
self.substitute = substitute
173181
self.typeName = None # Don't show this argument in __doc__ string
174182

175-
def declare(self, name):
183+
def declare(self, name, reference=False):
176184
pass
177185

178186
def getargsFormat(self):
@@ -236,6 +244,25 @@ def passInput(self, name):
236244

237245
def mkvalueArgs(self, name):
238246
return "%s, %s" % (self.new, name)
247+
248+
class OpaqueByRefType(OpaqueType):
249+
"""An opaque object type, passed by reference.
250+
251+
Instantiate with the type name, and optionally an object type name whose
252+
New/Convert functions will be used.
253+
"""
254+
255+
def passInput(self, name):
256+
return name
257+
258+
# def passOutput(self, name):
259+
# return name
260+
261+
def mkvalueFormat(self):
262+
return "O"
263+
264+
def mkvalueArgs(self, name):
265+
return "%s(%s)" % (self.new, name)
239266

240267
class OpaqueByValueStructType(OpaqueByValueType):
241268
"""Similar to OpaqueByValueType, but we also pass this to mkvalue by

Tools/bgen/bgen/bgenVariable.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
SelfMode = 4+InMode # this is 'self' -- don't declare it
1414
ReturnMode = 8+OutMode # this is the function return value
1515
ErrorMode = 16+OutMode # this is an error status -- turn it into an exception
16-
16+
RefMode = 32
1717

1818
class Variable:
1919

@@ -39,7 +39,9 @@ def declare(self):
3939
4040
If it is "self", it is not declared.
4141
"""
42-
if self.flags != SelfMode:
42+
if self.flags == ReturnMode+RefMode:
43+
self.type.declare(self.name, reference=True)
44+
elif self.flags != SelfMode:
4345
self.type.declare(self.name)
4446

4547
def getargsFormat(self):
@@ -62,6 +64,8 @@ def passArgument(self):
6264
"""
6365
if self.mode == InMode:
6466
return self.type.passInput(self.name)
67+
if self.mode & RefMode:
68+
return self.type.passReference(self.name)
6569
if self.mode in (OutMode, InOutMode):
6670
return self.type.passOutput(self.name)
6771
# XXX Shouldn't get here

Tools/bgen/bgen/scantools.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,7 @@ def dofuncspec(self):
466466
if self.debug:
467467
self.report("* WHOLE LINE: %r" % (raw,))
468468
self.processrawspec(raw)
469+
return raw
469470

470471
def processrawspec(self, raw):
471472
match = self.whole.search(raw)
@@ -478,8 +479,8 @@ def processrawspec(self, raw):
478479
self.report("(but type matched)")
479480
return
480481
type, name, args = match.group('type', 'name', 'args')
481-
type = re.sub("\*", " ptr", type)
482-
type = re.sub("[ \t]+", "_", type)
482+
type = self.pythonizename(type)
483+
name = self.pythonizename(name)
483484
if name in self.alreadydone:
484485
self.report("Name has already been defined: %r", name)
485486
return
@@ -500,6 +501,12 @@ def processrawspec(self, raw):
500501
self.alreadydone.append(name)
501502
self.generate(type, name, arglist)
502503

504+
def pythonizename(self, name):
505+
name = re.sub("\*", " ptr", name)
506+
name = name.strip()
507+
name = re.sub("[ \t]+", "_", name)
508+
return name
509+
503510
def extractarglist(self, args):
504511
args = args.strip()
505512
if not args or args == "void":
@@ -522,9 +529,7 @@ def extractarg(self, part):
522529
if array:
523530
# array matches an optional [] after the argument name
524531
type = type + " ptr "
525-
type = re.sub("\*", " ptr ", type)
526-
type = type.strip()
527-
type = re.sub("[ \t]+", "_", type)
532+
type = self.pythonizename(type)
528533
return self.modifyarg(type, name, mode)
529534

530535
def modifyarg(self, type, name, mode):
@@ -590,6 +595,7 @@ def substituteargs(self, pattern, replacement, old):
590595
def generate(self, type, name, arglist):
591596
self.typeused(type, 'return')
592597
classname, listname = self.destination(type, name, arglist)
598+
if not classname or not listname: return
593599
if not self.specfile: return
594600
self.specfile.write("f = %s(%s, %r,\n" % (classname, type, name))
595601
for atype, aname, amode in arglist:

0 commit comments

Comments
 (0)