From cb7c2bf07b5ab92a1ea55e5fdb64826ef9c4d2f0 Mon Sep 17 00:00:00 2001 From: Kai Huuhko Date: Sat, 7 Jun 2014 21:01:01 +0300 Subject: [PATCH] Eolian: Fix obj conversion The generic converter was an idea which didn't work in practise. --- efl/eolian/__init__.pyx | 119 ++++++++++++++++++++++++++-------------- 1 file changed, 79 insertions(+), 40 deletions(-) diff --git a/efl/eolian/__init__.pyx b/efl/eolian/__init__.pyx index 72134fe..664656d 100644 --- a/efl/eolian/__init__.pyx +++ b/efl/eolian/__init__.pyx @@ -75,19 +75,59 @@ EOLIAN_SCOPE_PUBLIC = enums.EOLIAN_SCOPE_PUBLIC EOLIAN_SCOPE_PROTECTED = enums.EOLIAN_SCOPE_PROTECTED -cdef list eina_list_obj_to_python_list(const Eina_List *lst, object cls): +cdef list eina_list_obj_to_python_list(const Eina_List *lst, type cls): cdef: list ret = list() while lst: - o = eolian_obj_to_python_obj(lst.data, cls) + if cls is Class: + o = eolian_class_to_python_obj(lst.data) + elif cls is Function: + o = eolian_func_to_python_obj(lst.data) + elif cls is FunctionParameter: + o = eolian_func_param_to_python_obj(lst.data) + elif cls is Type: + o = eolian_type_to_python_obj(lst.data) + elif cls is Implement: + o = eolian_implement_to_python_obj(lst.data) + elif cls is Event: + o = eolian_event_to_python_obj(lst.data) + else: + print("Unknown type") + return ret.append(o) lst = lst.next return ret -cdef object eolian_obj_to_python_obj(uintptr_t ptr, object cls): - ret = cls.__new__(cls) - ret._set_obj(ptr) +cdef Class eolian_class_to_python_obj(Eolian_Class o): + cdef Class ret = Class.__new__(Class) + ret._set_obj(o) + return ret + +cdef Function eolian_func_to_python_obj(Eolian_Function o): + cdef Function ret = Function.__new__(Function) + ret._set_obj(o) + return ret + +cdef FunctionParameter eolian_func_param_to_python_obj( + Eolian_Function_Parameter o): + cdef FunctionParameter ret = FunctionParameter.__new__(FunctionParameter) + ret._set_obj(o) + return ret + +cdef Type eolian_type_to_python_obj(Eolian_Type o): + cdef Type ret = Type.__new__(Type) + ret._set_obj(o) + return ret + +cdef Implement eolian_implement_to_python_obj(Eolian_Implement o): + cdef Implement ret = Implement.__new__(Implement) + ret._set_obj(o) + return ret + +cdef Event eolian_event_to_python_obj(Eolian_Event o): + cdef Event ret = Event.__new__(Event) + ret._set_obj(o) return ret @@ -163,9 +203,11 @@ def class_find_by_name(class_name): """ if isinstance(class_name, unicode): class_name = PyUnicode_AsUTF8String(class_name) - return eolian_obj_to_python_obj( - eolian_class_find_by_name(class_name), Class - ) + cdef Eolian_Class klass = eolian_class_find_by_name(class_name) + if klass is NULL: + return None + else: + return eolian_class_to_python_obj(klass) def class_find_by_file(file_name): """Finds a class by its location (.eo file) @@ -175,8 +217,8 @@ def class_find_by_file(file_name): """ if isinstance(file_name, unicode): file_name = PyUnicode_AsUTF8String(file_name) - return eolian_obj_to_python_obj( - eolian_class_find_by_file(file_name), Class + return eolian_class_to_python_obj( + eolian_class_find_by_file(file_name) ) @@ -184,8 +226,8 @@ cdef class Class(object): cdef Eolian_Class klass - cdef _set_obj(self, uintptr_t obj): - self.klass = obj + cdef _set_obj(self, Eolian_Class obj): + self.klass = obj def __init__(self): pass @@ -353,11 +395,10 @@ cdef class Class(object): """ if isinstance(func_name, unicode): func_name = PyUnicode_AsUTF8String(func_name) - return eolian_obj_to_python_obj( - eolian_class_function_find_by_name( + return eolian_func_to_python_obj( + eolian_class_function_find_by_name( self.klass, func_name, f_type - ), - Function + ) ) @@ -377,8 +418,8 @@ cdef class Function(object): cdef Eolian_Function function_id - cdef _set_obj(self, uintptr_t obj): - self.function_id = obj + cdef _set_obj(self, Eolian_Function obj): + self.function_id = obj def __init__(self): pass @@ -447,11 +488,10 @@ cdef class Function(object): """ if isinstance(param_name, unicode): param_name = PyUnicode_AsUTF8String(param_name) - return eolian_obj_to_python_obj( - eolian_function_parameter_get( + return eolian_func_param_to_python_obj( + eolian_function_parameter_get( self.function_id, param_name - ), - FunctionParameter + ) ) property property_keys_list: @@ -509,11 +549,10 @@ cdef class Function(object): :return: the types of the function return """ - return eolian_obj_to_python_obj( - eolian_function_return_types_list_get( + return eolian_type_to_python_obj( + eolian_function_return_types_list_get( self.function_id, ftype - ), - Type + ) ) def return_dflt_value_get(self, Eolian_Function_Type ftype): @@ -573,8 +612,8 @@ cdef class FunctionParameter(object): cdef Eolian_Function_Parameter param - cdef _set_obj(self, uintptr_t obj): - self.param = obj + cdef _set_obj(self, Eolian_Function_Parameter obj): + self.param = obj def __init__(self): pass @@ -615,8 +654,8 @@ cdef class FunctionParameter(object): """ def __get__(self): - return eolian_obj_to_python_obj( - eolian_parameter_types_list_get(self.param), Type + return eolian_type_to_python_obj( + eolian_parameter_types_list_get(self.param) ) property name: @@ -655,8 +694,8 @@ cdef class Type(object): cdef Eolian_Type etype - cdef _set_obj(self, uintptr_t obj): - self.etype = obj + cdef _set_obj(self, Eolian_Type obj): + self.etype = obj def __init__(self): pass @@ -708,8 +747,8 @@ cdef class Implement(object): cdef Eolian_Implement impl - cdef _set_obj(self, uintptr_t obj): - self.impl = obj + cdef _set_obj(self, Eolian_Implement obj): + self.impl = obj def __init__(self): pass @@ -744,8 +783,8 @@ cdef class Implement(object): raise RuntimeError("Could not fetch information") return ( - eolian_obj_to_python_obj(klass, Class), - eolian_obj_to_python_obj(function, Function), + eolian_class_to_python_obj(klass), + eolian_func_to_python_obj(function), type ) @@ -754,8 +793,8 @@ cdef class Event(object): cdef Eolian_Event event - cdef _set_obj(self, uintptr_t obj): - self.event = obj + cdef _set_obj(self, Eolian_Event obj): + self.event = obj def __init__(self): pass @@ -790,6 +829,6 @@ def type_find_by_alias(alias): """ if isinstance(alias, unicode): alias = PyUnicode_AsUTF8String(alias) - return eolian_obj_to_python_obj( - eolian_type_find_by_alias(alias), Type + return eolian_type_to_python_obj( + eolian_type_find_by_alias(alias) )