Author: Wim Lavrijsen <[email protected]>
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
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit