[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [33462] trunk/blender/source/blender/ python/intern/bpy_rna.c: disallow setting RNA attributes while drawing, this is bad practice so enforcing here has the benifit of making sure people are not m

Doug Hammond doughammond at hamsterfight.co.uk
Tue Dec 7 20:43:13 CET 2010


Is there an alternative mechanism for achieving the same result available?
>From this revision onwards I've lost the ability to set the object's colour
from the LuxRender material editor, which is something our users find really
useful.

TBH, I'm a bit peeved that something like this would be disabled without
discussion with addon developers and without a reasonable alternative API in
place.


Cheers,
Doug.


On 4 December 2010 06:25, Campbell Barton <ideasman42 at gmail.com> wrote:

> Revision: 33462
>
> http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33462
> Author:   campbellbarton
> Date:     2010-12-04 07:25:36 +0100 (Sat, 04 Dec 2010)
>
> Log Message:
> -----------
> disallow setting RNA attributes while drawing, this is bad practice so
> enforcing here has the benifit of making sure people are not manipulating
> blender scene data in a drawing panel for eg.
>
> This is ifdef'd and may be disabled later on, or only enabled in debug
> mode.
>
> This applies to setting any RNA value that has an ID and is not a screen or
> window-manager datablock.
>
> Some addons break this rule and need fixing but from my tests blender UI
> scripts are ok.
>
> Modified Paths:
> --------------
>    trunk/blender/source/blender/python/intern/bpy_rna.c
>
> Modified: trunk/blender/source/blender/python/intern/bpy_rna.c
> ===================================================================
> --- trunk/blender/source/blender/python/intern/bpy_rna.c        2010-12-04
> 06:21:08 UTC (rev 33461)
> +++ trunk/blender/source/blender/python/intern/bpy_rna.c        2010-12-04
> 06:25:36 UTC (rev 33462)
> @@ -50,6 +50,7 @@
>  #include "DNA_anim_types.h"
>  #include "ED_keyframing.h"
>
> +#define USE_PEDANTIC_WRITE
>  #define USE_MATHUTILS
>  #define USE_STRING_COERCE
>
> @@ -67,7 +68,32 @@
>
>  /* bpyrna vector/euler/quat callbacks */
>  static int mathutils_rna_array_cb_index= -1; /* index for our callbacks */
> +#ifdef USE_PEDANTIC_WRITE
> +static short rna_disallow_writes= FALSE;
>
> +static int rna_id_write_error(PointerRNA *ptr, PyObject *key)
> +{
> +       ID *id= ptr->id.data;
> +       if(id) {
> +               const short idcode= GS(id->name);
> +               if(!ELEM(idcode, ID_WM, ID_SCR)) { /* may need more added
> here */
> +                       const char *idtype= BKE_idcode_to_name(idcode);
> +                       const char *pyname;
> +                       if(key && PyUnicode_Check(key)) pyname=
> _PyUnicode_AsString(key);
> +                       else
>      pyname= "<UNKNOWN>";
> +
> +                       /* make a nice string error */
> +                       assert(idtype != NULL);
> +                       PyErr_Format(PyExc_RuntimeError, "Writing to ID
> classes in this context is not allowed: %.200s, %.200s datablock, error
> setting %.200s.%.200s", id->name+2, idtype,
> RNA_struct_identifier(ptr->type), pyname);
> +
> +                       return TRUE;
> +               }
> +       }
> +       return FALSE;
> +}
> +
> +#endif
> +
>  /* subtype not used much yet */
>  #define MATHUTILS_CB_SUBTYPE_EUL 0
>  #define MATHUTILS_CB_SUBTYPE_VEC 1
> @@ -104,7 +130,13 @@
>        float min, max;
>        if(self->prop==NULL)
>                return 0;
> -
> +
> +#ifdef USE_PEDANTIC_WRITE
> +       if(rna_disallow_writes && rna_id_write_error(&self->ptr, NULL)) {
> +               return 0;
> +       }
> +#endif
> +
>        if (!RNA_property_editable_flag(&self->ptr, self->prop)) {
>                PyErr_Format(PyExc_AttributeError, "bpy_prop
> \"%.200s.%.200s\" is read-only", RNA_struct_identifier(self->ptr.type),
> RNA_property_identifier(self->prop));
>                return 0;
> @@ -157,6 +189,12 @@
>        if(self->prop==NULL)
>                return 0;
>
> +#ifdef USE_PEDANTIC_WRITE
> +       if(rna_disallow_writes && rna_id_write_error(&self->ptr, NULL)) {
> +               return 0;
> +       }
> +#endif
> +
>        if (!RNA_property_editable_flag(&self->ptr, self->prop)) {
>                PyErr_Format(PyExc_AttributeError, "bpy_prop
> \"%.200s.%.200s\" is read-only", RNA_struct_identifier(self->ptr.type),
> RNA_property_identifier(self->prop));
>                return 0;
> @@ -201,7 +239,13 @@
>
>        if(self->prop==NULL)
>                return 0;
> -
> +
> +#ifdef USE_PEDANTIC_WRITE
> +       if(rna_disallow_writes && rna_id_write_error(&self->ptr, NULL)) {
> +               return 0;
> +       }
> +#endif
> +
>        if (!RNA_property_editable_flag(&self->ptr, self->prop)) {
>                PyErr_Format(PyExc_AttributeError, "bpy_prop
> \"%.200s.%.200s\" is read-only", RNA_struct_identifier(self->ptr.type),
> RNA_property_identifier(self->prop));
>                return 0;
> @@ -1903,6 +1947,12 @@
>  {
>        IDProperty *group= RNA_struct_idprops(&self->ptr, 1);
>
> +#ifdef USE_PEDANTIC_WRITE
> +       if(rna_disallow_writes && rna_id_write_error(&self->ptr, key)) {
> +               return -1;
> +       }
> +#endif
> +
>        if(group==NULL) {
>                PyErr_SetString(PyExc_TypeError, "bpy_struct[key] = val: id
> properties not supported for this type");
>                return -1;
> @@ -2727,6 +2777,12 @@
>        char *name = _PyUnicode_AsString(pyname);
>        PropertyRNA *prop= NULL;
>
> +#ifdef USE_PEDANTIC_WRITE
> +       if(rna_disallow_writes && rna_id_write_error(&self->ptr, pyname)) {
> +               return -1;
> +       }
> +#endif
> +
>        if(name == NULL) {
>                PyErr_SetString(PyExc_AttributeError, "bpy_struct:
> __setattr__ must be a string");
>                return -1;
> @@ -2840,6 +2896,12 @@
>        PropertyRNA *prop;
>        PointerRNA r_ptr;
>
> +#ifdef USE_PEDANTIC_WRITE
> +       if(rna_disallow_writes && rna_id_write_error(&self->ptr, pyname)) {
> +               return -1;
> +       }
> +#endif
> +
>        if(name == NULL) {
>                PyErr_SetString(PyExc_AttributeError, "bpy_prop: __setattr__
> must be a string");
>                return -1;
> @@ -5080,7 +5142,11 @@
>        PyGILState_STATE gilstate;
>
>        bContext *C= BPy_GetContext(); // XXX - NEEDS FIXING, QUITE BAD.
> -
> +#ifdef USE_PEDANTIC_WRITE
> +       /* testing, for correctness, not operator and not draw function */
> +       const short is_readonly= strstr("draw",
> RNA_function_identifier(func)) || !RNA_struct_is_a(ptr->type,
> &RNA_Operator);
> +#endif
> +
>        py_class= RNA_struct_py_type_get(ptr->type);
>
>        /* rare case. can happen when registering subclasses */
> @@ -5177,8 +5243,19 @@
>                                i++;
>                        }
>
> +#ifdef USE_PEDANTIC_WRITE
> +                       rna_disallow_writes= is_readonly ? TRUE:FALSE;
> +#endif
> +                       /* *** Main Caller *** */
> +
>                        ret = PyObject_Call(item, args, NULL);
>
> +                       /* *** Done Calling *** */
> +
> +#ifdef USE_PEDANTIC_WRITE
> +                       rna_disallow_writes= FALSE;
> +#endif
> +
>                        RNA_parameter_list_end(&iter);
>                        Py_DECREF(item);
>                        Py_DECREF(args);
>
>
> _______________________________________________
> Bf-blender-cvs mailing list
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>


More information about the Bf-committers mailing list