Author: Wim Lavrijsen <[email protected]>
Branch: cling-support
Changeset: r85671:7e5b01d3cab2
Date: 2016-07-12 11:40 -0700
http://bitbucket.org/pypy/pypy/changeset/7e5b01d3cab2/
Log: simpler template handling
diff --git a/pypy/module/cppyy/capi/builtin_capi.py
b/pypy/module/cppyy/capi/builtin_capi.py
--- a/pypy/module/cppyy/capi/builtin_capi.py
+++ b/pypy/module/cppyy/capi/builtin_capi.py
@@ -53,13 +53,6 @@
compilation_info=backend.eci)
def c_get_scope_opaque(space, name):
return _c_get_scope_opaque(name)
-_c_get_template = rffi.llexternal(
- "cppyy_get_template",
- [rffi.CCHARP], C_TYPE,
- releasegil=ts_reflect,
- compilation_info=backend.eci)
-def c_get_template(space, name):
- return _c_get_template(name)
_c_actual_class = rffi.llexternal(
"cppyy_actual_class",
[C_TYPE, C_OBJECT], C_TYPE,
@@ -238,6 +231,13 @@
compilation_info=backend.eci)
def c_is_namespace(space, scope):
return _c_is_namespace(scope)
+_c_is_template = rffi.llexternal(
+ "cppyy_is_template",
+ [rffi.CCHARP], rffi.INT,
+ releasegil=ts_reflect,
+ compilation_info=backend.eci)
+def c_is_template(space, name):
+ return _c_is_template(name)
_c_is_abstract = rffi.llexternal(
"cppyy_is_abstract",
[C_SCOPE], rffi.INT,
diff --git a/pypy/module/cppyy/capi/loadable_capi.py
b/pypy/module/cppyy/capi/loadable_capi.py
--- a/pypy/module/cppyy/capi/loadable_capi.py
+++ b/pypy/module/cppyy/capi/loadable_capi.py
@@ -126,7 +126,6 @@
'resolve_name' : ([c_ccharp],
c_ccharp),
'get_scope' : ([c_ccharp], c_scope),
- 'get_template' : ([c_ccharp], c_type),
'actual_class' : ([c_type, c_object], c_type),
# memory management
@@ -162,6 +161,7 @@
# scope reflection information
'is_namespace' : ([c_scope], c_int),
+ 'is_template' : ([c_ccharp], c_int),
'is_abstract' : ([c_type], c_int),
'is_enum' : ([c_ccharp], c_int),
@@ -291,8 +291,6 @@
return charp2str_free(space, call_capi(space, 'resolve_name',
[_Arg(s=name)]))
def c_get_scope_opaque(space, name):
return rffi.cast(C_SCOPE, space.uint_w(call_capi(space, 'get_scope',
[_Arg(s=name)])))
-def c_get_template(space, name):
- return rffi.cast(C_TYPE, space.uint_w(call_capi(space, 'get_template',
[_Arg(s=name)])))
def c_actual_class(space, cppclass, cppobj):
args = [_Arg(h=cppclass.handle), _Arg(h=cppobj)]
return rffi.cast(C_TYPE, space.uint_w(call_capi(space, 'actual_class',
args)))
@@ -368,6 +366,8 @@
# scope reflection information -----------------------------------------------
def c_is_namespace(space, scope):
return space.bool_w(call_capi(space, 'is_namespace', [_Arg(h=scope)]))
+def c_is_template(space, name):
+ return space.bool_w(call_capi(space, 'is_template', [_Arg(s=name)]))
def c_is_abstract(space, scope):
return space.bool_w(call_capi(space, 'is_abstract', [_Arg(h=cpptype)]))
def c_is_enum(space, name):
diff --git a/pypy/module/cppyy/include/capi.h b/pypy/module/cppyy/include/capi.h
--- a/pypy/module/cppyy/include/capi.h
+++ b/pypy/module/cppyy/include/capi.h
@@ -26,8 +26,6 @@
RPY_EXTERN
cppyy_scope_t cppyy_get_scope(const char* scope_name);
RPY_EXTERN
- cppyy_type_t cppyy_get_template(const char* template_name);
- RPY_EXTERN
cppyy_type_t cppyy_actual_class(cppyy_type_t klass, cppyy_object_t obj);
/* memory management
------------------------------------------------------ */
@@ -85,6 +83,8 @@
RPY_EXTERN
int cppyy_is_namespace(cppyy_scope_t scope);
RPY_EXTERN
+ int cppyy_is_template(const char* template_name);
+ RPY_EXTERN
int cppyy_is_abstract(cppyy_type_t type);
RPY_EXTERN
int cppyy_is_enum(const char* type_name);
diff --git a/pypy/module/cppyy/include/cpp_cppyy.h
b/pypy/module/cppyy/include/cpp_cppyy.h
--- a/pypy/module/cppyy/include/cpp_cppyy.h
+++ b/pypy/module/cppyy/include/cpp_cppyy.h
@@ -6,21 +6,21 @@
#include <vector>
#include <stddef.h>
-//ROOT types
- typedef long Long_t;
- typedef unsigned long ULong_t;
- typedef long long Long64_t;
- typedef unsigned long long ULong64_t;
- typedef float Float_t;
- typedef double Double_t;
- typedef long double LongDouble_t;
- typedef bool Bool_t;
- typedef char Char_t;
- typedef unsigned char UChar_t;
- typedef short Short_t;
- typedef unsigned short UShort_t;
- typedef int Int_t;
- typedef unsigned int UInt_t;
+// ROOT types
+typedef long Long_t;
+typedef unsigned long ULong_t;
+typedef long long Long64_t;
+typedef unsigned long long ULong64_t;
+typedef float Float_t;
+typedef double Double_t;
+typedef long double LongDouble_t;
+typedef bool Bool_t;
+typedef char Char_t;
+typedef unsigned char UChar_t;
+typedef short Short_t;
+typedef unsigned short UShort_t;
+typedef int Int_t;
+typedef unsigned int UInt_t;
namespace Cppyy {
typedef ptrdiff_t TCppScope_t;
@@ -36,7 +36,6 @@
std::string GetScopeName( TCppScope_t parent, TCppIndex_t iscope );
std::string ResolveName( const std::string& cppitem_name );
TCppScope_t GetScope( const std::string& scope_name );
- TCppType_t GetTemplate( const std::string& template_name );
TCppType_t GetActualClass( TCppType_t klass, TCppObject_t obj );
size_t SizeOf( TCppType_t klass );
@@ -78,6 +77,7 @@
// scope reflection information ----------------------------------------------
Bool_t IsNamespace( TCppScope_t scope );
+ Bool_t IsTemplate( const std::string& template_name );
Bool_t IsAbstract( TCppType_t type );
Bool_t IsEnum( const std::string& type_name );
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
@@ -103,10 +103,8 @@
except KeyError:
pass
- opaque_handle = capi.c_get_template(space, name)
- assert lltype.typeOf(opaque_handle) == capi.C_TYPE
- if opaque_handle:
- cpptemplate = W_CPPTemplateType(space, name, opaque_handle)
+ if capi.c_is_template(space, name):
+ cpptemplate = W_CPPTemplateType(space, name)
state.cpptemplate_cache[name] = cpptemplate
return cpptemplate
@@ -997,14 +995,12 @@
class W_CPPTemplateType(W_Root):
- _attrs_ = ['space', 'name', 'handle']
- _immutable_fields = ['name', 'handle']
+ _attrs_ = ['space', 'name']
+ _immutable_fields = ['name']
- def __init__(self, space, name, opaque_handle):
+ def __init__(self, space, name):
self.space = space
self.name = name
- assert lltype.typeOf(opaque_handle) == capi.C_TYPE
- self.handle = opaque_handle
@unwrap_spec(args_w='args_w')
def __call__(self, args_w):
diff --git a/pypy/module/cppyy/src/clingcwrapper.cxx
b/pypy/module/cppyy/src/clingcwrapper.cxx
--- a/pypy/module/cppyy/src/clingcwrapper.cxx
+++ b/pypy/module/cppyy/src/clingcwrapper.cxx
@@ -178,9 +178,9 @@
return (TCppScope_t)sz;
}
-Cppyy::TCppType_t Cppyy::GetTemplate( const std::string& /* template_name */ )
+Bool_t Cppyy::IsTemplate( const std::string& template_name )
{
- return (TCppType_t)0;
+ return (Bool_t)gInterpreter->CheckClassTemplate( template_name.c_str() );
}
Cppyy::TCppType_t Cppyy::GetActualClass( TCppType_t klass, TCppObject_t obj )
@@ -1082,10 +1082,6 @@
return cppyy_scope_t(Cppyy::GetScope(scope_name));
}
-cppyy_type_t cppyy_get_template(const char* template_name) {
- return cppyy_type_t(Cppyy::GetTemplate(template_name));
-}
-
cppyy_type_t cppyy_actual_class(cppyy_type_t klass, cppyy_object_t obj) {
return cppyy_type_t(Cppyy::GetActualClass(klass, (void*)obj));
}
@@ -1200,6 +1196,10 @@
return (int)Cppyy::IsNamespace(scope);
}
+int cppyy_is_template(const char* template_name) {
+ return (int)Cppyy::IsTemplate(template_name);
+}
+
int cppyy_is_abstract(cppyy_type_t type){
return (int)Cppyy::IsAbstract(type);
}
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit