Bläddra i källkod

added is_special_compare to as3

Simon Krajewski 13 år sedan
förälder
incheckning
414fec2d2d
3 ändrade filer med 13 tillägg och 2 borttagningar
  1. 11 0
      genas3.ml
  2. 1 1
      std/flash/_std/Xml.hx
  3. 1 1
      typeload.ml

+ 11 - 0
genas3.ml

@@ -51,6 +51,14 @@ let is_var_field e v =
 		with Not_found -> false)
 	| _ -> false
 
+let is_special_compare e1 e2 =
+	match e1.eexpr, e2.eexpr with
+	| TConst TNull, _  | _ , TConst TNull -> None
+	| _ ->
+	match follow e1.etype, follow e2.etype with
+	| TInst ({ cl_path = [],"Xml" } as c,_) , _ | _ , TInst ({ cl_path = [],"Xml" } as c,_) -> Some c
+	| _ -> None
+
 let protect name =
 	match name with
 	| "Error" | "Namespace" -> "_" ^ name
@@ -502,6 +510,9 @@ and gen_expr ctx e =
 		spr ctx "[";
 		gen_value ctx e2;
 		spr ctx "]";
+	| TBinop (Ast.OpEq,e1,e2) when (match is_special_compare e1 e2 with Some c -> true | None -> false) ->
+		let c = match is_special_compare e1 e2 with Some c -> c | None -> assert false in
+		gen_expr ctx (mk (TCall (mk (TField (mk (TTypeExpr (TClassDecl c)) t_dynamic e.epos,"compare")) t_dynamic e.epos,[e1;e2])) ctx.inf.com.basic.tbool e.epos);
 	| TBinop (op,{ eexpr = TField (e1,s) },e2) ->
 		gen_value_op ctx e1;
 		gen_field_access ctx e1.etype s;

+ 1 - 1
std/flash/_std/Xml.hx

@@ -68,7 +68,7 @@ enum XmlType {
 		return wrap( root, Xml.Document );
 	}
 	
-	static function compare( a : Xml, b : Xml ) : Bool {
+	#if as3 @:hack public #end static function compare( a : Xml, b : Xml ) : Bool {
 		return a == null ? b == null : (b == null ? false : a._node == b._node);
 	}
 

+ 1 - 1
typeload.ml

@@ -737,7 +737,7 @@ let init_core_api ctx c =
 			) fcore;
 			PMap.iter (fun i f ->
 				let p = (match f.cf_expr with None -> c.cl_pos | Some e -> e.epos) in
-				if f.cf_public && not (PMap.mem f.cf_name fcore) && not (List.mem f.cf_name c.cl_overrides) then error ("Public field " ^ i ^ " is not part of core type") p;
+				if f.cf_public && not (has_meta ":hack" f.cf_meta) && not (PMap.mem f.cf_name fcore) && not (List.mem f.cf_name c.cl_overrides) then error ("Public field " ^ i ^ " is not part of core type") p;
 			) fl;
 		in
 		check_fields ccore.cl_fields c.cl_fields;