From cf4fdad824f2ce76fe3f51c03f52cc22e5a7b117 Mon Sep 17 00:00:00 2001 From: Simon Krajewski Date: Wed, 4 Jul 2012 20:40:57 +0000 Subject: [PATCH] added property reflection support for Flash8 --- codegen.ml | 17 +++++++++++++++++ genswf8.ml | 2 ++ std/flash8/_std/Reflect.hx | 26 ++++++++++++++++++++++---- 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/codegen.ml b/codegen.ml index 200fe12328e..cba9f763981 100644 --- a/codegen.ml +++ b/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 *) diff --git a/genswf8.ml b/genswf8.ml index baf2c9d867f..c18296e9190 100644 --- a/genswf8.ml +++ b/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; diff --git a/std/flash8/_std/Reflect.hx b/std/flash8/_std/Reflect.hx index d5007b47225..5fc5c6f7689 100644 --- a/std/flash8/_std/Reflect.hx +++ b/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, 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 untyped {