synchronized final VariableAccessor allocateVariableAccessorForVar(String name, MethodHandle getter, MethodHandle setter) { int id = realClass.id; final String[] myVariableNames = variableNames; final int newIndex = myVariableNames.length; fieldVariables += 1; VariableAccessor newVariableAccessor = new FieldVariableAccessor(realClass, name, newIndex, id, getter, setter); final String[] newVariableNames = new String[newIndex + 1]; ArraySupport.copy(myVariableNames, 0, newVariableNames, 0, newIndex); newVariableNames[newIndex] = name; variableNames = newVariableNames; return newVariableAccessor; }
.filterReturn(filter); int offset = ((FieldVariableAccessor)accessor).getOffset(); Class objCls = InvokeDynamicSupport.REIFIED_OBJECT_CLASSES[offset]; nativeTarget = b
private static MethodHandle createAttrReaderHandle(InvokeSite site, IRubyObject self, RubyClass cls, VariableAccessor accessor) { MethodHandle nativeTarget; MethodHandle filter = cls.getClassRuntime().getNullToNilHandle(); MethodHandle getValue; if (accessor instanceof FieldVariableAccessor) { MethodHandle getter = ((FieldVariableAccessor)accessor).getGetter(); getValue = Binder.from(site.type()) .drop(0, 2) .filterReturn(filter) .cast(methodType(Object.class, self.getClass())) .invoke(getter); } else { getValue = Binder.from(site.type()) .drop(0, 2) .filterReturn(filter) .cast(methodType(Object.class, Object.class)) .prepend(accessor) .invokeVirtualQuiet(LOOKUP, "get"); } // NOTE: Must not cache the fully-bound handle in the method, since it's specific to this class return getValue; }
private static MethodHandle createAttrWriterHandle(InvokeSite site, IRubyObject self, RubyClass cls, VariableAccessor accessor) { MethodHandle nativeTarget; MethodHandle filter = Binder .from(IRubyObject.class, Object.class) .drop(0) .constant(cls.getRuntime().getNil()); MethodHandle setValue; if (accessor instanceof FieldVariableAccessor) { MethodHandle setter = ((FieldVariableAccessor)accessor).getSetter(); setValue = Binder.from(site.type()) .drop(0, 2) .filterReturn(filter) .cast(methodType(void.class, self.getClass(), Object.class)) .invoke(setter); } else { setValue = Binder.from(site.type()) .drop(0, 2) .filterReturn(filter) .cast(methodType(void.class, Object.class, Object.class)) .prepend(accessor) .invokeVirtualQuiet(LOOKUP, "set"); } return setValue; }
.filterReturn(filter); int offset = ((FieldVariableAccessor)accessor).getOffset(); Class objCls = InvokeDynamicSupport.REIFIED_OBJECT_CLASSES[offset]; nativeTarget = b
private static MethodHandle createAttrReaderHandle(InvokeSite site, IRubyObject self, RubyClass cls, VariableAccessor accessor) { MethodHandle nativeTarget; MethodHandle filter = cls.getClassRuntime().getNullToNilHandle(); MethodHandle getValue; if (accessor instanceof FieldVariableAccessor) { MethodHandle getter = ((FieldVariableAccessor)accessor).getGetter(); getValue = Binder.from(site.type()) .drop(0, 2) .filterReturn(filter) .cast(methodType(Object.class, self.getClass())) .invoke(getter); } else { getValue = Binder.from(site.type()) .drop(0, 2) .filterReturn(filter) .cast(methodType(Object.class, Object.class)) .prepend(accessor) .invokeVirtualQuiet(LOOKUP, "get"); } // NOTE: Must not cache the fully-bound handle in the method, since it's specific to this class return getValue; }
private static MethodHandle createAttrWriterHandle(InvokeSite site, IRubyObject self, RubyClass cls, VariableAccessor accessor) { MethodHandle nativeTarget; MethodHandle filter = Binder .from(IRubyObject.class, Object.class) .drop(0) .constant(cls.getRuntime().getNil()); MethodHandle setValue; if (accessor instanceof FieldVariableAccessor) { MethodHandle setter = ((FieldVariableAccessor)accessor).getSetter(); setValue = Binder.from(site.type()) .drop(0, 2) .filterReturn(filter) .cast(methodType(void.class, self.getClass(), Object.class)) .invoke(setter); } else { setValue = Binder.from(site.type()) .drop(0, 2) .filterReturn(filter) .cast(methodType(void.class, Object.class, Object.class)) .prepend(accessor) .invokeVirtualQuiet(LOOKUP, "set"); } return setValue; }
.filterReturn(filter); int offset = ((FieldVariableAccessor)accessor).getOffset(); Class objCls = InvokeDynamicSupport.REIFIED_OBJECT_CLASSES[offset]; nativeTarget = b
getValue = ((FieldVariableAccessor) accessor).getGetter(); getValue = explicitCastArguments(getValue, methodType(Object.class, IRubyObject.class)); } else {
setValue = ((FieldVariableAccessor)accessor).getSetter(); setValue = explicitCastArguments(setValue, methodType(void.class, IRubyObject.class, IRubyObject.class)); } else {
synchronized final VariableAccessor allocateVariableAccessorForVar(String name, MethodHandle getter, MethodHandle setter) { int id = realClass.id; final String[] myVariableNames = variableNames; final int newIndex = myVariableNames.length; fieldVariables += 1; VariableAccessor newVariableAccessor = new FieldVariableAccessor(realClass, name, newIndex, id, getter, setter); final String[] newVariableNames = new String[newIndex + 1]; ArraySupport.copy(myVariableNames, 0, newVariableNames, 0, newIndex); newVariableNames[newIndex] = name; variableNames = newVariableNames; return newVariableAccessor; }
.filterReturn(filter); int offset = ((FieldVariableAccessor)accessor).getOffset(); Class objCls = InvokeDynamicSupport.REIFIED_OBJECT_CLASSES[offset]; nativeTarget = b
getValue = ((FieldVariableAccessor) accessor).getGetter(); getValue = explicitCastArguments(getValue, methodType(Object.class, IRubyObject.class)); } else {
setValue = ((FieldVariableAccessor)accessor).getSetter(); setValue = explicitCastArguments(setValue, methodType(void.class, IRubyObject.class, IRubyObject.class)); } else {
int offset = ((FieldVariableAccessor)accessor).getOffset(); Class cls = REIFIED_OBJECT_CLASSES[offset]; setValue = findStatic(cls, "setVariableChecked", methodType(void.class, cls, Object.class));
int offset = ((FieldVariableAccessor)accessor).getOffset(); Class cls = REIFIED_OBJECT_CLASSES[offset]; getValue = lookup().findGetter(cls, "var" + offset, Object.class);
int offset = ((FieldVariableAccessor)accessor).getOffset(); Class cls = REIFIED_OBJECT_CLASSES[offset]; getValue = lookup().findGetter(cls, "var" + offset, Object.class);
int offset = ((FieldVariableAccessor)accessor).getOffset(); Class cls = REIFIED_OBJECT_CLASSES[offset]; setValue = findStatic(cls, "setVariableChecked", methodType(void.class, cls, Object.class));