Skip to content

Commit 714357e

Browse files
committed
Assign return value on Variant operator failure
Variant operators for String formatting and "in" could result in errors, which would return from validated_evaluate without assigning r_ret. This would cause scripts using the return value from these operators to get results from previously run code. Updated to return the original String value in the String formatting case, and false for "in" when an error occurs.
1 parent 3978628 commit 714357e

File tree

1 file changed

+24
-6
lines changed

1 file changed

+24
-6
lines changed

core/variant/variant_op.h

+24-6
Original file line numberDiff line numberDiff line change
@@ -923,7 +923,10 @@ class OperatorEvaluatorStringFormat<S, void> {
923923
static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
924924
bool valid = true;
925925
String result = do_mod(*VariantGetInternalPtr<S>::get_ptr(left), &valid);
926-
ERR_FAIL_COND_MSG(!valid, result);
926+
if (unlikely(!valid)) {
927+
*VariantGetInternalPtr<String>::get_ptr(r_ret) = *VariantGetInternalPtr<S>::get_ptr(left);
928+
ERR_FAIL_MSG(vformat("String formatting error: %s.", result));
929+
}
927930
*VariantGetInternalPtr<String>::get_ptr(r_ret) = result;
928931
}
929932
static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
@@ -948,7 +951,10 @@ class OperatorEvaluatorStringFormat<S, Array> {
948951
static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
949952
bool valid = true;
950953
String result = do_mod(*VariantGetInternalPtr<S>::get_ptr(left), *VariantGetInternalPtr<Array>::get_ptr(right), &valid);
951-
ERR_FAIL_COND_MSG(!valid, result);
954+
if (unlikely(!valid)) {
955+
*VariantGetInternalPtr<String>::get_ptr(r_ret) = *VariantGetInternalPtr<S>::get_ptr(left);
956+
ERR_FAIL_MSG(vformat("String formatting error: %s.", result));
957+
}
952958
*VariantGetInternalPtr<String>::get_ptr(r_ret) = result;
953959
}
954960
static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
@@ -976,7 +982,10 @@ class OperatorEvaluatorStringFormat<S, Object> {
976982
static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
977983
bool valid = true;
978984
String result = do_mod(*VariantGetInternalPtr<S>::get_ptr(left), right->get_validated_object(), &valid);
979-
ERR_FAIL_COND_MSG(!valid, result);
985+
if (unlikely(!valid)) {
986+
*VariantGetInternalPtr<String>::get_ptr(r_ret) = *VariantGetInternalPtr<S>::get_ptr(left);
987+
ERR_FAIL_MSG(vformat("String formatting error: %s.", result));
988+
}
980989
*VariantGetInternalPtr<String>::get_ptr(r_ret) = result;
981990
}
982991
static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
@@ -1003,7 +1012,10 @@ class OperatorEvaluatorStringFormat {
10031012
static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
10041013
bool valid = true;
10051014
String result = do_mod(*VariantGetInternalPtr<S>::get_ptr(left), *VariantGetInternalPtr<T>::get_ptr(right), &valid);
1006-
ERR_FAIL_COND_MSG(!valid, result);
1015+
if (unlikely(!valid)) {
1016+
*VariantGetInternalPtr<String>::get_ptr(r_ret) = *VariantGetInternalPtr<S>::get_ptr(left);
1017+
ERR_FAIL_MSG(vformat("String formatting error: %s.", result));
1018+
}
10071019
*VariantGetInternalPtr<String>::get_ptr(r_ret) = result;
10081020
}
10091021
static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
@@ -1492,7 +1504,10 @@ class OperatorEvaluatorObjectHasPropertyString {
14921504
}
14931505
static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
14941506
Object *l = right->get_validated_object();
1495-
ERR_FAIL_NULL(l);
1507+
if (unlikely(!l)) {
1508+
*VariantGetInternalPtr<bool>::get_ptr(r_ret) = false;
1509+
ERR_FAIL_MSG("Invalid base object for 'in'.");
1510+
}
14961511
const String &a = *VariantGetInternalPtr<String>::get_ptr(left);
14971512

14981513
bool valid;
@@ -1526,7 +1541,10 @@ class OperatorEvaluatorObjectHasPropertyStringName {
15261541
}
15271542
static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
15281543
Object *l = right->get_validated_object();
1529-
ERR_FAIL_NULL(l);
1544+
if (unlikely(!l)) {
1545+
*VariantGetInternalPtr<bool>::get_ptr(r_ret) = false;
1546+
ERR_FAIL_MSG("Invalid base object for 'in'.");
1547+
}
15301548
const StringName &a = *VariantGetInternalPtr<StringName>::get_ptr(left);
15311549

15321550
bool valid;

0 commit comments

Comments
 (0)