|
|
|
[package]
|
|
|
|
name = "boa_cli"
|
|
|
|
keywords = ["javascript", "compiler", "js", "cli"]
|
|
|
|
categories = ["command-line-utilities"]
|
|
|
|
default-run = "boa"
|
|
|
|
description.workspace = true
|
|
|
|
version.workspace = true
|
|
|
|
edition.workspace = true
|
|
|
|
authors.workspace = true
|
|
|
|
license.workspace = true
|
|
|
|
repository.workspace = true
|
|
|
|
rust-version.workspace = true
|
|
|
|
|
|
|
|
[dependencies]
|
|
|
|
boa_engine = { workspace = true, features = ["deser", "flowgraph", "trace"] }
|
|
|
|
boa_ast = { workspace = true, features = ["serde"] }
|
|
|
|
boa_parser.workspace = true
|
Implement debug object for CLI (#2772)
Currently some debugging stuff in JavaScript land is difficult to impossible, like triggering a GC collect, this is not impossible to do in JavaScript the way I triggered it was by creating a huge amount of object `for (let i = 0; i < 100000; ++i) { ({}) }` but this is cumbersome and not guaranteed to trigger a gc.
This PR implements `--debug-object` flag that injects the `$boa` debug object in the context, the object is separated into modules currently `gc`, `function`, `object`.
We can now do `$boa.gc.collect()`, which force triggers a GC collect.
Or sometimes I wanted a trace (the current solution is great, you can trace stuff like `>>> 1 + 1` but that is also it's limitation), it traces everything, I sometimes have a scenario and just want to trace a single function in that scenario, that's why I added the `$boa.function.trace(func, this, ...args)` It only traces the function.
```js
>> $boa.function.trace((a, b) => a + b, undefined, 1, 2)
-------------------------Compiled Output: ''--------------------------
Location Count Opcode Operands
000000 0000 DefInitArg 0000: 'a'
000005 0001 DefInitArg 0001: 'b'
000010 0002 RestParameterPop
000011 0003 GetName 0000: 'a'
000016 0004 GetName 0001: 'b'
000021 0005 Add
000022 0006 Return
000023 0007 PushUndefined
000024 0008 Return
... (cut for brevity) ...
```
It also implements `$boa.function.flowgraph(func, options)`:
```js
$boa.function.flowgraph(func, 'graphviz')
$boa.function.flowgraph(func, { format: 'mermaid', direction: 'TopBottom' })
```
Printing the object pointer:
```js
$boa.object.id({}) // '0x566464F33'
```
It currently implements some functionality which we can grow it with our debugging needs since we are not restricted by a spec we can add whatever we want :)
I was originally going to implement this in #2723 (but the PR is too big), for shapes having functions like:
```js
$boa.shape.type({}) // Shared shape
$boa.shape.id({}) // 0x8578FG355 (objects, shape pointer)
$boa.shape.flowgraph({}) // printing the shape transition chain, like $boa.function.flowgraph
```
Shapes chains are very hard to debug once they are big... so having this type of debugging capability would make it much easier.
2 years ago
|
|
|
boa_gc.workspace = true
|
|
|
|
boa_interner.workspace = true
|
|
|
|
boa_runtime.workspace = true
|
|
|
|
rustyline = { version = "12.0.0", features = ["derive"]}
|
|
|
|
clap = { version = "4.3.12", features = ["derive"] }
|
|
|
|
serde_json = "1.0.102"
|
|
|
|
colored = "2.0.4"
|
|
|
|
regex = "1.9.1"
|
|
|
|
phf = { version = "0.11.2", features = ["macros"] }
|
|
|
|
pollster = "0.3.0"
|
|
|
|
|
|
|
|
[features]
|
|
|
|
default = ["boa_engine/annex-b", "boa_engine/intl"]
|
|
|
|
|
|
|
|
[target.x86_64-unknown-linux-gnu.dependencies]
|
|
|
|
jemallocator = "0.5.0"
|
|
|
|
|
|
|
|
[[bin]]
|
|
|
|
name = "boa"
|
|
|
|
doc = false
|
|
|
|
path = "src/main.rs"
|