[pypy-commit] pypy cppyy-packaging: simplify/cleanup
wlav
pypy.commits at gmail.com
Sat Oct 7 09:08:52 EDT 2017
Author: Wim Lavrijsen <WLavrijsen at lbl.gov>
Branch: cppyy-packaging
Changeset: r92589:9e7102e53565
Date: 2017-08-09 19:05 -0700
http://bitbucket.org/pypy/pypy/changeset/9e7102e53565/
Log: simplify/cleanup
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
@@ -706,9 +706,7 @@
class W_CPPScope(W_Root):
_attrs_ = ['space', 'name', 'handle', 'methods', 'datamembers']
- _immutable_fields_ = ['kind', 'name']
-
- kind = "scope"
+ _immutable_fields_ = ['handle', 'name']
def __init__(self, space, name, opaque_handle):
self.space = space
@@ -755,9 +753,6 @@
overload = W_CPPOverload(self.space, self, methods[:])
self.methods[pyname] = overload
- def full_name(self):
- return capi.c_scoped_final_name(self.space, self.handle)
-
def get_method_names(self):
return self.space.newlist([self.space.newtext(name) for name in self.methods])
@@ -790,11 +785,6 @@
return W_CPPOverload(self.space, self, [f])
raise oefmt(self.space.w_LookupError, "no overload matches signature")
- def missing_attribute_error(self, name):
- return oefmt(self.space.w_AttributeError,
- "%s '%s' has no attribute %s",
- self.kind, self.name, name)
-
def __eq__(self, other):
return self.handle == other.handle
@@ -807,9 +797,6 @@
# classes for inheritance. Both are python classes, though, and refactoring
# may be in order at some point.
class W_CPPNamespace(W_CPPScope):
- _immutable_fields_ = ['kind']
-
- kind = "namespace"
def _make_cppfunction(self, pyname, index):
num_args = capi.c_method_num_args(self.space, self, index)
@@ -877,6 +864,10 @@
if dname: alldir.append(self.space.newtext(dname))
return self.space.newlist(alldir)
+ def missing_attribute_error(self, name):
+ return oefmt(self.space.w_AttributeError,
+ "namespace '%s' has no attribute %s", self.name, name)
+
W_CPPNamespace.typedef = TypeDef(
'CPPNamespace',
@@ -892,13 +883,42 @@
class W_CPPClass(W_CPPScope):
_attrs_ = ['space', 'name', 'handle', 'methods', 'datamembers']
- _immutable_fields_ = ['kind', 'constructor', 'methods[*]', 'datamembers[*]']
-
- kind = "class"
+ _immutable_fields_ = ['handle', 'constructor', 'methods[*]', 'datamembers[*]']
def __init__(self, space, name, opaque_handle):
W_CPPScope.__init__(self, space, name, opaque_handle)
+ def _build_methods(self):
+ assert len(self.methods) == 0
+ methods_temp = {}
+ for i in range(capi.c_num_methods(self.space, self)):
+ idx = capi.c_method_index_at(self.space, self, i)
+ pyname = helper.map_operator_name(self.space,
+ capi.c_method_name(self.space, self, idx),
+ capi.c_method_num_args(self.space, self, idx),
+ capi.c_method_result_type(self.space, self, idx))
+ cppmethod = self._make_cppfunction(pyname, idx)
+ methods_temp.setdefault(pyname, []).append(cppmethod)
+ # the following covers the case where the only kind of operator[](idx)
+ # returns are the ones that produce non-const references; these can be
+ # used for __getitem__ just as much as for __setitem__, though
+ if not "__getitem__" in methods_temp:
+ try:
+ for m in methods_temp["__setitem__"]:
+ cppmethod = self._make_cppfunction("__getitem__", m.index)
+ methods_temp.setdefault("__getitem__", []).append(cppmethod)
+ except KeyError:
+ pass # just means there's no __setitem__ either
+
+ # create the overload methods from the method sets
+ for pyname, methods in methods_temp.iteritems():
+ CPPMethodSort(methods).sort()
+ if pyname == self.name:
+ overload = W_CPPConstructorOverload(self.space, self, methods[:])
+ else:
+ overload = W_CPPOverload(self.space, self, methods[:])
+ self.methods[pyname] = overload
+
def _make_cppfunction(self, pyname, index):
num_args = capi.c_method_num_args(self.space, self, index)
args_required = capi.c_method_req_args(self.space, self, index)
@@ -937,9 +957,6 @@
datamember = W_CPPDataMember(self.space, self, type_name, offset)
self.datamembers[datamember_name] = datamember
- def construct(self):
- return self.get_overload(self.name).call(None, [])
-
def find_overload(self, name):
raise self.missing_attribute_error(name)
@@ -965,6 +982,11 @@
bases.append(self.space.newtext(base_name))
return self.space.newlist(bases)
+ def missing_attribute_error(self, name):
+ return oefmt(self.space.w_AttributeError,
+ "class '%s' has no attribute %s", self.name, name)
+
+
W_CPPClass.typedef = TypeDef(
'CPPClass',
type_name = interp_attrproperty('name', W_CPPClass, wrapfn="newtext"),
More information about the pypy-commit
mailing list