package haxe.lang;
import haxe.root.*;
@SuppressWarnings(value={"rawtypes", "unchecked"})
public class Runtime
{
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, Array<?> args)
{
return obj.__hx_invokeField(field, args);
}
static
{
haxe.lang.Runtime.undefined = new haxe.lang.DynamicObject(new haxe.root.Array<java.lang.String>(new java.lang.String[]{}), new haxe.root.Array<java.lang.Object>(new java.lang.Object[]{}), new haxe.root.Array<java.lang.String>(new java.lang.String[]{}), new haxe.root.Array<java.lang.Object>(new java.lang.Object[]{}));
}
public Runtime()
{
{
}
}
public static java.lang.Object undefined;
public static java.lang.Object closure(java.lang.Object obj, java.lang.String field)
{
return new haxe.lang.Closure(obj, field);
}
public static boolean eq(java.lang.Object v1, java.lang.Object v2)
{
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 boolean refEq(java.lang.Object v1, java.lang.Object v2)
{
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 boolean valEq(java.lang.Object v1, java.lang.Object v2)
{
return v1 == v2 || (v1 != null && v1.equals(v2));
}
public static double toDouble(java.lang.Object obj)
{
return (obj == null) ? 0.0 : ((java.lang.Number) obj).doubleValue();
}
public static boolean toBool(java.lang.Object obj)
{
return (obj == null) ? false : ((java.lang.Boolean) obj).booleanValue();
}
public static int toInt(java.lang.Object obj)
{
return (obj == null) ? 0 : ((java.lang.Number) obj).intValue();
}
public static boolean isDouble(java.lang.Object obj)
{
if (obj != null && obj instanceof java.lang.Number)
{
return true;
} else {
return false;
}
}
public static boolean isInt(java.lang.Object obj)
{
if (obj != null && obj instanceof java.lang.Number)
{
java.lang.Number n = (java.lang.Number) obj;
return n.doubleValue() == n.intValue();
} else {
return false;
}
}
public static boolean slowHasField(java.lang.Object o, java.lang.String field)
{
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 int compare(java.lang.Object v1, java.lang.Object v2)
{
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 java.lang.Object plus(java.lang.Object v1, java.lang.Object v2)
{
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 java.lang.Object slowGetField(java.lang.Object obj, java.lang.String field, boolean throwErrors)
{
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 java.lang.Object slowSetField(java.lang.Object obj, java.lang.String field, java.lang.Object value)
{
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 java.lang.Object slowCallField(java.lang.Object obj, java.lang.String field, haxe.root.Array args)
{
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();
}
if (args == null) args = new Array();
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.getDeclaredMethods();
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;
boolean hasBoolean = false;
for (int i = 0; i < len; i++)
{
Object o = args.__get(i);
objs[i]= o;
cls[i] = (o == null) ? null : o.getClass();
boolean isNum = false;
boolean isBoolean = false;
if ((o != null) && (o instanceof java.lang.Number))
{
cls[i] = java.lang.Number.class;
isNum = hasNumber = true;
}
else if ((o != null) && (o instanceof java.lang.Boolean))
{
cls[i] = java.lang.Boolean.class;
isBoolean = hasBoolean = true;
}
msl = realMsl;
realMsl = 0;
for (int j = 0; j < msl; j++)
{
java.lang.Class[] allcls = ms[j].getParameterTypes();
if (i < allcls.length)
{
String allclsName = allcls[i].getName();
boolean allclsIsBoolean = (allclsName == "boolean") || (allclsName == "java.lang.Boolean");
boolean allclsIsNumber = allcls[i].isPrimitive() && !allclsIsBoolean;
if ((isNum && allclsIsNumber) || (isBoolean && allclsIsBoolean) || (cls[i] == null) || allcls[i].isAssignableFrom(cls[i]))
{
ms[realMsl] = ms[j];
if (realMsl != j)
ms[j] = null;
realMsl++;
} else {
ms[j] = null;
}
}
}
}
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 != null) && (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 varargs not handled TODO
}
}
}
else if (hasBoolean)
{
java.lang.Class[] allcls = found.getParameterTypes();
for (int i = 0; i < len; i++)
{
java.lang.Object o = objs[i];
if ((o != null) && (o instanceof java.lang.Boolean))
{
java.lang.Class curCls = null;
if (i < allcls.length)
{
curCls = allcls[i];
if (!curCls.isAssignableFrom(o.getClass()))
{
String name = curCls.getName();
if (name.equals("boolean") || name.equals("java.lang.Boolean"))
{
objs[i] = ((java.lang.Boolean)o).booleanValue();
}
}
} //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 java.lang.Object callField(java.lang.Object obj, java.lang.String field, haxe.root.Array args)
{
if (obj instanceof haxe.lang.IHxObject)
{
return ((haxe.lang.IHxObject) obj).__hx_invokeField(field, args);
}
return slowCallField(obj, field, args);
}
public static java.lang.Object getField(java.lang.Object obj, java.lang.String field, boolean throwErrors)
{
if (obj instanceof haxe.lang.IHxObject)
return ((haxe.lang.IHxObject) obj).__hx_getField(field, throwErrors, false, false);
return slowGetField(obj, field, throwErrors);
}
public static double getField_f(java.lang.Object obj, java.lang.String field, boolean throwErrors)
{
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 java.lang.Object setField(java.lang.Object obj, java.lang.String field, java.lang.Object value)
{
if (obj instanceof haxe.lang.IHxObject)
return ((haxe.lang.IHxObject) obj).__hx_setField(field, value, false);
return slowSetField(obj, field, value);
}
public static double setField_f(java.lang.Object obj, java.lang.String field, double value)
{
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 java.lang.String toString(java.lang.Object obj)
{
if (( obj == null ))
{
return null;
}
if (haxe.lang.Runtime.isInt(obj))
{
return ( ((int) (haxe.lang.Runtime.toInt(obj)) ) + "" );
}
return obj.toString();
}
public static boolean isFinite(double v)
{
return ( ( v == v ) && ! (java.lang.Double.isInfinite(((double) (v) ))) );
}
}