2
0
Эх сурвалжийг харах

added check to prevent Float superclass var init before calling super (close #2202)

Nicolas Cannasse 11 жил өмнө
parent
commit
1a07506c9d
1 өөрчлөгдсөн 19 нэмэгдсэн , 1 устгасан
  1. 19 1
      genswf9.ml

+ 19 - 1
genswf9.ml

@@ -2034,7 +2034,24 @@ let generate_field_kind ctx f c stat =
 			hlv_value = HVNone;
 			hlv_const = false;
 		})
-
+		
+let check_constructor ctx c f =
+	(*
+		check that we don't assign a super Float var before we call super() : will result in NaN
+	*)
+	let rec loop e =
+		Type.iter loop e;
+		match e.eexpr with
+		| TCall ({ eexpr = TConst TSuper },_) -> raise Exit
+		| TBinop (OpAssign,{ eexpr = TField({ eexpr = TConst TThis },FInstance (cc,cf)) },_) when c != cc && classify ctx cf.cf_type = KFloat ->
+			error "You cannot assign a super class Float before calling super() in flash, this will reset it to NaN" e.epos
+		| _ -> ()
+	in
+	try
+		loop f.tf_expr
+	with Exit ->
+		()
+		
 let generate_class ctx c =
 	let name = type_path ctx c.cl_path in
 	ctx.cur_class <- c;
@@ -2057,6 +2074,7 @@ let generate_class ctx c =
 			| Some { eexpr = TFunction fdata } ->
 				let old = do_debug ctx f.cf_meta in
 				let m = generate_construct ctx fdata c in
+				check_constructor ctx c fdata;
 				old();
 				m
 			| _ -> assert false