Generic check for string being a Py keyword
authorCampbell Barton <ideasman42@gmail.com>
Thu, 31 Mar 2016 22:43:11 +0000 (09:43 +1100)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 31 Mar 2016 22:49:16 +0000 (09:49 +1100)
Driver code used incomplete list of Py keywords

source/blender/blenkernel/intern/fcurve.c
source/blender/python/BPY_extern.h
source/blender/python/intern/bpy_interface.c

index 845229e49e35f191c34d82f86960123a2e8c4746..29da218f973778356213321303c2fc0b8c2fe4af 100644 (file)
@@ -1649,15 +1649,12 @@ void driver_variable_name_validate(DriverVar *dvar)
         * NOTE: These won't confuse Python, but it will be impossible to use the variable
         *       in an expression without Python misinterpreting what these are for
         */
         * NOTE: These won't confuse Python, but it will be impossible to use the variable
         *       in an expression without Python misinterpreting what these are for
         */
-       if (STREQ(dvar->name, "if") || STREQ(dvar->name, "elif") || STREQ(dvar->name, "else") ||
-           STREQ(dvar->name, "for") || STREQ(dvar->name, "while") || STREQ(dvar->name, "def") ||
-           STREQ(dvar->name, "True") || STREQ(dvar->name, "False") || STREQ(dvar->name, "import") ||
-           STREQ(dvar->name, "pass")  || STREQ(dvar->name, "with"))
-       {
+#ifdef WITH_PYTHON
+       if (BPY_string_is_keyword(dvar->name)) {
                dvar->flag |= DVAR_FLAG_INVALID_PY_KEYWORD;
        }
                dvar->flag |= DVAR_FLAG_INVALID_PY_KEYWORD;
        }
-       
-       
+#endif
+
        /* If any these conditions match, the name is invalid */
        if (dvar->flag & DVAR_ALL_INVALID_FLAGS)
                dvar->flag |= DVAR_FLAG_INVALID_NAME;
        /* If any these conditions match, the name is invalid */
        if (dvar->flag & DVAR_ALL_INVALID_FLAGS)
                dvar->flag |= DVAR_FLAG_INVALID_NAME;
index d3be59921c028a60a4297817c62c829d6fb4cf5c..4006816e78851bc2a561fd28262d6104e03c69d8 100644 (file)
@@ -95,6 +95,8 @@ void  BPY_context_update(struct bContext *C);
 
 void   BPY_id_release(struct ID *id);
 
 
 void   BPY_id_release(struct ID *id);
 
+bool   BPY_string_is_keyword(const char *str);
+
 /* I18n for addons */
 #ifdef WITH_INTERNATIONAL
 const char *BPY_app_translations_py_pgettext(const char *msgctxt, const char *msgid);
 /* I18n for addons */
 #ifdef WITH_INTERNATIONAL
 const char *BPY_app_translations_py_pgettext(const char *msgctxt, const char *msgid);
index 0c3048dd9d667266b0b81f932049b11be8719c49..b559623f6196a4fcdb9c7d4dab3f7e8afe0c31aa 100644 (file)
@@ -899,6 +899,32 @@ static void bpy_module_free(void *UNUSED(mod))
 
 #endif
 
 
 #endif
 
+/**
+ * Avoids duplicating keyword list.
+ */
+bool BPY_string_is_keyword(const char *str)
+{
+       /* list is from...
+       * ", ".join(['"%s"' % kw for kw in  __import__("keyword").kwlist])
+       */
+       const char *kwlist[] = {
+           "False", "None", "True",
+           "and", "as", "assert", "break",
+           "class", "continue", "def", "del", "elif", "else", "except",
+           "finally", "for", "from", "global", "if", "import", "in",
+           "is", "lambda", "nonlocal", "not", "or", "pass", "raise",
+           "return", "try", "while", "with", "yield", NULL,
+       };
+
+       for (int i = 0; kwlist[i]; i++) {
+               if (STREQ(str, kwlist[i])) {
+                       return true;
+               }
+       }
+
+       return false;
+}
+
 
 /* EVIL, define text.c functions here... */
 /* BKE_text.h */
 
 /* EVIL, define text.c functions here... */
 /* BKE_text.h */