Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make attrs position-aware #8215

Closed
wants to merge 2 commits into from
Closed
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
12 changes: 12 additions & 0 deletions bench/bench_attr_reader.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
require 'benchmark/ips'

Benchmark.ips do |bm|
bm.report("attr_reader") do |i|
Class.new do
while i > 0
i-=1
attr_reader :foo
end
end
end
end
5 changes: 3 additions & 2 deletions core/src/main/java/org/jruby/RubyModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -2303,13 +2303,14 @@ private void addAccessor(ThreadContext context, RubySymbol identifier, Visibilit
}

final String variableName = identifier.asInstanceVariable().idString();
RubyStackTraceElement trace = context.getSingleBacktrace(1);
if (readable) {
addMethod(internedIdentifier, new AttrReaderMethod(methodLocation, visibility, variableName));
addMethod(internedIdentifier, new AttrReaderMethod(methodLocation, visibility, variableName, trace));
methodAdded(context, identifier);
}
if (writeable) {
identifier = identifier.asWriter();
addMethod(identifier.idString(), new AttrWriterMethod(methodLocation, visibility, variableName));
addMethod(identifier.idString(), new AttrWriterMethod(methodLocation, visibility, variableName, trace));
methodAdded(context, identifier);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@

import org.jruby.RubyClass;
import org.jruby.RubyModule;
import org.jruby.runtime.PositionAware;
import org.jruby.runtime.backtrace.RubyStackTraceElement;
import org.jruby.runtime.ivars.VariableAccessor;
import org.jruby.internal.runtime.methods.JavaMethod.JavaMethodZero;
import org.jruby.runtime.ThreadContext;
Expand All @@ -44,12 +46,17 @@
/**
* A method type for attribute writers (as created by attr_writer or attr_accessor).
*/
public class AttrReaderMethod extends JavaMethodZero {
public class AttrReaderMethod extends JavaMethodZero implements PositionAware {
private MethodData methodData;
private VariableAccessor accessor = VariableAccessor.DUMMY_ACCESSOR;
private final String file;
private final int line;

public AttrReaderMethod(RubyModule implementationClass, Visibility visibility, String variableName) {
public AttrReaderMethod(RubyModule implementationClass, Visibility visibility, String variableName, RubyStackTraceElement trace) {
super(implementationClass, visibility, variableName);

this.file = trace == null ? null : trace.getFileName();
this.line = trace == null ? -1 : trace.getLineNumber();
}

public IRubyObject call(ThreadContext context, IRubyObject self, RubyModule clazz, String name) {
Expand Down Expand Up @@ -87,6 +94,16 @@ public Collection<String> getInstanceVariableNames() {
// Used by racc extension, needed for backward-compat with 1.7.
@Deprecated
public AttrReaderMethod(RubyModule implementationClass, Visibility visibility, CallConfiguration callConfiguration, String variableName) {
this(implementationClass, visibility, variableName);
this(implementationClass, visibility, variableName, null);
}

@Override
public String getFile() {
return file;
}

@Override
public int getLine() {
return line;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@

import org.jruby.RubyClass;
import org.jruby.RubyModule;
import org.jruby.runtime.PositionAware;
import org.jruby.runtime.backtrace.RubyStackTraceElement;
import org.jruby.runtime.ivars.VariableAccessor;
import org.jruby.internal.runtime.methods.JavaMethod.JavaMethodOne;
import org.jruby.runtime.ThreadContext;
Expand All @@ -44,14 +46,20 @@
/**
* A method type for attribute writers (as created by attr_writer or attr_accessor).
*/
public class AttrWriterMethod extends JavaMethodOne {
public class AttrWriterMethod extends JavaMethodOne implements PositionAware {
private MethodData methodData;
private final String variableName;
private VariableAccessor accessor = VariableAccessor.DUMMY_ACCESSOR;
private final String file;
private final int line;

public AttrWriterMethod(RubyModule implementationClass, Visibility visibility, String variableName) {
public AttrWriterMethod(RubyModule implementationClass, Visibility visibility, String variableName, RubyStackTraceElement trace) {
super(implementationClass, visibility, variableName + "=");

this.variableName = variableName;

this.file = trace == null ? null : trace.getFileName();
this.line = trace == null ? -1 : trace.getLineNumber();
}

public IRubyObject call(ThreadContext context, IRubyObject self, RubyModule clazz, String name, IRubyObject arg1) {
Expand Down Expand Up @@ -89,6 +97,16 @@ public Collection<String> getInstanceVariableNames() {
// Used by racc extension, needed for backward-compat with 1.7.
@Deprecated
public AttrWriterMethod(RubyModule implementationClass, Visibility visibility, CallConfiguration callConfiguration, String variableName) {
this(implementationClass, visibility, variableName);
this(implementationClass, visibility, variableName, null);
}

@Override
public String getFile() {
return file;
}

@Override
public int getLine() {
return line;
}
}
Loading