[pypy-commit] creflect default: constdecl
arigo
noreply at buildbot.pypy.org
Tue Nov 18 17:22:20 CET 2014
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r71:bdd95bc342bd
Date: 2014-11-18 17:22 +0100
http://bitbucket.org/cffi/creflect/changeset/bdd95bc342bd/
Log: constdecl
diff --git a/creflect/cparser.py b/creflect/cparser.py
--- a/creflect/cparser.py
+++ b/creflect/cparser.py
@@ -114,7 +114,7 @@
if decl.name:
tp = self._get_type(node, partial_length_ok=True)
if self._is_constant_globalvar(node):
- self._declare('constant ' + decl.name, tp)
+ self.declarations.append(model.ConstDecl(decl.name, tp))
else:
self.declarations.append(model.VarDecl(decl.name, tp))
diff --git a/creflect/model.py b/creflect/model.py
--- a/creflect/model.py
+++ b/creflect/model.py
@@ -136,6 +136,15 @@
raise AssertionError
return block.write_crx_type_var(expr)
+ def write_int_const_decl(self, block, varname):
+ block.writedecl("crx_int_const_t v;")
+ block.writeline("(void)((%s) << 1); /* check that '%s' is an"
+ " integer */" % (varname, varname))
+ expr = "CRX_INT_CONST(cb, %s, &v)" % varname
+ t1 = block.write_crx_type_var(expr)
+ block.writeline('cb->define_int_const(cb, "%s", %s, &v);' % (
+ varname, t1))
+
class FunctionType(BaseType):
_attrs_ = ('args', 'result', 'ellipsis')
@@ -591,10 +600,6 @@
class FuncDecl(VarDecl):
- def __init__(self, name, type):
- self.name = name
- self.type = type
-
def write_declaration(self, funcblock):
if self.type.ellipsis:
VarDecl.write_declaration(self, funcblock)
@@ -602,3 +607,13 @@
block = CodeBlock(funcblock)
self.type.write_func_decl(block, self.name)
funcblock.write_subblock(block)
+
+
+class ConstDecl(VarDecl):
+ def write_declaration(self, funcblock):
+ if isinstance(self.type, PrimitiveType):
+ block = CodeBlock(funcblock)
+ self.type.write_int_const_decl(block, self.name)
+ funcblock.write_subblock(block)
+ else:
+ VarDecl.write_declaration(self, funcblock)
More information about the pypy-commit
mailing list