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: 146e7390f432
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 061636138eb9
Choose a head ref
  • 2 commits
  • 1 file changed
  • 1 contributor

Commits on Apr 4, 2016

  1. Copy the full SHA
    f18ca55 View commit details
  2. Copy the full SHA
    0616361 View commit details
Showing with 77 additions and 10 deletions.
  1. +77 −10 truffle/src/main/java/org/jruby/truffle/interop/TruffleInteropNodes.java
Original file line number Diff line number Diff line change
@@ -364,7 +364,7 @@ public Object read(
TruffleObject receiver,
DynamicObject identifier,
@Cached("identifier") DynamicObject cachedIdentifier,
@Cached("identifier.toString()") String identifierString,
@Cached("cachedIdentifier.toString()") String identifierString,
@Cached("createReadNode()") Node readNode,
@Cached("create()") BranchProfile exceptionProfile) {
try {
@@ -375,13 +375,19 @@ public Object read(
}
}

@Specialization(guards = {"isRubyString(identifier)", "ropesEqual(identifier, cachedIdentifier)"})
public Object read(
@Specialization(
guards = {
"isRubyString(identifier)",
"ropesEqual(identifier, cachedIdentifier)"
},
limit = "getCacheLimit()"
)
public Object readCached(
VirtualFrame frame,
TruffleObject receiver,
DynamicObject identifier,
@Cached("privatizeRope(identifier)") Rope cachedIdentifier,
@Cached("identifier.toString()") String identifierString,
@Cached("cachedIdentifier.toString()") String identifierString,
@Cached("createReadNode()") Node readNode,
@Cached("create()") BranchProfile exceptionProfile) {
try {
@@ -392,10 +398,37 @@ public Object read(
}
}

@Specialization(
guards = "isRubyString(identifier)",
contains = "readCached"
)
public Object readUncached(
VirtualFrame frame,
TruffleObject receiver,
DynamicObject identifier,
@Cached("createReadNode()") Node readNode,
@Cached("create()") BranchProfile exceptionProfile) {
try {
return ForeignAccess.sendRead(readNode, frame, receiver, objectToString(identifier));
} catch (UnknownIdentifierException | UnsupportedMessageException e) {
exceptionProfile.enter();
throw new RuntimeException(e);
}
}

@TruffleBoundary
protected String objectToString(Object object) {
return object.toString();
}

protected static Node createReadNode() {
return Message.READ.createNode();
}

protected int getCacheLimit() {
return getContext().getOptions().INTEROP_READ_CACHE;
}

}

@CoreMethod(unsafeNeedsAudit = true, names = {"write", "write_property"}, isModuleFunction = true, needsSelf = false, required = 3)
@@ -407,7 +440,7 @@ public WriteNode(RubyContext context, SourceSection sourceSection) {
}

@Specialization(guards = {"!isRubySymbol(identifier)", "!isRubyString(identifier)"})
public Object writeProperty(
public Object write(
VirtualFrame frame,
TruffleObject receiver,
Object identifier,
@@ -423,13 +456,13 @@ public Object writeProperty(
}

@Specialization(guards = {"isRubySymbol(identifier)", "identifier == cachedIdentifier"})
public Object writeProperty(
public Object write(
VirtualFrame frame,
TruffleObject receiver,
DynamicObject identifier,
Object value,
@Cached("identifier") DynamicObject cachedIdentifier,
@Cached("identifier.toString()") String identifierString,
@Cached("cachedIdentifier.toString()") String identifierString,
@Cached("createWriteNode()") Node writeNode,
@Cached("create()") BranchProfile exceptionProfile) {
try {
@@ -440,14 +473,20 @@ public Object writeProperty(
}
}

@Specialization(guards = {"isRubyString(identifier)", "ropesEqual(identifier, cachedIdentifier)"})
public Object writeProperty(
@Specialization(
guards = {
"isRubyString(identifier)",
"ropesEqual(identifier, cachedIdentifier)"
},
limit = "getCacheLimit()"
)
public Object writeCached(
VirtualFrame frame,
TruffleObject receiver,
DynamicObject identifier,
Object value,
@Cached("privatizeRope(identifier)") Rope cachedIdentifier,
@Cached("identifier.toString()") String identifierString,
@Cached("cachedIdentifier.toString()") String identifierString,
@Cached("createWriteNode()") Node writeNode,
@Cached("create()") BranchProfile exceptionProfile) {
try {
@@ -458,10 +497,38 @@ public Object writeProperty(
}
}

@Specialization(
guards = "isRubyString(identifier)",
contains = "writeCached"
)
public Object writeUncached(
VirtualFrame frame,
TruffleObject receiver,
DynamicObject identifier,
Object value,
@Cached("createWriteNode()") Node writeNode,
@Cached("create()") BranchProfile exceptionProfile) {
try {
return ForeignAccess.sendWrite(writeNode, frame, receiver, objectToString(identifier), value);
} catch (UnknownIdentifierException | UnsupportedTypeException | UnsupportedMessageException e) {
exceptionProfile.enter();
throw new RuntimeException(e);
}
}

@TruffleBoundary
protected String objectToString(Object object) {
return object.toString();
}

protected static Node createWriteNode() {
return Message.WRITE.createNode();
}

protected int getCacheLimit() {
return getContext().getOptions().INTEROP_WRITE_CACHE;
}

}

@CoreMethod(unsafeNeedsAudit = true, names = "export", isModuleFunction = true, needsSelf = false, required = 2)