Kaynağa Gözat

[jvm] treat type parameter like Object for numeric casting

closes #9590
Simon Krajewski 5 yıl önce
ebeveyn
işleme
4475dc30fd

+ 1 - 1
src/generators/jvm/jvmMethod.ml

@@ -560,7 +560,7 @@ class builder jc name jsig = object(self)
 				self#expect_reference_type
 			end else if is_number_sig name jsig then
 				number_to name
-			else if jsig = object_sig then
+			else if is_dynamic_at_runtime jsig then
 				dynamic_to name
 			else
 				code#checkcast (["java";"lang"],name)

+ 6 - 7
std/jvm/Jvm.hx

@@ -157,48 +157,47 @@ class Jvm {
 	}
 
 	// casts
-	// TODO: add other dynamicToType methods
 
 	static public function dynamicToByte<T>(d:T):Null<java.lang.Byte> {
 		if (instanceof(d, java.lang.Number)) {
 			return numberToByte(cast d);
 		}
-		return cast d;
+		return null;
 	}
 
 	static public function dynamicToShort<T>(d:T):Null<java.lang.Short> {
 		if (instanceof(d, java.lang.Number)) {
 			return numberToShort(cast d);
 		}
-		return cast d;
+		return null;
 	}
 
 	static public function dynamicToInteger<T>(d:T):Null<Int> {
 		if (instanceof(d, java.lang.Number)) {
 			return numberToInteger(cast d);
 		}
-		return cast d;
+		return null;
 	}
 
 	static public function dynamicToLong<T>(d:T):Null<java.lang.Long> {
 		if (instanceof(d, java.lang.Number)) {
 			return numberToLong(cast d);
 		}
-		return cast d;
+		return null;
 	}
 
 	static public function dynamicToFloat<T>(d:T):Null<java.lang.Float> {
 		if (instanceof(d, java.lang.Number)) {
 			return numberToFloat(cast d);
 		}
-		return cast d;
+		return null;
 	}
 
 	static public function dynamicToDouble<T>(d:T):Null<Float> {
 		if (instanceof(d, java.lang.Number)) {
 			return numberToDouble(cast d);
 		}
-		return cast d;
+		return null;
 	}
 
 	static public function numberToByte(n:java.lang.Number):Null<java.lang.Byte> {

+ 25 - 0
tests/unit/src/unit/issues/Issue9590.hx

@@ -0,0 +1,25 @@
+package unit.issues;
+
+// A schema for some JSON file
+private typedef Format = {
+    ?anchorX :Float,
+    ?anchorY :Float,
+};
+
+// Returns value with a default if missing
+/* inline */ function deNull<T> (value :T, defaultValue :T) :T {
+    return (value != null) ? value : defaultValue;
+}
+
+class Issue9590 extends Test {
+	function test() {
+		// Load a bunch of JSON data
+		var obj :Format = haxe.Json.parse("{\"anchorX\": 123.0}");
+
+		var anchorX :Float = deNull(obj.anchorX, 0.0);
+		var anchorY :Float = deNull(obj.anchorY, 0.0);
+
+		feq(123.0, anchorX);
+		feq(0, anchorY);
+	}
+}