diff options
Diffstat (limited to 'weave/common_info.py')
-rw-r--r-- | weave/common_info.py | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/weave/common_info.py b/weave/common_info.py new file mode 100644 index 000000000..da2278845 --- /dev/null +++ b/weave/common_info.py @@ -0,0 +1,154 @@ +""" Generic support code for handling standard Numeric arrays +""" + +import base_info + +############################################################# +# Basic module support code +############################################################# + +module_support_code = \ +""" + +char* find_type(PyObject* py_obj) +{ + if(py_obj == NULL) return "C NULL value"; + if(PyCallable_Check(py_obj)) return "callable"; + if(PyString_Check(py_obj)) return "string"; + if(PyInt_Check(py_obj)) return "int"; + if(PyFloat_Check(py_obj)) return "float"; + if(PyDict_Check(py_obj)) return "dict"; + if(PyList_Check(py_obj)) return "list"; + if(PyTuple_Check(py_obj)) return "tuple"; + if(PyFile_Check(py_obj)) return "file"; + if(PyModule_Check(py_obj)) return "module"; + + //should probably do more intergation (and thinking) on these. + if(PyCallable_Check(py_obj) && PyInstance_Check(py_obj)) return "callable"; + if(PyInstance_Check(py_obj)) return "instance"; + if(PyCallable_Check(py_obj)) return "callable"; + return "unkown type"; +} + +void handle_bad_type(PyObject* py_obj, char* good_type, char* var_name) +{ + char msg[500]; + sprintf(msg,"received '%s' type instead of '%s' for variable '%s'", + find_type(py_obj),good_type,var_name); + throw Py::TypeError(msg); +} +""" + +class basic_module_info(base_info.base_info): + _headers = ['"Python.h"'] + _support_code = [module_support_code] + +############################################################# +# File conversion support code +############################################################# + +file_convert_code = \ +""" +FILE* py_to_file(PyObject* py_obj, char* name) +{ + if (!py_obj || !PyFile_Check(py_obj)) + handle_bad_type(py_obj,"file", name); + + // Cleanup code should call DECREF + Py_INCREF(py_obj); + return PyFile_AsFile(py_obj); +} + +PyObject* file_to_py(FILE* file, char* name, char* mode) +{ + PyObject* py_obj = NULL; + //extern int fclose(FILE *); + return (PyObject*) PyFile_FromFile(file, name, mode, fclose); +} + +""" + +class file_info(base_info.base_info): + _headers = ['<stdio.h>'] + _support_code = [file_convert_code] + +############################################################# +# Instance info code +############################################################# + +instance_convert_code = \ +""" +PyObject* py_to_instance(PyObject* py_obj, char* name) +{ + if (!py_obj || !PyFile_Check(py_obj)) + handle_bad_type(py_obj,"instance", name); + + // Should I INCREF??? + // Py_INCREF(py_obj); + // just return the raw python pointer. + return py_obj; +} + +PyObject* instance_to_py(PyObject* instance) +{ + // Don't think I need to do anything... + return (PyObject*) instance; +} + +""" +class instance_info(base_info.base_info): + _support_code = [instance_convert_code] + +############################################################# +# Callable info code +############################################################# + +callable_convert_code = \ +""" +PyObject* py_to_callable(PyObject* py_obj, char* name) +{ + if (!py_obj || !PyCallable_Check(py_obj)) + handle_bad_type(py_obj,"callable", name); + + // Should I INCREF??? + // Py_INCREF(py_obj); + // just return the raw python pointer. + return py_obj; +} + +PyObject* callable_to_py(PyObject* callable) +{ + // Don't think I need to do anything... + return (PyObject*) callable; +} + +""" +class callable_info(base_info.base_info): + _support_code = [callable_convert_code] + +############################################################# +# Module info code +############################################################# + +module_convert_code = \ +""" +PyObject* py_to_module(PyObject* py_obj, char* name) +{ + if (!py_obj || !PyModule_Check(py_obj)) + handle_bad_type(py_obj,"module", name); + + // Should I INCREF??? + // Py_INCREF(py_obj); + // just return the raw python pointer. + return py_obj; +} + +PyObject* module_to_py(PyObject* module) +{ + // Don't think I need to do anything... + return (PyObject*) module; +} + +""" +class module_info(base_info.base_info): + _support_code = [module_convert_code] |