/** * Register all fields accessed by a VarHandle for an instance field or a static field as unsafe * accessed, which is necessary for correctness of the static analysis. We want to process every * VarHandle only once, therefore we mark all VarHandle that were already processed in in * {@link #processedVarHandles}. */ private Object processVarHandle(Object obj) { VarHandleInfo info = infos.get(obj.getClass()); if (info != null && processedVarHandles.putIfAbsent(obj, true) == null) { VMError.guarantee(markAsUnsafeAccessed != null, "New VarHandle found after static analysis"); Field field = findVarHandleField(obj); if (info.isStatic) { /* * GR-10238 implements Unsafe access for static fields, then this branch can be * removed and static fields can be properly marked for Unsafe access too. */ // Checkstyle: stop System.out.println("WARNING GR-10238: VarHandle for static field is currently not fully supported. Static field " + field + " is not properly marked for Unsafe access!"); // Checkstyle: resume } else { markAsUnsafeAccessed.accept(field); } } return obj; } }
@Override public Object compute(MetaAccessProvider metaAccess, ResolvedJavaField original, ResolvedJavaField annotated, Object varHandle) { Field field = ImageSingletons.lookup(VarHandleFeature.class).findVarHandleField(varHandle); SharedField sField = (SharedField) metaAccess.lookupJavaField(field); guarantee(sField.isAccessed() && sField.getLocation() > 0, "Field not marked as accessed"); return Long.valueOf(sField.getLocation()); } }