Author: Wim Lavrijsen <wlavrij...@lbl.gov>
Branch: reflex-support
Changeset: r44825:5b8ff90f865c
Date: 2011-06-07 16:41 -0700
http://bitbucket.org/pypy/pypy/changeset/5b8ff90f865c/

Log:    rpython fixes and refactoring

diff --git a/pypy/module/cppyy/converter.py b/pypy/module/cppyy/converter.py
--- a/pypy/module/cppyy/converter.py
+++ b/pypy/module/cppyy/converter.py
@@ -350,12 +350,12 @@
         self.cpptype = cpptype
 
     def convert_argument(self, space, w_obj):
-        from pypy.module.cppyy import interp_cppyy
+        from pypy.module.cppyy.interp_cppyy import W_CPPInstance
         w_cppinstance = space.findattr(w_obj, space.wrap("_cppinstance"))
         if w_cppinstance:
             w_obj = w_cppinstance
         obj = space.interpclass_w(w_obj)
-        if isinstance(obj, interp_cppyy.W_CPPInstance):
+        if isinstance(obj, W_CPPInstance):
             if capi.c_is_subtype(obj.cppclass.handle, self.cpptype.handle):
                 return obj.rawobject
         raise OperationError(space.w_TypeError,
@@ -402,9 +402,12 @@
 
     #   5) generalized cases (covers basically all user classes)
     cpptype = interp_cppyy.type_byname(space, clean_name)
-    if compound == "*":
+
+    if cpptype and compound == "*":
+        # type check for the benefit of the annotator
+        from pypy.module.cppyy.interp_cppyy import W_CPPType
+        cpptype = space.interp_w(W_CPPType, cpptype, can_be_None=False)
         return InstancePtrConverter(space, cpptype)
-
     
     #   6) void converter, which fails on use
     #
diff --git a/pypy/module/cppyy/executor.py b/pypy/module/cppyy/executor.py
--- a/pypy/module/cppyy/executor.py
+++ b/pypy/module/cppyy/executor.py
@@ -176,14 +176,12 @@
             pass
 
     #   3) types/classes, either by ref/ptr or by value
-    try:
-        cpptype = interp_cppyy.type_byname(space, clean_name)
-        if compound == "*" or compound == "&":
-            return InstancePtrExecutor(space, clean_name, cpptype)
-    except OperationError, e:
-        if not e.match(space, space.w_TypeError):
-            raise
-        pass
+    cpptype = interp_cppyy.type_byname(space, clean_name)
+    if cpptype and (compound == "*" or compound == "&"):
+        # type check for the benefit of the annotator
+        from pypy.module.cppyy.interp_cppyy import W_CPPType
+        cpptype = space.interp_w(W_CPPType, cpptype, can_be_None=False)
+        return InstancePtrExecutor(space, clean_name, cpptype)
 
     # 4) additional special cases
     # ... none for now
diff --git a/pypy/module/cppyy/interp_cppyy.py 
b/pypy/module/cppyy/interp_cppyy.py
--- a/pypy/module/cppyy/interp_cppyy.py
+++ b/pypy/module/cppyy/interp_cppyy.py
@@ -46,7 +46,7 @@
         cpptype._find_data_members()
         return cpptype
 
-    return space.w_None
+    return None
 type_byname.unwrap_spec = [ObjSpace, str]
 
 def template_byname(space, name):
@@ -62,7 +62,7 @@
         state.cpptype_cache[name] = template
         return template
 
-    return space.w_None
+    return None
 template_byname.unwrap_spec = [ObjSpace, str]
 
 
@@ -272,9 +272,9 @@
     _immutable_=True
     _immutable_fields_ = ["converter", "offset"]
 
-    def __init__(self, space, cpptype, offset):
+    def __init__(self, space, type_name, offset):
         self.space = space
-        self.converter = converter.get_converter(self.space, cpptype)
+        self.converter = converter.get_converter(self.space, type_name)
         self.offset = offset
 
     def is_static(self):
@@ -401,9 +401,9 @@
         num_data_members = capi.c_num_data_members(self.handle)
         for i in range(num_data_members):
             data_member_name = 
capi.charp2str_free(capi.c_data_member_name(self.handle, i))
-            cpptype = capi.charp2str_free(capi.c_data_member_type(self.handle, 
i))
+            type_name = 
capi.charp2str_free(capi.c_data_member_type(self.handle, i))
             offset = capi.c_data_member_offset(self.handle, i)
-            data_member = W_CPPStaticDataMember(self.space, cpptype, offset)
+            data_member = W_CPPStaticDataMember(self.space, type_name, offset)
             self.data_members[data_member_name] = data_member
 
     def is_namespace(self):
@@ -440,12 +440,12 @@
         num_data_members = capi.c_num_data_members(self.handle)
         for i in range(num_data_members):
             data_member_name = 
capi.charp2str_free(capi.c_data_member_name(self.handle, i))
-            cpptype = capi.charp2str_free(capi.c_data_member_type(self.handle, 
i))
+            type_name = 
capi.charp2str_free(capi.c_data_member_type(self.handle, i))
             offset = capi.c_data_member_offset(self.handle, i)
             if capi.c_is_staticdata(self.handle, i):
-                data_member = W_CPPStaticDataMember(self.space, cpptype, 
offset)
+                data_member = W_CPPStaticDataMember(self.space, type_name, 
offset)
             else:
-                data_member = W_CPPDataMember(self.space, cpptype, offset)
+                data_member = W_CPPDataMember(self.space, type_name, offset)
             self.data_members[data_member_name] = data_member
 
     def is_namespace(self):
@@ -508,7 +508,6 @@
 
     def invoke(self, overload, args_w):
         self._nullcheck()
-        cppclass = jit.hint(self.cppclass, promote=True)
         return overload.call(self.rawobject, args_w)
 
     def destruct(self):
diff --git a/pypy/module/cppyy/pythonify.py b/pypy/module/cppyy/pythonify.py
--- a/pypy/module/cppyy/pythonify.py
+++ b/pypy/module/cppyy/pythonify.py
@@ -9,9 +9,9 @@
 class CppyyScopeMeta(type):
     def __getattr__(self, attr):
         try:
-            cppclass = get_cppitem(attr, self)
-            self.__dict__[attr] = cppclass
-            return cppclass
+            cppitem = get_cppitem(attr, self)
+            self.__dict__[attr] = cppitem
+            return cppitem
         except TypeError:
             raise AttributeError("%s object has no attribute '%s'" % (self, 
attr))
 
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to