Skip to content

Commit

Permalink
Assign return value on Variant operator failure
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
aaronp64 committed Sep 19, 2024
1 parent 3978628 commit 714357e
Showing 1 changed file with 24 additions and 6 deletions.
30 changes: 24 additions & 6 deletions core/variant/variant_op.h
Original file line number Diff line number Diff line change
Expand Up @@ -923,7 +923,10 @@ class OperatorEvaluatorStringFormat<S, void> {
static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
bool valid = true;
String result = do_mod(*VariantGetInternalPtr<S>::get_ptr(left), &valid);
ERR_FAIL_COND_MSG(!valid, result);
if (unlikely(!valid)) {
*VariantGetInternalPtr<String>::get_ptr(r_ret) = *VariantGetInternalPtr<S>::get_ptr(left);
ERR_FAIL_MSG(vformat("String formatting error: %s.", result));
}
*VariantGetInternalPtr<String>::get_ptr(r_ret) = result;
}
static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
Expand All @@ -948,7 +951,10 @@ class OperatorEvaluatorStringFormat<S, Array> {
static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
bool valid = true;
String result = do_mod(*VariantGetInternalPtr<S>::get_ptr(left), *VariantGetInternalPtr<Array>::get_ptr(right), &valid);
ERR_FAIL_COND_MSG(!valid, result);
if (unlikely(!valid)) {
*VariantGetInternalPtr<String>::get_ptr(r_ret) = *VariantGetInternalPtr<S>::get_ptr(left);
ERR_FAIL_MSG(vformat("String formatting error: %s.", result));
}
*VariantGetInternalPtr<String>::get_ptr(r_ret) = result;
}
static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
Expand Down Expand Up @@ -976,7 +982,10 @@ class OperatorEvaluatorStringFormat<S, Object> {
static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
bool valid = true;
String result = do_mod(*VariantGetInternalPtr<S>::get_ptr(left), right->get_validated_object(), &valid);
ERR_FAIL_COND_MSG(!valid, result);
if (unlikely(!valid)) {
*VariantGetInternalPtr<String>::get_ptr(r_ret) = *VariantGetInternalPtr<S>::get_ptr(left);
ERR_FAIL_MSG(vformat("String formatting error: %s.", result));
}
*VariantGetInternalPtr<String>::get_ptr(r_ret) = result;
}
static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
Expand All @@ -1003,7 +1012,10 @@ class OperatorEvaluatorStringFormat {
static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
bool valid = true;
String result = do_mod(*VariantGetInternalPtr<S>::get_ptr(left), *VariantGetInternalPtr<T>::get_ptr(right), &valid);
ERR_FAIL_COND_MSG(!valid, result);
if (unlikely(!valid)) {
*VariantGetInternalPtr<String>::get_ptr(r_ret) = *VariantGetInternalPtr<S>::get_ptr(left);
ERR_FAIL_MSG(vformat("String formatting error: %s.", result));
}
*VariantGetInternalPtr<String>::get_ptr(r_ret) = result;
}
static void ptr_evaluate(const void *left, const void *right, void *r_ret) {
Expand Down Expand Up @@ -1492,7 +1504,10 @@ class OperatorEvaluatorObjectHasPropertyString {
}
static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
Object *l = right->get_validated_object();
ERR_FAIL_NULL(l);
if (unlikely(!l)) {
*VariantGetInternalPtr<bool>::get_ptr(r_ret) = false;
ERR_FAIL_MSG("Invalid base object for 'in'.");
}
const String &a = *VariantGetInternalPtr<String>::get_ptr(left);

bool valid;
Expand Down Expand Up @@ -1526,7 +1541,10 @@ class OperatorEvaluatorObjectHasPropertyStringName {
}
static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) {
Object *l = right->get_validated_object();
ERR_FAIL_NULL(l);
if (unlikely(!l)) {
*VariantGetInternalPtr<bool>::get_ptr(r_ret) = false;
ERR_FAIL_MSG("Invalid base object for 'in'.");
}
const StringName &a = *VariantGetInternalPtr<StringName>::get_ptr(left);

bool valid;
Expand Down

0 comments on commit 714357e

Please sign in to comment.