| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598 | /* * Copyright (C)2005-2019 Haxe Foundation * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */package java.internal;/**	This class is meant for internal compiler use only. It provides the Haxe runtime	compatibility to the host language. Do not access it directly.**/@:native('haxe.lang.Runtime')@:nativeGen@:classCode('	public static java.lang.Object getField(haxe.lang.IHxObject obj, java.lang.String field, boolean throwErrors)	{		if (obj == null && !throwErrors) return null;		return obj.__hx_getField(field, throwErrors, false, false);	}	public static double getField_f(haxe.lang.IHxObject obj, java.lang.String field, boolean throwErrors)	{		if (obj == null && !throwErrors) return 0.0;		return obj.__hx_getField_f(field, throwErrors, false);	}	public static java.lang.Object setField(haxe.lang.IHxObject obj, java.lang.String field, java.lang.Object value)	{		return obj.__hx_setField(field, value, false);	}	public static double setField_f(haxe.lang.IHxObject obj, java.lang.String field, double value)	{		return obj.__hx_setField_f(field, value, false);	}	public static java.lang.Object callField(haxe.lang.IHxObject obj, java.lang.String field, java.lang.Object[] args)	{		return obj.__hx_invokeField(field, args);	}')@:keep class Runtime {	public static var undefined:Dynamic = {};	@:functionCode('	return new haxe.lang.Closure(obj, field);	')	public static function closure(obj:Dynamic, field:String):Dynamic {		return null;	}	@:functionCode('			if (v1 == v2)				return true;			if (v1 == null || v2 == null)				return false;			if (v1 instanceof java.lang.Number)			{				if (!(v2 instanceof java.lang.Number))					return false;				java.lang.Number v1c = (java.lang.Number) v1;				java.lang.Number v2c = (java.lang.Number) v2;				if (v1 instanceof java.lang.Long || v2 instanceof java.lang.Long)					return v1c.longValue() == v2c.longValue();				return v1c.doubleValue() == v2c.doubleValue();			} else if (v1 instanceof java.lang.String || v1 instanceof haxe.lang.IEquatable) { //TODO see what happens with Boolean cases				return v1.equals(v2);			}			return false;	')	public static function eq(v1:Dynamic, v2:Dynamic):Bool {		return false;	}	@:functionCode('		if (v1 == v2)			return true;		if (v1 instanceof java.lang.String || v1 instanceof haxe.lang.IEquatable)		{			return v1 != null && v1.equals(v2);		} else {			return v1 == v2;		}	')	public static function refEq(v1:{}, v2:{}):Bool {		return false;	}	@:functionCode('		return v1 == v2 || (v1 != null && v1.equals(v2));	')	public static function valEq(v1:{}, v2:{}):Bool {		return false;	}	@:functionCode('		return (obj == null) ? 0.0 : ((java.lang.Number) obj).doubleValue();	')	public static function toDouble(obj:Dynamic):Float {		return 0.0;	}	public static function toBool(obj:java.lang.Boolean):Bool {		return obj == null ? false : obj.booleanValue();	}	@:functionCode('		return (obj == null) ? 0 : ((java.lang.Number) obj).intValue();	')	public static function toInt(obj:Dynamic):Int {		return 0;	}	public static function toLong(obj:Dynamic):haxe.Int64 {		return obj == null ? 0 : (obj : java.lang.Number).longValue();	}	@:functionCode('		if (obj != null && obj instanceof java.lang.Number)		{			return true;		} else {			return false;		}	')	public static function isDouble(obj:Dynamic):Bool {		return false;	}	@:overload public static function isInt(obj:Dynamic):Bool {		if (Std.isOfType(obj, java.lang.Number)) {			var n:java.lang.Number = obj;			return n.doubleValue() == n.intValue();		} else {			return false;		}	}	@:overload public static function isInt(num:java.lang.Number):Bool {		return num != null && num.doubleValue() == num.intValue();	}	@:functionCode('		java.lang.Class cl = null;		if (o instanceof java.lang.Class)		{			if (o == java.lang.String.class)				return field.equals("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();		}		try		{			java.lang.reflect.Field f = cl.getField(field);			return true;		}		catch(Throwable t)		{			java.lang.reflect.Method[] ms = cl.getMethods();			for (int i = 0; i < ms.length; i++)			{				if (ms[i].getName().equals(field))				{					return true;				}			}		}		return false;	')	public static function slowHasField(o:Dynamic, field:String):Bool {		return false;	}	@:functionCode('			if (v1 == v2)				return 0;			if (v1 == null) return -1;			if (v2 == null) return 1;			if (v1 instanceof java.lang.Number || v2 instanceof java.lang.Number)			{				java.lang.Number v1c = (java.lang.Number) v1;				java.lang.Number v2c = (java.lang.Number) v2;				if (v1 instanceof java.lang.Long || v2 instanceof java.lang.Long)				{					long l1 = (v1 == null) ? 0L : v1c.longValue();					long l2 = (v2 == null) ? 0L : v2c.longValue();          return (l1 < l2) ? -1 : (l1 > l2) ? 1 : 0;				} else {					double d1 = (v1 == null) ? 0.0 : v1c.doubleValue();					double d2 = (v2 == null) ? 0.0 : v2c.doubleValue();          return (d1 < d2) ? -1 : (d1 > d2) ? 1 : 0;				}			}			//if it\'s not a number it must be a String			return ((java.lang.String) v1).compareTo((java.lang.String) v2);	')	public static function compare(v1:Dynamic, v2:Dynamic):Int {		return 0;	}	@:functionCode('			if (v1 instanceof java.lang.String || v2 instanceof java.lang.String)				return toString(v1) + toString(v2);			if (v1 instanceof java.lang.Number || v2 instanceof java.lang.Number)			{				java.lang.Number v1c = (java.lang.Number) v1;				java.lang.Number v2c = (java.lang.Number) v2;				double d1 = (v1 == null) ? 0.0 : v1c.doubleValue();				double d2 = (v2 == null) ? 0.0 : v2c.doubleValue();				return d1 + d2;			}			throw new java.lang.IllegalArgumentException("Cannot dynamically add " + v1 + " and " + v2);	')	public static function plus(v1:Dynamic, v2:Dynamic):Dynamic {		return null;	}	@:functionCode('	if (obj == null)		if (throwErrors)			throw new java.lang.NullPointerException("Cannot access field \'" + field + "\' of null.");		else			return null;	java.lang.Class cl = null;	try	{		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();		}		java.lang.reflect.Field f = cl.getField(field);		f.setAccessible(true);		return f.get(obj);	} catch (Throwable t)	{		try		{			java.lang.reflect.Method[] ms = cl.getMethods();			for (int i = 0; i < ms.length; i++)			{				if (ms[i].getName().equals(field))				{					return new haxe.lang.Closure(obj != null ? obj : cl, field);				}			}		} catch (Throwable t2)		{		}		if (throwErrors)			throw HaxeException.wrap(t);		return null;	}	')	public static function slowGetField(obj:Dynamic, field:String, throwErrors:Bool):Dynamic {		return null;	}	@:functionCode('		java.lang.Class cl = null;		if (obj instanceof java.lang.Class)		{			cl = (java.lang.Class) obj;			obj = null;		} else {			cl = obj.getClass();		}		try {			java.lang.reflect.Field f = cl.getField(field);			f.setAccessible(true);			//FIXME we must evaluate if field to be set receives either int or double			if (isInt(value))			{				f.setInt(obj, toInt(value));			} else if (isDouble(value)) {				f.setDouble(obj, toDouble(value));			} else {				f.set(obj, value);			}			return value;		}		catch (Throwable t)		{			throw HaxeException.wrap(t);		}	')	public static function slowSetField(obj:Dynamic, field:String, value:Dynamic):Dynamic {		return null;	}	@:functionCode('		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[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();		}		if (args == null) args = new java.lang.Object[0];		int len = args.length;		java.lang.Class[] cls = new java.lang.Class[len];		java.lang.Object[] objs = new java.lang.Object[len];		java.lang.reflect.Method[] ms = cl.getMethods();		int msl = ms.length;		int realMsl = 0;		for(int i =0; i < msl; i++)		{			if (!ms[i].getName().equals(field) || (!ms[i].isVarArgs() && ms[i].getParameterTypes().length != len))			{				ms[i] = null;			} else {				ms[realMsl] = ms[i];				if (realMsl != i)					ms[i] = null;				realMsl++;			}		}		boolean hasNumber = false;		for (int i = 0; i < len; i++)		{			Object o = args[i];			if (o == null)			{				continue; //can be anything			}			objs[i]= o;			cls[i] = o.getClass();			boolean isNum = false;			if (o instanceof java.lang.Number)			{				cls[i] = java.lang.Number.class;				isNum = hasNumber = true;			} else if (o instanceof java.lang.Boolean) {				cls[i] = java.lang.Boolean.class;				isNum = true;			}			msl = realMsl;			realMsl = 0;			for (int j = 0; j < msl; j++)			{				java.lang.Class[] allcls = ms[j].getParameterTypes();				if (i < allcls.length)				{					if (!  ((isNum && allcls[i].isPrimitive()) || allcls[i].isAssignableFrom(cls[i])) )					{						ms[j] = null;					} else {						ms[realMsl] = ms[j];						if (realMsl != j)							ms[j] = null;						realMsl++;					}				}			}		}		java.lang.reflect.Method found;		if (ms.length == 0 || (found = ms[0]) == null)			throw haxe.lang.HaxeException.wrap("No compatible method found for: " + field);		if (hasNumber)		{			java.lang.Class[] allcls = found.getParameterTypes();			for (int i = 0; i < len; i++)			{				java.lang.Object o = objs[i];				if (o instanceof java.lang.Number)				{					java.lang.Class curCls = null;					if (i < allcls.length)					{						curCls = allcls[i];						if (!curCls.isAssignableFrom(o.getClass()))						{							String name = curCls.getName();							if (name.equals("double") || name.equals("java.lang.Double"))							{								objs[i] = ((java.lang.Number)o).doubleValue();							} else if (name.equals("int") || name.equals("java.lang.Integer"))							{								objs[i] = ((java.lang.Number)o).intValue();							} else if (name.equals("float") || name.equals("java.lang.Float"))							{								objs[i] = ((java.lang.Number)o).floatValue();							} else if (name.equals("byte") || name.equals("java.lang.Byte"))							{								objs[i] = ((java.lang.Number)o).byteValue();							} else if (name.equals("short") || name.equals("java.lang.Short"))							{								objs[i] = ((java.lang.Number)o).shortValue();							} else if (name.equals("long") || name.equals("java.lang.Long"))							{								objs[i] = ((java.lang.Number)o).longValue();							}						}					} //else varargs not handled TODO				}			}		}		try {			found.setAccessible(true);			return found.invoke(obj, objs);		}		catch (java.lang.reflect.InvocationTargetException e)		{			throw haxe.lang.HaxeException.wrap(e.getCause());		}		catch (Throwable t)		{			throw haxe.lang.HaxeException.wrap(t);		}	')	public static function slowCallField(obj:Dynamic, field:String, args:java.NativeArray<Dynamic>):Dynamic {		return null;	}	@:functionCode('		if (obj instanceof haxe.lang.IHxObject)		{			return ((haxe.lang.IHxObject) obj).__hx_invokeField(field, args);		}		return slowCallField(obj, field, args);	')	public static function callField(obj:Dynamic, field:String, args:java.NativeArray<Dynamic>):Dynamic {		return null;	}	@:functionCode('		if (obj instanceof haxe.lang.IHxObject)			return ((haxe.lang.IHxObject) obj).__hx_getField(field, throwErrors, false, false);		return slowGetField(obj, field, throwErrors);	')	public static function getField(obj:Dynamic, field:String, throwErrors:Bool):Dynamic {		return null;	}	@:functionCode('		if (obj instanceof haxe.lang.IHxObject)			return ((haxe.lang.IHxObject) obj).__hx_getField_f(field, throwErrors, false);		return toDouble(slowGetField(obj, field, throwErrors));	')	public static function getField_f(obj:Dynamic, field:String, throwErrors:Bool):Float {		return 0.0;	}	@:functionCode('		if (obj instanceof haxe.lang.IHxObject)			return ((haxe.lang.IHxObject) obj).__hx_setField(field, value, false);		return slowSetField(obj, field, value);	')	public static function setField(obj:Dynamic, field:String, value:Dynamic):Dynamic {		return null;	}	@:functionCode('		if (obj instanceof haxe.lang.IHxObject)			return ((haxe.lang.IHxObject) obj).__hx_setField_f(field, value, false);		return toDouble(slowSetField(obj, field, value));	')	public static function setField_f(obj:Dynamic, field:String, value:Float):Float {		return 0.0;	}	public static function toString(obj:Dynamic):String {		if (obj == null)			return null;		if (Std.isOfType(obj, java.lang.Number) && !Std.isOfType(obj, java.lang.Integer.IntegerClass) && isInt((obj : java.lang.Number)))			return java.lang.Integer._toString(toInt(obj));		return untyped obj.toString();	}	public static function isFinite(v:Float):Bool {		return (v == v) && !java.lang.Double.DoubleClass._isInfinite(v);	}	public static function getIntFromNumber(n:java.lang.Number):Int {		return n == null ? 0 : n.intValue();	}	public static function getFloatFromNumber(n:java.lang.Number):Float {		return n == null ? 0.0 : n.doubleValue();	}	public static function getInt64FromNumber(n:java.lang.Number):java.StdTypes.Int64 {		return n == null ? 0.0 : n.longValue();	}	public static function numToInteger(num:java.lang.Number):java.lang.Integer {		return num == null ? null : (Std.isOfType(num, java.lang.Integer.IntegerClass) ? cast num : java.lang.Integer.valueOf(num.intValue()));	}	public static function numToDouble(num:java.lang.Number):java.lang.Double {		return num == null ? null : (Std.isOfType(num, java.lang.Double.DoubleClass) ? cast num : java.lang.Double.valueOf(num.doubleValue()));	}	public static function numToFloat(num:java.lang.Number):java.lang.Float {		return num == null ? null : (Std.isOfType(num, java.lang.Float.FloatClass) ? cast num : java.lang.Float.valueOf(num.floatValue()));	}	public static function numToByte(num:java.lang.Number):java.lang.Byte {		return num == null ? null : (Std.isOfType(num, java.lang.Byte.ByteClass) ? cast num : java.lang.Byte.valueOf(num.byteValue()));	}	public static function numToLong(num:java.lang.Number):java.lang.Long {		return num == null ? null : (Std.isOfType(num, java.lang.Long.LongClass) ? cast num : java.lang.Long.valueOf(num.longValue()));	}	public static function numToShort(num:java.lang.Number):java.lang.Short {		return num == null ? null : (Std.isOfType(num, java.lang.Short.ShortClass) ? cast num : java.lang.Short.valueOf(num.shortValue()));	}}@:keep @:native("haxe.lang.EmptyObject") enum EmptyObject {	EMPTY;}
 |