Explorar o código

-Concatenating arrays keeps the shared property if any of the arrays is shared. Fixes #1646

Juan Linietsky %!s(int64=10) %!d(string=hai) anos
pai
achega
22997294fa
Modificáronse 4 ficheiros con 6 adicións e 3 borrados
  1. 2 2
      bin/tests/test_gui.cpp
  2. 2 0
      core/variant_call.cpp
  3. 1 1
      core/variant_op.cpp
  4. 1 0
      modules/gdscript/gd_parser.cpp

+ 2 - 2
bin/tests/test_gui.cpp

@@ -132,7 +132,7 @@ public:
 		frame->add_child( button );
 		frame->add_child( button );
 
 
 
 
-
+#if 0
 		Sprite *tf = memnew( Sprite );
 		Sprite *tf = memnew( Sprite );
 		frame->add_child(tf);
 		frame->add_child(tf);
 		Image img;
 		Image img;
@@ -147,7 +147,7 @@ public:
 		tf->set_pos(Point2(50,50));
 		tf->set_pos(Point2(50,50));
 		//tf->set_scale(Point2(0.3,0.3));
 		//tf->set_scale(Point2(0.3,0.3));
 
 
-#if 0
+
 		return;
 		return;
 #endif
 #endif
 
 

+ 2 - 0
core/variant_call.cpp

@@ -426,6 +426,7 @@ static void _call_##m_type##_##m_method(Variant& r_ret,Variant& p_self,const Var
 	VCALL_LOCALMEM0(Array,sort);
 	VCALL_LOCALMEM0(Array,sort);
 	VCALL_LOCALMEM2(Array,sort_custom);
 	VCALL_LOCALMEM2(Array,sort_custom);
 	VCALL_LOCALMEM0(Array,invert);
 	VCALL_LOCALMEM0(Array,invert);
+	VCALL_LOCALMEM0R(Array,is_shared);
 
 
 	static void _call_ByteArray_get_string_from_ascii(Variant& r_ret,Variant& p_self,const Variant** p_args) {
 	static void _call_ByteArray_get_string_from_ascii(Variant& r_ret,Variant& p_self,const Variant** p_args) {
 
 
@@ -1378,6 +1379,7 @@ _VariantCall::addfunc(Variant::m_vtype,Variant::m_ret,_SCS(#m_method),VCALL(m_cl
 	ADDFUNC0(ARRAY,NIL,Array,sort,varray());
 	ADDFUNC0(ARRAY,NIL,Array,sort,varray());
 	ADDFUNC2(ARRAY,NIL,Array,sort_custom,OBJECT,"obj",STRING,"func",varray());
 	ADDFUNC2(ARRAY,NIL,Array,sort_custom,OBJECT,"obj",STRING,"func",varray());
 	ADDFUNC0(ARRAY,NIL,Array,invert,varray());
 	ADDFUNC0(ARRAY,NIL,Array,invert,varray());
+	ADDFUNC0(ARRAY,BOOL,Array,is_shared,varray());
 
 
 	ADDFUNC0(RAW_ARRAY,INT,ByteArray,size,varray());
 	ADDFUNC0(RAW_ARRAY,INT,ByteArray,size,varray());
 	ADDFUNC2(RAW_ARRAY,NIL,ByteArray,set,INT,"idx",INT,"byte",varray());
 	ADDFUNC2(RAW_ARRAY,NIL,ByteArray,set,INT,"idx",INT,"byte",varray());

+ 1 - 1
core/variant_op.cpp

@@ -471,7 +471,7 @@ void Variant::evaluate(const Operator& p_op, const Variant& p_a, const Variant&
 						}
 						}
 						const Array &array_a=*reinterpret_cast<const Array *>(p_a._data._mem);
 						const Array &array_a=*reinterpret_cast<const Array *>(p_a._data._mem);
 						const Array &array_b=*reinterpret_cast<const Array *>(p_b._data._mem);
 						const Array &array_b=*reinterpret_cast<const Array *>(p_b._data._mem);
-						Array sum;
+						Array sum(array_a.is_shared() || array_b.is_shared());
 						int asize=array_a.size();
 						int asize=array_a.size();
 						int bsize=array_b.size();
 						int bsize=array_b.size();
 						sum.resize(asize+bsize);
 						sum.resize(asize+bsize);

+ 1 - 0
modules/gdscript/gd_parser.cpp

@@ -1075,6 +1075,7 @@ GDParser::Node* GDParser::_reduce_expression(Node *p_node,bool p_to_const) {
 
 
 				ConstantNode *cn = alloc_node<ConstantNode>();
 				ConstantNode *cn = alloc_node<ConstantNode>();
 				Array arr(!p_to_const);
 				Array arr(!p_to_const);
+				//print_line("mk array "+itos(!p_to_const));
 				arr.resize(an->elements.size());
 				arr.resize(an->elements.size());
 				for(int i=0;i<an->elements.size();i++) {
 				for(int i=0;i<an->elements.size();i++) {
 					ConstantNode *acn = static_cast<ConstantNode*>(an->elements[i]);
 					ConstantNode *acn = static_cast<ConstantNode*>(an->elements[i]);