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 {
|