Chromium Code Reviews| Index: mirrors/debug.dart |
| =================================================================== |
| --- mirrors/debug.dart (revision 0) |
| +++ mirrors/debug.dart (revision 0) |
| @@ -0,0 +1,130 @@ |
| +#library("debug"); |
| +#import("introspection.dart"); |
|
hausner
2011/12/21 21:53:19
Can you import a source file? Should this be #sour
gbracha
2011/12/22 18:29:59
introspection should be a library.
|
| + |
| +/** A mirror on the entire stack of an isolate. |
| +// questions about being active, suspending, resuming may perhaps belong to the isolate? |
| + |
| +The methods in this interface are synchronous wrappers around async message sends. |
| +We could make the all return a future instead. Ideally, I would declare them as |
| +async methods. |
| +*/ |
| +interface StackMirror extends Mirror { |
| + /** Return a mirror on the activation at the top of the stack. |
| + |
| +*/ |
| +ActivationMirror top(); |
| + |
| +/** Return the otal number of frames in the stack. */ |
| +int length(); |
| + |
| + |
| +/** |
| +Call the function at the current point in the calling frame, and stop at the first pc in that function. |
|
hausner
2011/12/21 21:53:19
In this description you are implying that there is
gbracha
2011/12/22 18:29:59
I like stepInto and stepOver as well. As for stepp
|
| + |
| +Open issue 1: Return void, or an ActivationMirror representing the activation where we |
| +have landed. Arguably, that activation is always the top-of-stack (TOS); but what's |
| +the harm in returning the activation we're at after the operation |
| + instead of forcing you to ask for TOS? So I propose we return the TOS after the call. |
| + |
| +Open issue 2: Should this take an ActivationMirror as an argument. |
| +One can argue that no argument is needed, as TOS (top-of-stack) is implicit. |
| +However, it's nice to able to restart from an earlier point. Hence, there is an |
| +optional argument that specifies what activation to start out from. |
| +If it's null, we use TOS. |
|
hausner
2011/12/21 21:53:19
Alternatively, step and next could be methods of t
gbracha
2011/12/22 18:29:59
Yes, but why?
hausner
2011/12/23 00:22:16
Because then you don't have the issue you mention
gbracha
2011/12/23 00:41:23
Good point.
|
| + |
| +*/ |
| +ActivationMirror step([ActivationMirror callingFrame]); |
| +// this was stepInto; renamed per Lars' request. |
| + |
| +/** |
| +Call the function at the current point in the calling frame, and stop at the pc |
| +immediately after the call. |
| +Open issues are similar to those in 'step' above. However, here we very clearly want to |
| +be able to specify a calling frame. |
| +*/ |
| +ActivationMirror next([ActivationMirror callingFrame]); |
| + // This was stepOver; renamed per Lars' request. |
| + |
| + |
| +// not needed - no first class control construct: |
| +// void stepIntoClosure(ActivationMirror activation); |
| + |
| +/** Resume execution. |
| +This method is asynchronous (not a synchronous wrapper). |
| +Does it belong on the isolate? |
| +*/ |
| +void restart(); |
| +} |
| + |
| + |
| +/** Scope mirrors represent subscopes in function bodies. These could be entire bodies, or blocks within a surrounding body or block, recursively. |
| + |
| +Again, methods here are synchronous wrappers. |
| +*/ |
| +interface ScopeMirror extends ObjectMirror { |
| +/** Names of all locals. Is this redundant with accessors defined by ObjectMirror? */ |
| + List<String> localNames(); |
| + |
| + |
| +/** The enclosing scope/context. |
| +For subscopes, its the surrounding ScopeMirror or ActivationMirror. For an activation, it would be the receiver. |
| +*/ |
| + ObjectMirror enclosingScope(); |
| + |
| +/** The program counter. the natural representation is a token, which already captures the location information: character index, file etc. |
| + */ |
| + Token pc(); |
|
hausner
2011/12/21 21:53:19
I don't see Token defined anywhere. What can I do
gbracha
2011/12/22 18:29:59
Indeed. It should be much the same as in the parse
mattsh
2011/12/22 21:00:05
I'm hoping in Dart we can make an nice UI for step
hausner
2011/12/23 00:22:16
No, but there can be ActivationFrames on the stack
gbracha
2011/12/23 00:41:23
Of course.
gbracha
2011/12/23 00:41:23
If no source code is available, one should be able
mattsh
2011/12/23 00:50:19
Right. I guess I was picturing that in this expre
|
| + |
| +/** Returns a list of length 2, representing the range of program counters for the |
| +reflectee. |
| + */ |
| + List<Token> pcRange(); |
| +} |
| + |
| + |
| +/** A mirror on a stack frame. |
| +It gives us access to its local variables, parameters, subscopes, the ability to set the PC etc. |
| + |
| +All methods here are synchoronous wrappers again. |
| + |
| +*/ |
| +interface ActivationMirror extends ScopeMirror{ |
| + |
| +/** a mirror on the receiver of this activation |
| + If it's a static method return null (not a mirror on null!). |
| + Alternately, dispense with this method and require 'this' be looked up among the locals? */ |
| +ObjectMirror receiverMirror(); |
| + |
| +/** Return the frame that called the reflectee. */ |
| +ActivationMirror caller(); |
| + |
| +/** |
| + Return an mirror on the activation that would catch the exception represented by |
| + o, if it were thrown. Returns null if none. The argument o must be either a value |
| + (in which case it will be used as the exception) or an object mirror (in which |
| + case o's reflectee will be used as the exception to be thrown). |
| + |
| + There is no easy way to implement this based on other primitives, but |
| + the VM has the ability to do this without actually throwing an exception. |
| + |
| +*/ |
| +ActivationMirror handlerFor(Object o); // if I threw o, where would I land? |
| + |
| + |
| + |
| +/** A mirror on the function the reflectee is an activation of. |
| + // could be closure. Therefore the return type is |
| +// potentially MethodMirror | ClosureMirror. So maybe we should define a common |
| +// supertype for those two. |
| + |
| +This method is not asynchronous. We should be able to embded this data in the |
| +activation mirror. |
| +*/ |
| +MethodMirror method(); |
| + |
| +/** |
| +Return to the caller of the reflectee. The value returned is o, if o is a value, or |
| +o's reflectee if o is an objetc mirror; o must be either a value or an object mirror. |
| +*/ |
| +returnObject(Object o, ActivationMirror); // terminate this frame and return o. |
| +} |