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: 24f3a4735f9c
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: ca0d6522e803
Choose a head ref
  • 8 commits
  • 7 files changed
  • 1 contributor

Commits on May 11, 2016

  1. Copy the full SHA
    2ef59ea View commit details
  2. [Truffle] Passing specs.

    chrisseaton committed May 11, 2016
    Copy the full SHA
    b6daed1 View commit details
  3. Copy the full SHA
    e7c343f View commit details
  4. [Truffle] Passing specs.

    chrisseaton committed May 11, 2016
    Copy the full SHA
    b1ea927 View commit details
  5. Copy the full SHA
    c5de3ca View commit details
  6. Copy the full SHA
    9becc06 View commit details
  7. Copy the full SHA
    6fc612c View commit details
  8. [Truffle] Passing specs.

    chrisseaton committed May 11, 2016
    Copy the full SHA
    ca0d652 View commit details
8 changes: 4 additions & 4 deletions spec/truffle/specs/truffle/interop/write_spec.rb
Original file line number Diff line number Diff line change
@@ -37,14 +37,14 @@ def called?
describe "writes an instance variable if given an @name" do
it "as a symbol" do
object = Object.new
Truffle::Interop.write ReadInstanceVariable.new, :@foo, 14
object.instance_variable_get('foo').should == 14
Truffle::Interop.write object, :@foo, 14
object.instance_variable_get(:@foo).should == 14
end

it "as a string" do
object = Object.new
Truffle::Interop.write ReadInstanceVariable.new, '@foo', 14
object.instance_variable_get('foo').should == 14
Truffle::Interop.write object, '@foo', 14
object.instance_variable_get(:@foo).should == 14
end
end

2 changes: 0 additions & 2 deletions spec/truffle/tags/truffle/interop/read_tags.txt

This file was deleted.

6 changes: 0 additions & 6 deletions spec/truffle/tags/truffle/interop/write_tags.txt

This file was deleted.

Original file line number Diff line number Diff line change
@@ -37,19 +37,19 @@ abstract class ForeignReadStringCachedHelperNode extends RubyNode {

protected final static String INDEX_METHOD_NAME = "[]";

public abstract Object executeStringCachedHelper(VirtualFrame frame, DynamicObject receiver, Object name, String stringName, boolean isIVar);
public abstract Object executeStringCachedHelper(VirtualFrame frame, DynamicObject receiver, Object name, Object stringName, boolean isIVar);

@Specialization(guards = "isIVar")
public Object readInstanceVariable(
DynamicObject receiver,
Object name,
String stringName,
Object stringName,
boolean isIVar,
@Cached("createReadObjectFieldNode(stringName)") ReadObjectFieldNode readObjectFieldNode) {
return readObjectFieldNode.execute(receiver);
}

protected ReadObjectFieldNode createReadObjectFieldNode(String name) {
protected ReadObjectFieldNode createReadObjectFieldNode(Object name) {
return ReadObjectFieldNodeGen.create(name, nil());
}

@@ -61,7 +61,7 @@ public Object callMethod(
VirtualFrame frame,
DynamicObject receiver,
Object name,
String stringName,
Object stringName,
boolean isIVar) {
return getCallNode().call(frame, receiver, stringName, null);
}
@@ -75,7 +75,7 @@ public Object index(
VirtualFrame frame,
DynamicObject receiver,
Object name,
String stringName,
Object stringName,
boolean isIVar) {
return getCallNode().call(frame, receiver, "[]", null, name);
}
@@ -98,9 +98,13 @@ protected DoesRespondDispatchHeadNode getIndexDefinedNode() {
return indexDefinedNode;
}

protected boolean methodDefined(VirtualFrame frame, DynamicObject receiver, String stringName,
protected boolean methodDefined(VirtualFrame frame, DynamicObject receiver, Object stringName,
DoesRespondDispatchHeadNode definedNode) {
return definedNode.doesRespondTo(frame, stringName, receiver);
if (stringName == null) {
return false;
} else {
return definedNode.doesRespondTo(frame, stringName, receiver);
}
}

protected CallDispatchHeadNode getCallNode() {
Original file line number Diff line number Diff line change
@@ -56,6 +56,12 @@ public int indexStringOutOfRange(DynamicObject receiver, int index) {
return 0;
}

@Specialization(guards = { "!isRubyString(receiver)", "!isStringLike(name)" })
public Object indexObject(VirtualFrame frame, DynamicObject receiver, Object name,
@Cached("createNextHelper()") ForeignReadStringCachedHelperNode nextHelper) {
return nextHelper.executeStringCachedHelper(frame, receiver, name, null, false);
}

protected boolean inRange(DynamicObject string, int index) {
return index >= 0 && index < Layouts.STRING.getRope(string).byteLength();
}
Original file line number Diff line number Diff line change
@@ -39,21 +39,21 @@ abstract class ForeignWriteStringCachedHelperNode extends RubyNode {
protected final static String INDEX_SET_METHOD_NAME = "[]=";

public abstract Object executeStringCachedHelper(VirtualFrame frame, DynamicObject receiver, Object name,
String stringName, boolean isIVar, Object value);
Object stringName, boolean isIVar, Object value);

@Specialization(guards = "isIVar")
public Object readInstanceVariable(
DynamicObject receiver,
Object name,
String stringName,
Object stringName,
boolean isIVar,
Object value,
@Cached("createWriteObjectFieldNode(stringName)") WriteObjectFieldNode writeObjectFieldNode) {
writeObjectFieldNode.execute(receiver, value);
return value;
}

protected WriteObjectFieldNode createWriteObjectFieldNode(String name) {
protected WriteObjectFieldNode createWriteObjectFieldNode(Object name) {
return WriteObjectFieldNodeGen.create(name);
}

@@ -62,7 +62,7 @@ public Object callMethod(
VirtualFrame frame,
DynamicObject receiver,
Object name,
String stringName,
Object stringName,
boolean isIVar,
Object value,
@Cached("createWriteMethodName(stringName)") String writeMethodName) {
@@ -74,7 +74,7 @@ protected boolean not(boolean value) {
return !value;
}

protected String createWriteMethodName(String name) {
protected String createWriteMethodName(Object name) {
return name + "=";
}

@@ -87,11 +87,11 @@ public Object index(
VirtualFrame frame,
DynamicObject receiver,
Object name,
String stringName,
Object stringName,
boolean isIVar,
Object value,
@Cached("createWriteMethodName(stringName)") String writeMethodName) {
return getCallNode().call(frame, receiver, "[]", null, name, value);
return getCallNode().call(frame, receiver, "[]=", null, name, value);
}

protected DoesRespondDispatchHeadNode getDefinedNode() {
@@ -112,9 +112,13 @@ protected DoesRespondDispatchHeadNode getIndexDefinedNode() {
return indexDefinedNode;
}

protected boolean methodDefined(VirtualFrame frame, DynamicObject receiver, String stringName,
protected boolean methodDefined(VirtualFrame frame, DynamicObject receiver, Object stringName,
DoesRespondDispatchHeadNode definedNode) {
return definedNode.doesRespondTo(frame, stringName, receiver);
if (stringName == null) {
return false;
} else {
return definedNode.doesRespondTo(frame, stringName, receiver);
}
}

protected CallDispatchHeadNode getCallNode() {
Original file line number Diff line number Diff line change
@@ -46,6 +46,13 @@ public Object cacheStringLikeAndForward(VirtualFrame frame, DynamicObject receiv
return nextHelper.executeStringCachedHelper(frame, receiver, name, nameAsJavaString, isIVar, value);
}

@Specialization(guards = "!isStringLike(name)")
public Object passThroughNonString(VirtualFrame frame, DynamicObject receiver, Object name, Object value,
@Cached("create()") ToJavaStringNode toJavaStringNode,
@Cached("createNextHelper()") ForeignWriteStringCachedHelperNode nextHelper) {
return nextHelper.executeStringCachedHelper(frame, receiver, name, null, false, value);
}

protected boolean isStringLike(Object value) {
if (isStringLikeNode == null) {
CompilerDirectives.transferToInterpreter();