[pygobject/invoke-rewrite] [gi]fix cache compile error - now compiles but cache still not hooked up



commit f4cdf0c0321285da015686fcb7115bd91bfd5c7c
Author: John (J5) Palmieri <johnp redhat com>
Date:   Sat Jan 8 20:45:11 2011 -0500

    [gi]fix cache compile error - now compiles but cache still not hooked up

 gi/Makefile.am     |    2 +
 gi/pygi-argument.c |  100 +++++++++++++++---------------
 gi/pygi-argument.h |  174 +++++++++++++++++++++++++++++++++++++++++++---------
 gi/pygi-cache.c    |  169 ++++++++++++++++++++++++--------------------------
 gi/pygi-cache.h    |   25 ++++---
 5 files changed, 293 insertions(+), 177 deletions(-)
---
diff --git a/gi/Makefile.am b/gi/Makefile.am
index 8306784..d460bad 100644
--- a/gi/Makefile.am
+++ b/gi/Makefile.am
@@ -52,6 +52,8 @@ _gi_la_SOURCES = \
 	pygi-private.h \
 	pygi-property.c \
 	pygi-property.h \
+	pygi-cache.h \
+	pygi-cache.c \
 	pygobject-external.h \
 	gimodule.c
 
diff --git a/gi/pygi-argument.c b/gi/pygi-argument.c
index 769bfe1..9525ba0 100644
--- a/gi/pygi-argument.c
+++ b/gi/pygi-argument.c
@@ -2000,7 +2000,7 @@ _pygi_marshal_in_void (PyGIState         *state,
 {
     g_warn_if_fail (arg_cache->transfer == GI_TRANSFER_NOTHING);
 
-    arg.v_pointer = py_arg;
+    (*arg).v_pointer = py_arg;
    
     return TRUE;
 }
@@ -2012,7 +2012,7 @@ _pygi_marshal_in_boolean (PyGIState         *state,
                           PyObject          *py_arg,
                           GIArgument        *arg)
 {
-    arg.v_boolean = PyObject_IsTrue(py_arg);
+    (*arg).v_boolean = PyObject_IsTrue(py_arg);
 
     return TRUE;
 }
@@ -2044,11 +2044,11 @@ _pygi_marshal_in_int8 (PyGIState         *state,
         return FALSE;
 
     if (long_ < -128 || long_ > 127) {
-        PyErr_Format (PyExc_ValueError, "%i not in range %i to %i", long_, -128, 127);
+        PyErr_Format (PyExc_ValueError, "%li not in range %i to %i", long_, -128, 127);
         return FALSE;
     }
 
-    arg.v_long = long_;
+    (*arg).v_long = long_;
 
     return TRUE;
 }
@@ -2080,7 +2080,7 @@ _pygi_marshal_in_uint8 (PyGIState         *state,
         long_ = PYGLIB_PyLong_AsLong(py_long);
         Py_DECREF(py_long);
 
-        if (PyErr_Occured())
+        if (PyErr_Occurred())
             return FALSE;
     } else {
         PyErr_Format (PyExc_TypeError, "Must be number or single byte string, not %s",
@@ -2093,7 +2093,7 @@ _pygi_marshal_in_uint8 (PyGIState         *state,
         return FALSE;
     }
 
-    arg.v_long = long_;
+    (*arg).v_long = long_;
 
     return TRUE;
 }
@@ -2129,7 +2129,7 @@ _pygi_marshal_in_int16 (PyGIState         *state,
         return FALSE;
     }
 
-    arg.v_long = long_;
+    (*arg).v_long = long_;
 
     return TRUE;
 }
@@ -2165,7 +2165,7 @@ _pygi_marshal_in_uint16 (PyGIState         *state,
         return FALSE;
     }
 
-    arg.v_long = long_;
+    (*arg).v_long = long_;
 
     return TRUE;
 }
@@ -2197,11 +2197,11 @@ _pygi_marshal_in_int32 (PyGIState         *state,
         return FALSE;
 
     if (long_ < G_MININT32 || long_ > G_MAXINT32) {
-        PyErr_Format (PyExc_ValueError, "%i not in range %i to %i", long_, G_MININT32, G_MAXINT32);
+        PyErr_Format (PyExc_ValueError, "%li not in range %i to %i", long_, G_MININT32, G_MAXINT32);
         return FALSE;
     }
 
-    arg.v_long = long_;
+    (*arg).v_long = long_;
 
     return TRUE;
 }
@@ -2227,8 +2227,8 @@ _pygi_marshal_in_uint32 (PyGIState         *state,
         return FALSE;
 
 #if PY_VERSION_HEX < 0x03000000
-    if (PyInt_Check (number))
-        long_ = PyInt_AS_LONG (number);
+    if (PyInt_Check (py_long))
+        long_ = PyInt_AS_LONG (py_long);
     else
 #endif
         long_ = PyLong_AsLongLong(py_long);
@@ -2239,11 +2239,11 @@ _pygi_marshal_in_uint32 (PyGIState         *state,
         return FALSE;
 
     if (long_ < 0 || long_ > G_MAXUINT32) {
-        PyErr_Format (PyExc_ValueError, "%lli not in range %i to %lli", long_, 0, G_MAXUINT32);
+        PyErr_Format (PyExc_ValueError, "%lli not in range %i to %u", long_, 0, G_MAXUINT32);
         return FALSE;
     }
 
-    arg.v_uint64 = long_;
+    (*arg).v_uint64 = long_;
 
     return TRUE;
 }
@@ -2269,8 +2269,8 @@ _pygi_marshal_in_int64 (PyGIState         *state,
         return FALSE;
 
 #if PY_VERSION_HEX < 0x03000000
-    if (PyInt_Check (number))
-        long_ = PyInt_AS_LONG (number);
+    if (PyInt_Check (py_long))
+        long_ = PyInt_AS_LONG (py_long);
     else
 #endif
         long_ = PyLong_AsLongLong(py_long);
@@ -2281,11 +2281,11 @@ _pygi_marshal_in_int64 (PyGIState         *state,
         return FALSE;
 
     if (long_ < G_MININT64 || long_ > G_MAXINT64) {
-        PyErr_Format (PyExc_ValueError, "%lli not in range %lli to %lli", long_, G_MININT64, G_MAXINT64);
+        PyErr_Format (PyExc_ValueError, "%lli not in range %li to %li", long_, G_MININT64, G_MAXINT64);
         return FALSE;
     }
 
-    arg.v_uint64 = long_;
+    (*arg).v_uint64 = long_;
 
     return TRUE;
 }
@@ -2311,8 +2311,8 @@ _pygi_marshal_in_uint64 (PyGIState         *state,
         return FALSE;
 
 #if PY_VERSION_HEX < 0x03000000
-    if (PyInt_Check (number))
-        long_ = PyInt_AS_LONG (number);
+    if (PyInt_Check (py_long))
+        long_ = PyInt_AS_LONG (py_long);
     else
 #endif
         long_ = PyLong_AsLongLong(py_long);
@@ -2323,11 +2323,11 @@ _pygi_marshal_in_uint64 (PyGIState         *state,
         return FALSE;
 
     if (long_ < 0 || long_ > G_MAXUINT64) {
-        PyErr_Format (PyExc_ValueError, "%lli not in range %i to %lli", long_, 0, G_MAXUINT64);
+        PyErr_Format (PyExc_ValueError, "%lli not in range %i to %lu", long_, 0, G_MAXUINT64);
         return FALSE;
     }
 
-    arg.v_uint64 = long_;
+    (*arg).v_uint64 = long_;
 
     return TRUE;
 }
@@ -2352,18 +2352,18 @@ _pygi_marshal_in_float (PyGIState         *state,
     if (!py_float)
         return FALSE;
 
-    double_ = PyFLoat_AsDouble(py_float);
+    double_ = PyFloat_AsDouble(py_float);
     Py_DECREF(py_float);
 
     if (PyErr_Occurred())
         return FALSE;
 
     if (double_ < -G_MAXFLOAT || double_ > G_MAXFLOAT) {
-        PyErr_Format (PyExc_ValueError, "%f not in range %f to %f", long_, -G_MAXFLOAT, G_MAXFLOAT);
+        PyErr_Format (PyExc_ValueError, "%f not in range %f to %f", double_, -G_MAXFLOAT, G_MAXFLOAT);
         return FALSE;
     }
 
-    arg.v_double = double_;
+    (*arg).v_double = double_;
 
     return TRUE;
 }
@@ -2388,18 +2388,18 @@ _pygi_marshal_in_double (PyGIState         *state,
     if (!py_float)
         return FALSE;
 
-    double_ = PyFLoat_AsDouble(py_float);
+    double_ = PyFloat_AsDouble(py_float);
     Py_DECREF(py_float);
 
     if (PyErr_Occurred())
         return FALSE;
 
     if (double_ < -G_MAXDOUBLE || double_ > G_MAXDOUBLE) {
-        PyErr_Format (PyExc_ValueError, "%f not in range %f to %f", long_, -G_MAXDOUBLE, G_MAXDOUBLE);
+        PyErr_Format (PyExc_ValueError, "%f not in range %f to %f", double_, -G_MAXDOUBLE, G_MAXDOUBLE);
         return FALSE;
     }
 
-    arg.v_double = double_;
+    (*arg).v_double = double_;
 
     return TRUE;
 }
@@ -2418,8 +2418,8 @@ _pygi_marshal_in_unichar (PyGIState         *state,
        PyObject *py_bytes;
 
        size = PyUnicode_GET_SIZE (py_arg);
-       py_bytes = PyUnicode_AsUTF8String();
-       _string = strdup(PYGLIB_PyBytes_AsString(py_bytes));
+       py_bytes = PyUnicode_AsUTF8String(py_arg);
+       string_ = strdup(PYGLIB_PyBytes_AsString(py_bytes));
        Py_DECREF(py_bytes);
  
 #if PY_VERSION_HEX < 0x03000000
@@ -2445,7 +2445,7 @@ _pygi_marshal_in_unichar (PyGIState         *state,
        return FALSE;
     }
 
-    arg.v_uint32 = g_utf8_get_char(string_);
+    (*arg).v_uint32 = g_utf8_get_char(string_);
     g_free(string_);
 
     return TRUE;
@@ -2464,7 +2464,7 @@ _pygi_marshal_in_gtype (PyGIState         *state,
                       py_arg->ob_type->tp_name);
     } 
 
-    arg.v_long = type_;
+    (*arg).v_long = type_;
     return TRUE;
 }
 gboolean
@@ -2481,12 +2481,12 @@ _pygi_marshal_in_utf8 (PyGIState         *state,
         if (!pystr_obj)
             return FALSE;
 
-        string = g_strdup(PYGLIB_PyBytes_AsString (pystr_obj));
+        string_ = g_strdup(PYGLIB_PyBytes_AsString (pystr_obj));
         Py_DECREF(pystr_obj);
     } 
 #if PY_VERSION_HEX < 0x03000000
     else if (PyString_Check(py_arg)) {
-        string = g_strdup(PyString_AsString (py_arg));
+        string_ = g_strdup(PyString_AsString (py_arg));
     }
 #endif
     else {
@@ -2495,7 +2495,7 @@ _pygi_marshal_in_utf8 (PyGIState         *state,
         return FALSE;
     }
 
-    arg.v_string = string_;
+    (*arg).v_string = string_;
     return TRUE;
 }
 
@@ -2514,12 +2514,12 @@ _pygi_marshal_in_filename (PyGIState         *state,
         if (!pystr_obj)
             return FALSE;
 
-        string = g_strdup(PYGLIB_PyBytes_AsString (pystr_obj));
+        string_ = g_strdup(PYGLIB_PyBytes_AsString (pystr_obj));
         Py_DECREF(pystr_obj);
     } 
 #if PY_VERSION_HEX < 0x03000000
     else if (PyString_Check(py_arg)) {
-        string = g_strdup(PyString_AsString (py_arg));
+        string_ = g_strdup(PyString_AsString (py_arg));
     }
 #endif
     else {
@@ -2528,10 +2528,10 @@ _pygi_marshal_in_filename (PyGIState         *state,
         return FALSE;
     }
 
-    arg.v_string = g_filename_from_utf8 (string_, -1, NULL, NULL, &error);
+    (*arg).v_string = g_filename_from_utf8 (string_, -1, NULL, NULL, &error);
     g_free(string_);
 
-    if (arg.v_string == NULL) {
+    if ((*arg).v_string == NULL) {
         PyErr_SetString (PyExc_Exception, error->message);
         g_error_free(error);
         /* TODO: Convert the error to an exception. */
@@ -2548,13 +2548,13 @@ _pygi_marshal_in_array (PyGIState         *state,
                         PyObject          *py_arg,
                         GIArgument        *arg)
 {
-    PyGIMarshalInFunc *in_marshaller;
+    PyGIMarshalInFunc in_marshaller;
     int i;
     Py_ssize_t length;
-    garray array_ = NULL;
+    GArray *array_ = NULL;
 
     if (py_arg == Py_None) {
-        arg.v_pointer = NULL;
+        (*arg).v_pointer = NULL;
         return TRUE;
     }
 
@@ -2588,30 +2588,30 @@ _pygi_marshal_in_array (PyGIState         *state,
 
     if (arg_cache->sequence_cache->item_cache->type_tag == GI_TYPE_TAG_UINT8 &&
         PYGLIB_PyBytes_Check(py_arg)) {
-        memcpy(array->data, PYGLIB_PyBytes_AsString(py_arg), length);
+        memcpy(array_->data, PYGLIB_PyBytes_AsString(py_arg), length);
 
         goto array_success;
     }
 
-    in_marshaler = arg_cache->sequence_cache->item_cache->in_marshaller;
+    in_marshaller = arg_cache->sequence_cache->item_cache->in_marshaller;
     for (i = 0; i < length; i++) {
         GIArgument item;
         PyObject *py_item = PySequence_GetItem (py_arg, i);
         if (py_item == NULL) {
             int j;
             if (arg_cache->sequence_cache->item_cache->cleanup != NULL) {
-                PyGICleanupFunc *cleanup = arg_cache->sequence_cache->item_cache->cleanup;
-                for(j = 0; j < i; j++)
-                    cleanup(array_->data[j]);
+                PyGIArgCleanupFunc cleanup = arg_cache->sequence_cache->item_cache->cleanup;
+                /*for(j = 0; j < i; j++)
+                    cleanup((gpointer)(array_->data[j]));*/
             }
 
             g_array_free(array_, TRUE);
-            _PyGI_ERROR_PREFIX ("Item %zd: ", i);
+            _PyGI_ERROR_PREFIX ("Item %i: ", i);
             return FALSE;
         }
         arg_cache->sequence_cache->item_cache->in_marshaller(state, 
                                                              function_cache, 
-                                                             item_cache, 
+                                                             arg_cache->sequence_cache->item_cache, 
                                                              py_item, 
                                                              &item);
         g_array_insert_val(array_, i, item);
@@ -2619,7 +2619,7 @@ _pygi_marshal_in_array (PyGIState         *state,
 
 array_success:
 
-    arg.v_pointer = array;
+    (*arg).v_pointer = array_;
     return TRUE;
 }
 
diff --git a/gi/pygi-argument.h b/gi/pygi-argument.h
index 8848d8c..ebb0cd7 100644
--- a/gi/pygi-argument.h
+++ b/gi/pygi-argument.h
@@ -66,35 +66,151 @@ void _pygi_argument_init (void);
 
 
 /*** argument marshaling and validating routines ***/
-PyGIMarshalInFunc _pygi_marshal_in_void;
-PyGIMarshalInFunc _pygi_marshal_in_int8;
-PyGIMarshalInFunc _pygi_marshal_in_uint8;
-PyGIMarshalInFunc _pygi_marshal_in_int16;
-PyGIMarshalInFunc _pygi_marshal_in_uint16;
-PyGIMarshalInFunc _pygi_marshal_in_int32;
-PyGIMarshalInFunc _pygi_marshal_in_uint32;
-PyGIMarshalInFunc _pygi_marshal_in_int64;
-PyGIMarshalInFunc _pygi_marshal_in_float;
-PyGIMarshalInFunc _pygi_marshal_in_double;
-PyGIMarshalInFunc _pygi_marshal_in_unichar;
-PyGIMarshalInFunc _pygi_marshal_in_gtype;
-PyGIMarshalInFunc _pygi_marshal_in_utf8;
-PyGIMarshalInFunc _pygi_marshal_in_filename;
-PyGIMarshalInFunc _pygi_marshal_in_array;
-PyGIMarshalInFunc _pygi_marshal_in_glist;
-PyGIMarshalInFunc _pygi_marshal_in_gslist;
-PyGIMarshalInFunc _pygi_marshal_in_ghash;
-PyGIMarshalInFunc _pygi_marshal_in_gerror;
-PyGIMarshalInFunc _pygi_marshal_in_interface_callback;
-PyGIMarshalInFunc _pygi_marshal_in_interface_enum;
-PyGIMarshalInFunc _pygi_marshal_in_interface_flags;
-PyGIMarshalInFunc _pygi_marshal_in_interface_struct;
-PyGIMarshalInFunc _pygi_marshal_in_interface_interface;
-PyGIMarshalInFunc _pygi_marshal_in_interface_boxed;
-PyGIMarshalInFunc _pygi_marshal_in_interface_object;
-PyGIMarshalInFunc _pygi_marshal_in_interface_union;
-
-
+gboolean _pygi_marshal_in_void        (PyGIState         *state,
+                                       PyGIFunctionCache *function_cache,
+                                       PyGIArgCache      *arg_cache,
+                                       PyObject          *py_arg,
+                                       GIArgument        *arg);
+gboolean _pygi_marshal_in_boolean     (PyGIState         *state,
+                                       PyGIFunctionCache *function_cache,
+                                       PyGIArgCache      *arg_cache,
+                                       PyObject          *py_arg,
+                                       GIArgument        *arg);
+gboolean _pygi_marshal_in_int8        (PyGIState         *state,
+                                       PyGIFunctionCache *function_cache,
+                                       PyGIArgCache      *arg_cache,
+                                       PyObject          *py_arg,
+                                       GIArgument        *arg);
+gboolean _pygi_marshal_in_uint8       (PyGIState         *state,
+                                       PyGIFunctionCache *function_cache,
+                                       PyGIArgCache      *arg_cache,
+                                       PyObject          *py_arg,
+                                       GIArgument        *arg);
+gboolean _pygi_marshal_in_int16       (PyGIState         *state,
+                                       PyGIFunctionCache *function_cache,
+                                       PyGIArgCache      *arg_cache,
+                                       PyObject          *py_arg,
+                                       GIArgument        *arg);
+gboolean _pygi_marshal_in_uint16      (PyGIState         *state,
+                                       PyGIFunctionCache *function_cache,
+                                       PyGIArgCache      *arg_cache,
+                                       PyObject          *py_arg,
+                                       GIArgument        *arg);
+gboolean _pygi_marshal_in_int32       (PyGIState         *state,
+                                       PyGIFunctionCache *function_cache,
+                                       PyGIArgCache      *arg_cache,
+                                       PyObject          *py_arg,
+                                       GIArgument        *arg);
+gboolean _pygi_marshal_in_uint32      (PyGIState         *state,
+                                       PyGIFunctionCache *function_cache,
+                                       PyGIArgCache      *arg_cache,
+                                       PyObject          *py_arg,
+                                       GIArgument        *arg);
+gboolean _pygi_marshal_in_int64       (PyGIState         *state,
+                                       PyGIFunctionCache *function_cache,
+                                       PyGIArgCache      *arg_cache,
+                                       PyObject          *py_arg,
+                                       GIArgument        *arg);
+gboolean _pygi_marshal_in_uint64      (PyGIState         *state,
+                                       PyGIFunctionCache *function_cache,
+                                       PyGIArgCache      *arg_cache,
+                                       PyObject          *py_arg,
+                                       GIArgument        *arg);
+gboolean _pygi_marshal_in_float       (PyGIState         *state,
+                                       PyGIFunctionCache *function_cache,
+                                       PyGIArgCache      *arg_cache,
+                                       PyObject          *py_arg,
+                                       GIArgument        *arg);
+gboolean _pygi_marshal_in_double      (PyGIState         *state,
+                                       PyGIFunctionCache *function_cache,
+                                       PyGIArgCache      *arg_cache,
+                                       PyObject          *py_arg,
+                                       GIArgument        *arg);
+gboolean _pygi_marshal_in_unichar     (PyGIState         *state,
+                                       PyGIFunctionCache *function_cache,
+                                       PyGIArgCache      *arg_cache,
+                                       PyObject          *py_arg,
+                                       GIArgument        *arg);
+gboolean _pygi_marshal_in_gtype       (PyGIState         *state,
+                                       PyGIFunctionCache *function_cache,
+                                       PyGIArgCache      *arg_cache,
+                                       PyObject          *py_arg,
+                                       GIArgument        *arg);
+gboolean _pygi_marshal_in_utf8        (PyGIState         *state,
+                                       PyGIFunctionCache *function_cache,
+                                       PyGIArgCache      *arg_cache,
+                                       PyObject          *py_arg,
+                                       GIArgument        *arg);
+gboolean _pygi_marshal_in_filename    (PyGIState         *state,
+                                       PyGIFunctionCache *function_cache,
+                                       PyGIArgCache      *arg_cache,
+                                       PyObject          *py_arg,
+                                       GIArgument        *arg);
+gboolean _pygi_marshal_in_array       (PyGIState         *state,
+                                       PyGIFunctionCache *function_cache,
+                                       PyGIArgCache      *arg_cache,
+                                       PyObject          *py_arg,
+                                       GIArgument        *arg);
+gboolean _pygi_marshal_in_glist       (PyGIState         *state,
+                                       PyGIFunctionCache *function_cache,
+                                       PyGIArgCache      *arg_cache,
+                                       PyObject          *py_arg,
+                                       GIArgument        *arg);
+gboolean _pygi_marshal_in_gslist      (PyGIState         *state,
+                                       PyGIFunctionCache *function_cache,
+                                       PyGIArgCache      *arg_cache,
+                                       PyObject          *py_arg,
+                                       GIArgument        *arg);
+gboolean _pygi_marshal_in_ghash       (PyGIState         *state,
+                                       PyGIFunctionCache *function_cache,
+                                       PyGIArgCache      *arg_cache,
+                                       PyObject          *py_arg,
+                                       GIArgument        *arg);
+gboolean _pygi_marshal_in_gerror      (PyGIState         *state,
+                                       PyGIFunctionCache *function_cache,
+                                       PyGIArgCache      *arg_cache,
+                                       PyObject          *py_arg,
+                                       GIArgument        *arg);
+gboolean _pygi_marshal_in_interface_callback (PyGIState         *state,
+                                              PyGIFunctionCache *function_cache,
+                                              PyGIArgCache      *arg_cache,
+                                              PyObject          *py_arg,
+                                              GIArgument        *arg);
+gboolean _pygi_marshal_in_interface_enum     (PyGIState         *state,
+                                              PyGIFunctionCache *function_cache,
+                                              PyGIArgCache      *arg_cache,
+                                              PyObject          *py_arg,
+                                              GIArgument        *arg);
+gboolean _pygi_marshal_in_interface_flags    (PyGIState         *state,
+                                              PyGIFunctionCache *function_cache,
+                                              PyGIArgCache      *arg_cache,
+                                              PyObject          *py_arg,
+                                              GIArgument        *arg);
+gboolean _pygi_marshal_in_interface_struct   (PyGIState         *state,
+                                              PyGIFunctionCache *function_cache,
+                                              PyGIArgCache      *arg_cache,
+                                              PyObject          *py_arg,
+                                              GIArgument        *arg);
+gboolean _pygi_marshal_in_interface_interface(PyGIState         *state,
+                                              PyGIFunctionCache *function_cache,
+                                              PyGIArgCache      *arg_cache,
+                                              PyObject          *py_arg,
+                                              GIArgument        *arg);
+gboolean _pygi_marshal_in_interface_boxed    (PyGIState         *state,
+                                              PyGIFunctionCache *function_cache,
+                                              PyGIArgCache      *arg_cache,
+                                              PyObject          *py_arg,
+                                              GIArgument        *arg);
+gboolean _pygi_marshal_in_interface_object   (PyGIState         *state,
+                                              PyGIFunctionCache *function_cache,
+                                              PyGIArgCache      *arg_cache,
+                                              PyObject          *py_arg,
+                                              GIArgument        *arg);
+gboolean _pygi_marshal_in_interface_union    (PyGIState         *state,
+                                              PyGIFunctionCache *function_cache,
+                                              PyGIArgCache      *arg_cache,
+                                              PyObject          *py_arg,
+                                              GIArgument        *arg);
 
 G_END_DECLS
 
diff --git a/gi/pygi-cache.c b/gi/pygi-cache.c
index aa75d3d..4e52a59 100644
--- a/gi/pygi-cache.c
+++ b/gi/pygi-cache.c
@@ -18,10 +18,13 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
  * USA
  */
+#include "pygi-cache.h"
+#include "pygi-argument.h"
+#include <girepository.h>
 
-boolean _arg_cache_generate_metadata_in(PyGIArgCache *arg_cache,
-                                        GITypeInfo *type_info,
-                                        GITypeTag type_tag);
+gboolean _arg_cache_generate_metadata_in(PyGIArgCache *arg_cache,
+                                         GITypeInfo *type_info,
+                                         GITypeTag type_tag);
 
 /* cleanup */
 static inline void
@@ -55,16 +58,15 @@ _pygi_callback_cache_free (PyGICallbackCache *cache)
 }
 
 void
-_pygi_arg_cache_clear (PyGIArgCache *cache);
+_pygi_arg_cache_clear (PyGIArgCache *cache)
 {
     cache->is_aux = FALSE;
     cache->is_pointer = FALSE;
     cache->direction = 0;
     g_base_info_unref(cache->arg_info);
 
-    cache->in_validator = NULL;
-    cache->in_marshaler = NULL;
-    cache->out_marshaler = NULL;
+    cache->in_marshaller = NULL;
+    cache->out_marshaller = NULL;
     cache->cleanup = NULL;
 
     _pygi_sequence_cache_free(cache->sequence_cache);
@@ -108,17 +110,17 @@ _function_cache_new_from_function_info(GIFunctionInfo *function_info)
     fc->is_method = flags & GI_FUNCTION_IS_METHOD;
     fc->is_constructor = flags & GI_FUNCTION_IS_CONSTRUCTOR;
     fc->n_args = g_callable_info_get_n_args ( (GICallableInfo *) function_info);
-    fc->args_cache = g_slice_alloc0(fc->n_args * sizeof(PyGIArgInfo *));
+    fc->args_cache = g_slice_alloc0(fc->n_args * sizeof(PyGIArgCache *));
 
     return fc;
 }
 
-static inline PyGIFunctionCache *
+static inline PyGISequenceCache *
 _sequence_cache_new_from_type_info(GITypeInfo *type_info)
 {
     PyGISequenceCache *sc;
     GITypeInfo *item_type_info;
-    GITypeTag *item_type_tag;
+    GITypeTag item_type_tag;
 
     sc = g_slice_new0(PyGISequenceCache);
 
@@ -131,153 +133,154 @@ _sequence_cache_new_from_type_info(GITypeInfo *type_info)
         sc->len_arg_index = g_type_info_get_array_length (type_info);    
     
     item_type_info = g_type_info_get_param_type (type_info, 0);
-    item_tag_type = g_type_info_get_tag (item_type_info);
+    item_type_tag = g_type_info_get_tag (item_type_info);
 
     sc->item_cache = g_slice_new0(PyGIArgCache);
-    sc->item_cache->type_tag = item_tag_type;
+    sc->item_cache->type_tag = item_type_tag;
 
-    _arg_cache_generate_metadata_in(PyGIArgCache sc->item_cache,
+    _arg_cache_generate_metadata_in(sc->item_cache,
                                     item_type_info,
                                     item_type_tag);
 
  
     g_base_info_unref ( (GIBaseInfo *) item_type_info);
+
+    return sc;
 }
 
 /* process in args */
 
-static inline boolean
+static inline gboolean
 _arg_cache_generate_metadata_in_void(PyGIArgCache *arg_cache)
 {
-     arg_cache->in_marshaler = _pygi_marshal_in_void;
+     arg_cache->in_marshaller = _pygi_marshal_in_void;
 
      return TRUE;
 }
 
-static inline boolean
+static inline gboolean
 _arg_cache_generate_metadata_in_boolean(PyGIArgCache *arg_cache)
 {
-    arg_cache->in_marshaler = _pygi_marshal_in_boolean;
+    arg_cache->in_marshaller = _pygi_marshal_in_boolean;
     return TRUE;
 }
 
-static inline boolean
+static inline gboolean
 _arg_cache_generate_metadata_in_int8(PyGIArgCache *arg_cache)
 {
-    arg_cache->in_marshaler = _pygi_marshal_in_int8;
+    arg_cache->in_marshaller = _pygi_marshal_in_int8;
     return TRUE;
 }
 
-static inline boolean
+static inline gboolean
 _arg_cache_generate_metadata_in_uint8(PyGIArgCache *arg_cache)
 {
-    arg_cache->in_marshaler = _pygi_marshal_in_uint8;
+    arg_cache->in_marshaller = _pygi_marshal_in_uint8;
     return TRUE;
 }
 
-static inline boolean
+static inline gboolean
 _arg_cache_generate_metadata_in_int16(PyGIArgCache *arg_cache)
 {
-    arg_cache->in_marshaler = _pygi_marshal_in_int16;
+    arg_cache->in_marshaller = _pygi_marshal_in_int16;
     return TRUE;
 }
 
-static inline boolean
+static inline gboolean
 _arg_cache_generate_metadata_in_uint16(PyGIArgCache *arg_cache)
 {
-    arg_cache->in_marshaler = _pygi_marshal_in_uint16;
+    arg_cache->in_marshaller = _pygi_marshal_in_uint16;
     return TRUE;
 }
 
-static inline boolean
+static inline gboolean
 _arg_cache_generate_metadata_in_int32(PyGIArgCache *arg_cache)
 {
-    arg_cache->in_marshaler = _pygi_marshal_in_int32;
+    arg_cache->in_marshaller = _pygi_marshal_in_int32;
     return TRUE;
 }
 
-static inline boolean
+static inline gboolean
 _arg_cache_generate_metadata_in_uint32(PyGIArgCache *arg_cache)
 {
-    arg_cache->in_marshaler = _pygi_marshal_in_uint32;
+    arg_cache->in_marshaller = _pygi_marshal_in_uint32;
     return TRUE;
 }
 
-static inline boolean
+static inline gboolean
 _arg_cache_generate_metadata_in_int64(PyGIArgCache *arg_cache)
 {
-    arg_cache->in_marshaler = _pygi_marshal_in_int64;
+    arg_cache->in_marshaller = _pygi_marshal_in_int64;
     return TRUE;
 }
 
-static inline boolean
+static inline gboolean
 _arg_cache_generate_metadata_in_uint64(PyGIArgCache *arg_cache)
 {
-    arg_cache->in_marshaler = _pygi_marshal_in_uint64;
+    arg_cache->in_marshaller = _pygi_marshal_in_uint64;
     return TRUE;
 }
 
-static inline boolean
+static inline gboolean
 _arg_cache_generate_metadata_in_float(PyGIArgCache *arg_cache)
 {
-    arg_cache->in_marshaler = _pygi_marshal_in_float;
+    arg_cache->in_marshaller = _pygi_marshal_in_float;
     return TRUE;
 }
 
-static inline boolean
+static inline gboolean
 _arg_cache_generate_metadata_in_double(PyGIArgCache *arg_cache)
 {
-    arg_cache->in_marshaler = _pygi_marshal_in_double;
+    arg_cache->in_marshaller = _pygi_marshal_in_double;
     return TRUE;
 }
 
-static inline boolean
+static inline gboolean
 _arg_cache_generate_metadata_in_unichar(PyGIArgCache *arg_cache)
 {
-    arg_cache->in_marshaler = _pygi_marshal_in_unichar;
+    arg_cache->in_marshaller = _pygi_marshal_in_unichar;
     return TRUE;
 }
 
-static inline boolean
+static inline gboolean
 _arg_cache_generate_metadata_in_gtype(PyGIArgCache *arg_cache)
 {
-    arg_cache->in_marshaler = _pygi_marshal_in_gtype;
+    arg_cache->in_marshaller = _pygi_marshal_in_gtype;
     return TRUE;
 }
 
-static inline boolean
+static inline gboolean
 _arg_cache_generate_metadata_in_utf8(PyGIArgCache *arg_cache)
 {
-    arg_cache->in_marshaler = _pygi_marshal_in_utf8;
+    arg_cache->in_marshaller = _pygi_marshal_in_utf8;
     if (arg_cache->transfer == GI_TRANSFER_NOTHING)
         arg_cache->cleanup = g_free;
 
     return TRUE;
 }
 
-static inline boolean
+static inline gboolean
 _arg_cache_generate_metadata_in_filename(PyGIArgCache *arg_cache)
 {
-    arg_cache->in_marshaler = _pygi_marshal_in_filename;
+    arg_cache->in_marshaller = _pygi_marshal_in_filename;
     if (arg_cache->transfer == GI_TRANSFER_NOTHING)
         arg_cache->cleanup = g_free;
 
     return TRUE;
 }
 
-static inline boolean
+static inline gboolean
 _arg_cache_generate_metadata_in_array(PyGIArgCache *arg_cache,
                                       GITypeInfo *type_info)
 {
-    GITypeInfo *type_info;
-    arg_cache->in_marshaler = _pygi_marshal_in_array;
+    arg_cache->in_marshaller = _pygi_marshal_in_array;
     arg_cache->sequence_cache = _sequence_cache_new_from_type_info(type_info);
 
     /* arg_cache->cleanup = _pygi_cleanup_array; */
     return TRUE;
 }
 
-static inline boolean
+static inline gboolean
 _arg_cache_generate_metadata_in_interface(PyGIArgCache *arg_cache)
 {
     /* TODO: Switch on GI_INFO_TYPE_ to determine caching */
@@ -286,56 +289,55 @@ _arg_cache_generate_metadata_in_interface(PyGIArgCache *arg_cache)
     return FALSE;
 }
 
-static inline boolean
+static inline gboolean
 _arg_cache_generate_metadata_in_glist(PyGIArgCache *arg_cache,
                                       GITypeInfo *type_info)
 {
-    arg_cache->in_marshaler = _pygi_marshal_in_glist;
+    arg_cache->in_marshaller = _pygi_marshal_in_glist;
     arg_cache->sequence_cache = _sequence_cache_new_from_type_info(type_info);
     /* arg_cache->cleanup = */
 
     return TRUE;
 }
 
-static inline boolean
+static inline gboolean
 _arg_cache_generate_metadata_in_gslist(PyGIArgCache *arg_cache,
                                        GITypeInfo *type_info)
 {
-    arg_cache->in_marshaler = _pygi_marshal_in_gslist;
+    arg_cache->in_marshaller = _pygi_marshal_in_gslist;
     arg_cache->sequence_cache = _sequence_cache_new_from_type_info(type_info);
     /* arg_cache->cleanup = */
 
     return TRUE;
 }
 
-static inline boolean
+static inline gboolean
 _arg_cache_generate_metadata_in_ghash(PyGIArgCache *arg_cache,
                                       GITypeInfo *type_info)
 {
-    arg_cache->in_marshaler = _pygi_marshal_in_ghash;
+    arg_cache->in_marshaller = _pygi_marshal_in_ghash;
     PyErr_Format(PyExc_NotImplementedError,
                  "Caching for this type is not fully implemented yet");
     return FALSE;
 }
 
-static inline boolean
-_arg_cache_generate_metadata_in_error(PyGIArgCache *arg_cache)
+static inline gboolean
+_arg_cache_generate_metadata_in_gerror(PyGIArgCache *arg_cache)
 {
-    arg_cache->in_marshaler = _pygi_marshal_in_error;
+    arg_cache->in_marshaller = _pygi_marshal_in_gerror;
     arg_cache->is_aux = TRUE;
     PyErr_Format(PyExc_NotImplementedError,
                  "Caching for this type is not fully implemented yet");
     return FALSE;
 }
 
-boolean
+gboolean
 _arg_cache_generate_metadata_in(PyGIArgCache *arg_cache,
                                 GITypeInfo *type_info,
                                 GITypeTag type_tag)
 {
-    gboolean success = True;
+    gboolean success = TRUE;
 
-    function_info->n_in_args++;
     switch (type_tag) {
        case GI_TYPE_TAG_VOID:
            success = _arg_cache_generate_metadata_in_void(arg_cache);
@@ -390,8 +392,7 @@ _arg_cache_generate_metadata_in(PyGIArgCache *arg_cache,
                                                            type_info);
            break;
        case GI_TYPE_TAG_INTERFACE:
-           success = _arg_cache_generate_metadata_in_interface(arg_cache,
-                                                               arg_info);
+           success = _arg_cache_generate_metadata_in_interface(arg_cache);
            break;
        case GI_TYPE_TAG_GLIST:
            success = _arg_cache_generate_metadata_in_glist(arg_cache,
@@ -403,27 +404,25 @@ _arg_cache_generate_metadata_in(PyGIArgCache *arg_cache,
            break;
        case GI_TYPE_TAG_GHASH:
            success = _arg_cache_generate_metadata_in_ghash(arg_cache,
-                                                           arg_info);
+                                                           type_info);
            break;
        case GI_TYPE_TAG_ERROR:
-           success = _arg_cache_generate_metadata_in_error(arg_cache,
-                                                           arg_info);
+           success = _arg_cache_generate_metadata_in_gerror(arg_cache);
            break;
     }
 
-    function_cache->in_args =
-        g_slist_append(function_cache->in_args, arg_cache);
-
     return success;
 }
 
-static inline boolean
+static inline gboolean
 _args_cache_generate(GIFunctionInfo *function_info,
                      PyGIFunctionCache *function_cache)
 {
+    int i;
     for (i = 0; i < function_cache->n_args; i++) {
         PyGIArgCache *arg_cache;
         GIArgInfo *arg_info;
+        GITypeInfo *type_info;
 
         /* must be an aux arg filled in by its owner so skip */
         if (function_cache->args_cache[i] != NULL)
@@ -433,42 +432,38 @@ _args_cache_generate(GIFunctionInfo *function_info,
             g_callable_info_get_arg ( (GICallableInfo *) function_info, i);
 
         arg_cache = function_cache->args_cache[i] = g_slice_new0(PyGIArgCache);
-        arg_cache->direction = g_arg_info_get_direction (arg_info);
-        arg_cache->transfer = g_arg_info_get_transfer (arg_info);
-        type_info = g_base_info_get_type ( (GIBaseInfo *) arg_info);
-        type_tag = g_type_info_get_tag (type_info);
+        arg_cache->direction = g_arg_info_get_direction(arg_info);
+        arg_cache->transfer = g_arg_info_get_ownership_transfer (arg_info);
+        type_info = g_base_info_get_type_info ( (GIBaseInfo *) arg_info);
+        arg_cache->type_tag = g_type_info_get_tag (type_info);
 
-        switch(direction) {
+        switch(arg_cache->direction) {
             case GI_DIRECTION_IN:
+                function_cache->n_in_args++;
                 arg_cache->c_arg_index = i + function_cache->is_method;
                 arg_cache->py_arg_index =
-                    function_info->n_in_args + function_cache->is_method;
+                    function_cache->n_in_args + function_cache->is_method;
 
                 _arg_cache_generate_metadata_in(arg_cache,
                                                 type_info,
-                                                type_tag);
+                                                arg_cache->type_tag);
 
+                function_cache->in_args =
+                    g_slist_append(function_cache->in_args, arg_cache);
                 break;
 
             case GI_DIRECTION_OUT:
-                function_info->n_out_args++;
- 		    switch (type_tag) {
-                    case GI_TYPE_TAG_...:
-
-                        ac->out_marshaler = <type marshaling function pointer>
-                        ac->cleanup = <type cleanup function pointer>
-                        fc->out_args = g_slist_append(fc->out_args, ac);
-                        break;
-            }
+                function_cache->n_out_args++;
         }
         g_base_info_unref( (GIBaseInfo *) type_info);
     }
+    return TRUE;
 }
 
 PyGIFunctionCache *
 _pygi_function_cache_new (GIFunctionInfo *function_info)
 {
-    PyGIFunction *fc = _function_cache_new_from_function_info(function_info);
+    PyGIFunctionCache *fc = _function_cache_new_from_function_info(function_info);
     if (!_args_cache_generate(function_info, fc))
         goto err;
 
diff --git a/gi/pygi-cache.h b/gi/pygi-cache.h
index 88a43c8..7453eeb 100644
--- a/gi/pygi-cache.h
+++ b/gi/pygi-cache.h
@@ -30,6 +30,8 @@ G_BEGIN_DECLS
 typedef struct _PyGIFunctionCache PyGIFunctionCache;
 typedef struct _PyGIArgCache PyGIArgCache;
 
+typedef struct _PyGIState PyGIState;
+
 typedef gboolean (*PyGIMarshalInFunc) (PyGIState         *state,
                                        PyGIFunctionCache *function_cache,
                                        PyGIArgCache      *arg_cache,
@@ -58,12 +60,8 @@ typedef struct _PyGIInterfaceCache
 
 typedef struct _PyGIHashCache
 {
-    GITypeTag key_type_tag;
-    PyGIValidateFunc *key_validate_func;
-    PyGIMarshalFunc *key_marshal_func;
-    GITypeTag value_type_tag;
-    PyGIValidateFunc *value_validate_func;
-    PyGIValidateFunc *value_marshal_func;
+    PyGIArgCache *key_cache;
+    PyGIArgCache *value_cache;
 } PyGIHashCache;
 
 typedef struct _PyGICallbackCache
@@ -71,7 +69,7 @@ typedef struct _PyGICallbackCache
     gint py_user_data_index;
     gint user_data_index;
     gint destroy_notify_index;
-    GScope scope;
+    GIScopeType scope;
 } PyGICallbackCache;
 
 struct _PyGIArgCache
@@ -80,17 +78,22 @@ struct _PyGIArgCache
     gboolean is_pointer;
     GIDirection direction;
     GITransfer transfer;
+    GITypeTag type_tag;
     GIArgInfo *arg_info;
     GIArgument *default_value;
 
-    PyGIMashalInFunc in_marshaler;
-    PyGIMarshalOutFunc out_marshaler;
+    PyGIMarshalInFunc in_marshaller;
+    PyGIMarshalOutFunc out_marshaller;
     PyGIArgCleanupFunc cleanup;
 
+    /* FIXME: we should actually subclass ArgCache for each of these 
+     *        types but that requires we know more about the type
+     *        before we create the cache.
+     */
     PyGISequenceCache *sequence_cache;
     PyGIInterfaceCache *interface_cache;
     PyGIHashCache *hash_cache;
-    PyCallbackCache *callback_cache;
+    PyGICallbackCache *callback_cache;
 
     gint c_arg_index;
     gint py_arg_index;
@@ -103,7 +106,7 @@ struct _PyGIFunctionCache
 
     PyGIArgCache **args_cache;
     GSList *in_args;
-    GSList *out_arg;
+    GSList *out_args;
 
     /* counts */
     guint n_in_args;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]