浏览代码

[java/cs] Fixed Std.string recursion with --no-inline - Fixed Issue #999

Caue Waneck 13 年之前
父节点
当前提交
b6d87fb5a0
共有 4 个文件被更改,包括 12 次插入3 次删除
  1. 8 0
      gencommon.ml
  2. 1 0
      gencs.ml
  3. 1 1
      std/cs/_std/haxe/lang/Runtime.hx
  4. 2 2
      std/java/_std/haxe/lang/Runtime.hx

+ 8 - 0
gencommon.ml

@@ -578,6 +578,7 @@ and gen_classes =
   cl_type : tclass;
   cl_class : tclass;
   cl_enum : tclass;
+  cl_dyn : tclass;
   
   t_iterator : tdef;
 }
@@ -628,6 +629,7 @@ let new_ctx con =
       cl_type = get_cl (get_type con.types ([], "Type"));
       cl_class = get_cl (get_type con.types ([], "Class"));
       cl_enum = get_cl (get_type con.types ([], "Enum"));
+      cl_dyn = get_cl (get_type con.types ([], "Dynamic"));
       
       t_iterator = get_tdef (get_type con.types ([], "Iterator"));
     };
@@ -1143,9 +1145,15 @@ let field_access gen (t:t) (field:string) : (tfield_access) =
           let f = PMap.find field e.e_constrs in
           let is_param = match follow f.ef_type with | TFun _ -> true | _ -> false in
           FEnumField(e, f, is_param)
+        | _ when PMap.mem field gen.gbase_class_fields ->
+          let cf = PMap.find field gen.gbase_class_fields in
+          FClassField(gen.gclasses.cl_dyn, [t_dynamic], cf, false, cf.cf_type)
         | _ ->
           FAnonField(PMap.find field anon.a_fields)
       with | Not_found -> FNotFound)
+    | _ when PMap.mem field gen.gbase_class_fields ->
+      let cf = PMap.find field gen.gbase_class_fields in
+      FClassField(gen.gclasses.cl_dyn, [t_dynamic], cf, false, cf.cf_type)
     | TDynamic t -> FDynamicField t
     | TMono _ -> FDynamicField t_dynamic
     | _ -> FNotFound

+ 1 - 0
gencs.ml

@@ -1061,6 +1061,7 @@ let configure gen =
         end (* TODO see how (get,set) variable handle when they are interfaces *)
       | Method mkind -> 
         let is_virtual = not is_final && match mkind with | MethInline -> false | _ when not is_new -> true | _ -> false in
+        let is_virtual = if not is_virtual || has_meta ":final" cf.cf_meta then false else is_virtual in
         let is_override = List.mem cf.cf_name cl.cl_overrides in
         let is_virtual = is_virtual && not (has_meta ":final" cl.cl_meta) && not (is_interface) in
         let visibility = if is_interface then "" else "public" in

+ 1 - 1
std/cs/_std/haxe/lang/Runtime.hx

@@ -545,7 +545,7 @@ import system.Type;
 	{
 		if (obj == null) 
 			return null;
-		return obj + "";
+		return untyped obj.ToString();
 	}
 	
 	@:functionBody('

+ 2 - 2
std/java/_std/haxe/lang/Runtime.hx

@@ -535,9 +535,9 @@ package haxe.lang;
 	
 	public static function toString(obj:Dynamic):String
 	{
-		if (obj == null) 
+		if (obj == null)
 			return null;
-		return obj + "";
+		return untyped obj.toString();
 	}
 }