-
-
Notifications
You must be signed in to change notification settings - Fork 406
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Merged by Bors] - Implement instruction flowgraph generator #2422
Conversation
Test262 conformance changes
|
Codecov Report
@@ Coverage Diff @@
## main #2422 +/- ##
==========================================
- Coverage 52.58% 51.63% -0.95%
==========================================
Files 329 336 +7
Lines 34905 35541 +636
==========================================
- Hits 18354 18353 -1
- Misses 16551 17188 +637
Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here. |
Very nice work! This is a huge improvement for debugging. I have just a small nitpick though. Can it be generated vertically instead of horizontally? I think it will read better that way. |
Hmmm.. looking at the flowgraph it looks like there is a |
That's definitely a bug! |
I guess, I'll create an issue about it :) |
What if we coloured pairs of |
Here is a implementation of that, it assumes that the generated push and pop instructions always are in that order., which should be the case generaly (if not always), unless there are some wierd jumping back and forth. Also included the opcode location prefix on all nodes. Here are the graphs generated: This is all temporary code, will try to create nice options for generating dot and mermaid.js formats tomorrow :) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is extremely good. Just seeing the graphs I'm starting to understand the VM, which is already a huge step for me 😅
And it's already showing how this can spot problems!
The code needs a bit of documentation, polishing and maybe the color constant could be reviewed to be more configurable, but it's already in pretty good shape.
Thank you!
This is great! And definitely helps with seeing how things work with the VM a lot. I’m very interested in mermaid integration as that’s supported on GitHub and VSCode now so should make collaboration easier. It should save on needing to install an additional viewer. The syntax looks similar but I don’t know if there’s any limitations. |
8182cc6
to
467f143
Compare
I still need to add many things but we can generate graphviz and mermaid diagrams Since mermaid diagrams are supported by github comments (flipped it horizontally because its to big): graph LR
__main___i_0[PushZero]
__main___i_1[DefInitLet 'i']
__main___i_6[LoopStart]
__main___i_7[LoopContinue]
__main___i_8[GetName 'i']
__main___i_13[PushInt8 10]
__main___i_15[LessThan]
__main___i_16{JumpIfFalse}
__main___i_21[PushDeclarativeEnvironment 0, 1]
__main___i_30[GetName 'i']
__main___i_35[PushInt8 3]
__main___i_37[Eq]
__main___i_38{JumpIfFalse}
__main___i_43[PushDeclarativeEnvironment 0, 0]
__main___i_52{Jump}
__main___i_57[PopEnvironment]
__main___i_58[GetName 'i']
__main___i_63[IncPost]
__main___i_64[RotateRight 2]
__main___i_66[SetName 'i']
__main___i_71[Pop]
__main___i_72[PopEnvironment]
__main___i_73{Jump}
__main___i_78[LoopEnd]
__main___i_79{End}
__main___i_80{Start}
__main___i_0 -->| | __main___i_1
__main___i_1 -->| | __main___i_6
__main___i_6 -->| | __main___i_7
__main___i_7 -->| | __main___i_8
__main___i_8 -->| | __main___i_13
__main___i_13 -->| | __main___i_15
__main___i_15 -->| | __main___i_16
__main___i_16 -->| YES| __main___i_78
__main___i_16 -->| NO| __main___i_21
__main___i_21 -->| | __main___i_30
__main___i_30 -->| | __main___i_35
__main___i_35 -->| | __main___i_37
__main___i_37 -->| | __main___i_38
__main___i_38 -->| YES| __main___i_58
__main___i_38 -->| NO| __main___i_43
__main___i_43 -->| | __main___i_52
__main___i_52 -->| | __main___i_78
__main___i_57 -->| | __main___i_58
__main___i_58 -->| | __main___i_63
__main___i_63 -->| | __main___i_64
__main___i_64 -->| | __main___i_66
__main___i_66 -->| | __main___i_71
__main___i_71 -->| | __main___i_72
__main___i_72 -->| | __main___i_73
__main___i_73 -->| | __main___i_7
__main___i_78 -->| | __main___i_79
__main___i_80 -->| | __main___i_0
|
8ac3b2d
to
6e945a1
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Still a lot to review, but it looks great :) I added some comments related to documentation and Clone
implementations.
Added documentation in |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM :)
bors r+ |
🕐 Waiting for PR status (GitHub check) to be set, probably by CI. Bors will automatically try to run when all required PR statuses are set. |
👎 Rejected by PR status |
bors r+ |
This PR is a WIP implementation of a vm instruction flowgraph generator This aims to make the vm easier to debug and understand for both newcomers and experienced devs. For example if we have the following code: ```js let i = 0; while (i < 10) { if (i == 3) { break; } i++; } ``` It generates the following instructions (which is hard to read, especially jumps): <details> ``` ----------------------Compiled Output: '<main>'----------------------- Location Count Opcode Operands 000000 0000 PushZero 000001 0001 DefInitLet 0000: 'i' 000006 0002 LoopStart 000007 0003 LoopContinue 000008 0004 GetName 0000: 'i' 000013 0005 PushInt8 10 000015 0006 LessThan 000016 0007 JumpIfFalse 78 000021 0008 PushDeclarativeEnvironment 0, 1 000030 0009 GetName 0000: 'i' 000035 0010 PushInt8 3 000037 0011 Eq 000038 0012 JumpIfFalse 58 000043 0013 PushDeclarativeEnvironment 0, 0 000052 0014 Jump 78 000057 0015 PopEnvironment 000058 0016 GetName 0000: 'i' 000063 0017 IncPost 000064 0018 RotateRight 2 000066 0019 SetName 0000: 'i' 000071 0020 Pop 000072 0021 PopEnvironment 000073 0022 Jump 7 000078 0023 LoopEnd Literals: <empty> Bindings: 0000: i Functions: <empty> ``` </details> And the flow graph is generated: ![flowgraph](https://user-images.githubusercontent.com/8566042/200589387-40b36ad7-d2f2-4918-a3e4-5a8fa5eee89b.png) The beginning of the function is marked by the `start` node (in green) and end (in red). In branching the "yes" branch is marked in green and "no" in red. ~~This only generates in [graphviz format](https://en.wikipedia.org/wiki/DOT_(graph_description_language)) (a widely used format) but it would be nice to also generate to a format that `mermaid.js` can understand and that could be put in articles boa-dev/boa-dev.github.io#26 TODO: - [x] Generate graphviz format - [x] Generate mermaid format - [x] Programmatically generate colors push and pop env instructions - [x] Display nested functions in sub-sub-graphs. - [x] Put under a feature (`"flowgraph"`) - [x] Handle try/catch, switch instructions - [x] CLI option for configuring direction of flow (by default it is top down) - [x] Handle `Throw` instruction (requires keeping track of try blocks) - [x] Documentation - [x] Prevent node name collisions (functions with the same name)
Pull request successfully merged into main. Build succeeded: |
This PR is a WIP implementation of a vm instruction flowgraph generator
This aims to make the vm easier to debug and understand for both newcomers and experienced devs.
For example if we have the following code:
It generates the following instructions (which is hard to read, especially jumps):
And the flow graph is generated:
The beginning of the function is marked by the
start
node (in green) and end (in red). In branching the "yes" branch is marked in green and "no" in red.This only generates in graphviz format (a widely used format) but it would be nice to also generate to a format thatmermaid.js
can understand and that could be put in articles boa-dev/boa-dev.github.io#26TODO:
"flowgraph"
)Throw
instruction (requires keeping track of try blocks)