rt/vm/src/main/java/org/apidesign/vm4brwsr/VM.java
changeset 1856 9cdc403018b5
parent 1855 34efbdde4eca
child 1859 727d3be7e03c
     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