Skip to content

Commit

Permalink
[Truffle] Implement Binding#local_variable_defined?
Browse files Browse the repository at this point in the history
  • Loading branch information
Brandon Fish committed Sep 1, 2016
1 parent 3cf0b5b commit 772f381
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 5 deletions.
@@ -1,7 +1,2 @@
fails:Binding#local_variable_defined? returns false when a variable is not defined
fails:Binding#local_variable_defined? returns true when a regular local variable is defined
fails:Binding#local_variable_defined? returns true when a local variable is defined using eval()
fails:Binding#local_variable_defined? returns true when a local variable is defined using Binding#local_variable_set
fails:Binding#local_variable_defined? returns true when a local variable is defined in a parent scope
fails:Binding#local_variable_defined? allows usage of a String as the variable name
fails:Binding#local_variable_defined? allows usage of an object responding to #to_str as the variable name
Expand Up @@ -130,6 +130,38 @@ private MaterializedFrame copyFrame(MaterializedFrame frame) {

}

@ImportStatic(BindingNodes.class)
@CoreMethod(names = "local_variable_defined?", required = 1)
public abstract static class LocalVariableDefinedNode extends CoreMethodArrayArgumentsNode {

private final DynamicObject dollarUnderscore;

public LocalVariableDefinedNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
dollarUnderscore = getSymbol("$_");
}

@TruffleBoundary
@Specialization(guards = {"isRubySymbol(symbol)", "!isLastLine(symbol)"})
public boolean localVariableDefinedUncached(DynamicObject binding, DynamicObject symbol) {
final FrameSlotAndDepth frameSlot = findFrameSlotOrNull(binding, symbol);
return frameSlot != null;
}

@TruffleBoundary
@Specialization(guards = {"isRubySymbol(symbol)", "isLastLine(symbol)"})
public Object localVariableDefinedLastLine(DynamicObject binding, DynamicObject symbol) {
final MaterializedFrame frame = Layouts.BINDING.getFrame(binding);
final FrameSlot frameSlot = frame.getFrameDescriptor().findFrameSlot(Layouts.SYMBOL.getString(symbol));
return frameSlot != null;
}

protected boolean isLastLine(DynamicObject symbol) {
return symbol == dollarUnderscore;
}

}

@ImportStatic(BindingNodes.class)
@CoreMethod(names = "local_variable_get", required = 1)
public abstract static class LocalVariableGetNode extends CoreMethodArrayArgumentsNode {
Expand Down

0 comments on commit 772f381

Please sign in to comment.