Skip to content

Commit

Permalink
[Truffle] Move Kernel#=~ and #!~ to Ruby.
Browse files Browse the repository at this point in the history
* Fixes #4163.
* Propagates $~ correctly.
  • Loading branch information
eregon committed Sep 20, 2016
1 parent fb81d4b commit 3b94d22
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 47 deletions.
Expand Up @@ -264,53 +264,6 @@ private boolean areEqual(VirtualFrame frame, Object left, Object right) {

}

@CoreMethod(names = "=~", required = 1, needsSelf = false)
public abstract static class MatchNode extends CoreMethodArrayArgumentsNode {

@Specialization
public DynamicObject equal(Object other) {
return nil();
}

}

@CoreMethod(names = "!~", required = 1)
public abstract static class NotMatchNode extends CoreMethodArrayArgumentsNode {

@Child private CallDispatchHeadNode matchNode;
@Child private RegexpPrimitiveNodes.RegexpSetLastMatchPrimitiveNode setLastMatchNode;

public NotMatchNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
matchNode = DispatchHeadNodeFactory.createMethodCall(context);
setLastMatchNode = RegexpPrimitiveNodesFactory.RegexpSetLastMatchPrimitiveNodeFactory.create(null);
}

@Specialization
public boolean notMatch(VirtualFrame frame, Object self, Object other) {
final boolean ret = !matchNode.callBoolean(frame, self, "=~", null, other);

final FrameSlot matchDataSlot = getMatchDataSlot(frame.getFrameDescriptor());
final Object matchData = frame.getValue(matchDataSlot);

if (matchData instanceof ThreadLocalObject) {
final ThreadLocalObject threadLocalObject = (ThreadLocalObject) matchData;

setLastMatchNode.executeSetLastMatch(threadLocalObject.get());
} else {
setLastMatchNode.executeSetLastMatch(nil());
}

return ret;
}

@TruffleBoundary
private FrameSlot getMatchDataSlot(FrameDescriptor frameDescriptor) {
return frameDescriptor.findFrameSlot("$~");
}

}

@CoreMethod(names = { "<=>" }, required = 1)
public abstract static class CompareNode extends CoreMethodArrayArgumentsNode {

Expand Down
10 changes: 10 additions & 0 deletions truffle/src/main/ruby/core/kernel.rb
Expand Up @@ -182,6 +182,16 @@ def StringValue(obj)
end
module_function :StringValue

def =~(other)
nil
end

def !~(other)
r = self =~ other ? false : true
Truffle.invoke_primitive(:regexp_set_last_match, $~)
r
end

def itself
self
end
Expand Down

0 comments on commit 3b94d22

Please sign in to comment.