1.1 --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Mon Jan 25 05:14:25 2016 +0100
1.2 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java Mon Jan 25 05:53:21 2016 +0100
1.3 @@ -310,15 +310,22 @@
1.4 }
1.5
1.6 @Override
1.7 - protected String accessField(String object, String[] fieldInfoName)
1.8 + protected FieldData findField(String[] fieldInfoName) throws IOException {
1.9 + FieldData field = classDataCache.findField(
1.10 + fieldInfoName[0], fieldInfoName[1], fieldInfoName[2]
1.11 + );
1.12 + return field != null && canAccessDirectly(field.cls) ? field : null;
1.13 + }
1.14 +
1.15 + @Override
1.16 + protected String accessField(String object, FieldData field, String[] fieldInfoName)
1.17 throws IOException {
1.18 - final FieldData field =
1.19 - classDataCache.findField(fieldInfoName[0],
1.20 - fieldInfoName[1],
1.21 - fieldInfoName[2]);
1.22 - String mangledName = "_" + fieldInfoName[1];
1.23 - return accessNonVirtualMember(object, mangledName,
1.24 - (field != null) ? field.cls : null);
1.25 + if (field != null) {
1.26 + return "fld_" + object + "_" + field.getName();
1.27 + } else {
1.28 + String mangledName = "_" + fieldInfoName[1];
1.29 + return accessNonVirtualMember(object, mangledName, null);
1.30 + }
1.31 }
1.32
1.33 @Override
1.34 @@ -403,11 +410,9 @@
1.35 return (exportedMethodFinder.getFound() != null);
1.36 }
1.37
1.38 - private String accessNonVirtualMember(String object,
1.39 - String mangledName,
1.40 - ClassData declaringClass) {
1.41 + private boolean canAccessDirectly(ClassData declaringClass) {
1.42 if (declaringClass == null) {
1.43 - return object + "['" + mangledName + "']";
1.44 + return false;
1.45 }
1.46 final String className = declaringClass.getClassName();
1.47 if (
1.48 @@ -415,9 +420,17 @@
1.49 "java/lang/reflect/Array".equals(className) ||
1.50 isExternalClass(className)
1.51 ) {
1.52 - return object + "['" + mangledName + "']";
1.53 + return false;
1.54 }
1.55 - return object + "." + mangledName;
1.56 + return true;
1.57 + }
1.58 +
1.59 + private String accessNonVirtualMember(
1.60 + String object, String mangledName, ClassData declaringClass
1.61 + ) {
1.62 + return canAccessDirectly(declaringClass) ?
1.63 + object + "." + mangledName :
1.64 + object + "['" + mangledName + "']";
1.65 }
1.66
1.67 private final class ExportedMethodFinder