Merged changes in the trunk up to revision 36301.
This commit is contained in:
@@ -513,15 +513,15 @@ static PyObject *BPy_IDGroup_MapDataToPy(IDProperty *prop)
|
||||
for (i=0; i<prop->len; i++) {
|
||||
if (prop->subtype == IDP_FLOAT) {
|
||||
PyList_SET_ITEM(seq, i,
|
||||
PyFloat_FromDouble(((float*)prop->data.pointer)[i]));
|
||||
PyFloat_FromDouble(((float*)prop->data.pointer)[i]));
|
||||
}
|
||||
else if (prop->subtype == IDP_DOUBLE) {
|
||||
PyList_SET_ITEM(seq, i,
|
||||
PyFloat_FromDouble(((double*)prop->data.pointer)[i]));
|
||||
PyFloat_FromDouble(((double*)prop->data.pointer)[i]));
|
||||
}
|
||||
else {
|
||||
PyList_SET_ITEM(seq, i,
|
||||
PyLong_FromLong(((int*)prop->data.pointer)[i]));
|
||||
PyLong_FromLong(((int*)prop->data.pointer)[i]));
|
||||
}
|
||||
}
|
||||
return seq;
|
||||
@@ -588,7 +588,7 @@ static PyObject *BPy_IDGroup_Pop(BPy_IDProperty *self, PyObject *value)
|
||||
/*ok something bad happened with the pyobject,
|
||||
so don't remove the prop from the group. if pyform is
|
||||
NULL, then it already should have raised an exception.*/
|
||||
return NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
IDP_RemFromGroup(self->prop, idprop);
|
||||
|
||||
@@ -132,16 +132,16 @@ static PyObject *Method_##funcname (PyObject *UNUSED(self), PyObject *args) {\
|
||||
int BGL_typeSize(int type)
|
||||
{
|
||||
switch (type) {
|
||||
case GL_BYTE:
|
||||
return sizeof(char);
|
||||
case GL_SHORT:
|
||||
return sizeof(short);
|
||||
case GL_INT:
|
||||
return sizeof(int);
|
||||
case GL_FLOAT:
|
||||
return sizeof(float);
|
||||
case GL_DOUBLE:
|
||||
return sizeof(double);
|
||||
case GL_BYTE:
|
||||
return sizeof(char);
|
||||
case GL_SHORT:
|
||||
return sizeof(short);
|
||||
case GL_INT:
|
||||
return sizeof(int);
|
||||
case GL_FLOAT:
|
||||
return sizeof(float);
|
||||
case GL_DOUBLE:
|
||||
return sizeof(double);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
@@ -293,7 +293,7 @@ static PyObject *Buffer_item(PyObject *self, int i)
|
||||
size= BGL_typeSize(buf->type);
|
||||
|
||||
newbuf= (Buffer *) PyObject_NEW(Buffer, &BGL_bufferType);
|
||||
|
||||
|
||||
Py_INCREF(self);
|
||||
newbuf->parent= self;
|
||||
|
||||
@@ -307,7 +307,7 @@ static PyObject *Buffer_item(PyObject *self, int i)
|
||||
|
||||
return (PyObject *) newbuf;
|
||||
}
|
||||
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -435,7 +435,7 @@ static PyObject *Buffer_dimensions(PyObject *self)
|
||||
Buffer *buffer= (Buffer *) self;
|
||||
PyObject *list= PyList_New(buffer->ndimensions);
|
||||
int i;
|
||||
|
||||
|
||||
for (i= 0; i<buffer->ndimensions; i++) {
|
||||
PyList_SET_ITEM(list, i, PyLong_FromLong(buffer->dimensions[i]));
|
||||
}
|
||||
@@ -804,7 +804,7 @@ BGLU_Wrap(9, UnProject, GLint, (GLdouble, GLdouble, GLdouble, GLdoubleP, GLdo
|
||||
* {"glAccum", Method_Accumfunc, METH_VARARGS} */
|
||||
|
||||
static struct PyMethodDef BGL_methods[] = {
|
||||
{"Buffer", Method_Buffer, METH_VARARGS, Method_Buffer_doc},
|
||||
{"Buffer", Method_Buffer, METH_VARARGS, Method_Buffer_doc},
|
||||
|
||||
/* #ifndef __APPLE__ */
|
||||
MethodDef(Accum),
|
||||
@@ -1641,7 +1641,7 @@ PyObject *BPyInit_bgl(void)
|
||||
EXPP_ADDCONST(GL_TEXTURE_RESIDENT);
|
||||
EXPP_ADDCONST(GL_TEXTURE_BINDING_1D);
|
||||
EXPP_ADDCONST(GL_TEXTURE_BINDING_2D);
|
||||
|
||||
|
||||
return submodule;
|
||||
}
|
||||
|
||||
|
||||
@@ -132,7 +132,7 @@ PyObject *bpy_text_import(Text *text)
|
||||
PyObject *bpy_text_import_name(char *name, int *found)
|
||||
{
|
||||
Text *text;
|
||||
char txtname[22]; /* 21+NULL */
|
||||
char txtname[MAX_ID_NAME-2];
|
||||
int namelen= strlen(name);
|
||||
//XXX Main *maggie= bpy_import_main ? bpy_import_main:G.main;
|
||||
Main *maggie= bpy_import_main;
|
||||
@@ -144,7 +144,7 @@ PyObject *bpy_text_import_name(char *name, int *found)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (namelen>21-3) return NULL; /* we know this cant be importable, the name is too long for blender! */
|
||||
if (namelen >= (MAX_ID_NAME-2) - 3) return NULL; /* we know this cant be importable, the name is too long for blender! */
|
||||
|
||||
memcpy(txtname, name, namelen);
|
||||
memcpy(&txtname[namelen], ".py", 4);
|
||||
@@ -304,7 +304,7 @@ static PyObject *blender_reload(PyObject *UNUSED(self), PyObject * module)
|
||||
}
|
||||
else {
|
||||
/* no blender text was found that could import the module
|
||||
* rause the original error from PyImport_ImportModuleEx */
|
||||
* reuse the original error from PyImport_ImportModuleEx */
|
||||
PyErr_Restore(exception, err, tb);
|
||||
}
|
||||
|
||||
@@ -326,8 +326,8 @@ PyMethodDef bpy_reload_meth= {"bpy_reload_meth", (PyCFunction)blender_reload, ME
|
||||
* it wont reload scripts between loading different blend files or while making the game.
|
||||
* - use 'clear_all' arg in this case.
|
||||
*
|
||||
* Since pythons bultins include a full path even for win32.
|
||||
* even if we remove a python module a reimport will bring it back again.
|
||||
* Since pythons built-ins include a full path even for win32.
|
||||
* even if we remove a python module a re-import will bring it back again.
|
||||
*/
|
||||
|
||||
#if 0 // not used anymore but may still come in handy later
|
||||
|
||||
@@ -841,10 +841,10 @@ static PyObject *M_Geometry_barycentric_transform(PyObject *UNUSED(self), PyObje
|
||||
vec_t1_tar->size != 3 ||
|
||||
vec_t2_tar->size != 3 ||
|
||||
vec_t3_tar->size != 3)
|
||||
{
|
||||
PyErr_SetString(PyExc_ValueError, "One of more of the vector arguments wasnt a 3D vector");
|
||||
return NULL;
|
||||
}
|
||||
{
|
||||
PyErr_SetString(PyExc_ValueError, "One of more of the vector arguments wasnt a 3D vector");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
barycentric_transform(vec, vec_pt->vec,
|
||||
vec_t1_tar->vec, vec_t2_tar->vec, vec_t3_tar->vec,
|
||||
|
||||
@@ -30,6 +30,12 @@
|
||||
|
||||
#include "py_capi_utils.h"
|
||||
|
||||
#include "BKE_font.h" /* only for utf8towchar, should replace with py funcs but too late in release now */
|
||||
|
||||
#ifdef _WIN32 /* BLI_setenv */
|
||||
#include "BLI_path_util.h"
|
||||
#endif
|
||||
|
||||
#define PYC_INTERPRETER_ACTIVE (((PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current)) != NULL)
|
||||
|
||||
/* for debugging */
|
||||
@@ -284,6 +290,48 @@ void PyC_MainModule_Restore(PyObject *main_mod)
|
||||
Py_XDECREF(main_mod);
|
||||
}
|
||||
|
||||
/* must be called before Py_Initialize, expects output of BLI_get_folder(BLENDER_PYTHON, NULL) */
|
||||
void PyC_SetHomePath(const char *py_path_bundle)
|
||||
{
|
||||
if(py_path_bundle==NULL) {
|
||||
/* Common enough to have bundled *nix python but complain on OSX/Win */
|
||||
#if defined(__APPLE__) || defined(_WIN32)
|
||||
fprintf(stderr, "Warning! bundled python not found and is expected on this platform. (if you built with CMake: 'install' target may have not been built)\n");
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
/* set the environment path */
|
||||
printf("found bundled python: %s\n", py_path_bundle);
|
||||
|
||||
#ifdef __APPLE__
|
||||
/* OSX allow file/directory names to contain : character (represented as / in the Finder)
|
||||
but current Python lib (release 3.1.1) doesn't handle these correctly */
|
||||
if(strchr(py_path_bundle, ':'))
|
||||
printf("Warning : Blender application is located in a path containing : or / chars\
|
||||
\nThis may make python import function fail\n");
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
/* cmake/MSVC debug build crashes without this, why only
|
||||
in this case is unknown.. */
|
||||
{
|
||||
BLI_setenv("PYTHONPATH", py_path_bundle);
|
||||
}
|
||||
#endif
|
||||
|
||||
{
|
||||
static wchar_t py_path_bundle_wchar[1024];
|
||||
|
||||
/* cant use this, on linux gives bug: #23018, TODO: try LANG="en_US.UTF-8" /usr/bin/blender, suggested 22008 */
|
||||
/* mbstowcs(py_path_bundle_wchar, py_path_bundle, FILE_MAXDIR); */
|
||||
|
||||
utf8towchar(py_path_bundle_wchar, py_path_bundle);
|
||||
|
||||
Py_SetPythonHome(py_path_bundle_wchar);
|
||||
// printf("found python (wchar_t) '%ls'\n", py_path_bundle_wchar);
|
||||
}
|
||||
}
|
||||
|
||||
/* Would be nice if python had this built in */
|
||||
void PyC_RunQuicky(const char *filepath, int n, ...)
|
||||
{
|
||||
|
||||
@@ -48,4 +48,6 @@ void PyC_RunQuicky(const char *filepath, int n, ...);
|
||||
void PyC_MainModule_Backup(PyObject **main_mod);
|
||||
void PyC_MainModule_Restore(PyObject *main_mod);
|
||||
|
||||
void PyC_SetHomePath(const char *py_path_bundle);
|
||||
|
||||
#endif // PY_CAPI_UTILS_H
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
#include "BLI_bpath.h"
|
||||
#include "BLI_utildefines.h"
|
||||
|
||||
|
||||
#include "BKE_main.h"
|
||||
#include "BKE_global.h" /* XXX, G.main only */
|
||||
#include "BKE_blender.h"
|
||||
|
||||
@@ -78,12 +78,12 @@ static PyObject *bpy_script_paths(PyObject *UNUSED(self))
|
||||
{
|
||||
PyObject *ret= PyTuple_New(2);
|
||||
char *path;
|
||||
|
||||
|
||||
path= BLI_get_folder(BLENDER_USER_SCRIPTS, NULL);
|
||||
PyTuple_SET_ITEM(ret, 0, PyUnicode_FromString(path?path:""));
|
||||
path= BLI_get_folder(BLENDER_SYSTEM_SCRIPTS, NULL);
|
||||
PyTuple_SET_ITEM(ret, 1, PyUnicode_FromString(path?path:""));
|
||||
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -113,7 +113,7 @@ static PyObject *bpy_blend_paths(PyObject *UNUSED(self), PyObject *args, PyObjec
|
||||
|
||||
list= PyList_New(0);
|
||||
|
||||
for(BLI_bpathIterator_init(&bpi, G.main, NULL, 0); !BLI_bpathIterator_isDone(bpi); BLI_bpathIterator_step(bpi)) {
|
||||
for(BLI_bpathIterator_init(&bpi, G.main, G.main->name, 0); !BLI_bpathIterator_isDone(bpi); BLI_bpathIterator_step(bpi)) {
|
||||
/* build the list */
|
||||
if (absolute) {
|
||||
BLI_bpathIterator_getPathExpanded(bpi, filepath_expanded);
|
||||
|
||||
@@ -255,7 +255,7 @@ float BPY_driver_exec(ChannelDriver *driver)
|
||||
|
||||
if(use_gil)
|
||||
PyGILState_Release(gilstate);
|
||||
|
||||
|
||||
if(finite(result)) {
|
||||
return (float)result;
|
||||
}
|
||||
|
||||
@@ -164,52 +164,6 @@ void BPY_modules_update(bContext *C)
|
||||
bpy_context_module->ptr.data= (void *)C;
|
||||
}
|
||||
|
||||
/* must be called before Py_Initialize */
|
||||
#ifndef WITH_PYTHON_MODULE
|
||||
static void bpy_python_start_path(void)
|
||||
{
|
||||
char *py_path_bundle= BLI_get_folder(BLENDER_PYTHON, NULL);
|
||||
|
||||
if(py_path_bundle==NULL) {
|
||||
/* Common enough to have bundled *nix python but complain on OSX/Win */
|
||||
#if defined(__APPLE__) || defined(_WIN32)
|
||||
fprintf(stderr, "Warning! bundled python not found and is expected on this platform. (if you built with CMake: 'install' target may have not been built)\n");
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
/* set the environment path */
|
||||
printf("found bundled python: %s\n", py_path_bundle);
|
||||
|
||||
#ifdef __APPLE__
|
||||
/* OSX allow file/directory names to contain : character (represented as / in the Finder)
|
||||
but current Python lib (release 3.1.1) doesn't handle these correctly */
|
||||
if(strchr(py_path_bundle, ':'))
|
||||
printf("Warning : Blender application is located in a path containing : or / chars\
|
||||
\nThis may make python import function fail\n");
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
/* cmake/MSVC debug build crashes without this, why only
|
||||
in this case is unknown.. */
|
||||
{
|
||||
BLI_setenv("PYTHONPATH", py_path_bundle);
|
||||
}
|
||||
#endif
|
||||
|
||||
{
|
||||
static wchar_t py_path_bundle_wchar[FILE_MAX];
|
||||
|
||||
/* cant use this, on linux gives bug: #23018, TODO: try LANG="en_US.UTF-8" /usr/bin/blender, suggested 22008 */
|
||||
/* mbstowcs(py_path_bundle_wchar, py_path_bundle, FILE_MAXDIR); */
|
||||
|
||||
utf8towchar(py_path_bundle_wchar, py_path_bundle);
|
||||
|
||||
Py_SetPythonHome(py_path_bundle_wchar);
|
||||
// printf("found python (wchar_t) '%ls'\n", py_path_bundle_wchar);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void BPY_context_set(bContext *C)
|
||||
{
|
||||
BPy_SetContext(C);
|
||||
@@ -242,7 +196,8 @@ void BPY_python_start(int argc, const char **argv)
|
||||
/* must run before python initializes */
|
||||
PyImport_ExtendInittab(bpy_internal_modules);
|
||||
|
||||
bpy_python_start_path(); /* allow to use our own included python */
|
||||
/* allow to use our own included python */
|
||||
PyC_SetHomePath(BLI_get_folder(BLENDER_PYTHON, NULL));
|
||||
|
||||
/* Python 3.2 now looks for '2.57/python/include/python3.2d/pyconfig.h' to parse
|
||||
* from the 'sysconfig' module which is used by 'site', so for now disable site.
|
||||
@@ -713,8 +668,8 @@ static struct PyModuleDef bpy_proxy_def= {
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
PyObject_HEAD
|
||||
/* Type-specific fields go here. */
|
||||
PyObject_HEAD
|
||||
/* Type-specific fields go here. */
|
||||
PyObject *mod;
|
||||
} dealloc_obj;
|
||||
|
||||
|
||||
@@ -129,7 +129,7 @@ static PyObject *bpy_prop_deferred_return(PyObject *func, PyObject *kw)
|
||||
}
|
||||
|
||||
/* this define runs at the start of each function and deals with
|
||||
* returning a deferred property (to be registed later) */
|
||||
* returning a deferred property (to be registered later) */
|
||||
#define BPY_PROPDEF_HEAD(_func) \
|
||||
if (PyTuple_GET_SIZE(args) == 1) { \
|
||||
PyObject *ret; \
|
||||
@@ -140,7 +140,7 @@ static PyObject *bpy_prop_deferred_return(PyObject *func, PyObject *kw)
|
||||
return ret; \
|
||||
} \
|
||||
else if (PyTuple_GET_SIZE(args) > 1) { \
|
||||
PyErr_SetString(PyExc_ValueError, "all args must be keywords"); \
|
||||
PyErr_SetString(PyExc_ValueError, "all args must be keywords"); \
|
||||
return NULL; \
|
||||
} \
|
||||
srna= srna_from_self(self, #_func"(...):"); \
|
||||
@@ -762,7 +762,7 @@ static StructRNA *pointer_type_from_py(PyObject *value, const char *error_prefix
|
||||
}
|
||||
|
||||
if(!RNA_struct_is_a(srna, &RNA_PropertyGroup)) {
|
||||
PyErr_Format(PyExc_TypeError, "%.200s expected an RNA type derived from PropertyGroup", error_prefix);
|
||||
PyErr_Format(PyExc_TypeError, "%.200s expected an RNA type derived from PropertyGroup", error_prefix);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -884,7 +884,7 @@ static PyObject *BPy_RemoveProperty(PyObject *self, PyObject *args, PyObject *kw
|
||||
return ret;
|
||||
}
|
||||
else if (PyTuple_GET_SIZE(args) > 1) {
|
||||
PyErr_SetString(PyExc_ValueError, "all args must be keywords"); \
|
||||
PyErr_SetString(PyExc_ValueError, "all args must be keywords"); \
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -948,7 +948,7 @@ PyObject *BPY_rna_props( void )
|
||||
|
||||
/* INCREF since its its assumed that all these functions return the
|
||||
* module with a new ref like PyDict_New, since they are passed to
|
||||
* PyModule_AddObject which steals a ref */
|
||||
* PyModule_AddObject which steals a ref */
|
||||
Py_INCREF(submodule);
|
||||
|
||||
/* api needs the PyObjects internally */
|
||||
|
||||
@@ -144,7 +144,7 @@ struct GHash *id_weakref_pool= NULL;
|
||||
static PyObject *id_free_weakref_cb(PyObject *weakinfo_pair, PyObject *weakref);
|
||||
static PyMethodDef id_free_weakref_cb_def= {"id_free_weakref_cb", (PyCFunction)id_free_weakref_cb, METH_O, NULL};
|
||||
|
||||
/* adds a reference to the list, remember ot decref */
|
||||
/* adds a reference to the list, remember to decref */
|
||||
static GHash *id_weakref_pool_get(ID *id)
|
||||
{
|
||||
GHash *weakinfo_hash= NULL;
|
||||
@@ -548,7 +548,7 @@ static short pyrna_rotation_euler_order_get(PointerRNA *ptr, PropertyRNA **prop_
|
||||
#endif // USE_MATHUTILS
|
||||
|
||||
/* note that PROP_NONE is included as a vector subtype. this is because its handy to
|
||||
* have x/y access to fcurve keyframes and other fixed size float arrayas of length 2-4. */
|
||||
* have x/y access to fcurve keyframes and other fixed size float arrays of length 2-4. */
|
||||
#define PROP_ALL_VECTOR_SUBTYPES PROP_COORDS: case PROP_TRANSLATION: case PROP_DIRECTION: case PROP_VELOCITY: case PROP_ACCELERATION: case PROP_XYZ: case PROP_XYZ_LENGTH
|
||||
|
||||
PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop)
|
||||
@@ -573,7 +573,7 @@ PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop)
|
||||
|
||||
if (totdim == 1 || (totdim == 2 && subtype == PROP_MATRIX)) {
|
||||
if(!is_thick)
|
||||
ret= pyrna_prop_CreatePyObject(ptr, prop); /* owned by the Mathutils PyObject */
|
||||
ret= pyrna_prop_CreatePyObject(ptr, prop); /* owned by the mathutils PyObject */
|
||||
|
||||
switch(RNA_property_subtype(prop)) {
|
||||
case PROP_ALL_VECTOR_SUBTYPES:
|
||||
@@ -668,7 +668,7 @@ PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop)
|
||||
ret= pyrna_prop_array_subscript_slice(NULL, ptr, prop, 0, len, len);
|
||||
}
|
||||
else {
|
||||
ret= pyrna_prop_CreatePyObject(ptr, prop); /* owned by the Mathutils PyObject */
|
||||
ret= pyrna_prop_CreatePyObject(ptr, prop); /* owned by the mathutils PyObject */
|
||||
}
|
||||
}
|
||||
#else // USE_MATHUTILS
|
||||
@@ -1670,7 +1670,7 @@ static int pyrna_py_to_prop_array_index(BPy_PropertyArrayRNA *self, int index, P
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* see if we can coorce into a python type - PropertyType */
|
||||
/* see if we can coerce into a python type - PropertyType */
|
||||
switch (RNA_property_type(prop)) {
|
||||
case PROP_BOOLEAN:
|
||||
{
|
||||
@@ -1744,7 +1744,7 @@ static Py_ssize_t pyrna_prop_collection_length(BPy_PropertyRNA *self)
|
||||
return RNA_property_collection_length(&self->ptr, self->prop);
|
||||
}
|
||||
|
||||
/* bool funcs are for speed, so we can avoid getting the length
|
||||
/* bool functions are for speed, so we can avoid getting the length
|
||||
* of 1000's of items in a linked list for eg. */
|
||||
static int pyrna_prop_array_bool(BPy_PropertyRNA *self)
|
||||
{
|
||||
@@ -1885,7 +1885,7 @@ static PyObject *pyrna_prop_array_subscript_slice(BPy_PropertyArrayRNA *self, Po
|
||||
|
||||
tuple= PyTuple_New(stop - start);
|
||||
|
||||
/* PYRNA_PROP_CHECK_OBJ(self) isnt needed, internal use only */
|
||||
/* PYRNA_PROP_CHECK_OBJ(self) isn't needed, internal use only */
|
||||
|
||||
totdim= RNA_property_array_dimension(ptr, prop, NULL);
|
||||
|
||||
@@ -2177,7 +2177,7 @@ static int prop_subscript_ass_array_int(BPy_PropertyArrayRNA *self, Py_ssize_t k
|
||||
if(keynum >= 0 && keynum < len)
|
||||
return pyrna_py_to_prop_array_index(self, keynum, value);
|
||||
|
||||
PyErr_SetString(PyExc_IndexError, "bpy_prop_array[index]= value: index out of range");
|
||||
PyErr_SetString(PyExc_IndexError, "bpy_prop_array[index] = value: index out of range");
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -2309,7 +2309,7 @@ static int pyrna_struct_contains(BPy_StructRNA *self, PyObject *value)
|
||||
}
|
||||
|
||||
if(RNA_struct_idprops_check(self->ptr.type)==0) {
|
||||
PyErr_SetString(PyExc_TypeError, "bpy_struct: this type doesnt support IDProperties");
|
||||
PyErr_SetString(PyExc_TypeError, "bpy_struct: this type doesn't support IDProperties");
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -2942,9 +2942,9 @@ static PyObject *pyrna_struct_getattro(BPy_StructRNA *self, PyObject *pyname)
|
||||
#if 0
|
||||
static int pyrna_struct_pydict_contains(PyObject *self, PyObject *pyname)
|
||||
{
|
||||
PyObject *dict= *(_PyObject_GetDictPtr((PyObject *)self));
|
||||
if (dict==NULL) /* unlikely */
|
||||
return 0;
|
||||
PyObject *dict= *(_PyObject_GetDictPtr((PyObject *)self));
|
||||
if (dict==NULL) /* unlikely */
|
||||
return 0;
|
||||
|
||||
return PyDict_Contains(dict, pyname);
|
||||
}
|
||||
@@ -2965,7 +2965,7 @@ static PyObject *pyrna_struct_meta_idprop_getattro(PyObject *cls, PyObject *attr
|
||||
* >>> bpy.types.Scene.foo= BoolProperty()
|
||||
* >>> bpy.types.Scene.foo
|
||||
* <bpy_struct, BooleanProperty("foo")>
|
||||
* ...rather then returning the defered class register tuple as checked by pyrna_is_deferred_prop()
|
||||
* ...rather then returning the deferred class register tuple as checked by pyrna_is_deferred_prop()
|
||||
*
|
||||
* Disable for now, this is faking internal behavior in a way thats too tricky to maintain well. */
|
||||
#if 0
|
||||
@@ -3024,9 +3024,9 @@ static int pyrna_struct_meta_idprop_setattro(PyObject *cls, PyObject *attr, PyOb
|
||||
* but gets confusing from script writers POV if the assigned value cant be read back. */
|
||||
}
|
||||
else {
|
||||
/* remove existing property if its set or we also end up with confusement */
|
||||
/* remove existing property if its set or we also end up with confusion */
|
||||
const char *attr_str= _PyUnicode_AsString(attr);
|
||||
RNA_def_property_free_identifier(srna, attr_str); /* ignore on failier */
|
||||
RNA_def_property_free_identifier(srna, attr_str); /* ignore on failure */
|
||||
}
|
||||
}
|
||||
else { /* __delattr__ */
|
||||
@@ -3540,7 +3540,7 @@ static int foreach_parse_args(
|
||||
}
|
||||
|
||||
/* check 'attr_tot' otherwise we dont know if any values were set
|
||||
* this isnt ideal because it means running on an empty list may fail silently when its not compatible. */
|
||||
* this isn't ideal because it means running on an empty list may fail silently when its not compatible. */
|
||||
if (*size == 0 && *attr_tot != 0) {
|
||||
PyErr_SetString(PyExc_AttributeError, "attribute does not support foreach method");
|
||||
return -1;
|
||||
@@ -3705,7 +3705,7 @@ static PyObject *foreach_getset(BPy_PropertyRNA *self, PyObject *args, int set)
|
||||
if(PyErr_Occurred()) {
|
||||
/* Maybe we could make our own error */
|
||||
PyErr_Print();
|
||||
PyErr_SetString(PyExc_TypeError, "could not access the py sequence");
|
||||
PyErr_SetString(PyExc_TypeError, "couldn't access the py sequence");
|
||||
return NULL;
|
||||
}
|
||||
if (!ok) {
|
||||
@@ -3719,13 +3719,13 @@ static PyObject *foreach_getset(BPy_PropertyRNA *self, PyObject *args, int set)
|
||||
static char pyrna_prop_collection_foreach_get_doc[] =
|
||||
".. method:: foreach_get(attr, seq)\n"
|
||||
"\n"
|
||||
" This is a function to give fast access to attribites within a collection.\n"
|
||||
" This is a function to give fast access to attributes within a collection.\n"
|
||||
"\n"
|
||||
" .. code-block:: python\n"
|
||||
"\n"
|
||||
" collection.foreach_get(someseq, attr)\n"
|
||||
"\n"
|
||||
" # Python equivelent\n"
|
||||
" # Python equivalent\n"
|
||||
" for i in range(len(seq)): someseq[i]= getattr(collection, attr)\n"
|
||||
"\n"
|
||||
;
|
||||
@@ -3739,13 +3739,13 @@ static PyObject *pyrna_prop_collection_foreach_get(BPy_PropertyRNA *self, PyObje
|
||||
static char pyrna_prop_collection_foreach_set_doc[] =
|
||||
".. method:: foreach_set(attr, seq)\n"
|
||||
"\n"
|
||||
" This is a function to give fast access to attribites within a collection.\n"
|
||||
" This is a function to give fast access to attributes within a collection.\n"
|
||||
"\n"
|
||||
" .. code-block:: python\n"
|
||||
"\n"
|
||||
" collection.foreach_set(seq, attr)\n"
|
||||
"\n"
|
||||
" # Python equivelent\n"
|
||||
" # Python equivalent\n"
|
||||
" for i in range(len(seq)): setattr(collection[i], attr, seq[i])\n"
|
||||
"\n"
|
||||
;
|
||||
@@ -3872,7 +3872,7 @@ static PyObject *pyrna_struct_new(PyTypeObject *type, PyObject *args, PyObject *
|
||||
}
|
||||
else if (PyType_IsSubtype(Py_TYPE(base), &pyrna_struct_Type)) {
|
||||
/* this almost never runs, only when using user defined subclasses of built-in object.
|
||||
* this isnt common since its NOT related to registerable subclasses. eg:
|
||||
* this isn't common since its NOT related to registerable subclasses. eg:
|
||||
|
||||
>>> class MyObSubclass(bpy.types.Object):
|
||||
... def test_func(self):
|
||||
@@ -4196,7 +4196,7 @@ static PyObject *pyrna_func_call(PyObject *self, PyObject *args, PyObject *kw)
|
||||
err= pyrna_py_to_prop(&funcptr, parm, iter.data, item, "");
|
||||
|
||||
if(err!=0) {
|
||||
/* the error generated isnt that useful, so generate it again with a useful prefix
|
||||
/* the error generated isn't that useful, so generate it again with a useful prefix
|
||||
* could also write a function to prepend to error messages */
|
||||
char error_prefix[512];
|
||||
PyErr_Clear(); /* re-raise */
|
||||
@@ -4214,7 +4214,7 @@ static PyObject *pyrna_func_call(PyObject *self, PyObject *args, PyObject *kw)
|
||||
|
||||
RNA_parameter_list_end(&iter);
|
||||
|
||||
/* Check if we gave args that dont exist in the function
|
||||
/* Check if we gave args that don't exist in the function
|
||||
* printing the error is slow but it should only happen when developing.
|
||||
* the if below is quick, checking if it passed less keyword args then we gave.
|
||||
* (Dont overwrite the error if we have one, otherwise can skip important messages and confuse with args)
|
||||
@@ -5018,7 +5018,7 @@ static void pyrna_subtype_set_rna(PyObject *newclass, StructRNA *srna)
|
||||
/* Not 100% needed but useful,
|
||||
* having an instance within a type looks wrong however this instance IS an rna type */
|
||||
|
||||
/* python deals with the curcular ref */
|
||||
/* python deals with the circular ref */
|
||||
RNA_pointer_create(NULL, &RNA_Struct, srna, &ptr);
|
||||
item= pyrna_struct_CreatePyObject(&ptr);
|
||||
|
||||
@@ -5116,7 +5116,7 @@ static PyObject* pyrna_srna_Subtype(StructRNA *srna)
|
||||
/* stupid/simple case */
|
||||
if (srna == NULL) {
|
||||
newclass= NULL; /* Nothing to do */
|
||||
} /* the class may have alredy been declared & allocated */
|
||||
} /* the class may have already been declared & allocated */
|
||||
else if ((newclass= RNA_struct_py_type_get(srna))) {
|
||||
Py_INCREF(newclass);
|
||||
} /* check if bpy_types.py module has the class defined in it */
|
||||
@@ -5124,9 +5124,9 @@ static PyObject* pyrna_srna_Subtype(StructRNA *srna)
|
||||
pyrna_subtype_set_rna(newclass, srna);
|
||||
Py_INCREF(newclass);
|
||||
} /* create a new class instance with the C api
|
||||
* maintly for the purposing of matching the C/rna type hierarchy */
|
||||
* mainly for the purposing of matching the C/rna type hierarchy */
|
||||
else {
|
||||
/* subclass equivelents
|
||||
/* subclass equivalents
|
||||
- class myClass(myBase):
|
||||
some='value' # or ...
|
||||
- myClass= type(name='myClass', bases=(myBase,), dict={'__module__':'bpy.types'})
|
||||
@@ -5356,7 +5356,7 @@ PyObject *BPY_rna_doc(void)
|
||||
#endif
|
||||
|
||||
|
||||
/* pyrna_basetype_* - BPy_BaseTypeRNA is just a BPy_PropertyRNA struct with a differnt type
|
||||
/* pyrna_basetype_* - BPy_BaseTypeRNA is just a BPy_PropertyRNA struct with a different type
|
||||
* the self->ptr and self->prop are always set to the "structs" collection */
|
||||
//---------------getattr--------------------------------------------
|
||||
static PyObject *pyrna_basetype_getattro(BPy_BaseTypeRNA *self, PyObject *pyname)
|
||||
@@ -5463,19 +5463,19 @@ StructRNA *pyrna_struct_as_srna(PyObject *self, int parent, const char *error_pr
|
||||
}
|
||||
|
||||
if(py_srna==NULL) {
|
||||
PyErr_Format(PyExc_RuntimeError, "%.200s, missing bl_rna attribute from '%.200s' instance (may not be registered)", error_prefix, Py_TYPE(self)->tp_name);
|
||||
PyErr_Format(PyExc_RuntimeError, "%.200s, missing bl_rna attribute from '%.200s' instance (may not be registered)", error_prefix, Py_TYPE(self)->tp_name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if(!BPy_StructRNA_Check(py_srna)) {
|
||||
PyErr_Format(PyExc_TypeError, "%.200s, bl_rna attribute wrong type '%.200s' on '%.200s'' instance", error_prefix, Py_TYPE(py_srna)->tp_name, Py_TYPE(self)->tp_name);
|
||||
Py_DECREF(py_srna);
|
||||
PyErr_Format(PyExc_TypeError, "%.200s, bl_rna attribute wrong type '%.200s' on '%.200s'' instance", error_prefix, Py_TYPE(py_srna)->tp_name, Py_TYPE(self)->tp_name);
|
||||
Py_DECREF(py_srna);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if(py_srna->ptr.type != &RNA_Struct) {
|
||||
PyErr_Format(PyExc_TypeError, "%.200s, bl_rna attribute not a RNA_Struct, on '%.200s'' instance", error_prefix, Py_TYPE(self)->tp_name);
|
||||
Py_DECREF(py_srna);
|
||||
Py_DECREF(py_srna);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -5614,7 +5614,7 @@ static int pyrna_deferred_register_class_recursive(StructRNA *srna, PyTypeObject
|
||||
PyTypeObject *py_superclass= (PyTypeObject *)PyTuple_GET_ITEM(py_class->tp_bases, i);
|
||||
|
||||
/* the rules for using these base classes are not clear,
|
||||
* 'object' is ofcourse not worth looking into and
|
||||
* 'object' is of course not worth looking into and
|
||||
* existing subclasses of RNA would cause a lot more dictionary
|
||||
* looping then is needed (SomeOperator would scan Operator.__dict__)
|
||||
* which is harmless but not at all useful.
|
||||
@@ -5875,7 +5875,7 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param
|
||||
* Although this is annoying to have to impliment a part of pythons typeobject.c:type_call().
|
||||
*/
|
||||
if(py_class->tp_init) {
|
||||
/* true in most cases even when the class its self doesnt define an __init__ function. */
|
||||
/* true in most cases even when the class its self doesn't define an __init__ function. */
|
||||
args= PyTuple_New(0);
|
||||
if (py_class->tp_init(py_srna, args, NULL) < 0) {
|
||||
Py_DECREF(py_srna);
|
||||
@@ -5888,7 +5888,7 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param
|
||||
py_class_instance= py_srna;
|
||||
|
||||
#else
|
||||
/* 'almost' all the time calling the class isnt needed.
|
||||
/* 'almost' all the time calling the class isn't needed.
|
||||
* We could just do...
|
||||
py_class_instance= py_srna;
|
||||
Py_INCREF(py_class_instance);
|
||||
@@ -5977,7 +5977,7 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* the error may be alredy set if the class instance couldnt be created */
|
||||
/* the error may be already set if the class instance couldn't be created */
|
||||
if(err != -1) {
|
||||
PyErr_Format(PyExc_RuntimeError, "could not create instance of %.200s to call callback function %.200s", RNA_struct_identifier(ptr->type), RNA_function_identifier(func));
|
||||
err= -1;
|
||||
@@ -6140,7 +6140,7 @@ void pyrna_free_types(void)
|
||||
* There is currently a bug where moving registering a python class does
|
||||
* not properly manage refcounts from the python class, since the srna owns
|
||||
* the python class this should not be so tricky but changing the references as
|
||||
* youd expect when changing ownership crashes blender on exit so I had to comment out
|
||||
* you'd expect when changing ownership crashes blender on exit so I had to comment out
|
||||
* the decref. This is not so bad because the leak only happens when re-registering (hold F8)
|
||||
* - Should still be fixed - Campbell
|
||||
* */
|
||||
@@ -6178,7 +6178,7 @@ static PyObject *pyrna_register_class(PyObject *UNUSED(self), PyObject *py_class
|
||||
/* fails in cases, cant use this check but would like to :| */
|
||||
/*
|
||||
if(RNA_struct_py_type_get(srna)) {
|
||||
PyErr_Format(PyExc_ValueError, "register_class(...): %.200s's parent class %.200s is alredy registered, this is not allowed", ((PyTypeObject*)py_class)->tp_name, RNA_struct_identifier(srna));
|
||||
PyErr_Format(PyExc_ValueError, "register_class(...): %.200s's parent class %.200s is already registered, this is not allowed", ((PyTypeObject*)py_class)->tp_name, RNA_struct_identifier(srna));
|
||||
return NULL;
|
||||
}
|
||||
*/
|
||||
@@ -6214,7 +6214,7 @@ static PyObject *pyrna_register_class(PyObject *UNUSED(self), PyObject *py_class
|
||||
/* old srna still references us, keep the check incase registering somehow can free it */
|
||||
if(RNA_struct_py_type_get(srna)) {
|
||||
RNA_struct_py_type_set(srna, NULL);
|
||||
// Py_DECREF(py_class); // shuld be able to do this XXX since the old rna adds a new ref.
|
||||
// Py_DECREF(py_class); // should be able to do this XXX since the old rna adds a new ref.
|
||||
}
|
||||
|
||||
/* Can't use this because it returns a dict proxy
|
||||
|
||||
@@ -38,68 +38,68 @@ static const char *traceback_filepath(PyTracebackObject *tb)
|
||||
/* copied from pythonrun.c, 3.2.0 */
|
||||
static int
|
||||
parse_syntax_error(PyObject *err, PyObject **message, const char **filename,
|
||||
int *lineno, int *offset, const char **text)
|
||||
int *lineno, int *offset, const char **text)
|
||||
{
|
||||
long hold;
|
||||
PyObject *v;
|
||||
long hold;
|
||||
PyObject *v;
|
||||
|
||||
/* old style errors */
|
||||
if (PyTuple_Check(err))
|
||||
return PyArg_ParseTuple(err, "O(ziiz)", message, filename,
|
||||
lineno, offset, text);
|
||||
/* old style errors */
|
||||
if (PyTuple_Check(err))
|
||||
return PyArg_ParseTuple(err, "O(ziiz)", message, filename,
|
||||
lineno, offset, text);
|
||||
|
||||
/* new style errors. `err' is an instance */
|
||||
/* new style errors. `err' is an instance */
|
||||
|
||||
if (! (v = PyObject_GetAttrString(err, "msg")))
|
||||
goto finally;
|
||||
*message = v;
|
||||
if (! (v = PyObject_GetAttrString(err, "msg")))
|
||||
goto finally;
|
||||
*message = v;
|
||||
|
||||
if (!(v = PyObject_GetAttrString(err, "filename")))
|
||||
goto finally;
|
||||
if (v == Py_None)
|
||||
*filename = NULL;
|
||||
else if (! (*filename = _PyUnicode_AsString(v)))
|
||||
goto finally;
|
||||
if (!(v = PyObject_GetAttrString(err, "filename")))
|
||||
goto finally;
|
||||
if (v == Py_None)
|
||||
*filename = NULL;
|
||||
else if (! (*filename = _PyUnicode_AsString(v)))
|
||||
goto finally;
|
||||
|
||||
Py_DECREF(v);
|
||||
if (!(v = PyObject_GetAttrString(err, "lineno")))
|
||||
goto finally;
|
||||
hold = PyLong_AsLong(v);
|
||||
Py_DECREF(v);
|
||||
v = NULL;
|
||||
if (hold < 0 && PyErr_Occurred())
|
||||
goto finally;
|
||||
*lineno = (int)hold;
|
||||
Py_DECREF(v);
|
||||
if (!(v = PyObject_GetAttrString(err, "lineno")))
|
||||
goto finally;
|
||||
hold = PyLong_AsLong(v);
|
||||
Py_DECREF(v);
|
||||
v = NULL;
|
||||
if (hold < 0 && PyErr_Occurred())
|
||||
goto finally;
|
||||
*lineno = (int)hold;
|
||||
|
||||
if (!(v = PyObject_GetAttrString(err, "offset")))
|
||||
goto finally;
|
||||
if (v == Py_None) {
|
||||
*offset = -1;
|
||||
Py_DECREF(v);
|
||||
v = NULL;
|
||||
if (!(v = PyObject_GetAttrString(err, "offset")))
|
||||
goto finally;
|
||||
if (v == Py_None) {
|
||||
*offset = -1;
|
||||
Py_DECREF(v);
|
||||
v = NULL;
|
||||
}
|
||||
else {
|
||||
hold = PyLong_AsLong(v);
|
||||
Py_DECREF(v);
|
||||
v = NULL;
|
||||
if (hold < 0 && PyErr_Occurred())
|
||||
goto finally;
|
||||
*offset = (int)hold;
|
||||
}
|
||||
hold = PyLong_AsLong(v);
|
||||
Py_DECREF(v);
|
||||
v = NULL;
|
||||
if (hold < 0 && PyErr_Occurred())
|
||||
goto finally;
|
||||
*offset = (int)hold;
|
||||
}
|
||||
|
||||
if (!(v = PyObject_GetAttrString(err, "text")))
|
||||
goto finally;
|
||||
if (v == Py_None)
|
||||
*text = NULL;
|
||||
else if (!PyUnicode_Check(v) ||
|
||||
!(*text = _PyUnicode_AsString(v)))
|
||||
goto finally;
|
||||
Py_DECREF(v);
|
||||
return 1;
|
||||
if (!(v = PyObject_GetAttrString(err, "text")))
|
||||
goto finally;
|
||||
if (v == Py_None)
|
||||
*text = NULL;
|
||||
else if (!PyUnicode_Check(v) ||
|
||||
!(*text = _PyUnicode_AsString(v)))
|
||||
goto finally;
|
||||
Py_DECREF(v);
|
||||
return 1;
|
||||
|
||||
finally:
|
||||
Py_XDECREF(v);
|
||||
return 0;
|
||||
Py_XDECREF(v);
|
||||
return 0;
|
||||
}
|
||||
/* end copied function! */
|
||||
|
||||
@@ -122,7 +122,7 @@ void python_script_error_jump(const char *filepath, int *lineno, int *offset)
|
||||
|
||||
if(value) { /* should always be true */
|
||||
PyObject *message;
|
||||
const char *filename, *text;
|
||||
const char *filename, *text;
|
||||
|
||||
if(parse_syntax_error(value, &message, &filename, lineno, offset, &text)) {
|
||||
/* python adds a '/', prefix, so check for both */
|
||||
|
||||
@@ -98,7 +98,7 @@ short BPy_errors_to_report(ReportList *reports)
|
||||
pystring= PyC_ExceptionBuffer();
|
||||
|
||||
if(pystring==NULL) {
|
||||
BKE_report(reports, RPT_ERROR, "unknown py-exception, could not convert");
|
||||
BKE_report(reports, RPT_ERROR, "unknown py-exception, couldn't convert");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user