Skip to content

Commit b7a61ac

Browse files
committed
[GR-14940] Expose the value in a ValueWrapper in Chrome Inspector debug.
PullRequest: truffleruby/2388
2 parents 2d6af95 + dc1cfcb commit b7a61ac

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
New features:
44

55
* Access to local variables of the interactive Binding via language bindings is now supported: `context.getBindings("ruby").putMember("my_var", 42);` (#2030).
6+
* `VALUE`s in C extensions now expose the Ruby object when viewed in the debugger, as long as they have not been converted to native values.
67

78
Bug fixes:
89

src/main/java/org/truffleruby/cext/ValueWrapper.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,15 @@
1313
import org.truffleruby.cext.ValueWrapperManager.AllocateHandleNode;
1414
import org.truffleruby.cext.ValueWrapperManager.HandleBlock;
1515
import org.truffleruby.core.MarkingServiceNodes.KeepAliveNode;
16+
import org.truffleruby.debug.VariableNamesObject;
1617
import org.truffleruby.interop.TranslateInteropExceptionNode;
1718

1819
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
1920
import com.oracle.truffle.api.dsl.Cached;
2021
import com.oracle.truffle.api.dsl.Cached.Exclusive;
2122
import com.oracle.truffle.api.interop.InteropLibrary;
2223
import com.oracle.truffle.api.interop.TruffleObject;
24+
import com.oracle.truffle.api.interop.UnknownIdentifierException;
2325
import com.oracle.truffle.api.interop.UnsupportedMessageException;
2426
import com.oracle.truffle.api.library.ExportLibrary;
2527
import com.oracle.truffle.api.library.ExportMessage;
@@ -121,4 +123,30 @@ protected static long asPointer(ValueWrapper wrapper,
121123

122124
return handle;
123125
}
126+
127+
@ExportMessage
128+
protected boolean hasMembers() {
129+
return true;
130+
}
131+
132+
@ExportMessage
133+
protected Object getMembers(boolean includeInternal) {
134+
return new VariableNamesObject(new String[]{ "value" });
135+
}
136+
137+
@ExportMessage
138+
protected boolean isMemberReadable(String member) {
139+
return "value".equals(member);
140+
}
141+
142+
@ExportMessage
143+
protected static Object readMember(ValueWrapper wrapper, String member,
144+
@Cached @Exclusive BranchProfile errorProfile) throws UnknownIdentifierException {
145+
if ("value".equals(member)) {
146+
return wrapper.object;
147+
} else {
148+
errorProfile.enter();
149+
throw UnknownIdentifierException.create(member);
150+
}
151+
}
124152
}

0 commit comments

Comments
 (0)