Commit: 8a757bf34ad2d01104e300e0ce529d01f2965e09
Author: Campbell Barton
Date:   Fri Jun 9 07:13:35 2017 +1000
Branches: master
https://developer.blender.org/rB8a757bf34ad2d01104e300e0ce529d01f2965e09

RNA: remove static strings from registration

* Static strings aren't needed anymore, use stack memory.
* Fix obscure leak on failed macro registration.
* Use prefix for wrappers exported from bpy module.

===================================================================

M       source/blender/makesrna/intern/rna_wm.c
M       source/blender/python/intern/bpy_operator_wrap.c
M       source/blender/python/intern/bpy_operator_wrap.h
M       source/blenderplayer/bad_level_call_stubs/stubs.c

===================================================================

diff --git a/source/blender/makesrna/intern/rna_wm.c 
b/source/blender/makesrna/intern/rna_wm.c
index b458b2e69d5..b5ecaf739c7 100644
--- a/source/blender/makesrna/intern/rna_wm.c
+++ b/source/blender/makesrna/intern/rna_wm.c
@@ -939,35 +939,8 @@ static void rna_wmClipboard_set(PointerRNA *UNUSED(ptr), 
const char *value)
 }
 
 #ifdef WITH_PYTHON
-static void rna_Operator_unregister(struct Main *bmain, StructRNA *type)
-{
-       const char *idname;
-       wmOperatorType *ot = RNA_struct_blender_type_get(type);
-       wmWindowManager *wm;
-
-       if (!ot)
-               return;
-
-       /* update while blender is running */
-       wm = bmain->wm.first;
-       if (wm) {
-               WM_operator_stack_clear(wm);
 
-               WM_operator_handlers_clear(wm, ot);
-       }
-       WM_main_add_notifier(NC_SCREEN | NA_EDITED, NULL);
-
-       RNA_struct_free_extension(type, &ot->ext);
-
-       idname = ot->idname;
-       WM_operatortype_remove_ptr(ot);
-       MEM_freeN((void *)idname);
-
-       /* not to be confused with the RNA_struct_free that 
WM_operatortype_remove calls, they are 2 different srna's */
-       RNA_struct_free(&BLENDER_RNA, type);
-}
-
-static int operator_poll(bContext *C, wmOperatorType *ot)
+static int rna_operator_poll_cb(bContext *C, wmOperatorType *ot)
 {
        extern FunctionRNA rna_Operator_poll_func;
 
@@ -992,7 +965,7 @@ static int operator_poll(bContext *C, wmOperatorType *ot)
        return visible;
 }
 
-static int operator_execute(bContext *C, wmOperator *op)
+static int rna_operator_execute_cb(bContext *C, wmOperator *op)
 {
        extern FunctionRNA rna_Operator_execute_func;
 
@@ -1018,7 +991,7 @@ static int operator_execute(bContext *C, wmOperator *op)
 }
 
 /* same as execute() but no return value */
-static bool operator_check(bContext *C, wmOperator *op)
+static bool rna_operator_check_cb(bContext *C, wmOperator *op)
 {
        extern FunctionRNA rna_Operator_check_func;
 
@@ -1043,7 +1016,7 @@ static bool operator_check(bContext *C, wmOperator *op)
        return result;
 }
 
-static int operator_invoke(bContext *C, wmOperator *op, const wmEvent *event)
+static int rna_operator_invoke_cb(bContext *C, wmOperator *op, const wmEvent 
*event)
 {
        extern FunctionRNA rna_Operator_invoke_func;
 
@@ -1070,7 +1043,7 @@ static int operator_invoke(bContext *C, wmOperator *op, 
const wmEvent *event)
 }
 
 /* same as invoke */
-static int operator_modal(bContext *C, wmOperator *op, const wmEvent *event)
+static int rna_operator_modal_cb(bContext *C, wmOperator *op, const wmEvent 
*event)
 {
        extern FunctionRNA rna_Operator_modal_func;
 
@@ -1096,7 +1069,7 @@ static int operator_modal(bContext *C, wmOperator *op, 
const wmEvent *event)
        return result;
 }
 
-static void operator_draw(bContext *C, wmOperator *op)
+static void rna_operator_draw_cb(bContext *C, wmOperator *op)
 {
        extern FunctionRNA rna_Operator_draw_func;
 
@@ -1115,7 +1088,7 @@ static void operator_draw(bContext *C, wmOperator *op)
 }
 
 /* same as exec(), but call cancel */
-static void operator_cancel(bContext *C, wmOperator *op)
+static void rna_operator_cancel_cb(bContext *C, wmOperator *op)
 {
        extern FunctionRNA rna_Operator_cancel_func;
 
@@ -1133,35 +1106,42 @@ static void operator_cancel(bContext *C, wmOperator *op)
        RNA_parameter_list_free(&list);
 }
 
-void operator_wrapper(wmOperatorType *ot, void *userdata);
-void macro_wrapper(wmOperatorType *ot, void *userdata);
+static void rna_Operator_unregister(struct Main *bmain, StructRNA *type);
 
-static char _operator_idname[OP_MAX_TYPENAME];
-static char _operator_name[OP_MAX_TYPENAME];
-static char _operator_descr[RNA_DYN_DESCR_MAX];
-static char _operator_ctxt[RNA_DYN_DESCR_MAX];
-static char _operator_undo_group[OP_MAX_TYPENAME];
-static StructRNA *rna_Operator_register(Main *bmain, ReportList *reports, void 
*data, const char *identifier,
-                                        StructValidateFunc validate, 
StructCallbackFunc call, StructFreeFunc free)
+/* bpy_operator_wrap.c */
+extern void BPY_RNA_operator_wrapper(wmOperatorType *ot, void *userdata);
+extern void BPY_RNA_operator_macro_wrapper(wmOperatorType *ot, void *userdata);
+
+static StructRNA *rna_Operator_register(
+        Main *bmain, ReportList *reports, void *data, const char *identifier,
+        StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc 
free)
 {
        wmOperatorType dummyot = {NULL};
        wmOperator dummyop = {NULL};
        PointerRNA dummyotr;
        int have_function[7];
 
+       struct {
+               char idname[OP_MAX_TYPENAME];
+               char name[OP_MAX_TYPENAME];
+               char descr[RNA_DYN_DESCR_MAX];
+               char ctxt[RNA_DYN_DESCR_MAX];
+               char undo_group[OP_MAX_TYPENAME];
+       } temp_buffers;
+
        /* setup dummy operator & operator type to store static properties in */
        dummyop.type = &dummyot;
-       dummyot.idname = _operator_idname; /* only assigne the pointer, string 
is NULL'd */
-       dummyot.name = _operator_name; /* only assigne the pointer, string is 
NULL'd */
-       dummyot.description = _operator_descr; /* only assigne the pointer, 
string is NULL'd */
-       dummyot.translation_context = _operator_ctxt; /* only assigne the 
pointer, string is NULL'd */
-       dummyot.undo_group = _operator_undo_group; /* only assigne the pointer, 
string is NULL'd */
+       dummyot.idname = temp_buffers.idname; /* only assigne the pointer, 
string is NULL'd */
+       dummyot.name = temp_buffers.name; /* only assigne the pointer, string 
is NULL'd */
+       dummyot.description = temp_buffers.descr; /* only assigne the pointer, 
string is NULL'd */
+       dummyot.translation_context = temp_buffers.ctxt; /* only assigne the 
pointer, string is NULL'd */
+       dummyot.undo_group = temp_buffers.undo_group; /* only assigne the 
pointer, string is NULL'd */
        RNA_pointer_create(NULL, &RNA_Operator, &dummyop, &dummyotr);
 
        /* clear in case they are left unset */
-       _operator_idname[0] = _operator_name[0] = _operator_descr[0] = 
_operator_undo_group[0] = '\0';
+       temp_buffers.idname[0] = temp_buffers.name[0] = temp_buffers.descr[0] = 
temp_buffers.undo_group[0] = '\0';
        /* We have to set default op context! */
-       strcpy(_operator_ctxt, BLT_I18NCONTEXT_OPERATOR_DEFAULT);
+       strcpy(temp_buffers.ctxt, BLT_I18NCONTEXT_OPERATOR_DEFAULT);
 
        /* validate the python class */
        if (validate(&dummyotr, data, have_function) != 0)
@@ -1172,7 +1152,7 @@ static StructRNA *rna_Operator_register(Main *bmain, 
ReportList *reports, void *
 
                /* inconveniently long name sanity check */
                {
-                       char *ch = _operator_idname;
+                       char *ch = temp_buffers.idname;
                        int i;
                        int dot = 0;
                        for (i = 0; *ch; i++) {
@@ -1185,7 +1165,7 @@ static StructRNA *rna_Operator_register(Main *bmain, 
ReportList *reports, void *
                                else {
                                        BKE_reportf(reports, RPT_ERROR,
                                                    "Registering operator 
class: '%s', invalid bl_idname '%s', at position %d",
-                                                   identifier, 
_operator_idname, i);
+                                                   identifier, 
temp_buffers.idname, i);
                                        return NULL;
                                }
 
@@ -1194,7 +1174,7 @@ static StructRNA *rna_Operator_register(Main *bmain, 
ReportList *reports, void *
 
                        if (i > ((int)sizeof(dummyop.idname)) - 3) {
                                BKE_reportf(reports, RPT_ERROR, "Registering 
operator class: '%s', invalid bl_idname '%s', "
-                                           "is too long, maximum length is 
%d", identifier, _operator_idname,
+                                           "is too long, maximum length is 
%d", identifier, temp_buffers.idname,
                                            (int)sizeof(dummyop.idname) - 3);
                                return NULL;
                        }
@@ -1202,34 +1182,34 @@ static StructRNA *rna_Operator_register(Main *bmain, 
ReportList *reports, void *
                        if (dot != 1) {
                                BKE_reportf(reports, RPT_ERROR,
                                            "Registering operator class: '%s', 
invalid bl_idname '%s', must contain 1 '.' character",
-                                           identifier, _operator_idname);
+                                           identifier, temp_buffers.idname);
                                return NULL;
                        }
                }
                /* end sanity check */
 
                {
-                       int idlen = strlen(_operator_idname) + 4;
-                       int namelen = strlen(_operator_name) + 1;
-                       int desclen = strlen(_operator_descr) + 1;
-                       int ctxtlen = strlen(_operator_ctxt) + 1;
-                       int ugrouplen = strlen(_operator_undo_group) + 1;
-                       char *ch;
+                       const uint idname_len = strlen(temp_buffers.idname) + 4;
+                       const uint name_len = strlen(temp_buffers.name) + 1;
+                       const uint desc_len = strlen(temp_buffers.descr) + 1;
+                       const uint ctxt_len = strlen(temp_buffers.ctxt) + 1;
+                       const uint undo_group_len = 
strlen(temp_buffers.undo_group) + 1;
                        /* 2 terminators and 3 to convert a.b -> A_OT_b */
-                       ch = MEM_callocN(sizeof(char) * (idlen + namelen + 
desclen + ctxtlen + ugrouplen), "_operator_idname");
-                       WM_operator_bl_idname(ch, _operator_idname); /* convert 
the idname from python */
+                       char *ch = MEM_mallocN(
+                               sizeof(char) * (idname_len + name_len + 
desc_len + ctxt_len + undo_group_len), __func__);
+                       WM_operator_bl_idname(ch, temp_buffers.idname); /* 
convert the idname from python */
                        dummyot.idname = ch;
-                       ch += idlen;
-                       strcpy(ch, _operator_name);
+                       ch += idname_len;
+                       memcpy(ch, temp_buffers.name, name_len);
                        dummyot.name = ch;
-                       ch += namelen;
-                       strcpy(ch, _operator_descr);
+                       ch += name_len;
+                       memcpy(ch, temp_buffers.descr, desc_len);
                        dummyot.description = ch;
-                       ch += desclen;
-                       strcpy(ch, _operator_ctxt);
+                       ch += desc_len;
+                       memcpy(ch, temp_buffers.ctxt, ctxt_len);
                        dummyot.translation_context = ch;
-                       ch += ctxtlen;
-                       strcpy(ch, _operator_undo_group);
+                       ch += ctxt_len;
+                       memcpy(ch, temp_buffers.undo_group, undo_group_len);
                        dummyot.undo_group = ch;
                }
        }
@@ -1252,14 +1232,14 @@ static StructRNA *rna_Operator_register(Main *bmain, 
ReportList *reports, void *
        dummyot.ext.call = call;
        dummyot.ext.free = free;
 
-       dummyot.pyop_poll = (have_function[0]) ? operator_poll : NULL;
-       dummyot.exec =      (have_function[1]) ? operator_execute : NULL;
-       dummyot.check =     (have_function[2]) ? operator_check : NULL;
-       dummyot.invoke =        (have_function[3]) ? operator_invoke : NULL;
-       dummyot.modal =     (have_function[4]) ? operator_modal : NULL;
-       dummyot.ui =            (have_function[5]) ? operator_draw : NULL;
-       dummyot.cancel =        (have_function[6]) ? operator_cancel : NULL;
-       WM_operatortype_append_ptr(operator_wrapper, (void *)&dummyot);
+       dummyot.pyop_poll = (have_function[0]) ? rna_operator_poll_cb : NULL;
+       dummyot.exec =      (have_function[1]) ? rna_operator_execute_cb : NULL;
+       dummyot.c

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to