Changeset 16655

Show
Ignore:
Timestamp:
06/18/08 22:31:18 (4 months ago)
Author:
piotras
Message:

Define methods' structure per class type. It seems to be safer on 64bit systems.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/midgard/apis/python/py_midgard_object.c

    r16508 r16655  
    11/*  
    2  * Copyright (C) 2007 Piot-> Pokora <piot->ek.pokora@gmail.com> 
     2 * Copyright (C) 2007 Piotr Pokora <piotrek.pokora@gmail.com> 
    33 * 
    44 * This program is free software; you can redistribute it and/or modify it 
     
    425425 
    426426static PyMethodDef pymidgard_object_methods[] = { 
    427         { "get_by_id", (PyCFunction)pymidgard_object_get_by_id, METH_VARARGS }, 
    428         { "get_by_guid", (PyCFunction)pymidgard_object_get_by_guid, METH_VARARGS }, 
    429         { "create", (PyCFunction)pymidgard_object_create, METH_NOARGS }, 
    430         { "update", (PyCFunction)pymidgard_object_update, METH_VARARGS }, 
    431         { "delete", (PyCFunction)pymidgard_object_delete, METH_VARARGS },      
    432         { "purge", (PyCFunction)pymidgard_object_purge, METH_VARARGS }, 
     427        { "get_by_id", (PyCFunction)pymidgard_object_get_by_id, METH_VARARGS, NULL }, 
     428        { "get_by_guid", (PyCFunction)pymidgard_object_get_by_guid, METH_VARARGS, NULL }, 
     429        { "create", (PyCFunction)pymidgard_object_create, METH_NOARGS, NULL }, 
     430        { "update", (PyCFunction)pymidgard_object_update, METH_VARARGS, NULL }, 
     431        { "delete", (PyCFunction)pymidgard_object_delete, METH_VARARGS, NULL },        
     432        { "purge", (PyCFunction)pymidgard_object_purge, METH_VARARGS, NULL }, 
    433433        { "is_in_parent_tree", (PyCFunction)pymidgard_object_is_in_parent_tree, METH_VARARGS }, 
    434434        { "is_in_tree", (PyCFunction)pymidgard_object_is_in_tree, METH_VARARGS }, 
     
    438438        { "list_children", (PyCFunction)pymidgard_object_list_children, METH_VARARGS }, 
    439439        { "get_languages", (PyCFunction)pymidgard_object_get_languages, METH_VARARGS }, 
    440         { "get_by_path", (PyCFunction)pymidgard_object_get_languages, METH_VARARGS }, 
     440        { "get_by_path", (PyCFunction)pymidgard_object_get_by_path, METH_VARARGS }, 
    441441        { "get_parameter", (PyCFunction)pymidgard_object_get_parameter, METH_VARARGS }, 
    442442        { "set_parameter", (PyCFunction)pymidgard_object_set_parameter, METH_VARARGS }, 
     
    453453}; 
    454454 
     455static PyMethodDef *__midgard_object_methods_pmd() 
     456{ 
     457        PyMethodDef *pmd = g_new0(PyMethodDef, 25); 
     458         
     459        pmd[0].ml_name = "get_by_id"; 
     460        pmd[0].ml_meth = (PyCFunction)pymidgard_object_get_by_id; 
     461        pmd[0].ml_flags = METH_VARARGS; 
     462        pmd[0].ml_doc = NULL; 
     463 
     464        pmd[1].ml_name = "get_by_guid";  
     465        pmd[1].ml_meth = (PyCFunction)pymidgard_object_get_by_guid; 
     466        pmd[1].ml_flags = METH_VARARGS; 
     467        pmd[1].ml_doc = NULL; 
     468 
     469        pmd[2].ml_name = "create"; 
     470        pmd[2].ml_meth = (PyCFunction)pymidgard_object_create; 
     471        pmd[2].ml_flags = METH_VARARGS; 
     472        pmd[2].ml_doc = NULL; 
     473 
     474        pmd[3].ml_name = "update"; 
     475        pmd[3].ml_meth = (PyCFunction)pymidgard_object_update; 
     476        pmd[3].ml_flags = METH_VARARGS; 
     477        pmd[3].ml_doc = NULL; 
     478 
     479        pmd[4].ml_name = "delete"; 
     480        pmd[4].ml_meth = (PyCFunction)pymidgard_object_delete; 
     481        pmd[4].ml_flags = METH_VARARGS; 
     482        pmd[4].ml_doc = NULL; 
     483 
     484        pmd[5].ml_name = "purge"; 
     485        pmd[5].ml_meth = (PyCFunction)pymidgard_object_purge; 
     486        pmd[5].ml_flags = METH_VARARGS; 
     487        pmd[5].ml_doc = NULL; 
     488 
     489        pmd[6].ml_name = "is_in_parent_tree"; 
     490        pmd[6].ml_meth = (PyCFunction)pymidgard_object_is_in_parent_tree; 
     491        pmd[6].ml_flags = METH_VARARGS; 
     492        pmd[6].ml_doc = NULL; 
     493 
     494        pmd[7].ml_name = "is_in_tree"; 
     495        pmd[7].ml_meth = (PyCFunction)pymidgard_object_is_in_tree; 
     496        pmd[7].ml_flags = METH_VARARGS; 
     497        pmd[7].ml_doc = NULL; 
     498 
     499        pmd[8].ml_name = "get_parent"; 
     500        pmd[8].ml_meth = (PyCFunction)pymidgard_object_get_parent; 
     501        pmd[8].ml_flags = METH_VARARGS; 
     502        pmd[8].ml_doc = NULL; 
     503 
     504        pmd[9].ml_name = "parent"; 
     505        pmd[9].ml_meth = (PyCFunction)pymidgard_object_parent; 
     506        pmd[9].ml_flags = METH_VARARGS; 
     507        pmd[9].ml_doc = NULL; 
     508 
     509        pmd[10].ml_name = "list"; 
     510        pmd[10].ml_meth = (PyCFunction)pymidgard_object_list; 
     511        pmd[10].ml_flags = METH_VARARGS; 
     512        pmd[10].ml_doc = NULL; 
     513 
     514        pmd[11].ml_name = "list_children"; 
     515        pmd[11].ml_meth = (PyCFunction)pymidgard_object_list_children; 
     516        pmd[11].ml_flags = METH_VARARGS; 
     517        pmd[11].ml_doc = NULL; 
     518 
     519        pmd[12].ml_name = "get_languages"; 
     520        pmd[12].ml_meth = (PyCFunction)pymidgard_object_get_languages; 
     521        pmd[12].ml_flags = METH_VARARGS; 
     522        pmd[12].ml_doc = NULL; 
     523 
     524        pmd[13].ml_name = "get_by_path"; 
     525        pmd[13].ml_meth = (PyCFunction)pymidgard_object_get_by_path; 
     526        pmd[13].ml_flags = METH_VARARGS; 
     527        pmd[13].ml_doc = NULL; 
     528 
     529        pmd[14].ml_name = "get_parameter"; 
     530        pmd[14].ml_meth = (PyCFunction)pymidgard_object_get_parameter; 
     531        pmd[14].ml_flags = METH_VARARGS; 
     532        pmd[14].ml_doc = NULL; 
     533 
     534        pmd[15].ml_name = "set_parameter"; 
     535        pmd[15].ml_meth = (PyCFunction)pymidgard_object_set_parameter; 
     536        pmd[15].ml_flags = METH_VARARGS; 
     537        pmd[15].ml_doc = NULL; 
     538 
     539        pmd[15].ml_name = "delete_parameters"; 
     540        pmd[15].ml_meth = (PyCFunction)pymidgard_object_delete_parameters; 
     541        pmd[15].ml_flags = METH_VARARGS; 
     542        pmd[15].ml_doc = NULL; 
     543 
     544        pmd[16].ml_name = "purge_parameters"; 
     545        pmd[16].ml_meth = (PyCFunction)pymidgard_object_purge_parameters; 
     546        pmd[16].ml_flags = METH_VARARGS; 
     547        pmd[16].ml_doc = NULL; 
     548 
     549        pmd[17].ml_name = "list_parameters"; 
     550        pmd[17].ml_meth = (PyCFunction)pymidgard_object_list_parameters; 
     551        pmd[17].ml_flags = METH_VARARGS; 
     552        pmd[17].ml_doc = NULL; 
     553 
     554        pmd[18].ml_name = "find_parameters"; 
     555        pmd[18].ml_meth = (PyCFunction)pymidgard_object_find_parameters; 
     556        pmd[18].ml_flags = METH_VARARGS; 
     557        pmd[18].ml_doc = NULL; 
     558 
     559        pmd[19].ml_name = "delete_attachments"; 
     560        pmd[19].ml_meth = (PyCFunction)pymidgard_object_delete_attachments; 
     561        pmd[19].ml_flags = METH_VARARGS; 
     562        pmd[19].ml_doc = NULL; 
     563 
     564        pmd[20].ml_name = "purge_attachments"; 
     565        pmd[20].ml_meth = (PyCFunction)pymidgard_object_purge_attachments; 
     566        pmd[20].ml_flags = METH_VARARGS; 
     567        pmd[20].ml_doc = NULL; 
     568 
     569        pmd[21].ml_name = "list_attachments"; 
     570        pmd[21].ml_meth = (PyCFunction)pymidgard_object_list_attachments; 
     571        pmd[21].ml_flags = METH_VARARGS; 
     572        pmd[21].ml_doc = NULL; 
     573 
     574        pmd[22].ml_name = "find_attachments"; 
     575        pmd[22].ml_meth = (PyCFunction)pymidgard_object_find_attachments; 
     576        pmd[22].ml_flags = METH_VARARGS; 
     577        pmd[22].ml_doc = NULL; 
     578 
     579        pmd[23].ml_name = "create_attachment"; 
     580        pmd[23].ml_meth = (PyCFunction)pymidgard_object_create_attachment; 
     581        pmd[23].ml_flags = METH_VARARGS; 
     582        pmd[23].ml_doc = NULL; 
     583 
     584        pmd[24].ml_name = NULL; 
     585        pmd[24].ml_meth = NULL; 
     586        pmd[24].ml_flags = 0; 
     587        pmd[24].ml_doc = NULL; 
     588 
     589        return pmd; 
     590} 
     591 
    455592PyTypeObject *__new_object_struct(const gchar *typename) 
    456593{ 
    457594        /* initialize object type */ 
    458595        PyTypeObject *ot = g_new(PyTypeObject, 1); 
     596 
     597#ifdef Py_TRACE_REFS 
     598        ot->_ob_next = NULL; 
     599        ot->_ob_prev = NULL 
     600#endif 
    459601        ot->ob_refcnt = 1; 
    460602        ot->ob_type = NULL; 
     
    486628        ot->tp_iter = 0; 
    487629        ot->tp_iternext = 0; 
    488         ot->tp_methods = pymidgard_object_methods; 
     630        /* It fails on 64bit systems, so we allocate methods structure per class */ 
     631        /* ot->tp_methods = pymidgard_object_methods; */ 
     632        ot->tp_methods = __midgard_object_methods_pmd(); 
    489633        ot->tp_members = 0; 
    490634        ot->tp_getset = 0; 
     
    506650        ot->tp_weaklist = 0; 
    507651        ot->tp_del = 0; 
    508  
     652         
    509653        return ot; 
    510654} 
     
    527671                typename = g_type_name(all_types[i]); 
    528672                PyTypeObject *ot = __new_object_struct(typename); 
    529                 pygobject_register_class(d,  
     673                 
     674                pygobject_register_class(d, 
    530675                                typename, all_types[i], ot,  
    531676                                Py_BuildValue("(O)", pygobject_type)); 
     677                 
    532678                g_hash_table_insert(_pytype_hash,  
    533679                                (gpointer*)typename, (gpointer *)ot);