Bladeren bron

Merge pull request #95166 from aaronp64/variant_op_err_return

Assign return value on `Variant` operator failure
Rémi Verschelde 11 maanden geleden
bovenliggende
commit
1b19ecb360
1 gewijzigde bestanden met toevoegingen van 24 en 6 verwijderingen
  1. 24 6
      core/variant/variant_op.h

+ 24 - 6
core/variant/variant_op.h

@@ -923,7 +923,10 @@ public:
 	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) {
@@ -948,7 +951,10 @@ public:
 	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) {
@@ -976,7 +982,10 @@ public:
 	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) {
@@ -1003,7 +1012,10 @@ public:
 	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) {
@@ -1492,7 +1504,10 @@ public:
 	}
 	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;
@@ -1526,7 +1541,10 @@ public:
 	}
 	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;