Skip to content

Commit 221769f

Browse files
committed
Fix Proc#inspect for a Symbol#to_proc Proc
1 parent 6bd2c33 commit 221769f

File tree

4 files changed

+25
-3
lines changed

4 files changed

+25
-3
lines changed

src/main/java/org/truffleruby/core/proc/ProcNodes.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,13 @@
1414
import org.truffleruby.builtins.CoreClass;
1515
import org.truffleruby.builtins.CoreMethod;
1616
import org.truffleruby.builtins.CoreMethodArrayArgumentsNode;
17+
import org.truffleruby.builtins.Primitive;
18+
import org.truffleruby.builtins.PrimitiveArrayArgumentsNode;
1719
import org.truffleruby.builtins.UnaryCoreMethodNode;
1820
import org.truffleruby.core.binding.BindingNodes;
1921
import org.truffleruby.core.rope.CodeRange;
2022
import org.truffleruby.core.string.StringNodes;
23+
import org.truffleruby.core.symbol.SymbolNodes;
2124
import org.truffleruby.language.NotProvided;
2225
import org.truffleruby.language.Visibility;
2326
import org.truffleruby.language.arguments.ArgumentDescriptorUtils;
@@ -280,4 +283,18 @@ public Object sourceLocation(DynamicObject proc) {
280283

281284
}
282285

286+
@Primitive(name = "proc_symbol_to_proc_symbol")
287+
public abstract static class ProcSymbolToProcSymbolNode extends PrimitiveArrayArgumentsNode {
288+
289+
@Specialization
290+
public DynamicObject symbolToProcSymbol(DynamicObject proc) {
291+
if (Layouts.PROC.getSharedMethodInfo(proc).getArity() == SymbolNodes.ToProcNode.ARITY) {
292+
return getSymbol(Layouts.PROC.getSharedMethodInfo(proc).getName());
293+
} else {
294+
return nil();
295+
}
296+
}
297+
298+
}
299+
283300
}

src/main/java/org/truffleruby/core/symbol/SymbolNodes.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@ protected boolean isPreInitializing() {
9595
@CoreMethod(names = "to_proc")
9696
public abstract static class ToProcNode extends CoreMethodArrayArgumentsNode {
9797

98+
public static final Arity ARITY = new Arity(0, 0, true);
99+
98100
@Child private ReadCallerFrameNode readCallerFrame = ReadCallerFrameNode.create();
99101

100102
@Specialization(guards = { "cachedSymbol == symbol", "getDeclarationContext(frame) == cachedDeclarationContext" }, limit = "getCacheLimit()")
@@ -120,7 +122,7 @@ protected DynamicObject createProc(DeclarationContext declarationContext, Intern
120122
final SharedMethodInfo sharedMethodInfo = new SharedMethodInfo(
121123
sourceSection,
122124
method.getLexicalScope(),
123-
Arity.REST,
125+
ARITY,
124126
null,
125127
Layouts.SYMBOL.getString(symbol),
126128
0,

src/main/java/org/truffleruby/language/methods/Arity.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ public class Arity {
2121
public static final String[] NO_KEYWORDS = new String[]{};
2222
public static final Arity NO_ARGUMENTS = new Arity(0, 0, false);
2323
public static final Arity ONE_REQUIRED = new Arity(1, 0, false);
24-
public static final Arity REST = new Arity(0, 0, true);
2524

2625
private final int preRequired;
2726
private final int optional;

src/main/ruby/core/proc.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,11 @@ def to_s
9090
file, line = source_location
9191

9292
suffix = "".b
93-
suffix << "@#{file}:#{line}" if file and line
93+
if sym = Truffle.invoke_primitive(:proc_symbol_to_proc_symbol, self)
94+
suffix << "(&#{sym.inspect})"
95+
elsif file and line
96+
suffix << "@#{file}:#{line}"
97+
end
9498
suffix << ' (lambda)' if lambda?
9599
base.b.insert -2, suffix
96100
end

0 commit comments

Comments
 (0)