PyAPI: Support for 'None' string args from Python
authorCampbell Barton <ideasman42@gmail.com>
Tue, 30 Oct 2018 05:11:39 +0000 (16:11 +1100)
committerCampbell Barton <ideasman42@gmail.com>
Tue, 30 Oct 2018 05:17:46 +0000 (16:17 +1100)
This is needed because some RNA functions differentiate a NULL 'char *'
argument from an empty string.

Previously a NULL argument could be passed when the C definition
defined the default as NULL and the argument wasn't passed
which is a fairly hidden way of handling things.

Now strings use `PROP_NEVER_NULL` by default
which can be cleared for function arguments that allow None -> NULL.

source/blender/makesrna/intern/rna_define.c
source/blender/python/intern/bpy_rna.c

index 42db80c83c058e54c7ad91a1288b8860d60d8482..6724315f376e317889d01426e6551f8f1d1a1150 100644 (file)
@@ -1165,7 +1165,8 @@ PropertyRNA *RNA_def_property(StructOrFunctionRNA *cont_, const char *identifier
                case PROP_STRING:
                {
                        StringPropertyRNA *sprop = (StringPropertyRNA *)prop;
-
+                       /* By default don't allow NULL string args, callers may clear. */
+                       RNA_def_property_flag(prop, PROP_NEVER_NULL);
                        sprop->defaultvalue = "";
                        break;
                }
index 32d8c01be7666ebca10350e7a1111629d0c6f8ed..b4020c9fc8ffebc64e29c555dbce6a08f72fee29 100644 (file)
@@ -1729,7 +1729,25 @@ static int pyrna_py_to_prop(
                                const int subtype = RNA_property_subtype(prop);
                                const char *param;
 
-                               if (subtype == PROP_BYTESTRING) {
+                               if (value == Py_None) {
+                                       if ((RNA_property_flag(prop) & PROP_NEVER_NULL) == 0) {
+                                               if (data) {
+                                                       *((char **)data) = (char *)NULL;
+                                               }
+                                               else {
+                                                       RNA_property_string_set(ptr, prop, NULL);
+                                               }
+                                       }
+                                       else {
+                                               PyC_Err_Format_Prefix(
+                                                       PyExc_TypeError,
+                                                       "%.200s %.200s.%.200s doesn't support None from string types",
+                                                       error_prefix, RNA_struct_identifier(ptr->type),
+                                                       RNA_property_identifier(prop));
+                                               return -1;
+                                       }
+                               }
+                               else if (subtype == PROP_BYTESTRING) {
 
                                        /* Byte String */