< prev index next >

src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotMemoryAccessProviderImpl.java

Print this page




  81             if (f.getName().equals("oop_size")) {
  82                 int offset = ((HotSpotResolvedJavaField) f).offset();
  83                 assert offset != 0 : "not expecting offset of java.lang.Class::oop_size to be 0";
  84                 return offset;
  85             }
  86         }
  87         throw new JVMCIError("Could not find injected java.lang.Class::oop_size field");
  88     }
  89 
  90     private boolean checkRead(JavaKind kind, long displacement, HotSpotResolvedObjectType type, Object object) {
  91         if (type.isArray()) {
  92             ResolvedJavaType componentType = type.getComponentType();
  93             JavaKind componentKind = componentType.getJavaKind();
  94             final int headerSize = getArrayBaseOffset(componentKind);
  95             int sizeOfElement = getArrayIndexScale(componentKind);
  96             int length = Array.getLength(object);
  97             long arrayEnd = headerSize + (sizeOfElement * length);
  98             boolean aligned = ((displacement - headerSize) % sizeOfElement) == 0;
  99             if (displacement < 0 || displacement > (arrayEnd - sizeOfElement) || (kind == JavaKind.Object && !aligned)) {
 100                 int index = (int) ((displacement - headerSize) / sizeOfElement);
 101                 throw new AssertionError("Unsafe array access: reading element of kind " + kind +
 102                                 " at offset " + displacement + " (index ~ " + index + ") in " +
 103                                 type.toJavaName() + " object of length " + length);
 104             }
 105         } else if (kind != JavaKind.Object) {
 106             long size;
 107             if (object instanceof Class) {
 108                 if (oopSizeOffset == 0) {
 109                     oopSizeOffset = computeOopSizeOffset(runtime);
 110                 }
 111                 int wordSize = runtime.getHostJVMCIBackend().getCodeCache().getTarget().wordSize;
 112                 size = UNSAFE.getInt(object, oopSizeOffset) * wordSize;
 113             } else {
 114                 size = Math.abs(type.instanceSize());
 115             }
 116             int bytesToRead = kind.getByteCount();
 117             if (displacement + bytesToRead > size || displacement < 0) {
 118                 throw new IllegalArgumentException("Unsafe access: reading " + bytesToRead + " bytes at offset " + displacement + " in " +
 119                                 type.toJavaName() + " object of size " + size);
 120             }
 121         } else {




  81             if (f.getName().equals("oop_size")) {
  82                 int offset = ((HotSpotResolvedJavaField) f).offset();
  83                 assert offset != 0 : "not expecting offset of java.lang.Class::oop_size to be 0";
  84                 return offset;
  85             }
  86         }
  87         throw new JVMCIError("Could not find injected java.lang.Class::oop_size field");
  88     }
  89 
  90     private boolean checkRead(JavaKind kind, long displacement, HotSpotResolvedObjectType type, Object object) {
  91         if (type.isArray()) {
  92             ResolvedJavaType componentType = type.getComponentType();
  93             JavaKind componentKind = componentType.getJavaKind();
  94             final int headerSize = getArrayBaseOffset(componentKind);
  95             int sizeOfElement = getArrayIndexScale(componentKind);
  96             int length = Array.getLength(object);
  97             long arrayEnd = headerSize + (sizeOfElement * length);
  98             boolean aligned = ((displacement - headerSize) % sizeOfElement) == 0;
  99             if (displacement < 0 || displacement > (arrayEnd - sizeOfElement) || (kind == JavaKind.Object && !aligned)) {
 100                 int index = (int) ((displacement - headerSize) / sizeOfElement);
 101                 throw new IllegalArgumentException("Unsafe array access: reading element of kind " + kind +
 102                                 " at offset " + displacement + " (index ~ " + index + ") in " +
 103                                 type.toJavaName() + " object of length " + length);
 104             }
 105         } else if (kind != JavaKind.Object) {
 106             long size;
 107             if (object instanceof Class) {
 108                 if (oopSizeOffset == 0) {
 109                     oopSizeOffset = computeOopSizeOffset(runtime);
 110                 }
 111                 int wordSize = runtime.getHostJVMCIBackend().getCodeCache().getTarget().wordSize;
 112                 size = UNSAFE.getInt(object, oopSizeOffset) * wordSize;
 113             } else {
 114                 size = Math.abs(type.instanceSize());
 115             }
 116             int bytesToRead = kind.getByteCount();
 117             if (displacement + bytesToRead > size || displacement < 0) {
 118                 throw new IllegalArgumentException("Unsafe access: reading " + bytesToRead + " bytes at offset " + displacement + " in " +
 119                                 type.toJavaName() + " object of size " + size);
 120             }
 121         } else {


< prev index next >