Author: Wim Lavrijsen <wlavrij...@lbl.gov>
Branch: reflex-support
Changeset: r45606:78c5c11329a0
Date: 2011-07-14 15:08 -0700
http://bitbucket.org/pypy/pypy/changeset/78c5c11329a0/

Log:    further progress on CINT backend and some Reflex backend sync

diff --git a/pypy/module/cppyy/capi/cint_capi.py 
b/pypy/module/cppyy/capi/cint_capi.py
--- a/pypy/module/cppyy/capi/cint_capi.py
+++ b/pypy/module/cppyy/capi/cint_capi.py
@@ -89,39 +89,39 @@
 
 c_call_v = rffi.llexternal(
     "cppyy_call_v",
-    [C_TYPEHANDLE, rffi.INT, C_OBJECT, rffi.INT, rffi.VOIDPP], lltype.Void,
+    [C_TYPEHANDLE, rffi.INT, C_OBJECT, rffi.INT, rffi.VOIDP], lltype.Void,
     compilation_info=eci)
 c_call_o = rffi.llexternal(
     "cppyy_call_o",
-    [C_TYPEHANDLE, rffi.INT, C_OBJECT, rffi.INT, rffi.VOIDPP, C_TYPEHANDLE], 
rffi.LONG,
+    [C_TYPEHANDLE, rffi.INT, C_OBJECT, rffi.INT, rffi.VOIDP, C_TYPEHANDLE], 
rffi.LONG,
     compilation_info=eci)
 c_call_b = rffi.llexternal(
     "cppyy_call_b",
-    [C_TYPEHANDLE, rffi.INT, C_OBJECT, rffi.INT, rffi.VOIDPP], rffi.INT,
+    [C_TYPEHANDLE, rffi.INT, C_OBJECT, rffi.INT, rffi.VOIDP], rffi.INT,
     compilation_info=eci)
 c_call_c = rffi.llexternal(
     "cppyy_call_c",
-    [C_TYPEHANDLE, rffi.INT, C_OBJECT, rffi.INT, rffi.VOIDPP], rffi.CHAR,
+    [C_TYPEHANDLE, rffi.INT, C_OBJECT, rffi.INT, rffi.VOIDP], rffi.CHAR,
     compilation_info=eci)
 c_call_h = rffi.llexternal(
     "cppyy_call_h",
-    [C_TYPEHANDLE, rffi.INT, C_OBJECT, rffi.INT, rffi.VOIDPP], rffi.SHORT,
+    [C_TYPEHANDLE, rffi.INT, C_OBJECT, rffi.INT, rffi.VOIDP], rffi.SHORT,
     compilation_info=eci)
 c_call_i = rffi.llexternal(
     "cppyy_call_i",
-    [C_TYPEHANDLE, rffi.INT, C_OBJECT, rffi.INT, rffi.VOIDPP], rffi.INT,
+    [C_TYPEHANDLE, rffi.INT, C_OBJECT, rffi.INT, rffi.VOIDP], rffi.INT,
     compilation_info=eci)
 c_call_l = rffi.llexternal(
     "cppyy_call_l",
-    [C_TYPEHANDLE, rffi.INT, C_OBJECT, rffi.INT, rffi.VOIDPP], rffi.LONG,
+    [C_TYPEHANDLE, rffi.INT, C_OBJECT, rffi.INT, rffi.VOIDP], rffi.LONG,
     compilation_info=eci)
 c_call_f = rffi.llexternal(
     "cppyy_call_f",
-    [C_TYPEHANDLE, rffi.INT, C_OBJECT, rffi.INT, rffi.VOIDPP], rffi.DOUBLE,
+    [C_TYPEHANDLE, rffi.INT, C_OBJECT, rffi.INT, rffi.VOIDP], rffi.DOUBLE,
     compilation_info=eci)
 c_call_d = rffi.llexternal(
     "cppyy_call_d",
-    [C_TYPEHANDLE, rffi.INT, C_OBJECT, rffi.INT, rffi.VOIDPP], rffi.DOUBLE,
+    [C_TYPEHANDLE, rffi.INT, C_OBJECT, rffi.INT, rffi.VOIDP], rffi.DOUBLE,
     compilation_info=eci)
 
 
@@ -131,6 +131,29 @@
     compilation_info=eci)
 
 
+c_allocate_function_args = rffi.llexternal(
+    "cppyy_allocate_function_args",
+    [rffi.SIZE_T], rffi.VOIDP,
+    compilation_info=eci)
+
+c_deallocate_function_args = rffi.llexternal(
+    "cppyy_deallocate_function_args",
+    [rffi.VOIDP], lltype.Void,
+    compilation_info=eci)
+
+c_function_arg_sizeof = rffi.llexternal(
+    "cppyy_function_arg_sizeof",
+    [], rffi.SIZE_T,
+    compilation_info=eci,
+    elidable_function=True)
+
+c_function_arg_typeoffset = rffi.llexternal(
+    "cppyy_function_arg_typeoffset",
+    [], rffi.SIZE_T,
+    compilation_info=eci,
+    elidable_function=True)
+
+
 c_num_methods = rffi.llexternal(
     "cppyy_num_methods",
     [C_TYPEHANDLE], rffi.INT,
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
@@ -369,6 +369,8 @@
     def convert_argument(self, space, w_obj, address):
         x = rffi.cast(rffi.DOUBLEP, address)
         x[0] = self._unwrap_object(space, w_obj)
+        typecode = _direct_ptradd(address, capi.c_function_arg_typeoffset())
+        typecode[0] = 'd'
 
     def convert_argument_libffi(self, space, w_obj, argchain):
         argchain.arg(self._unwrap_object(space, w_obj))
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
@@ -231,6 +231,8 @@
         newthis = capi.c_allocate(self.cpptype.handle)
         assert lltype.typeOf(newthis) == rffi.VOIDP
         try:
+            # TODO: this does not work for CINT, as it calls a temp object
+            # by value returning method, not placement on newthis ...
             CPPMethod.call(self, newthis, None, args_w)
         except Exception, e:
             capi.c_deallocate(self.cpptype.handle, newthis)
diff --git a/pypy/module/cppyy/src/cintcwrapper.cxx 
b/pypy/module/cppyy/src/cintcwrapper.cxx
--- a/pypy/module/cppyy/src/cintcwrapper.cxx
+++ b/pypy/module/cppyy/src/cintcwrapper.cxx
@@ -13,6 +13,7 @@
 #include "TMethod.h"
 #include "TMethodArg.h"
 
+#include <assert.h>
 #include <string.h>
 #include <iostream>
 #include <map>
@@ -81,73 +82,85 @@
 
 /* method/function dispatching -------------------------------------------- */
 long cppyy_call_o(cppyy_typehandle_t handle, int method_index,
-                  cppyy_object_t self, int numargs, void* args[],
+                  cppyy_object_t self, int numargs, void* args,
                   cppyy_typehandle_t rettype) {
-    void* result = cppyy_allocate(rettype);
-    /* TODO: perform call ... */
-    return (long)result;
-}
-
-static inline G__value cppyy_call_T(cppyy_typehandle_t handle,
-        int method_index, cppyy_object_t self, int numargs, void* args[]) {
     TClassRef cr = type_from_handle(handle);
     TMethod* m = (TMethod*)cr->GetListOfMethods()->At(method_index);
 
     G__InterfaceMethod meth = (G__InterfaceMethod)m->InterfaceMethod();
-    G__param libp;
-    for (int i = 0; i < numargs; ++i ) {
-       G__letint(&libp.para[i], 'u', *(long*)args[i]); // TODO: use actual 
type code
-    }
+    G__param* libp = (G__param*)((char*)args - offsetof(G__param, para));
+    assert(libp->paran == numargs);
+
+    long obj = (long)cppyy_allocate(rettype);
+    G__setgvp(obj);
 
     G__value result;
-    meth(&result, 0, &libp, 0);
+    G__setnull(&result);
+    meth(&result, 0, libp, 0);
+
+    // G__pop_tempobject_nodel();      # TODO: not sure ...
+    return obj;
+}
+
+static inline G__value cppyy_call_T(cppyy_typehandle_t handle,
+        int method_index, cppyy_object_t self, int numargs, void* args) {
+    TClassRef cr = type_from_handle(handle);
+    TMethod* m = (TMethod*)cr->GetListOfMethods()->At(method_index);
+
+    G__InterfaceMethod meth = (G__InterfaceMethod)m->InterfaceMethod();
+    G__param* libp = (G__param*)((char*)args - offsetof(G__param, para));
+    assert(libp->paran == numargs);
+
+    G__value result;
+    G__setnull(&result);
+    meth(&result, 0, libp, 0);
     
     return result;
 }
 
 void cppyy_call_v(cppyy_typehandle_t handle, int method_index,
-                  cppyy_object_t self, int numargs, void* args[]) {
+                  cppyy_object_t self, int numargs, void* args) {
    cppyy_call_T(handle, method_index, self, numargs, args);
 }
 
 int cppyy_call_b(cppyy_typehandle_t handle, int method_index,
-                 cppyy_object_t self, int numargs, void* args[]) {
+                 cppyy_object_t self, int numargs, void* args) {
     G__value result = cppyy_call_T(handle, method_index, self, numargs, args);
     return (bool)G__int(result);
 }
 
 char cppyy_call_c(cppyy_typehandle_t handle, int method_index,
-                  cppyy_object_t self, int numargs, void* args[]) {
+                  cppyy_object_t self, int numargs, void* args) {
     G__value result = cppyy_call_T(handle, method_index, self, numargs, args);
     return (char)G__int(result);
 }
 
 short cppyy_call_h(cppyy_typehandle_t handle, int method_index,
-                   cppyy_object_t self, int numargs, void* args[]) {
+                   cppyy_object_t self, int numargs, void* args) {
     G__value result = cppyy_call_T(handle, method_index, self, numargs, args);
     return (short)G__int(result);
 }
 
 int cppyy_call_i(cppyy_typehandle_t handle, int method_index,
-                  cppyy_object_t self, int numargs, void* args[]) {
+                  cppyy_object_t self, int numargs, void* args) {
     G__value result = cppyy_call_T(handle, method_index, self, numargs, args);
     return (int)G__int(result);
 }
 
 long cppyy_call_l(cppyy_typehandle_t handle, int method_index,
-                  cppyy_object_t self, int numargs, void* args[]) {
+                  cppyy_object_t self, int numargs, void* args) {
     G__value result = cppyy_call_T(handle, method_index, self, numargs, args);
     return G__int(result);
 }
 
 double cppyy_call_f(cppyy_typehandle_t handle, int method_index,
-                    cppyy_object_t self, int numargs, void* args[]) {
+                    cppyy_object_t self, int numargs, void* args) {
     G__value result = cppyy_call_T(handle, method_index, self, numargs, args);
     return G__double(result);
 }
 
 double cppyy_call_d(cppyy_typehandle_t handle, int method_index,
-                    cppyy_object_t self, int numargs, void* args[]) {
+                    cppyy_object_t self, int numargs, void* args) {
     G__value result = cppyy_call_T(handle, method_index, self, numargs, args);
     return G__double(result);
 }   
@@ -158,6 +171,30 @@
 }
 
 
+/* handling of function argument buffer ----------------------------------- */
+void* cppyy_allocate_function_args(size_t nargs) {
+    assert(sizeof(CPPYY_G__value) == sizeof(G__value));
+    G__param* libp = (G__param*)malloc(
+        offsetof(G__param, para) + nargs*sizeof(CPPYY_G__value));
+    libp->paran = (int)nargs;
+    for (int i = 0; i < nargs; ++i)
+        libp->para[i].type = 'l';
+    return (void*)libp->para;
+}
+
+void cppyy_deallocate_function_args(void* args) {
+    free((char*)args - offsetof(G__param, para));
+}
+
+size_t cppyy_function_arg_sizeof() {
+    return sizeof(CPPYY_G__value);
+}
+
+size_t cppyy_function_arg_typeoffset() {
+    return offsetof(CPPYY_G__value, type);
+}
+
+
 /* scope reflection information ------------------------------------------- */
 int cppyy_is_namespace(cppyy_typehandle_t handle) {
     TClassRef cr = type_from_handle(handle);
@@ -195,7 +232,7 @@
         return 1;
     TClassRef crd = type_from_handle(dh);
     TClassRef crb = type_from_handle(bh);
-    return (int)crd->GetBaseClass(crb);
+    return crd->GetBaseClass(crb) != 0;
 }
 
 size_t cppyy_base_offset(cppyy_typehandle_t dh, cppyy_typehandle_t bh) {
diff --git a/pypy/module/cppyy/src/reflexcwrapper.cxx 
b/pypy/module/cppyy/src/reflexcwrapper.cxx
--- a/pypy/module/cppyy/src/reflexcwrapper.cxx
+++ b/pypy/module/cppyy/src/reflexcwrapper.cxx
@@ -34,7 +34,7 @@
     std::vector<void*> arguments;
     arguments.reserve(numargs);
     for (int i=0; i < numargs; ++i) {
-        if (((CPPYY_G__value*)args)[i].type == 'l')
+        if (((CPPYY_G__value*)args)[i].type != 'a')
             arguments.push_back(&((CPPYY_G__value*)args)[i]);
         else
             arguments.push_back((void*)(*(long*)&((CPPYY_G__value*)args)[i]));
@@ -200,7 +200,7 @@
 }
 
 
-/* handling of function argument buffer */
+/* handling of function argument buffer ----------------------------------- */
 void* cppyy_allocate_function_args(size_t nargs) {
     CPPYY_G__param* libp = (CPPYY_G__param*)malloc(
         sizeof(int/*CPPYY_G__param.paran*/) + nargs*sizeof(CPPYY_G__value));
diff --git a/pypy/module/cppyy/test/Makefile b/pypy/module/cppyy/test/Makefile
--- a/pypy/module/cppyy/test/Makefile
+++ b/pypy/module/cppyy/test/Makefile
@@ -28,7 +28,7 @@
        $(genreflex) example01.h $(genreflexflags) --selection=example01.xml
        g++ -o $@ example01_rflx.cpp example01.cxx -shared -lReflex $(cppflags) 
$(cppflags2)
 
-# rootcint -f example01_cint.cxx -c example01.h
+# rootcint -f example01_cint.cxx -c example01.h example01_LinkDef.h
 # g++ -I$ROOTSYS/include example01_cint.cxx example01.cxx -shared -o 
example01Dict.so -L$ROOTSYS/lib -lCore -lCint
 
 datatypesDict.so: datatypes.cxx datatypes.h
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to