Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -145,10 +145,10 @@ public IRubyObject ivarGet(IRubyObject self) throws Throwable {
MethodHandle test = findStatic(VariableSite.class, "testRealClass", methodType(boolean.class, int.class, IRubyObject.class));
test = insertArguments(test, 0, accessor.getClassId());

getValue = guardWithTest(test, getValue, fallback);
MethodHandle guarded = guardWithTest(test, getValue, fallback);

if (Options.INVOKEDYNAMIC_LOG_BINDING.load()) LOG.info(name() + "\tget on class " + self.getMetaClass().id + " bound directly" + extractSourceInfo());
setTarget(getValue);
setTarget(guarded);

return (IRubyObject)getValue.invokeExact(self);
}
Expand Down Expand Up @@ -209,10 +209,10 @@ public void ivarSet(IRubyObject self, IRubyObject value) throws Throwable {
test = insertArguments(test, 0, accessor.getClassId());
test = dropArguments(test, 1, IRubyObject.class);

setValue = guardWithTest(test, setValue, fallback);
MethodHandle guarded = guardWithTest(test, setValue, fallback);

if (Options.INVOKEDYNAMIC_LOG_BINDING.load()) LOG.info(name() + "\tset on class " + self.getMetaClass().id + " bound directly" + extractSourceInfo());
setTarget(setValue);
setTarget(guarded);

setValue.invokeExact(self, value);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@
* A variable accessor that accesses a field directly;
*/
public class FieldVariableAccessor extends VariableAccessor {
private final MethodHandle getter;
private final MethodHandle setter;
protected final MethodHandle getter;
protected final MethodHandle setter;

/**
* Construct a new FieldVariableAccessor for the given "real" class,
Expand All @@ -64,6 +64,10 @@ public FieldVariableAccessor(RubyClass realClass, String name, int index, int cl
this.setter = wrapSetter(setter);
}

public FieldVariableAccessor cloneFor(RubyClass newRealClass) {
return new FieldVariableAccessor(newRealClass, name, index, classId, getter, setter);
}

protected MethodHandle wrapSetter(MethodHandle setter) {
// mix frozen check into setter
return MethodHandles.foldArguments(setter, ENSURE_SETTABLE.asType(setter.type()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,15 @@ public class RawFieldVariableAccessor extends FieldVariableAccessor {
* @param setter the setter handle for the field
*/
public RawFieldVariableAccessor(RubyClass realClass, boolean unwrapInSet, Class<?> toJava, Class<?> returnType, String name, int index, int classId, MethodHandle getter, MethodHandle setter) {
super(realClass, name, index, classId, wrapGetter(getter, realClass, returnType), wrapSetter(setter, realClass, unwrapInSet, toJava, returnType));
this(realClass, name, index, classId, wrapGetter(getter, realClass, returnType), wrapSetter(setter, realClass, unwrapInSet, toJava, returnType));
}

private RawFieldVariableAccessor(RubyClass realClass, String name, int index, int classId, MethodHandle getter, MethodHandle setter) {
super(realClass, name, index, classId, getter, setter);
}

public RawFieldVariableAccessor cloneFor(RubyClass newRealClass) {
return new RawFieldVariableAccessor(newRealClass, name, index, classId, getter, setter);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,10 @@ public StampedVariableAccessor(RubyClass realClass, String name, int index, int
super(realClass, name, index, classId);
}

public StampedVariableAccessor cloneFor(RubyClass newRealClass) {
return new StampedVariableAccessor(newRealClass, name, index, classId);
}

/**
* Set this variable into the given object using Unsafe to ensure
* safe updating of the variable table.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,10 @@ public String toString() {
return "ivar:" + getName() + ":" + index;
}

public VariableAccessor cloneFor(RubyClass newRealClass) {
throw new UnsupportedOperationException();
}

/** a dummy accessor that will always return null */
public static final VariableAccessor DUMMY_ACCESSOR = new VariableAccessor(null, null, -1, -1) {};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ public VariableTableManager(RubyClass realClass) {
VariableTableManager(VariableTableManager original, RubyClass realClass) {
synchronized (original) {
this.realClass = realClass;
this.variableAccessors = copyVariableAccessors(original.variableAccessors);
this.variableAccessors = copyVariableAccessors(realClass, original.variableAccessors);
this.variableNames = original.variableNames.clone();
this.hasObjectID = original.hasObjectID;
this.hasFFI = original.hasFFI;
Expand Down Expand Up @@ -283,8 +283,10 @@ VariableAccessor getVariableAccessorWithBuilder(String name, Function<Integer, V
return ivarAccessor;
}

private static Map<String, VariableAccessor> copyVariableAccessors(Map<String, VariableAccessor> myVariableAccessors) {
return new LinkedHashMap<>(myVariableAccessors);
private static Map<String, VariableAccessor> copyVariableAccessors(RubyClass realClass, Map<String, VariableAccessor> otherVariableAccessors) {
var myVariableAccessors = new LinkedHashMap<String, VariableAccessor>(otherVariableAccessors.size());
otherVariableAccessors.forEach((name, accessor) -> myVariableAccessors.put(name, accessor.cloneFor(realClass)));
return myVariableAccessors;
}

private static Map<String, VariableAccessor> copyVariableAccessors(Map<String, VariableAccessor> myVariableAccessors, String name, VariableAccessor ivarAccessor) {
Expand Down
1 change: 0 additions & 1 deletion test/mri/excludes/TestData.rb

This file was deleted.

Loading