Forráskód Böngészése

added property reflection support for Flash8

Simon Krajewski 13 éve
szülő
commit
cf4fdad824
3 módosított fájl, 41 hozzáadás és 4 törlés
  1. 17 0
      codegen.ml
  2. 2 0
      genswf8.ml
  3. 22 4
      std/flash8/_std/Reflect.hx

+ 17 - 0
codegen.ml

@@ -101,6 +101,23 @@ let get_properties fields =
 		| _ -> acc
 	) [] fields
 
+let add_property_field com c =
+	let p = c.cl_pos in
+	let props = get_properties (c.cl_ordered_statics @ c.cl_ordered_fields) in
+	match props with
+	| [] -> ()
+	| _ ->
+		let fields,values = List.fold_left (fun (fields,values) (n,v) ->
+			let cf = mk_field n com.basic.tstring p in
+			PMap.add n cf fields,(n, string com v p) :: values
+		) (PMap.empty,[]) props in
+		let t = mk_anon fields in
+		let e = mk (TObjectDecl values) t p in
+		let cf = mk_field "__properties__" t p in
+		cf.cf_expr <- Some e;
+		c.cl_statics <- PMap.add cf.cf_name cf c.cl_statics;
+		c.cl_ordered_statics <- cf :: c.cl_ordered_statics
+
 (* -------------------------------------------------------------------------- *)
 (* REMOTING PROXYS *)
 

+ 2 - 0
genswf8.ml

@@ -1411,6 +1411,8 @@ let gen_type_def ctx t =
 		setvar ctx VarObj;
 		(* true if implements mt.Protect *)
 		let flag = is_protected ctx ~stat:true (TInst (c,[])) "" in
+		if (Common.has_feature ctx.com "Reflect.getProperty") || (Common.has_feature ctx.com "Reflect.setProperty") then
+			Codegen.add_property_field ctx.com c;
 		List.iter (gen_class_static_field ctx c flag) c.cl_ordered_statics;
 		let flag = is_protected ctx (TInst (c,[])) "" in
 		PMap.iter (fun _ f -> match f.cf_kind with Var { v_read = AccResolve } -> () | _ -> gen_class_field ctx flag f) c.cl_fields;

+ 22 - 4
std/flash8/_std/Reflect.hx

@@ -37,12 +37,30 @@
 		o[field] = value;
 	}
 
-	public static inline function getProperty( o : Dynamic, field : String ) : Dynamic {
-		return Reflect.field(o,field);
+	static function findAccessor( c : Class<Dynamic>, name : String ):Dynamic untyped {
+		do {
+			var getter = c.__properties__[name];
+			if (getter != null)
+				return getter;
+			c = c.__super__;
+		} while (c != null);
+		return null;
+	}
+	
+	public static function getProperty( o : Dynamic, field : String ) : Dynamic untyped {
+		var getter = findAccessor( Std.is(o,Class) ? o : o.__class__, "get_" +field);
+		return if (getter != null)
+			o[getter]["apply"](o, [field]);
+		else
+			Reflect.field(o, field);
 	}
 
-	public static inline function setProperty( o : Dynamic, field : String, value : Dynamic ) : Void {
-		setField(o,field,value);
+	public static inline function setProperty( o : Dynamic, field : String, value : Dynamic ) : Void untyped {
+		var setter = findAccessor( Std.is(o,Class) ? o : o.__class__, "set_" +field);
+		return if (setter != null)
+			o[setter]["apply"](o, [value]);
+		else
+			Reflect.setField(o, field, value);	
 	}
 
 	public inline static function callMethod( o : Dynamic, func : Dynamic, args : Array<Dynamic> ) : Dynamic untyped {