-
-
Notifications
You must be signed in to change notification settings - Fork 925
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Truffle] Tidy up ReadDeclarationVariableNode.
- 9.4.12.0
- 9.4.11.0
- 9.4.10.0
- 9.4.9.0
- 9.4.8.0
- 9.4.7.0
- 9.4.6.0
- 9.4.5.0
- 9.4.4.0
- 9.4.3.0
- 9.4.2.0
- 9.4.1.0
- 9.4.0.0
- 9.3.15.0
- 9.3.14.0
- 9.3.13.0
- 9.3.12.0
- 9.3.11.0
- 9.3.10.0
- 9.3.9.0
- 9.3.8.0
- 9.3.7.0
- 9.3.6.0
- 9.3.5.0
- 9.3.4.0
- 9.3.3.0
- 9.3.2.0
- 9.3.1.0
- 9.3.0.0
- 9.2.21.0
- 9.2.20.1
- 9.2.20.0
- 9.2.19.0
- 9.2.18.0
- 9.2.17.0
- 9.2.16.0
- 9.2.15.0
- 9.2.14.0
- 9.2.13.0
- 9.2.12.0
- 9.2.11.1
- 9.2.11.0
- 9.2.10.0
- 9.2.9.0
- 9.2.8.0
- 9.2.7.0
- 9.2.6.0
- 9.2.5.0
- 9.2.4.1
- 9.2.4.0
- 9.2.3.0
- 9.2.2.0
- 9.2.1.0
- 9.2.0.0
- 9.1.17.0
- 9.1.16.0
- 9.1.15.0
- 9.1.14.0
- 9.1.13.0
- 9.1.12.0
- 9.1.11.0
- 9.1.10.0
- 9.1.9.0
- 9.1.8.0
- 9.1.7.0
- 9.1.6.0
- 9.1.5.0
- 9.1.4.0
- 9.1.3.0
- 9.1.2.0
- 9.1.1.0
- 9.1.0.0
1 parent
a22364a
commit 870a9e9
Showing
3 changed files
with
53 additions
and
34 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -11,6 +11,7 @@ | |
|
||
import com.oracle.truffle.api.CompilerDirectives; | ||
import com.oracle.truffle.api.frame.FrameSlot; | ||
import com.oracle.truffle.api.frame.MaterializedFrame; | ||
import com.oracle.truffle.api.frame.VirtualFrame; | ||
import com.oracle.truffle.api.source.SourceSection; | ||
import org.jcodings.specific.UTF8Encoding; | ||
|
@@ -26,44 +27,61 @@ | |
|
||
public class ReadDeclarationVariableNode extends ReadLocalNode { | ||
|
||
private final LocalVariableType type; | ||
private final int frameDepth; | ||
private final FrameSlot frameSlot; | ||
|
||
@Child private ReadFrameSlotNode readFrameSlotNode; | ||
|
||
public ReadDeclarationVariableNode(RubyContext context, SourceSection sourceSection, | ||
int frameDepth, FrameSlot slot) { | ||
public ReadDeclarationVariableNode(RubyContext context, SourceSection sourceSection, LocalVariableType type, | ||
int frameDepth, FrameSlot frameSlot) { | ||
super(context, sourceSection); | ||
readFrameSlotNode = ReadFrameSlotNodeGen.create(slot); | ||
this.type = type; | ||
this.frameDepth = frameDepth; | ||
this.frameSlot = frameSlot; | ||
} | ||
|
||
@Override | ||
public Object execute(VirtualFrame frame) { | ||
return readFrameSlotNode.executeRead(RubyArguments.getDeclarationFrame(frame, frameDepth)); | ||
checkReadFrameSlotNode(); | ||
final MaterializedFrame declarationFrame = RubyArguments.getDeclarationFrame(frame, frameDepth); | ||
return readFrameSlotNode.executeRead(declarationFrame); | ||
} | ||
|
||
|
||
@Override | ||
public RubyNode makeWriteNode(RubyNode rhs) { | ||
return new WriteDeclarationVariableNode(getContext(), getSourceSection(), | ||
rhs, frameDepth, readFrameSlotNode.getFrameSlot()); | ||
public Object isDefined(VirtualFrame frame) { | ||
switch (type) { | ||
case FRAME_LOCAL: | ||
return coreStrings().LOCAL_VARIABLE.createInstance(); | ||
|
||
case FRAME_LOCAL_GLOBAL: | ||
checkReadFrameSlotNode(); | ||
|
||
if (readFrameSlotNode.executeRead(frame) != nil()) { | ||
return coreStrings().GLOBAL_VARIABLE.createInstance(); | ||
} else { | ||
return nil(); | ||
} | ||
|
||
case ALWAYS_DEFINED_GLOBAL: | ||
return coreStrings().GLOBAL_VARIABLE.createInstance(); | ||
|
||
default: | ||
throw new UnsupportedOperationException("didn't expect local type " + type); | ||
} | ||
} | ||
|
||
public static final Set<String> ALWAYS_DEFINED_GLOBALS = new HashSet<>(Collections.singletonList("$~")); | ||
private void checkReadFrameSlotNode() { | ||
if (readFrameSlotNode == null) { | ||
CompilerDirectives.transferToInterpreter(); | ||
readFrameSlotNode = insert(ReadFrameSlotNodeGen.create(frameSlot)); | ||
} | ||
This comment has been minimized.
Sorry, something went wrong.
This comment has been minimized.
Sorry, something went wrong.
eregon
Member
|
||
} | ||
|
||
@Override | ||
public Object isDefined(VirtualFrame frame) { | ||
CompilerDirectives.transferToInterpreter(); | ||
|
||
if (Translator.FRAME_LOCAL_GLOBAL_VARIABLES.contains(readFrameSlotNode.getFrameSlot().getIdentifier())) { | ||
if (ALWAYS_DEFINED_GLOBALS.contains(readFrameSlotNode.getFrameSlot().getIdentifier()) | ||
|| readFrameSlotNode.executeRead(RubyArguments.getDeclarationFrame(frame, frameDepth)) != nil()) { | ||
return create7BitString("global-variable", UTF8Encoding.INSTANCE); | ||
} else { | ||
return nil(); | ||
} | ||
} else { | ||
return create7BitString("local-variable", UTF8Encoding.INSTANCE); | ||
} | ||
public RubyNode makeWriteNode(RubyNode rhs) { | ||
return new WriteDeclarationVariableNode(getContext(), getSourceSection(), rhs, frameDepth, frameSlot); | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
I think we should use the pattern
getReadFrameSlotNode()
so side-effects are hidden in the specialization.