Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: jruby/jruby
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: adc4d68f2a15
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: c50d3ca04c03
Choose a head ref
  • 2 commits
  • 10 files changed
  • 1 contributor

Commits on Aug 23, 2016

  1. Copy the full SHA
    7483517 View commit details
  2. Copy the full SHA
    c50d3ca View commit details
Original file line number Diff line number Diff line change
@@ -35,6 +35,7 @@
import org.jruby.truffle.language.arguments.ReadCallerFrameNode;
import org.jruby.truffle.language.arguments.ReadPreArgumentNode;
import org.jruby.truffle.language.arguments.ReadRemainingArgumentsNode;
import org.jruby.truffle.language.arguments.ReadSelfNode;
import org.jruby.truffle.language.methods.Arity;
import org.jruby.truffle.language.methods.ExceptionTranslatingNode;
import org.jruby.truffle.language.methods.InternalMethod;
@@ -189,7 +190,7 @@ private static CallTarget makeGenericMethod(RubyContext context, MethodDetails m
final boolean needsSelf = method.constructor() || (!method.isModuleFunction() && !method.onSingleton() && method.needsSelf());

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

Original file line number Diff line number Diff line change
@@ -17,6 +17,7 @@
import org.jruby.truffle.language.RubyNode;
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;

@@ -46,7 +47,7 @@ public RubyNode createCallPrimitiveNode(RubyContext context, SourceSection sourc
List<Class<?>> signature = signatures.get(0);

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

Original file line number Diff line number Diff line change
@@ -65,6 +65,7 @@
import org.jruby.truffle.language.RubyRootNode;
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.arguments.RubyArguments;
import org.jruby.truffle.language.constants.GetConstantNode;
import org.jruby.truffle.language.constants.LookupConstantNode;
@@ -383,7 +384,7 @@ 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 SelfNode self = new SelfNode();
final ReadSelfNode self = new ReadSelfNode();
final RubyNode accessInstanceVariable;
if (isGetter) {
accessInstanceVariable = new ReadInstanceVariableNode(getContext(), sourceSection, ivar, self);
@@ -1772,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 SelfNode());
this.raiseIfFrozenNode = new RaiseIfFrozenNode(context, sourceSection, new ReadSelfNode());
this.methodUndefinedNode = DispatchHeadNodeFactory.createMethodCallOnSelf(context);
}

Original file line number Diff line number Diff line change
@@ -13,6 +13,7 @@
import com.oracle.truffle.api.frame.FrameDescriptor;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.nodes.Node;
import com.oracle.truffle.api.nodes.NodeUtil;
import com.oracle.truffle.api.nodes.RootNode;
import com.oracle.truffle.api.source.SourceSection;
import org.jruby.truffle.RubyContext;
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/*
* Copyright (c) 2013, 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 ReadSelfNode extends RubyNode {

private final ValueProfile valueProfile = ValueProfile.createEqualityProfile();

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

}
Original file line number Diff line number Diff line change
@@ -9,19 +9,34 @@
*/
package org.jruby.truffle.language.objects;

import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.frame.FrameSlot;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.profiles.ValueProfile;
import org.jruby.truffle.RubyContext;
import com.oracle.truffle.api.object.HiddenKey;
import org.jruby.truffle.language.RubyNode;
import org.jruby.truffle.language.arguments.RubyArguments;
import org.jruby.truffle.language.locals.ReadFrameSlotNode;
import org.jruby.truffle.language.locals.ReadFrameSlotNodeGen;

public class SelfNode extends RubyNode {

private final ValueProfile valueProfile = ValueProfile.createEqualityProfile();
public static HiddenKey SELF_IDENTIFIER = new HiddenKey("(self)");

private final FrameSlot selfSlot;

@Child private ReadFrameSlotNode readSelfSlotNode;

public SelfNode(FrameSlot selfSlot) {
this.selfSlot = selfSlot;
}

@Override
public Object execute(VirtualFrame frame) {
return valueProfile.profile(RubyArguments.getSelf(frame));
if (readSelfSlotNode == null) {
CompilerDirectives.transferToInterpreterAndInvalidate();
readSelfSlotNode = insert(ReadFrameSlotNodeGen.create(selfSlot));
}

return readSelfSlotNode.executeRead(frame);
}

@Override
Original file line number Diff line number Diff line change
@@ -73,6 +73,7 @@
import org.jruby.truffle.language.RubyNode;
import org.jruby.truffle.language.RubyRootNode;
import org.jruby.truffle.language.arguments.ArrayIsAtLeastAsLargeAsNode;
import org.jruby.truffle.language.arguments.ReadSelfNode;
import org.jruby.truffle.language.arguments.SingleBlockArgNode;
import org.jruby.truffle.language.constants.ReadConstantWithLexicalScopeNode;
import org.jruby.truffle.language.constants.ReadConstantNode;
@@ -133,6 +134,7 @@
import org.jruby.truffle.language.locals.LocalFlipFlopStateNode;
import org.jruby.truffle.language.locals.LocalVariableType;
import org.jruby.truffle.language.locals.ReadLocalVariableNode;
import org.jruby.truffle.language.locals.WriteLocalVariableNode;
import org.jruby.truffle.language.methods.AddMethodNodeGen;
import org.jruby.truffle.language.methods.Arity;
import org.jruby.truffle.language.methods.BlockDefinitionNode;
@@ -615,7 +617,7 @@ public RubyNode translateSingleBlockArg(SourceSection sourceSection, org.jruby.a
}

private RubyNode translateCheckFrozen(SourceSection sourceSection) {
return new RaiseIfFrozenNode(context, sourceSection, new SelfNode());
return new RaiseIfFrozenNode(context, sourceSection, new SelfNode(environment.getFrameDescriptor().findOrAddFrameSlot(SelfNode.SELF_IDENTIFIER)));
}

private RubyNode translateCallNode(org.jruby.ast.CallNode node, boolean ignoreVisibility, boolean isVCall, boolean isAttrAssign) {
@@ -947,6 +949,10 @@ private ModuleBodyDefinitionNode compileClassNode(SourceSection sourceSection, S
body = sequence(context, sourceSection, Arrays.asList(initFlipFlopStates(sourceSection), body));
}

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

final RubyRootNode rootNode = new RubyRootNode(context, sourceSection, environment.getFrameDescriptor(), environment.getSharedMethodInfo(), body, environment.needsDeclarationFrame());

final ModuleBodyDefinitionNode definitionNode = new ModuleBodyDefinitionNode(
@@ -1754,7 +1760,7 @@ public RubyNode visitInstAsgnNode(org.jruby.ast.InstAsgnNode node) {

// Every case will use a SelfNode, just don't it use more than once.
// Also note the check for frozen.
final RubyNode self = new RaiseIfFrozenNode(context, sourceSection, new SelfNode());
final RubyNode self = new RaiseIfFrozenNode(context, sourceSection, new SelfNode(environment.getFrameDescriptor().findOrAddFrameSlot(SelfNode.SELF_IDENTIFIER)));

final String path = getSourcePath(sourceSection);
final String corePath = buildCorePath("");
@@ -1802,7 +1808,7 @@ public RubyNode visitInstVarNode(org.jruby.ast.InstVarNode node) {
final String name = node.getName();

// About every case will use a SelfNode, just don't it use more than once.
final SelfNode self = new SelfNode();
final SelfNode self = new SelfNode(environment.getFrameDescriptor().findOrAddFrameSlot(SelfNode.SELF_IDENTIFIER));

final String path = getSourcePath(sourceSection);
final String corePath = buildCorePath("");
@@ -2816,7 +2822,7 @@ public RubyNode visitSValueNode(org.jruby.ast.SValueNode node) {

@Override
public RubyNode visitSelfNode(org.jruby.ast.SelfNode node) {
final RubyNode ret = new SelfNode();
final RubyNode ret = new SelfNode(environment.getFrameDescriptor().findOrAddFrameSlot(SelfNode.SELF_IDENTIFIER));
return addNewlineIfNeeded(node, ret);
}

Original file line number Diff line number Diff line change
@@ -37,6 +37,7 @@
import org.jruby.truffle.language.arguments.ReadPostArgumentNode;
import org.jruby.truffle.language.arguments.ReadPreArgumentNode;
import org.jruby.truffle.language.arguments.ReadRestArgumentNode;
import org.jruby.truffle.language.arguments.ReadSelfNode;
import org.jruby.truffle.language.arguments.RunBlockKWArgsHelperNode;
import org.jruby.truffle.language.control.IfElseNode;
import org.jruby.truffle.language.control.IfNode;
@@ -108,7 +109,9 @@ public RubyNode visitArgsNode(org.jruby.ast.ArgsNode node) {

final List<RubyNode> sequence = new ArrayList<>();

sequence.add(loadSelf());
//if (!arraySlotStack.isEmpty()) {
sequence.add(loadSelf());
//}

final org.jruby.ast.Node[] args = node.getArgs();

@@ -257,8 +260,8 @@ public RubyNode visitArgsNode(org.jruby.ast.ArgsNode node) {
}

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

@Override
Original file line number Diff line number Diff line change
@@ -31,6 +31,7 @@
import org.jruby.truffle.language.RubyRootNode;
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.arguments.RubyArguments;
import org.jruby.truffle.language.control.RaiseException;
import org.jruby.truffle.language.exceptions.TopLevelRaiseHandler;
@@ -41,6 +42,7 @@
import org.jruby.truffle.language.methods.CatchReturnAsErrorNode;
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.parser.Parser;
import org.jruby.truffle.language.parser.ParserContext;

@@ -183,6 +185,10 @@ 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());
truffleNode = Translator.sequence(context, sourceSection, Arrays.asList(writeSelfNode, truffleNode));

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

3 changes: 1 addition & 2 deletions truffle/src/main/ruby/core/pre.rb
Original file line number Diff line number Diff line change
@@ -42,7 +42,7 @@ class Module
#
def include(mod)
Truffle.privately do
mod.append_features self # Truffle: moved the append_features inside the privately
mod.append_features self
mod.included self
end
self
@@ -60,7 +60,6 @@ def __class__

alias_method :eql?, :equal?

# Truffle: no extra indirection for Kernel#send.
alias_method :send, :__send__ # from BasicObject

end