[pypy-commit] creflect default: progress
arigo
noreply at buildbot.pypy.org
Tue Nov 18 16:16:51 CET 2014
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r69:91c5dbd9cca3
Date: 2014-11-18 16:17 +0100
http://bitbucket.org/cffi/creflect/changeset/91c5dbd9cca3/
Log: progress
diff --git a/creflect/model.py b/creflect/model.py
--- a/creflect/model.py
+++ b/creflect/model.py
@@ -95,20 +95,7 @@
return self.ALL_PRIMITIVE_TYPES[self.name] == 'f'
def inspect_nonconst_type(self, block, inspect):
- if not isinstance(inspect, TypeInspector):
- if self.is_signed_type():
- expr = 'cb->get_signed_type(cb, sizeof(%s), "%s")' % (
- self.name, self.name)
- elif self.is_unsigned_type():
- expr = 'cb->get_unsigned_type(cb, sizeof(%s), "%s")' % (
- self.name, self.name)
- elif self.is_char_type():
- expr = 'cb->get_char_type(cb)'
- elif self.is_float_type():
- xxx
- else:
- raise AssertionError
- else:
+ if isinstance(inspect, TypeInspector):
star_p1 = inspect.fetch_star_p1()
comment1 = inspect.get_comment(0, False, "a valid type", minlevel=1)
comment2 = inspect.get_comment(0, False, "an integer type")
@@ -128,6 +115,25 @@
xxx
else:
raise AssertionError
+ else:
+ if isinstance(inspect, VarInspector):
+ decl = self.get_c_name("*p1")
+ block.writeline("%s = &%s; /* check that '%s' is of type '%s'"
+ " */" % (decl, inspect.varname,
+ inspect.varname, self.get_c_name()))
+ block.writeline("(void)p1;")
+ if self.is_signed_type():
+ expr = 'cb->get_signed_type(cb, sizeof(%s), "%s")' % (
+ self.name, self.name)
+ elif self.is_unsigned_type():
+ expr = 'cb->get_unsigned_type(cb, sizeof(%s), "%s")' % (
+ self.name, self.name)
+ elif self.is_char_type():
+ expr = 'cb->get_char_type(cb)'
+ elif self.is_float_type():
+ xxx
+ else:
+ raise AssertionError
return block.write_crx_type_var(expr)
@@ -277,11 +283,21 @@
inspect.after_star_p1_assignment.append(after)
inspect.levels.append('*')
elif isinstance(inspect, VarInspector):
- block.writeline("void *p1 = %s; /* check that '%s' is a"
- " pointer */" % (inspect.varname, inspect.varname))
- block.writeline("if (0) { %s = p1; } /* check that '%s' is a"
- " pointer variable, and not an array or a"
- " constant */" % (inspect.varname, inspect.varname))
+ if isinstance(self.totype, VoidType):
+ block.writeline("void *p1 = %s; /* check that '%s' is a"
+ " pointer */" % (inspect.varname,
+ inspect.varname))
+ block.writeline("if (0) { %s = p1; } /* check that '%s' is a"
+ " pointer variable, and not an array or a"
+ " constant */" % (inspect.varname,
+ inspect.varname))
+ else:
+ decl = self.totype.get_c_name("**p1")
+ block.writeline("%s = &%s; /* check that '%s' is of type '%s'"
+ " */" % (decl, inspect.varname,
+ inspect.varname, self.get_c_name()))
+ block.writeline("(void)p1;")
+ inspect = MissingInspector()
t1 = self.totype.inspect_type(block, inspect)
return block.write_crx_type_var('cb->get_pointer_type(cb, %s)' % t1)
@@ -332,6 +348,7 @@
inspect.varname, self.get_c_name()))
block.writeline("(void)p1;")
star_p1 = inspect.varname
+ inspect = MissingInspector()
else:
star_p1 = None
t1 = self.item.inspect_type(block, inspect)
diff --git a/test/codegen/glob-002c.c b/test/codegen/glob-002c.c
new file mode 100644
--- /dev/null
+++ b/test/codegen/glob-002c.c
@@ -0,0 +1,17 @@
+int someglob;
+
+// XXX can be improved to correct the size of the integer type
+
+# ____________________________________________________________
+
+void testglob_002c(crx_builder_t *cb)
+{
+ crx_type_t *t1;
+ {
+ int *p1 = &someglob; /* check that 'someglob' is of type 'int' */
+ (void)p1;
+ t1 = cb->get_signed_type(cb, sizeof(int), "int");
+ cb->define_var(cb, "someglob", t1, &someglob);
+#expect VAR someglob: int
+ }
+}
diff --git a/test/codegen/glob-002d.c b/test/codegen/glob-002d.c
new file mode 100644
--- /dev/null
+++ b/test/codegen/glob-002d.c
@@ -0,0 +1,16 @@
+int *someglob;
+
+# ____________________________________________________________
+
+void testglob_002d(crx_builder_t *cb)
+{
+ crx_type_t *t1, *t2;
+ {
+ int **p1 = &someglob; /* check that 'someglob' is of type 'int *' */
+ (void)p1;
+ t1 = cb->get_signed_type(cb, sizeof(int), "int");
+ t2 = cb->get_pointer_type(cb, t1);
+ cb->define_var(cb, "someglob", t2, &someglob);
+#expect VAR someglob: PTR int
+ }
+}
More information about the pypy-commit
mailing list