[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