Skip to content

Commit

Permalink
Showing 1 changed file with 18 additions and 6 deletions.
Original file line number Diff line number Diff line change
@@ -9,6 +9,7 @@
*/
package org.jruby.truffle.language.objects;

import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.object.DynamicObject;
import com.oracle.truffle.api.profiles.ConditionProfile;
@@ -19,22 +20,30 @@

public class ReadInstanceVariableNode extends RubyNode {

private final String name;

@Child private RubyNode receiver;
@Child private ReadObjectFieldNode readNode;
@Child private ReadObjectFieldNode readOrNullNode;

private final ConditionProfile objectProfile = ConditionProfile.createBinaryProfile();

public ReadInstanceVariableNode(RubyContext context, SourceSection sourceSection, String name, RubyNode receiver) {
super(context, sourceSection);
this.name = name;
this.receiver = receiver;
readNode = ReadObjectFieldNodeGen.create(getContext(), name, nil());
}

@Override
public Object execute(VirtualFrame frame) {
final Object receiverObject = receiver.execute(frame);

if (objectProfile.profile(receiverObject instanceof DynamicObject)) {
if (readNode == null) {
CompilerDirectives.transferToInterpreter();
readNode = insert(ReadObjectFieldNodeGen.create(getContext(), name, nil()));
}

return readNode.execute((DynamicObject) receiverObject);
} else {
return nil();
@@ -45,13 +54,16 @@ public Object execute(VirtualFrame frame) {
public Object isDefined(VirtualFrame frame) {
final Object receiverObject = receiver.execute(frame);

if (receiverObject instanceof DynamicObject) {
final DynamicObject receiverRubyObject = (DynamicObject) receiverObject;
if (objectProfile.profile(receiverObject instanceof DynamicObject)) {
if (readNode == null) {

This comment has been minimized.

Copy link
@eregon

eregon Feb 24, 2016

Member

Seems it should be readOrNullNode here. Please use an helper method for this or it just becomes unreadable and bug-friendly.

This comment has been minimized.

Copy link
@chrisseaton

chrisseaton Feb 24, 2016

Author Contributor

Done.

CompilerDirectives.transferToInterpreter();
readOrNullNode = insert(ReadObjectFieldNodeGen.create(getContext(), name, null));
}

if (receiverRubyObject.getShape().hasProperty(readNode.getName())) {
return create7BitString("instance-variable", UTF8Encoding.INSTANCE);
} else {
if (readOrNullNode.execute((DynamicObject) receiverObject) == null) {
return nil();
} else {
return create7BitString("instance-variable", UTF8Encoding.INSTANCE);
}
} else {
return false;

0 comments on commit db96418

Please sign in to comment.