Skip to content

Commit

Permalink
Showing 12 changed files with 58 additions and 27 deletions.
Original file line number Diff line number Diff line change
@@ -30,6 +30,7 @@
import org.jruby.truffle.language.RubyGuards;
import org.jruby.truffle.language.RubyNode;
import org.jruby.truffle.language.RubyRootNode;
import org.jruby.truffle.language.arguments.ProfileArgumentNode;
import org.jruby.truffle.language.arguments.MissingArgumentBehavior;
import org.jruby.truffle.language.arguments.ReadBlockNode;
import org.jruby.truffle.language.arguments.ReadCallerFrameNode;
@@ -40,7 +41,6 @@
import org.jruby.truffle.language.methods.ExceptionTranslatingNode;
import org.jruby.truffle.language.methods.InternalMethod;
import org.jruby.truffle.language.methods.SharedMethodInfo;
import org.jruby.truffle.language.objects.SelfNode;
import org.jruby.truffle.language.objects.SingletonClassNode;
import org.jruby.truffle.language.parser.jruby.Translator;
import org.jruby.truffle.platform.UnsafeGroup;
@@ -190,14 +190,14 @@ private static CallTarget makeGenericMethod(RubyContext context, MethodDetails m
final boolean needsSelf = method.constructor() || (!method.isModuleFunction() && !method.onSingleton() && method.needsSelf());

if (needsSelf) {
RubyNode readSelfNode = new ReadSelfNode();
RubyNode readSelfNode = new ProfileArgumentNode(new ReadSelfNode());
argumentsNodes.add(transformArgument(context, sourceSection, method, readSelfNode, 0));
}

final int nArgs = required + optional;

for (int n = 0; n < nArgs; n++) {
RubyNode readArgumentNode = new ReadPreArgumentNode(n, MissingArgumentBehavior.UNDEFINED);
RubyNode readArgumentNode = new ProfileArgumentNode(new ReadPreArgumentNode(n, MissingArgumentBehavior.UNDEFINED));
argumentsNodes.add(transformArgument(context, sourceSection, method, readArgumentNode, n + 1));
}
if (method.rest()) {
Original file line number Diff line number Diff line change
@@ -15,11 +15,11 @@
import org.jruby.truffle.core.array.ArrayUtils;
import org.jruby.truffle.core.numeric.FixnumLowerNodeGen;
import org.jruby.truffle.language.RubyNode;
import org.jruby.truffle.language.arguments.ProfileArgumentNode;
import org.jruby.truffle.language.arguments.MissingArgumentBehavior;
import org.jruby.truffle.language.arguments.ReadPreArgumentNode;
import org.jruby.truffle.language.arguments.ReadSelfNode;
import org.jruby.truffle.language.control.ReturnID;
import org.jruby.truffle.language.objects.SelfNode;

import java.util.ArrayList;
import java.util.List;
@@ -47,12 +47,12 @@ public RubyNode createCallPrimitiveNode(RubyContext context, SourceSection sourc
List<Class<?>> signature = signatures.get(0);

if (annotation.needsSelf()) {
arguments.add(transformArgument(new ReadSelfNode(), 0));
arguments.add(transformArgument(new ProfileArgumentNode(new ReadSelfNode()), 0));
argumentsCount--;
}

for (int n = 0; n < argumentsCount; n++) {
RubyNode readArgumentNode = new ReadPreArgumentNode(n, MissingArgumentBehavior.UNDEFINED);
RubyNode readArgumentNode = new ProfileArgumentNode(new ReadPreArgumentNode(n, MissingArgumentBehavior.UNDEFINED));
arguments.add(transformArgument(readArgumentNode, n + 1));
}

Original file line number Diff line number Diff line change
@@ -67,6 +67,7 @@
import org.jruby.truffle.language.RubyRootNode;
import org.jruby.truffle.language.SnippetNode;
import org.jruby.truffle.language.arguments.MissingArgumentBehavior;
import org.jruby.truffle.language.arguments.ProfileArgumentNode;
import org.jruby.truffle.language.arguments.ReadPreArgumentNode;
import org.jruby.truffle.language.arguments.RubyArguments;
import org.jruby.truffle.language.control.RaiseException;
@@ -1460,7 +1461,7 @@ public MaxBlock(RubyContext context) {

callTarget = Truffle.getRuntime().createCallTarget(new RubyRootNode(context, null, null, sharedMethodInfo, MaxBlockNodeFactory.create(context, null, new RubyNode[]{
new ReadDeclarationVariableNode(context, null, LocalVariableType.FRAME_LOCAL, 1, frameSlot),
new ReadPreArgumentNode(0, MissingArgumentBehavior.RUNTIME_ERROR)
new ProfileArgumentNode(new ReadPreArgumentNode(0, MissingArgumentBehavior.RUNTIME_ERROR))
}), false));
}

@@ -1582,7 +1583,7 @@ public MinBlock(RubyContext context) {

callTarget = Truffle.getRuntime().createCallTarget(new RubyRootNode(context, null, null, sharedMethodInfo, MinBlockNodeFactory.create(context, null, new RubyNode[]{
new ReadDeclarationVariableNode(context, null, LocalVariableType.FRAME_LOCAL, 1, frameSlot),
new ReadPreArgumentNode(0, MissingArgumentBehavior.RUNTIME_ERROR)
new ProfileArgumentNode(new ReadPreArgumentNode(0, MissingArgumentBehavior.RUNTIME_ERROR))
}), false));
}

Original file line number Diff line number Diff line change
@@ -63,6 +63,7 @@
import org.jruby.truffle.language.RubyGuards;
import org.jruby.truffle.language.RubyNode;
import org.jruby.truffle.language.RubyRootNode;
import org.jruby.truffle.language.arguments.ProfileArgumentNode;
import org.jruby.truffle.language.arguments.MissingArgumentBehavior;
import org.jruby.truffle.language.arguments.ReadPreArgumentNode;
import org.jruby.truffle.language.arguments.ReadSelfNode;
@@ -88,7 +89,6 @@
import org.jruby.truffle.language.objects.IsFrozenNode;
import org.jruby.truffle.language.objects.IsFrozenNodeGen;
import org.jruby.truffle.language.objects.ReadInstanceVariableNode;
import org.jruby.truffle.language.objects.SelfNode;
import org.jruby.truffle.language.objects.SingletonClassNode;
import org.jruby.truffle.language.objects.SingletonClassNodeGen;
import org.jruby.truffle.language.objects.WriteInstanceVariableNode;
@@ -384,12 +384,12 @@ private void createAccesor(DynamicObject module, String name) {
final RubyNode checkArity = Translator.createCheckArityNode(getContext(), sourceSection, arity);
final SharedMethodInfo sharedMethodInfo = new SharedMethodInfo(sourceSection, LexicalScope.NONE, arity, indicativeName, false, null, false, false, false);

final ReadSelfNode self = new ReadSelfNode();
final RubyNode self = new ProfileArgumentNode(new ReadSelfNode());
final RubyNode accessInstanceVariable;
if (isGetter) {
accessInstanceVariable = new ReadInstanceVariableNode(getContext(), sourceSection, ivar, self);
} else {
ReadPreArgumentNode readArgument = new ReadPreArgumentNode(0, MissingArgumentBehavior.RUNTIME_ERROR);
RubyNode readArgument = new ProfileArgumentNode(new ReadPreArgumentNode(0, MissingArgumentBehavior.RUNTIME_ERROR));
accessInstanceVariable = new WriteInstanceVariableNode(getContext(), sourceSection, ivar, self, readArgument);
}
final RubyNode sequence = Translator.sequence(getContext(), sourceSection, Arrays.asList(checkArity, accessInstanceVariable));
@@ -1773,7 +1773,7 @@ public abstract static class UndefMethodNode extends CoreMethodArrayArgumentsNod
public UndefMethodNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
this.nameToJavaStringNode = NameToJavaStringNode.create();
this.raiseIfFrozenNode = new RaiseIfFrozenNode(context, sourceSection, new ReadSelfNode());
this.raiseIfFrozenNode = new RaiseIfFrozenNode(context, sourceSection, new ProfileArgumentNode(new ReadSelfNode()));
this.methodUndefinedNode = DispatchHeadNodeFactory.createMethodCallOnSelf(context);
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*
* Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved. This
* code is released under a tri EPL/GPL/LGPL license. You can use it,
* redistribute it and/or modify it under the terms of the:
*
* Eclipse Public License version 1.0
* GNU General Public License version 2
* GNU Lesser General Public License version 2.1
*/
package org.jruby.truffle.language.arguments;

import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.profiles.ValueProfile;
import org.jruby.truffle.language.RubyNode;

public class ProfileArgumentNode extends RubyNode {

@Child private RubyNode readArgumentNode;

private final ValueProfile valueProfile = ValueProfile.createEqualityProfile();

public ProfileArgumentNode(RubyNode readArgumentNode) {
this.readArgumentNode = readArgumentNode;
}

@Override
public Object execute(VirtualFrame frame) {
return valueProfile.profile(readArgumentNode.execute(frame));
}

}
Original file line number Diff line number Diff line change
@@ -22,8 +22,6 @@ public class ReadPreArgumentNode extends RubyNode {
private final BranchProfile outOfRangeProfile = BranchProfile.create();
private final MissingArgumentBehavior missingArgumentBehavior;

private final ValueProfile argumentValueProfile = ValueProfile.createEqualityProfile();

public ReadPreArgumentNode(int index,
MissingArgumentBehavior missingArgumentBehavior) {
this.index = index;
@@ -33,7 +31,7 @@ public ReadPreArgumentNode(int index,
@Override
public Object execute(VirtualFrame frame) {
if (index < RubyArguments.getArgumentsCount(frame)) {
return argumentValueProfile.profile(RubyArguments.getArgument(frame, index));
return RubyArguments.getArgument(frame, index);
}

outOfRangeProfile.enter();
Original file line number Diff line number Diff line change
@@ -10,16 +10,13 @@
package org.jruby.truffle.language.arguments;

import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.profiles.ValueProfile;
import org.jruby.truffle.language.RubyNode;

public class ReadSelfNode extends RubyNode {

private final ValueProfile valueProfile = ValueProfile.createEqualityProfile();

@Override
public Object execute(VirtualFrame frame) {
return valueProfile.profile(RubyArguments.getSelf(frame));
return RubyArguments.getSelf(frame);
}

}
Original file line number Diff line number Diff line change
@@ -72,6 +72,7 @@
import org.jruby.truffle.language.LexicalScope;
import org.jruby.truffle.language.RubyNode;
import org.jruby.truffle.language.RubyRootNode;
import org.jruby.truffle.language.arguments.ProfileArgumentNode;
import org.jruby.truffle.language.arguments.ArrayIsAtLeastAsLargeAsNode;
import org.jruby.truffle.language.arguments.ReadSelfNode;
import org.jruby.truffle.language.arguments.SingleBlockArgNode;
@@ -950,7 +951,7 @@ private ModuleBodyDefinitionNode compileClassNode(SourceSection sourceSection, S
}

final FrameSlot selfSlot = environment.getFrameDescriptor().findOrAddFrameSlot(SelfNode.SELF_IDENTIFIER);
final WriteLocalVariableNode writeSelfNode = WriteLocalVariableNode.createWriteLocalVariableNode(context, null, selfSlot, new ReadSelfNode());
final WriteLocalVariableNode writeSelfNode = WriteLocalVariableNode.createWriteLocalVariableNode(context, null, selfSlot, new ProfileArgumentNode(new ReadSelfNode()));
body = sequence(context, sourceSection, Arrays.asList(writeSelfNode, body));

final RubyRootNode rootNode = new RubyRootNode(context, sourceSection, environment.getFrameDescriptor(), environment.getSharedMethodInfo(), body, environment.needsDeclarationFrame());
Original file line number Diff line number Diff line change
@@ -11,7 +11,6 @@

import com.oracle.truffle.api.frame.FrameSlot;
import com.oracle.truffle.api.nodes.Node;
import com.oracle.truffle.api.object.HiddenKey;
import com.oracle.truffle.api.source.Source;
import com.oracle.truffle.api.source.SourceSection;
import org.jruby.ast.MultipleAsgnNode;
@@ -27,6 +26,7 @@
import org.jruby.truffle.core.cast.SplatCastNode;
import org.jruby.truffle.core.cast.SplatCastNodeGen;
import org.jruby.truffle.language.RubyNode;
import org.jruby.truffle.language.arguments.ProfileArgumentNode;
import org.jruby.truffle.language.arguments.ArrayIsAtLeastAsLargeAsNode;
import org.jruby.truffle.language.arguments.MissingArgumentBehavior;
import org.jruby.truffle.language.arguments.MissingKeywordArgumentNode;
@@ -261,7 +261,7 @@ public RubyNode visitArgsNode(org.jruby.ast.ArgsNode node) {

private RubyNode loadSelf() {
final FrameSlot slot = methodBodyTranslator.getEnvironment().getFrameDescriptor().findOrAddFrameSlot(SelfNode.SELF_IDENTIFIER);
return WriteLocalVariableNode.createWriteLocalVariableNode(context, null, slot, new ReadSelfNode());
return WriteLocalVariableNode.createWriteLocalVariableNode(context, null, slot, new ProfileArgumentNode(new ReadSelfNode()));
}

@Override
@@ -324,7 +324,7 @@ private RubyNode readArgument(SourceSection sourceSection) {
return PrimitiveArrayNodeFactory.read(context, sourceSection, loadArray(sourceSection), index);
} else {
if (state == State.PRE) {
return new ReadPreArgumentNode(index, isProc ? MissingArgumentBehavior.NIL : MissingArgumentBehavior.RUNTIME_ERROR);
return new ProfileArgumentNode(new ReadPreArgumentNode(index, isProc ? MissingArgumentBehavior.NIL : MissingArgumentBehavior.RUNTIME_ERROR));
} else if (state == State.POST) {
return new ReadPostArgumentNode(-index);
} else {
Original file line number Diff line number Diff line change
@@ -31,6 +31,7 @@
import org.jruby.truffle.language.RubyNode;
import org.jruby.truffle.language.RubyRootNode;
import org.jruby.truffle.language.arguments.MissingArgumentBehavior;
import org.jruby.truffle.language.arguments.ProfileArgumentNode;
import org.jruby.truffle.language.arguments.ReadBlockNode;
import org.jruby.truffle.language.arguments.ReadPreArgumentNode;
import org.jruby.truffle.language.arguments.ShouldDestructureNode;
@@ -94,7 +95,7 @@ public BlockDefinitionNode compileBlockNode(SourceSection sourceSection, String

final RubyNode preludeProc;
if (shouldConsiderDestructuringArrayArg(arity)) {
final RubyNode readArrayNode = new ReadPreArgumentNode(0, MissingArgumentBehavior.RUNTIME_ERROR);
final RubyNode readArrayNode = new ProfileArgumentNode(new ReadPreArgumentNode(0, MissingArgumentBehavior.RUNTIME_ERROR));
final RubyNode castArrayNode = ArrayCastNodeGen.create(context, sourceSection, readArrayNode);

final FrameSlot arraySlot = environment.declareVar(environment.allocateLocalTemp("destructure"));
Original file line number Diff line number Diff line change
@@ -16,6 +16,7 @@
import org.jruby.truffle.RubyContext;
import org.jruby.truffle.language.RubyNode;
import org.jruby.truffle.language.arguments.MissingArgumentBehavior;
import org.jruby.truffle.language.arguments.ProfileArgumentNode;
import org.jruby.truffle.language.arguments.ReadPreArgumentNode;
import org.jruby.truffle.language.control.SequenceNode;

@@ -94,7 +95,7 @@ public RubyNode visitOptArgNode(org.jruby.ast.OptArgNode node) {

@Override
public RubyNode visitMultipleAsgnNode(org.jruby.ast.MultipleAsgnNode node) {
return new ReadPreArgumentNode(index, MissingArgumentBehavior.NIL);
return new ProfileArgumentNode(new ReadPreArgumentNode(index, MissingArgumentBehavior.NIL));
}

@Override
Original file line number Diff line number Diff line change
@@ -29,6 +29,7 @@
import org.jruby.truffle.language.LexicalScope;
import org.jruby.truffle.language.RubyNode;
import org.jruby.truffle.language.RubyRootNode;
import org.jruby.truffle.language.arguments.ProfileArgumentNode;
import org.jruby.truffle.language.arguments.MissingArgumentBehavior;
import org.jruby.truffle.language.arguments.ReadPreArgumentNode;
import org.jruby.truffle.language.arguments.ReadSelfNode;
@@ -186,15 +187,15 @@ public RubyRootNode parse(RubyContext context, Source source, Encoding defaultEn
// Load arguments

final FrameSlot selfSlot = environment.getFrameDescriptor().findOrAddFrameSlot(SelfNode.SELF_IDENTIFIER);
final WriteLocalVariableNode writeSelfNode = WriteLocalVariableNode.createWriteLocalVariableNode(context, null, selfSlot, new ReadSelfNode());
final WriteLocalVariableNode writeSelfNode = WriteLocalVariableNode.createWriteLocalVariableNode(context, null, selfSlot, new ProfileArgumentNode(new ReadSelfNode()));
truffleNode = Translator.sequence(context, sourceSection, Arrays.asList(writeSelfNode, truffleNode));

if (argumentNames != null && argumentNames.length > 0) {
final List<RubyNode> sequence = new ArrayList<>();

for (int n = 0; n < argumentNames.length; n++) {
final String name = argumentNames[n];
final RubyNode readNode = new ReadPreArgumentNode(n, MissingArgumentBehavior.NIL);
final RubyNode readNode = new ProfileArgumentNode(new ReadPreArgumentNode(n, MissingArgumentBehavior.NIL));
final FrameSlot slot = environment.getFrameDescriptor().findFrameSlot(name);
sequence.add(WriteLocalVariableNode.createWriteLocalVariableNode(context, sourceSection, slot, readNode));
}

0 comments on commit 4657984

Please sign in to comment.