bpy/rna support for invalidating objects.
access will raise an error.
This commit is contained in:
		@@ -69,6 +69,43 @@
 | 
			
		||||
 | 
			
		||||
static PyObject *pyrna_prop_collection_values(BPy_PropertyRNA *self);
 | 
			
		||||
 | 
			
		||||
#define PYRNA_STRUCT_CHECK_OBJ(obj) if(pyrna_struct_validity_check(obj) == -1) { return NULL; }
 | 
			
		||||
#define PYRNA_STRUCT_CHECK_INT(obj) if(pyrna_struct_validity_check(obj) == -1) { return -1; }
 | 
			
		||||
 | 
			
		||||
#define PYRNA_PROP_CHECK_OBJ(obj) if(pyrna_prop_validity_check(obj) == -1) { return NULL; }
 | 
			
		||||
#define PYRNA_PROP_CHECK_INT(obj) if(pyrna_prop_validity_check(obj) == -1) { return -1; }
 | 
			
		||||
 | 
			
		||||
#define PYRNA_STRUCT_IS_VALID(pysrna) (((BPy_StructRNA *)(pysrna))->ptr.type != NULL)
 | 
			
		||||
#define PYRNA_PROP_IS_VALID(pysrna) (((BPy_PropertyRNA *)(pysrna))->ptr.type != NULL)
 | 
			
		||||
 | 
			
		||||
static int pyrna_struct_validity_check(BPy_StructRNA *pysrna)
 | 
			
		||||
{
 | 
			
		||||
	if(pysrna->ptr.type)
 | 
			
		||||
		return 0;
 | 
			
		||||
	PyErr_Format(PyExc_ReferenceError, "StructRNA of type %.200s has been removed", Py_TYPE(pysrna)->tp_name);
 | 
			
		||||
	return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int pyrna_prop_validity_check(BPy_PropertyRNA *self)
 | 
			
		||||
{
 | 
			
		||||
	if(self->ptr.type)
 | 
			
		||||
		return 0;
 | 
			
		||||
	PyErr_Format(PyExc_ReferenceError, "PropertyRNA of type %.200s.%.200s has been removed", Py_TYPE(self)->tp_name, RNA_property_identifier(self->prop));
 | 
			
		||||
	return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
static void pyrna_struct_invalidate(BPy_StructRNA *self)
 | 
			
		||||
{
 | 
			
		||||
	self->ptr.type= NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void pyrna_prop_invalidate(BPy_PropertyRNA *self)
 | 
			
		||||
{
 | 
			
		||||
	self->ptr.type= NULL;
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifdef USE_PEDANTIC_WRITE
 | 
			
		||||
static short rna_disallow_writes= FALSE;
 | 
			
		||||
 | 
			
		||||
@@ -130,12 +167,18 @@ static int mathutils_rna_array_cb_index= -1; /* index for our callbacks */
 | 
			
		||||
static int mathutils_rna_generic_check(BaseMathObject *bmo)
 | 
			
		||||
{
 | 
			
		||||
	BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user;
 | 
			
		||||
 | 
			
		||||
	PYRNA_PROP_CHECK_INT(self)
 | 
			
		||||
 | 
			
		||||
	return self->prop ? 0 : -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int mathutils_rna_vector_get(BaseMathObject *bmo, int subtype)
 | 
			
		||||
{
 | 
			
		||||
	BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user;
 | 
			
		||||
 | 
			
		||||
	PYRNA_PROP_CHECK_INT(self)
 | 
			
		||||
 | 
			
		||||
	if(self->prop==NULL)
 | 
			
		||||
		return -1;
 | 
			
		||||
 | 
			
		||||
@@ -155,6 +198,9 @@ static int mathutils_rna_vector_set(BaseMathObject *bmo, int subtype)
 | 
			
		||||
{
 | 
			
		||||
	BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user;
 | 
			
		||||
	float min, max;
 | 
			
		||||
 | 
			
		||||
	PYRNA_PROP_CHECK_INT(self)
 | 
			
		||||
 | 
			
		||||
	if(self->prop==NULL)
 | 
			
		||||
		return -1;
 | 
			
		||||
 | 
			
		||||
@@ -202,6 +248,8 @@ static int mathutils_rna_vector_get_index(BaseMathObject *bmo, int UNUSED(subtyp
 | 
			
		||||
{
 | 
			
		||||
	BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user;
 | 
			
		||||
 | 
			
		||||
	PYRNA_PROP_CHECK_INT(self)
 | 
			
		||||
 | 
			
		||||
	if(self->prop==NULL)
 | 
			
		||||
		return -1;
 | 
			
		||||
 | 
			
		||||
@@ -213,6 +261,8 @@ static int mathutils_rna_vector_set_index(BaseMathObject *bmo, int UNUSED(subtyp
 | 
			
		||||
{
 | 
			
		||||
	BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user;
 | 
			
		||||
 | 
			
		||||
	PYRNA_PROP_CHECK_INT(self)
 | 
			
		||||
 | 
			
		||||
	if(self->prop==NULL)
 | 
			
		||||
		return -1;
 | 
			
		||||
 | 
			
		||||
@@ -253,6 +303,8 @@ static int mathutils_rna_matrix_get(BaseMathObject *bmo, int UNUSED(subtype))
 | 
			
		||||
{
 | 
			
		||||
	BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user;
 | 
			
		||||
 | 
			
		||||
	PYRNA_PROP_CHECK_INT(self)
 | 
			
		||||
 | 
			
		||||
	if(self->prop==NULL)
 | 
			
		||||
		return -1;
 | 
			
		||||
 | 
			
		||||
@@ -264,6 +316,8 @@ static int mathutils_rna_matrix_set(BaseMathObject *bmo, int UNUSED(subtype))
 | 
			
		||||
{
 | 
			
		||||
	BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user;
 | 
			
		||||
 | 
			
		||||
	PYRNA_PROP_CHECK_INT(self)
 | 
			
		||||
 | 
			
		||||
	if(self->prop==NULL)
 | 
			
		||||
		return -1;
 | 
			
		||||
 | 
			
		||||
@@ -453,12 +507,12 @@ int pyrna_enum_value_from_id(EnumPropertyItem *item, const char *identifier, int
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int pyrna_struct_compare( BPy_StructRNA * a, BPy_StructRNA * b )
 | 
			
		||||
static int pyrna_struct_compare(BPy_StructRNA *a, BPy_StructRNA *b)
 | 
			
		||||
{
 | 
			
		||||
	return (a->ptr.data==b->ptr.data) ? 0 : -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int pyrna_prop_compare( BPy_PropertyRNA * a, BPy_PropertyRNA * b )
 | 
			
		||||
static int pyrna_prop_compare(BPy_PropertyRNA *a, BPy_PropertyRNA *b)
 | 
			
		||||
{
 | 
			
		||||
	return (a->prop==b->prop && a->ptr.data==b->ptr.data ) ? 0 : -1;
 | 
			
		||||
}
 | 
			
		||||
@@ -522,11 +576,15 @@ static PyObject *pyrna_prop_richcmp(PyObject *a, PyObject *b, int op)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*----------------------repr--------------------------------------------*/
 | 
			
		||||
static PyObject *pyrna_struct_str( BPy_StructRNA *self )
 | 
			
		||||
static PyObject *pyrna_struct_str(BPy_StructRNA *self)
 | 
			
		||||
{
 | 
			
		||||
	PyObject *ret;
 | 
			
		||||
	const char *name;
 | 
			
		||||
 | 
			
		||||
	if(!PYRNA_STRUCT_IS_VALID(self)) {
 | 
			
		||||
		return PyUnicode_FromFormat("<bpy_struct, %.200s dead>", Py_TYPE(self)->tp_name);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* print name if available */
 | 
			
		||||
	name= RNA_struct_name_get_alloc(&self->ptr, NULL, FALSE);
 | 
			
		||||
	if(name) {
 | 
			
		||||
@@ -541,7 +599,7 @@ static PyObject *pyrna_struct_str( BPy_StructRNA *self )
 | 
			
		||||
static PyObject *pyrna_struct_repr(BPy_StructRNA *self)
 | 
			
		||||
{
 | 
			
		||||
	ID *id= self->ptr.id.data;
 | 
			
		||||
	if(id == NULL)
 | 
			
		||||
	if(id == NULL || !PYRNA_STRUCT_IS_VALID(self))
 | 
			
		||||
		return pyrna_struct_str(self); /* fallback */
 | 
			
		||||
 | 
			
		||||
	if(RNA_struct_is_ID(self->ptr.type)) {
 | 
			
		||||
@@ -563,14 +621,18 @@ static PyObject *pyrna_struct_repr(BPy_StructRNA *self)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static PyObject *pyrna_prop_str( BPy_PropertyRNA *self )
 | 
			
		||||
static PyObject *pyrna_prop_str(BPy_PropertyRNA *self)
 | 
			
		||||
{
 | 
			
		||||
	PyObject *ret;
 | 
			
		||||
	PointerRNA ptr;
 | 
			
		||||
	const char *name;
 | 
			
		||||
	const char *type_id= NULL;
 | 
			
		||||
	char type_fmt[64]= "";
 | 
			
		||||
	int type= RNA_property_type(self->prop);
 | 
			
		||||
	int type;
 | 
			
		||||
 | 
			
		||||
	PYRNA_PROP_CHECK_OBJ(self)
 | 
			
		||||
 | 
			
		||||
	type= RNA_property_type(self->prop);
 | 
			
		||||
 | 
			
		||||
	if(RNA_enum_id_from_value(property_type_items, type, &type_id)==0) {
 | 
			
		||||
		PyErr_SetString(PyExc_RuntimeError, "could not use property type, internal error"); /* should never happen */
 | 
			
		||||
@@ -616,11 +678,13 @@ static PyObject *pyrna_prop_str( BPy_PropertyRNA *self )
 | 
			
		||||
 | 
			
		||||
static PyObject *pyrna_prop_repr(BPy_PropertyRNA *self)
 | 
			
		||||
{
 | 
			
		||||
	ID *id= self->ptr.id.data;
 | 
			
		||||
	ID *id;
 | 
			
		||||
	PyObject *ret;
 | 
			
		||||
	const char *path;
 | 
			
		||||
 | 
			
		||||
	if(id == NULL)
 | 
			
		||||
	PYRNA_PROP_CHECK_OBJ(self)
 | 
			
		||||
 | 
			
		||||
	if((id= self->ptr.id.data))
 | 
			
		||||
		return pyrna_prop_str(self); /* fallback */
 | 
			
		||||
 | 
			
		||||
	path= RNA_path_from_ID_to_property(&self->ptr, self->prop);
 | 
			
		||||
@@ -635,7 +699,7 @@ static PyObject *pyrna_prop_repr(BPy_PropertyRNA *self)
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static long pyrna_struct_hash( BPy_StructRNA *self )
 | 
			
		||||
static long pyrna_struct_hash(BPy_StructRNA *self)
 | 
			
		||||
{
 | 
			
		||||
	return _Py_HashPointer(self->ptr.data);
 | 
			
		||||
}
 | 
			
		||||
@@ -1350,8 +1414,9 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static PyObject * pyrna_prop_array_to_py_index(BPy_PropertyArrayRNA *self, int index)
 | 
			
		||||
static PyObject *pyrna_prop_array_to_py_index(BPy_PropertyArrayRNA *self, int index)
 | 
			
		||||
{
 | 
			
		||||
	PYRNA_PROP_CHECK_OBJ((BPy_PropertyRNA *)self)
 | 
			
		||||
	return pyrna_py_from_array_index(self, &self->ptr, self->prop, index);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1427,14 +1492,18 @@ static int pyrna_py_to_prop_array_index(BPy_PropertyArrayRNA *self, int index, P
 | 
			
		||||
//---------------sequence-------------------------------------------
 | 
			
		||||
static Py_ssize_t pyrna_prop_array_length(BPy_PropertyArrayRNA *self)
 | 
			
		||||
{
 | 
			
		||||
	PYRNA_PROP_CHECK_INT((BPy_PropertyRNA *)self)
 | 
			
		||||
 | 
			
		||||
	if (RNA_property_array_dimension(&self->ptr, self->prop, NULL) > 1)
 | 
			
		||||
		return RNA_property_multi_array_length(&self->ptr, self->prop, self->arraydim);
 | 
			
		||||
	else
 | 
			
		||||
		return RNA_property_array_length(&self->ptr, self->prop);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Py_ssize_t pyrna_prop_collection_length( BPy_PropertyRNA *self )
 | 
			
		||||
static Py_ssize_t pyrna_prop_collection_length(BPy_PropertyRNA *self)
 | 
			
		||||
{
 | 
			
		||||
	PYRNA_PROP_CHECK_INT(self)
 | 
			
		||||
 | 
			
		||||
	return RNA_property_collection_length(&self->ptr, self->prop);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1442,15 +1511,19 @@ static Py_ssize_t pyrna_prop_collection_length( BPy_PropertyRNA *self )
 | 
			
		||||
 * of 1000's of items in a linked list for eg. */
 | 
			
		||||
static int pyrna_prop_array_bool(BPy_PropertyRNA *self)
 | 
			
		||||
{
 | 
			
		||||
	PYRNA_PROP_CHECK_INT(self)
 | 
			
		||||
 | 
			
		||||
	return RNA_property_array_length(&self->ptr, self->prop) ? 1 : 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int pyrna_prop_collection_bool( BPy_PropertyRNA *self )
 | 
			
		||||
static int pyrna_prop_collection_bool(BPy_PropertyRNA *self)
 | 
			
		||||
{
 | 
			
		||||
	/* no callback defined, just iterate and find the nth item */
 | 
			
		||||
	CollectionPropertyIterator iter;
 | 
			
		||||
	int test;
 | 
			
		||||
 | 
			
		||||
	PYRNA_PROP_CHECK_INT(self)
 | 
			
		||||
 | 
			
		||||
	RNA_property_collection_begin(&self->ptr, self->prop, &iter);
 | 
			
		||||
	test = iter.valid;
 | 
			
		||||
	RNA_property_collection_end(&iter);
 | 
			
		||||
@@ -1463,6 +1536,8 @@ static PyObject *pyrna_prop_collection_subscript_int(BPy_PropertyRNA *self, Py_s
 | 
			
		||||
	PointerRNA newptr;
 | 
			
		||||
	Py_ssize_t keynum_abs= keynum;
 | 
			
		||||
 | 
			
		||||
	PYRNA_PROP_CHECK_OBJ(self)
 | 
			
		||||
 | 
			
		||||
	/* notice getting the length of the collection is avoided unless negative index is used
 | 
			
		||||
	 * or to detect internal error with a valid index.
 | 
			
		||||
	 * This is done for faster lookups. */
 | 
			
		||||
@@ -1493,7 +1568,11 @@ static PyObject *pyrna_prop_collection_subscript_int(BPy_PropertyRNA *self, Py_s
 | 
			
		||||
 | 
			
		||||
static PyObject *pyrna_prop_array_subscript_int(BPy_PropertyArrayRNA *self, int keynum)
 | 
			
		||||
{
 | 
			
		||||
	int len= pyrna_prop_array_length(self);
 | 
			
		||||
	int len;
 | 
			
		||||
 | 
			
		||||
	PYRNA_PROP_CHECK_OBJ((BPy_PropertyRNA *)self)
 | 
			
		||||
 | 
			
		||||
	len= pyrna_prop_array_length(self);
 | 
			
		||||
 | 
			
		||||
	if(keynum < 0) keynum += len;
 | 
			
		||||
 | 
			
		||||
@@ -1507,6 +1586,9 @@ static PyObject *pyrna_prop_array_subscript_int(BPy_PropertyArrayRNA *self, int
 | 
			
		||||
static PyObject *pyrna_prop_collection_subscript_str(BPy_PropertyRNA *self, const char *keyname)
 | 
			
		||||
{
 | 
			
		||||
	PointerRNA newptr;
 | 
			
		||||
 | 
			
		||||
	PYRNA_PROP_CHECK_OBJ(self)
 | 
			
		||||
 | 
			
		||||
	if(RNA_property_collection_lookup_string(&self->ptr, self->prop, keyname, &newptr))
 | 
			
		||||
		return pyrna_struct_CreatePyObject(&newptr);
 | 
			
		||||
 | 
			
		||||
@@ -1517,13 +1599,17 @@ static PyObject *pyrna_prop_collection_subscript_str(BPy_PropertyRNA *self, cons
 | 
			
		||||
 | 
			
		||||
static PyObject *pyrna_prop_collection_subscript_slice(BPy_PropertyRNA *self, Py_ssize_t start, Py_ssize_t stop)
 | 
			
		||||
{
 | 
			
		||||
	CollectionPropertyIterator rna_macro_iter;
 | 
			
		||||
	int count= 0;
 | 
			
		||||
 | 
			
		||||
	PyObject *list= PyList_New(0);
 | 
			
		||||
	PyObject *list;
 | 
			
		||||
	PyObject *item;
 | 
			
		||||
 | 
			
		||||
	PYRNA_PROP_CHECK_OBJ(self)
 | 
			
		||||
 | 
			
		||||
	list= PyList_New(0);
 | 
			
		||||
 | 
			
		||||
	/* first loop up-until the start */
 | 
			
		||||
	CollectionPropertyIterator rna_macro_iter;
 | 
			
		||||
	for(RNA_property_collection_begin(&self->ptr, self->prop, &rna_macro_iter); rna_macro_iter.valid; RNA_property_collection_next(&rna_macro_iter)) {
 | 
			
		||||
		/* PointerRNA itemptr= rna_macro_iter.ptr; */
 | 
			
		||||
		if(count == start) {
 | 
			
		||||
@@ -1556,8 +1642,13 @@ static PyObject *pyrna_prop_collection_subscript_slice(BPy_PropertyRNA *self, Py
 | 
			
		||||
static PyObject *pyrna_prop_array_subscript_slice(BPy_PropertyArrayRNA *self, PointerRNA *ptr, PropertyRNA *prop, Py_ssize_t start, Py_ssize_t stop, Py_ssize_t length)
 | 
			
		||||
{
 | 
			
		||||
	int count, totdim;
 | 
			
		||||
	PyObject *tuple;
 | 
			
		||||
 | 
			
		||||
	PyObject *tuple= PyTuple_New(stop - start);
 | 
			
		||||
	PYRNA_PROP_CHECK_OBJ((BPy_PropertyRNA *)self)
 | 
			
		||||
 | 
			
		||||
	tuple= PyTuple_New(stop - start);
 | 
			
		||||
 | 
			
		||||
	/* PYRNA_PROP_CHECK_OBJ(self) isnt needed, internal use only */
 | 
			
		||||
 | 
			
		||||
	totdim = RNA_property_array_dimension(ptr, prop, NULL);
 | 
			
		||||
 | 
			
		||||
@@ -1628,6 +1719,8 @@ static PyObject *pyrna_prop_array_subscript_slice(BPy_PropertyArrayRNA *self, Po
 | 
			
		||||
 | 
			
		||||
static PyObject *pyrna_prop_collection_subscript(BPy_PropertyRNA *self, PyObject *key)
 | 
			
		||||
{
 | 
			
		||||
	PYRNA_PROP_CHECK_OBJ(self)
 | 
			
		||||
 | 
			
		||||
	if (PyUnicode_Check(key)) {
 | 
			
		||||
		return pyrna_prop_collection_subscript_str(self, _PyUnicode_AsString(key));
 | 
			
		||||
	}
 | 
			
		||||
@@ -1682,6 +1775,8 @@ static PyObject *pyrna_prop_collection_subscript(BPy_PropertyRNA *self, PyObject
 | 
			
		||||
 | 
			
		||||
static PyObject *pyrna_prop_array_subscript(BPy_PropertyArrayRNA *self, PyObject *key)
 | 
			
		||||
{
 | 
			
		||||
	PYRNA_PROP_CHECK_OBJ((BPy_PropertyRNA *)self)
 | 
			
		||||
 | 
			
		||||
	/*if (PyUnicode_Check(key)) {
 | 
			
		||||
		return pyrna_prop_array_subscript_str(self, _PyUnicode_AsString(key));
 | 
			
		||||
	} else*/
 | 
			
		||||
@@ -1833,7 +1928,11 @@ static int prop_subscript_ass_array_slice(PointerRNA *ptr, PropertyRNA *prop, in
 | 
			
		||||
 | 
			
		||||
static int prop_subscript_ass_array_int(BPy_PropertyArrayRNA *self, Py_ssize_t keynum, PyObject *value)
 | 
			
		||||
{
 | 
			
		||||
	int len= pyrna_prop_array_length(self);
 | 
			
		||||
	int len;
 | 
			
		||||
 | 
			
		||||
	PYRNA_PROP_CHECK_INT((BPy_PropertyRNA *)self)
 | 
			
		||||
 | 
			
		||||
	len= pyrna_prop_array_length(self);
 | 
			
		||||
 | 
			
		||||
	if(keynum < 0) keynum += len;
 | 
			
		||||
 | 
			
		||||
@@ -1844,11 +1943,13 @@ static int prop_subscript_ass_array_int(BPy_PropertyArrayRNA *self, Py_ssize_t k
 | 
			
		||||
	return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int pyrna_prop_array_ass_subscript( BPy_PropertyArrayRNA *self, PyObject *key, PyObject *value )
 | 
			
		||||
static int pyrna_prop_array_ass_subscript(BPy_PropertyArrayRNA *self, PyObject *key, PyObject *value)
 | 
			
		||||
{
 | 
			
		||||
	/* char *keyname = NULL; */ /* not supported yet */
 | 
			
		||||
	int ret= -1;
 | 
			
		||||
 | 
			
		||||
	PYRNA_PROP_CHECK_INT((BPy_PropertyRNA *)self)
 | 
			
		||||
 | 
			
		||||
	if (!RNA_property_editable_flag(&self->ptr, self->prop)) {
 | 
			
		||||
		PyErr_Format(PyExc_AttributeError, "bpy_prop_collection: attribute \"%.200s\" from \"%.200s\" is read-only", RNA_property_identifier(self->prop), RNA_struct_identifier(self->ptr.type) );
 | 
			
		||||
		ret= -1;
 | 
			
		||||
@@ -1962,6 +2063,8 @@ static int pyrna_struct_contains(BPy_StructRNA *self, PyObject *value)
 | 
			
		||||
	IDProperty *group;
 | 
			
		||||
	const char *name = _PyUnicode_AsString(value);
 | 
			
		||||
 | 
			
		||||
	PYRNA_STRUCT_CHECK_INT(self)
 | 
			
		||||
 | 
			
		||||
	if (!name) {
 | 
			
		||||
		PyErr_SetString(PyExc_TypeError, "bpy_struct.__contains__: expected a string");
 | 
			
		||||
		return -1;
 | 
			
		||||
@@ -2019,12 +2122,14 @@ static PySequenceMethods pyrna_struct_as_sequence = {
 | 
			
		||||
	(ssizeargfunc) NULL, /* sq_inplace_repeat */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static PyObject *pyrna_struct_subscript( BPy_StructRNA *self, PyObject *key )
 | 
			
		||||
static PyObject *pyrna_struct_subscript(BPy_StructRNA *self, PyObject *key)
 | 
			
		||||
{
 | 
			
		||||
	/* mostly copied from BPy_IDGroup_Map_GetItem */
 | 
			
		||||
	IDProperty *group, *idprop;
 | 
			
		||||
	const char *name= _PyUnicode_AsString(key);
 | 
			
		||||
 | 
			
		||||
	PYRNA_STRUCT_CHECK_OBJ(self)
 | 
			
		||||
 | 
			
		||||
	if(RNA_struct_idprops_check(self->ptr.type)==0) {
 | 
			
		||||
		PyErr_SetString(PyExc_TypeError, "this type doesn't support IDProperties");
 | 
			
		||||
		return NULL;
 | 
			
		||||
@@ -2052,9 +2157,13 @@ static PyObject *pyrna_struct_subscript( BPy_StructRNA *self, PyObject *key )
 | 
			
		||||
	return BPy_IDGroup_WrapData(self->ptr.id.data, idprop);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int pyrna_struct_ass_subscript( BPy_StructRNA *self, PyObject *key, PyObject *value )
 | 
			
		||||
static int pyrna_struct_ass_subscript(BPy_StructRNA *self, PyObject *key, PyObject *value)
 | 
			
		||||
{
 | 
			
		||||
	IDProperty *group= RNA_struct_idprops(&self->ptr, 1);
 | 
			
		||||
	IDProperty *group;
 | 
			
		||||
 | 
			
		||||
	PYRNA_STRUCT_CHECK_INT(self)
 | 
			
		||||
 | 
			
		||||
	group= RNA_struct_idprops(&self->ptr, 1);
 | 
			
		||||
 | 
			
		||||
#ifdef USE_PEDANTIC_WRITE
 | 
			
		||||
	if(rna_disallow_writes && rna_id_write_error(&self->ptr, key)) {
 | 
			
		||||
@@ -2276,6 +2385,8 @@ static PyObject *pyrna_struct_keyframe_insert(BPy_StructRNA *self, PyObject *arg
 | 
			
		||||
	float cfra= FLT_MAX;
 | 
			
		||||
	const char *group_name= NULL;
 | 
			
		||||
 | 
			
		||||
	PYRNA_STRUCT_CHECK_OBJ(self)
 | 
			
		||||
 | 
			
		||||
	if(pyrna_struct_keyframe_parse(&self->ptr, args, kw, "s|ifs:bpy_struct.keyframe_insert()", "bpy_struct.keyframe_insert()", &path_full, &index, &cfra, &group_name) == -1) {
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
@@ -2319,6 +2430,8 @@ static PyObject *pyrna_struct_keyframe_delete(BPy_StructRNA *self, PyObject *arg
 | 
			
		||||
	float cfra= FLT_MAX;
 | 
			
		||||
	const char *group_name= NULL;
 | 
			
		||||
 | 
			
		||||
	PYRNA_STRUCT_CHECK_OBJ(self)
 | 
			
		||||
 | 
			
		||||
	if(pyrna_struct_keyframe_parse(&self->ptr, args, kw, "s|ifs:bpy_struct.keyframe_delete()", "bpy_struct.keyframe_insert()", &path_full, &index, &cfra, &group_name) == -1) {
 | 
			
		||||
		return NULL;
 | 
			
		||||
	}
 | 
			
		||||
@@ -2356,6 +2469,8 @@ static PyObject *pyrna_struct_driver_add(BPy_StructRNA *self, PyObject *args)
 | 
			
		||||
	const char *path, *path_full;
 | 
			
		||||
	int index= -1;
 | 
			
		||||
 | 
			
		||||
	PYRNA_STRUCT_CHECK_OBJ(self)
 | 
			
		||||
 | 
			
		||||
	if (!PyArg_ParseTuple(args, "s|i:driver_add", &path, &index))
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
@@ -2428,6 +2543,8 @@ static PyObject *pyrna_struct_driver_remove(BPy_StructRNA *self, PyObject *args)
 | 
			
		||||
	const char *path, *path_full;
 | 
			
		||||
	int index= -1;
 | 
			
		||||
 | 
			
		||||
	PYRNA_STRUCT_CHECK_OBJ(self)
 | 
			
		||||
 | 
			
		||||
	if (!PyArg_ParseTuple(args, "s|i:driver_remove", &path, &index))
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
@@ -2466,6 +2583,8 @@ static PyObject *pyrna_struct_is_property_set(BPy_StructRNA *self, PyObject *arg
 | 
			
		||||
	const char *name;
 | 
			
		||||
	int ret;
 | 
			
		||||
 | 
			
		||||
	PYRNA_STRUCT_CHECK_OBJ(self)
 | 
			
		||||
 | 
			
		||||
	if (!PyArg_ParseTuple(args, "s:is_property_set", &name))
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
@@ -2505,6 +2624,8 @@ static PyObject *pyrna_struct_is_property_hidden(BPy_StructRNA *self, PyObject *
 | 
			
		||||
	PropertyRNA *prop;
 | 
			
		||||
	const char *name;
 | 
			
		||||
 | 
			
		||||
	PYRNA_STRUCT_CHECK_OBJ(self)
 | 
			
		||||
 | 
			
		||||
	if (!PyArg_ParseTuple(args, "s:is_property_hidden", &name))
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
@@ -2534,6 +2655,8 @@ static PyObject *pyrna_struct_path_resolve(BPy_StructRNA *self, PyObject *args)
 | 
			
		||||
	PropertyRNA *r_prop;
 | 
			
		||||
	int index= -1;
 | 
			
		||||
 | 
			
		||||
	PYRNA_STRUCT_CHECK_OBJ(self)
 | 
			
		||||
 | 
			
		||||
	if (!PyArg_ParseTuple(args, "s|O!:path_resolve", &path, &PyBool_Type, &coerce))
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
@@ -2584,6 +2707,8 @@ static PyObject *pyrna_struct_path_from_id(BPy_StructRNA *self, PyObject *args)
 | 
			
		||||
	PropertyRNA *prop;
 | 
			
		||||
	PyObject *ret;
 | 
			
		||||
 | 
			
		||||
	PYRNA_STRUCT_CHECK_OBJ(self)
 | 
			
		||||
 | 
			
		||||
	if (!PyArg_ParseTuple(args, "|s:path_from_id", &name))
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
@@ -2650,6 +2775,9 @@ static char pyrna_struct_type_recast_doc[] =
 | 
			
		||||
static PyObject *pyrna_struct_type_recast(BPy_StructRNA *self)
 | 
			
		||||
{
 | 
			
		||||
	PointerRNA r_ptr;
 | 
			
		||||
 | 
			
		||||
	PYRNA_STRUCT_CHECK_OBJ(self)
 | 
			
		||||
 | 
			
		||||
	RNA_pointer_recast(&self->ptr, &r_ptr);
 | 
			
		||||
	return pyrna_struct_CreatePyObject(&r_ptr);
 | 
			
		||||
}
 | 
			
		||||
@@ -2729,6 +2857,8 @@ static PyObject *pyrna_struct_dir(BPy_StructRNA *self)
 | 
			
		||||
	PyObject *ret;
 | 
			
		||||
	PyObject *pystring;
 | 
			
		||||
 | 
			
		||||
	PYRNA_STRUCT_CHECK_OBJ(self)
 | 
			
		||||
 | 
			
		||||
	/* Include this incase this instance is a subtype of a python class
 | 
			
		||||
	 * In these instances we may want to return a function or variable provided by the subtype
 | 
			
		||||
	 * */
 | 
			
		||||
@@ -2767,13 +2897,15 @@ static PyObject *pyrna_struct_dir(BPy_StructRNA *self)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//---------------getattr--------------------------------------------
 | 
			
		||||
static PyObject *pyrna_struct_getattro( BPy_StructRNA *self, PyObject *pyname )
 | 
			
		||||
static PyObject *pyrna_struct_getattro(BPy_StructRNA *self, PyObject *pyname)
 | 
			
		||||
{
 | 
			
		||||
	const char *name = _PyUnicode_AsString(pyname);
 | 
			
		||||
	PyObject *ret;
 | 
			
		||||
	PropertyRNA *prop;
 | 
			
		||||
	FunctionRNA *func;
 | 
			
		||||
 | 
			
		||||
	PYRNA_STRUCT_CHECK_OBJ(self)
 | 
			
		||||
 | 
			
		||||
	if(name == NULL) {
 | 
			
		||||
		PyErr_SetString(PyExc_AttributeError, "bpy_struct: __getattr__ must be a string");
 | 
			
		||||
		ret = NULL;
 | 
			
		||||
@@ -2967,11 +3099,13 @@ static int pyrna_struct_meta_idprop_setattro(PyObject *cls, PyObject *attr, PyOb
 | 
			
		||||
	return PyType_Type.tp_setattro(cls, attr, value);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int pyrna_struct_setattro( BPy_StructRNA *self, PyObject *pyname, PyObject *value )
 | 
			
		||||
static int pyrna_struct_setattro(BPy_StructRNA *self, PyObject *pyname, PyObject *value)
 | 
			
		||||
{
 | 
			
		||||
	const char *name = _PyUnicode_AsString(pyname);
 | 
			
		||||
	PropertyRNA *prop= NULL;
 | 
			
		||||
 | 
			
		||||
	PYRNA_STRUCT_CHECK_INT(self)
 | 
			
		||||
 | 
			
		||||
#ifdef USE_PEDANTIC_WRITE
 | 
			
		||||
	if(rna_disallow_writes && rna_id_write_error(&self->ptr, pyname)) {
 | 
			
		||||
		return -1;
 | 
			
		||||
@@ -3275,6 +3409,8 @@ static PyObject *pyrna_struct_get(BPy_StructRNA *self, PyObject *args)
 | 
			
		||||
	const char *key;
 | 
			
		||||
	PyObject* def = Py_None;
 | 
			
		||||
 | 
			
		||||
	PYRNA_STRUCT_CHECK_OBJ(self)
 | 
			
		||||
 | 
			
		||||
	if (!PyArg_ParseTuple(args, "s|O:get", &key, &def))
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
@@ -3317,6 +3453,8 @@ static PyObject *pyrna_prop_collection_get(BPy_PropertyRNA *self, PyObject *args
 | 
			
		||||
	const char *key;
 | 
			
		||||
	PyObject* def = Py_None;
 | 
			
		||||
 | 
			
		||||
	PYRNA_PROP_CHECK_OBJ(self)
 | 
			
		||||
 | 
			
		||||
	if (!PyArg_ParseTuple(args, "s|O:get", &key, &def))
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
@@ -3584,6 +3722,8 @@ static char pyrna_prop_collection_foreach_get_doc[] =
 | 
			
		||||
;
 | 
			
		||||
static PyObject *pyrna_prop_collection_foreach_get(BPy_PropertyRNA *self, PyObject *args)
 | 
			
		||||
{
 | 
			
		||||
	PYRNA_PROP_CHECK_OBJ(self)
 | 
			
		||||
 | 
			
		||||
	return foreach_getset(self, args, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -3600,8 +3740,10 @@ static char pyrna_prop_collection_foreach_set_doc[] =
 | 
			
		||||
"      for i in range(len(seq)): setattr(collection[i], attr, seq[i])\n"
 | 
			
		||||
"\n"
 | 
			
		||||
;
 | 
			
		||||
static  PyObject *pyrna_prop_collection_foreach_set(BPy_PropertyRNA *self, PyObject *args)
 | 
			
		||||
static PyObject *pyrna_prop_collection_foreach_set(BPy_PropertyRNA *self, PyObject *args)
 | 
			
		||||
{
 | 
			
		||||
	PYRNA_PROP_CHECK_OBJ(self)
 | 
			
		||||
 | 
			
		||||
	return foreach_getset(self, args, 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -3612,8 +3754,12 @@ static PyObject *pyrna_prop_array_iter(BPy_PropertyArrayRNA *self)
 | 
			
		||||
	/* Try get values from a collection */
 | 
			
		||||
	PyObject *ret;
 | 
			
		||||
	PyObject *iter= NULL;
 | 
			
		||||
	int len= pyrna_prop_array_length(self);
 | 
			
		||||
	ret = pyrna_prop_array_subscript_slice(self, &self->ptr, self->prop, 0, len, len);
 | 
			
		||||
	int len;
 | 
			
		||||
 | 
			
		||||
	PYRNA_PROP_CHECK_OBJ((BPy_PropertyRNA *)self)
 | 
			
		||||
 | 
			
		||||
	len= pyrna_prop_array_length(self);
 | 
			
		||||
	ret= pyrna_prop_array_subscript_slice(self, &self->ptr, self->prop, 0, len, len);
 | 
			
		||||
 | 
			
		||||
	/* we know this is a list so no need to PyIter_Check
 | 
			
		||||
	 * otherwise it could be NULL (unlikely) if conversion failed */
 | 
			
		||||
@@ -4881,7 +5027,7 @@ PyObject *pyrna_struct_CreatePyObject( PointerRNA *ptr )
 | 
			
		||||
		}
 | 
			
		||||
		else {
 | 
			
		||||
			fprintf(stderr, "Could not make type\n");
 | 
			
		||||
			pyrna = ( BPy_StructRNA * ) PyObject_NEW( BPy_StructRNA, &pyrna_struct_Type );
 | 
			
		||||
			pyrna = (BPy_StructRNA *) PyObject_NEW(BPy_StructRNA, &pyrna_struct_Type );
 | 
			
		||||
#ifdef USE_WEAKREFS
 | 
			
		||||
			pyrna->in_weakreflist= NULL;
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -50,9 +50,6 @@ extern PyTypeObject pyrna_prop_collection_Type;
 | 
			
		||||
typedef struct {
 | 
			
		||||
	PyObject_HEAD /* required python macro   */
 | 
			
		||||
	PointerRNA	ptr;
 | 
			
		||||
#ifdef USE_WEAKREFS
 | 
			
		||||
	PyObject *in_weakreflist;
 | 
			
		||||
#endif
 | 
			
		||||
} BPy_DummyPointerRNA;
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user