[pygobject/invoke-rewrite] [gi]fix cache compile error - now compiles but cache still not hooked up
- From: John Palmieri <johnp src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [pygobject/invoke-rewrite] [gi]fix cache compile error - now compiles but cache still not hooked up
- Date: Sun, 9 Jan 2011 01:45:57 +0000 (UTC)
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]