Просмотр исходного кода

[java] String reflection ( related to Issue #940 )

Caue Waneck 13 лет назад
Родитель
Сommit
a26cc35878

+ 5 - 3
gencommon.ml

@@ -3051,6 +3051,9 @@ struct
           let args = func_args_i i in
           
           (* api fn *)
+          
+          (* only cast if needed *)
+          let mk_cast tto efrom = gen.ghandle_cast (gen.greal_type tto) (gen.greal_type efrom.etype) efrom in
           let api i t const =
             let vf, _ = List.nth args i in
             let vo, _ = List.nth args (i + arity) in
@@ -3079,7 +3082,7 @@ struct
                 }
             in
             
-            if is_float then {  
+            {  
               eexpr = TIf(
                 { eexpr = TBinop(Ast.OpEq, olocal, undefined pos); etype = basic.tbool; epos = pos },
                 (if needs_cast then mk_cast t flocal else flocal),
@@ -3087,8 +3090,7 @@ struct
               ); 
               etype = t;
               epos = pos
-            } else 
-              get_from_obj olocal
+            }
           in
           (* end of api fn *)
           

+ 1 - 1
genjava.ml

@@ -770,7 +770,7 @@ let configure gen =
       | TType (({t_path = p;} as t), params) -> (path_param_s (TTypeDecl t) p params)
       | TAnon (anon) ->
         (match !(anon.a_status) with
-          | Statics _ | EnumStatics _ -> "haxe.lang.Class"
+          | Statics _ | EnumStatics _ -> "java.lang.Class"
           | _ -> "java.lang.Object")
       | TDynamic _ -> "java.lang.Object"
       (* No Lazy type nor Function type made. That's because function types will be at this point be converted into other types *)

+ 3 - 20
std/java/_std/Reflect.hx

@@ -122,27 +122,10 @@ import java.Boot;
 			Array<String> ret = new Array<String>();
 				((haxe.lang.IHxObject) o).__hx_getFields(ret);
 			return ret;
+		} else if (o instanceof java.lang.Class) {
+			return Type.getClassFields( (java.lang.Class) o);
 		} else {
-			Array<String> ret = new Array<String>();
-			
-			if (o instanceof java.lang.Class)
-			{
-				Class<?> cl = (java.lang.Class) o;
-				
-				for(java.lang.reflect.Field f : cl.getFields())
-				{
-					if (java.lang.reflect.Modifier.isStatic(f.getModifiers()))
-						ret.push(f.getName());
-				}
-				
-				for(java.lang.reflect.Method m : cl.getMethods())
-				{
-					if (java.lang.reflect.Modifier.isStatic(m.getModifiers()))
-						ret.push(m.getName());
-				}
-			}
-			
-			return ret;
+			return new Array<String>();
 		}
 	')
 	public static function fields( o : Dynamic ) : Array<String>

+ 11 - 0
std/java/_std/Type.hx

@@ -261,6 +261,11 @@ enum ValueType {
 	}
 	
 	@:functionBody('
+		if (c == java.lang.String.class)
+		{
+			return haxe.lang.StringRefl.fields;
+		}
+		
 		Array<String> ret = new Array<String>();
 		for (java.lang.reflect.Field f : c.getDeclaredFields())
 		{
@@ -284,6 +289,12 @@ enum ValueType {
 	
 	@:functionBody('
 		Array<String> ret = new Array<String>();
+		if (c == java.lang.String.class)
+		{
+			ret.push("fromCharCode");
+			return ret;
+		}
+		
 		for (java.lang.reflect.Field f : c.getDeclaredFields())
 		{
 			java.lang.String fname = f.getName();

+ 1 - 1
std/java/_std/haxe/lang/Function.hx

@@ -45,7 +45,7 @@ import haxe.lang.Runtime;
 	private var obj:Dynamic;
 	private var field:String;
 	
-	public function new(obj, field)
+	public function new(obj:Dynamic, field)
 	{
 		super(-1, -1);
 		this.obj = obj;

+ 16 - 29
std/java/_std/haxe/lang/Runtime.hx

@@ -2,7 +2,7 @@ package haxe.lang;
 
 /**
  This class is meant for internal compiler use only. It provides the Haxe runtime
- compatibility to the host language.
+ compatibility to the host language. Do not access it directly.
 **/
 
 @:nativegen
@@ -152,7 +152,12 @@ package haxe.lang;
 		java.lang.Class cl = null;
 		if (o instanceof java.lang.Class)
 		{
+			if (o == java.lang.String.class)
+				return field == "fromCharCode";
+			
 			cl = (java.lang.Class) o;
+		} else if (o instanceof java.lang.String) {
+			return haxe.lang.StringRefl.handleGetField( (java.lang.String) o, field, false) != null;
 		} else {
 			cl = o.getClass();
 		}
@@ -245,8 +250,13 @@ package haxe.lang;
 	{
 		if (obj instanceof java.lang.Class)
 		{
+			if (obj == java.lang.String.class && field.equals("fromCharCode"))
+				return new haxe.lang.Closure(haxe.lang.StringExt.class, field);
+			
 			cl = (java.lang.Class) obj;
 			obj = null;
+		} else if (obj instanceof java.lang.String) {
+			return haxe.lang.StringRefl.handleGetField((java.lang.String) obj, field, throwErrors);
 		} else {
 			cl = obj.getClass();
 		}
@@ -322,8 +332,13 @@ package haxe.lang;
 		java.lang.Class cl = null;
 		if (obj instanceof java.lang.Class)
 		{
+			if (obj == java.lang.String.class && field.equals("fromCharCode"))
+				return haxe.lang.StringExt.fromCharCode(toInt(args.__get(0)));
+			
 			cl = (java.lang.Class) obj;
 			obj = null;
+		} else if (obj instanceof java.lang.String) {
+			return haxe.lang.StringRefl.handleCallField((java.lang.String) obj, field, args);
 		} else {
 			cl = obj.getClass();
 		}
@@ -505,34 +520,6 @@ package haxe.lang;
 		return 0.0;
 	}
 	
-	
-	private static var classes:Hash<Class<Dynamic>> = new Hash();
-	
-	public static function registerClass(name:String, cl:Class<Dynamic>):Void
-	{
-		classes.set(name, cl);
-	}
-	
-	public static function getClass(name:String, t:java.lang.Class<Dynamic>):Class<Dynamic>
-	{
-		var ret:Class<Dynamic> = classes.get(name);
-		if (ret == null)
-			return slowGetClass(name, t);
-		else
-			return ret;
-	}
-	
-	@:functionBody('
-	if (t == null)
-		return null;
-	
-	return null;
-	')
-	public static function slowGetClass(name:String, t:java.lang.Class<Dynamic>):Class<Dynamic>
-	{
-		return null;
-	}
-	
 	public static function toString(obj:Dynamic):String
 	{
 		if (obj == null)

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
std/java/_std/haxe/lang/StringExt.hx


Некоторые файлы не были показаны из-за большого количества измененных файлов