|
@@ -297,9 +297,24 @@ class Jvm {
|
|
return new jvm.Closure(obj, method);
|
|
return new jvm.Closure(obj, method);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ static function readStaticField<T>(cl:java.lang.Class<T>, name:String):Dynamic {
|
|
|
|
+ var methods = cl.getMethods();
|
|
|
|
+ for (m in methods) {
|
|
|
|
+ if (m.getName() == name && !m.isSynthetic()) {
|
|
|
|
+ return new jvm.Closure(null, m);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ try {
|
|
|
|
+ var field = cl.getField(name);
|
|
|
|
+ field.setAccessible(true);
|
|
|
|
+ return field.get(null);
|
|
|
|
+ } catch (_:java.lang.NoSuchFieldException) {
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
static public function readFieldNoObject(obj:Dynamic, name:String):Dynamic {
|
|
static public function readFieldNoObject(obj:Dynamic, name:String):Dynamic {
|
|
- var isStatic = instanceof(obj, java.lang.Class);
|
|
|
|
- var cl = isStatic ? obj : (obj : java.lang.Object).getClass();
|
|
|
|
|
|
+ var cl = (obj : java.lang.Object).getClass();
|
|
try {
|
|
try {
|
|
var field = cl.getField(name);
|
|
var field = cl.getField(name);
|
|
field.setAccessible(true);
|
|
field.setAccessible(true);
|
|
@@ -309,21 +324,10 @@ class Jvm {
|
|
var methods = cl.getMethods();
|
|
var methods = cl.getMethods();
|
|
for (m in methods) {
|
|
for (m in methods) {
|
|
if (m.getName() == name && !m.isSynthetic()) {
|
|
if (m.getName() == name && !m.isSynthetic()) {
|
|
- var context = null;
|
|
|
|
- if (!isStatic || cl == cast java.lang.Class) {
|
|
|
|
- context = obj;
|
|
|
|
- }
|
|
|
|
- return new jvm.Closure(context, m);
|
|
|
|
|
|
+ return new jvm.Closure(obj, m);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- if (isStatic) {
|
|
|
|
- if (cl == cast java.lang.Class) {
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- cl = cast java.lang.Class;
|
|
|
|
- } else {
|
|
|
|
- cl = cl.getSuperclass();
|
|
|
|
- }
|
|
|
|
|
|
+ cl = cl.getSuperclass();
|
|
}
|
|
}
|
|
return null;
|
|
return null;
|
|
}
|
|
}
|
|
@@ -339,32 +343,35 @@ class Jvm {
|
|
if (instanceof(obj, jvm.Object)) {
|
|
if (instanceof(obj, jvm.Object)) {
|
|
return (cast obj : jvm.Object)._hx_getField(name);
|
|
return (cast obj : jvm.Object)._hx_getField(name);
|
|
}
|
|
}
|
|
|
|
+ if (instanceof(obj, java.lang.Class)) {
|
|
|
|
+ return readStaticField(cast obj, name);
|
|
|
|
+ }
|
|
if (instanceof(obj, java.NativeString)) {
|
|
if (instanceof(obj, java.NativeString)) {
|
|
switch (name) {
|
|
switch (name) {
|
|
case "length":
|
|
case "length":
|
|
return (obj : String).length;
|
|
return (obj : String).length;
|
|
case "charAt":
|
|
case "charAt":
|
|
- return (readFieldNoObject(jvm.StringExt, "charAt") : Closure).bindTo(obj);
|
|
|
|
|
|
+ return (readStaticField(cast jvm.StringExt, "charAt") : Closure).bindTo(obj);
|
|
case "charCodeAt":
|
|
case "charCodeAt":
|
|
- return (readFieldNoObject(jvm.StringExt, "charCodeAt") : Closure).bindTo(obj);
|
|
|
|
|
|
+ return (readStaticField(cast jvm.StringExt, "charCodeAt") : Closure).bindTo(obj);
|
|
case "indexOf":
|
|
case "indexOf":
|
|
- return (readFieldNoObject(jvm.StringExt, "indexOf") : Closure).bindTo(obj);
|
|
|
|
|
|
+ return (readStaticField(cast jvm.StringExt, "indexOf") : Closure).bindTo(obj);
|
|
case "iterator":
|
|
case "iterator":
|
|
return function() return new haxe.iterators.StringIterator(obj);
|
|
return function() return new haxe.iterators.StringIterator(obj);
|
|
case "keyValueIterator":
|
|
case "keyValueIterator":
|
|
return function() return new haxe.iterators.StringKeyValueIterator(obj);
|
|
return function() return new haxe.iterators.StringKeyValueIterator(obj);
|
|
case "lastIndexOf":
|
|
case "lastIndexOf":
|
|
- return (readFieldNoObject(jvm.StringExt, "lastIndexOf") : Closure).bindTo(obj);
|
|
|
|
|
|
+ return (readStaticField(cast jvm.StringExt, "lastIndexOf") : Closure).bindTo(obj);
|
|
case "split":
|
|
case "split":
|
|
- return (readFieldNoObject(jvm.StringExt, "split") : Closure).bindTo(obj);
|
|
|
|
|
|
+ return (readStaticField(cast jvm.StringExt, "split") : Closure).bindTo(obj);
|
|
case "substr":
|
|
case "substr":
|
|
- return (readFieldNoObject(jvm.StringExt, "substr") : Closure).bindTo(obj);
|
|
|
|
|
|
+ return (readStaticField(cast jvm.StringExt, "substr") : Closure).bindTo(obj);
|
|
case "substring":
|
|
case "substring":
|
|
- return (readFieldNoObject(jvm.StringExt, "substring") : Closure).bindTo(obj);
|
|
|
|
|
|
+ return (readStaticField(cast jvm.StringExt, "substring") : Closure).bindTo(obj);
|
|
case "toLowerCase":
|
|
case "toLowerCase":
|
|
- return (readFieldNoObject(jvm.StringExt, "toLowerCase") : Closure).bindTo(obj);
|
|
|
|
|
|
+ return (readStaticField(cast jvm.StringExt, "toLowerCase") : Closure).bindTo(obj);
|
|
case "toUpperCase":
|
|
case "toUpperCase":
|
|
- return (readFieldNoObject(jvm.StringExt, "toUpperCase") : Closure).bindTo(obj);
|
|
|
|
|
|
+ return (readStaticField(cast jvm.StringExt, "toUpperCase") : Closure).bindTo(obj);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return readFieldNoObject(obj, name);
|
|
return readFieldNoObject(obj, name);
|