diff --git a/core/variant_op.cpp b/core/variant_op.cpp index 2f522faf1fe..9f706e75cf4 100644 --- a/core/variant_op.cpp +++ b/core/variant_op.cpp @@ -861,7 +861,6 @@ void Variant::evaluate(const Operator& p_op, const Variant& p_a, const Variant& } break; //logic case OP_AND: { - bool l = p_a.booleanize(r_valid); if (!r_valid) return; @@ -978,6 +977,8 @@ Variant Variant::get_named(const StringName& p_index, bool *r_valid) const { int index = p_index;\ m_type *arr=reinterpret_cast(_data._mem);\ \ + if (index<0)\ + index += arr->size();\ if (index>=0 && indexsize()) {\ valid=true;\ cmd;\ @@ -1011,7 +1012,10 @@ void Variant::set(const Variant& p_index, const Variant& p_value, bool *r_valid) int idx=p_index; String *str=reinterpret_cast(_data._mem); - if (idx <0 || idx>=str->length()) + int len = str->length(); + if (idx<0) + idx += len; + if (idx<0 || idx>=len) return; String chr; @@ -1025,7 +1029,7 @@ void Variant::set(const Variant& p_index, const Variant& p_value, bool *r_valid) return; } - *str = str->substr(0,idx)+chr+str->substr(idx+1,str->length()); + *str = str->substr(0,idx)+chr+str->substr(idx+1, len); valid=true; return; @@ -1040,6 +1044,8 @@ void Variant::set(const Variant& p_index, const Variant& p_value, bool *r_valid) // scalar index int idx=p_index; + if (idx<0) + idx += 2; if (idx>=0 && idx<2) { Vector2 *v=reinterpret_cast(_data._mem); @@ -1098,6 +1104,8 @@ void Variant::set(const Variant& p_index, const Variant& p_value, bool *r_valid) int index = p_index; + if (index<0) + index += 3; if (index>=0 && index<3) { Matrix32 *v=_data._matrix32; @@ -1134,6 +1142,8 @@ void Variant::set(const Variant& p_index, const Variant& p_value, bool *r_valid) if (p_index.get_type()==Variant::INT || p_index.get_type()==Variant::REAL) { //scalar index int idx=p_index; + if (idx<0) + idx += 3; if (idx>=0 && idx<3) { Vector3 *v=reinterpret_cast(_data._mem); @@ -1268,6 +1278,8 @@ void Variant::set(const Variant& p_index, const Variant& p_value, bool *r_valid) int index = p_index; + if (index<0) + index += 3; if (index>=0 && index<3) { Matrix3 *v=_data._matrix3; @@ -1306,6 +1318,8 @@ void Variant::set(const Variant& p_index, const Variant& p_value, bool *r_valid) int index = p_index; + if (index<0) + index += 4; if (index>=0 && index<4) { Transform *v=_data._transform; valid=true; @@ -1394,6 +1408,8 @@ void Variant::set(const Variant& p_index, const Variant& p_value, bool *r_valid) } else if (p_index.get_type()==Variant::INT) { int idx = p_index; + if (idx<0) + idx += 4; if (idx>=0 || idx<4) { Color *v=reinterpret_cast(_data._mem); (*v)[idx]=p_value; @@ -1841,6 +1857,8 @@ Variant Variant::get(const Variant& p_index, bool *r_valid) const { int idx=p_index; const String *str=reinterpret_cast(_data._mem); + if (idx<0) + idx += str->length(); if (idx >=0 && idxlength()) { valid=true; @@ -1854,6 +1872,8 @@ Variant Variant::get(const Variant& p_index, bool *r_valid) const { if (p_index.get_type()==Variant::INT || p_index.get_type()==Variant::REAL) { // scalar index int idx=p_index; + if (idx<0) + idx += 2; if (idx>=0 && idx<2) { const Vector2 *v=reinterpret_cast(_data._mem); @@ -1899,6 +1919,8 @@ Variant Variant::get(const Variant& p_index, bool *r_valid) const { if (p_index.get_type()==Variant::INT || p_index.get_type()==Variant::REAL) { //scalar index int idx=p_index; + if (idx<0) + idx += 3; if (idx>=0 && idx<3) { const Vector3 *v=reinterpret_cast(_data._mem); @@ -1929,6 +1951,8 @@ Variant Variant::get(const Variant& p_index, bool *r_valid) const { int index = p_index; + if (index<0) + index += 3; if (index>=0 && index<3) { const Matrix32 *v=_data._matrix32; @@ -2024,7 +2048,8 @@ Variant Variant::get(const Variant& p_index, bool *r_valid) const { if (p_index.get_type()==Variant::INT || p_index.get_type()==Variant::REAL) { int index = p_index; - + if (index<0) + index += 3; if (index>=0 && index<3) { const Matrix3 *v=_data._matrix3; @@ -2054,7 +2079,8 @@ Variant Variant::get(const Variant& p_index, bool *r_valid) const { if (p_index.get_type()==Variant::INT || p_index.get_type()==Variant::REAL) { int index = p_index; - + if (index<0) + index += 4; if (index>=0 && index<4) { const Transform *v=_data._transform; valid=true; @@ -2118,6 +2144,8 @@ Variant Variant::get(const Variant& p_index, bool *r_valid) const { } else if (p_index.get_type()==Variant::INT) { int idx = p_index; + if (idx<0) + idx += 4; if (idx>=0 || idx<4) { const Color *v=reinterpret_cast(_data._mem); valid=true; diff --git a/doc/base/classes.xml b/doc/base/classes.xml index 8f29c7f166d..d71918b9494 100644 --- a/doc/base/classes.xml +++ b/doc/base/classes.xml @@ -4325,7 +4325,7 @@ Generic array datatype. - Generic array, contains several elements of any type, accessible by numerical index starting at 0. Arrays are always passed by reference. + Generic array, contains several elements of any type, accessible by numerical index starting at 0. Negative indices can be used to count from the right, like in Python. Arrays are always passed by reference.