From e35b66b41213cf519e85353b83b0952a95c4eda0 Mon Sep 17 00:00:00 2001 From: Jason Williams Date: Sun, 8 Sep 2019 21:49:30 +0100 Subject: [PATCH] moving to function objects, work started on boashell other bug fixes --- Cargo.lock | 392 ++++++++++++++++------------------------- Cargo.toml | 10 +- Dockerfile | 2 +- src/bin/shell.rs | 65 +++++++ src/lib/exec.rs | 25 ++- src/lib/js/array.rs | 54 +++--- src/lib/js/boolean.rs | 160 +++++++++++++++-- src/lib/js/console.rs | 17 +- src/lib/js/mod.rs | 2 + src/lib/js/object.rs | 91 +++++++++- src/lib/js/property.rs | 23 +++ src/lib/js/regexp.rs | 31 +++- src/lib/js/string.rs | 23 ++- src/lib/js/value.rs | 58 +++--- src/lib/lib.rs | 11 ++ tests/js/test.js | 3 +- 16 files changed, 617 insertions(+), 350 deletions(-) create mode 100644 src/bin/shell.rs diff --git a/Cargo.lock b/Cargo.lock index 20fa2d7ab2..add84c94e1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,12 +4,11 @@ name = "Boa" version = "0.3.0" dependencies = [ - "chrono 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "criterion 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "gc 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "gc_derive 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -24,7 +23,7 @@ dependencies = [ [[package]] name = "arrayvec" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", @@ -32,17 +31,16 @@ dependencies = [ [[package]] name = "atty" -version = "0.2.11" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", - "termion 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "autocfg" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -52,18 +50,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "bstr" -version = "0.2.1" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-automata 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-automata 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.100 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "bumpalo" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -76,7 +74,7 @@ name = "c2-chacha" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "ppv-lite86 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -90,19 +88,6 @@ name = "cfg-if" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "chrono" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "js-sys 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", - "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "clap" version = "2.33.0" @@ -110,7 +95,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-width 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -118,23 +103,23 @@ name = "criterion" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "cast 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", "criterion-plot 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "csv 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_os 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand_xoshiro 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rayon 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.100 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.100 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", "tinytemplate 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "walkdir 2.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -148,24 +133,24 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.6.3" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-epoch 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "crossbeam-epoch" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memoffset 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -173,16 +158,16 @@ name = "crossbeam-queue" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "crossbeam-utils" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -190,11 +175,11 @@ name = "csv" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bstr 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bstr 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "csv-core 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.100 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -227,11 +212,12 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.1.6" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", + "wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -247,30 +233,19 @@ name = "itoa" version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "js-sys" -version = "0.3.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "wasm-bindgen 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "lazy_static" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] name = "libc" -version = "0.2.59" +version = "0.2.62" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "log" -version = "0.4.6" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -281,34 +256,28 @@ name = "memchr" version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "memoffset" -version = "0.2.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "nodrop" version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "num-integer" -version = "0.1.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "num-traits" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -316,14 +285,9 @@ name = "num_cpus" version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "numtoa" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "ppv-lite86" version = "0.2.5" @@ -331,15 +295,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "proc-macro2" -version = "0.4.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "proc-macro2" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -350,20 +306,12 @@ name = "quote" version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "quote" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "quote" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -371,29 +319,28 @@ name = "rand" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "getrandom 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_chacha 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand_chacha" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "c2-chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rand_core" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "getrandom 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -401,7 +348,7 @@ name = "rand_hc" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rand_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -409,8 +356,8 @@ name = "rand_os" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "getrandom 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -418,47 +365,34 @@ name = "rand_xoshiro" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rand_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rayon" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rayon-core 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon-core 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rayon-core" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "redox_syscall" -version = "0.1.56" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "redox_termios" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "regex" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -469,7 +403,7 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -480,6 +414,14 @@ name = "regex-syntax" version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "ryu" version = "1.0.0" @@ -487,7 +429,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "same-file" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -495,22 +437,35 @@ dependencies = [ [[package]] name = "scopeguard" -version = "0.3.3" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.94" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde_derive" -version = "1.0.94" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -520,14 +475,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.100 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "spin" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "syn" version = "0.11.11" @@ -538,22 +488,12 @@ dependencies = [ "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "syn" -version = "0.15.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "syn" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -575,23 +515,12 @@ dependencies = [ "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "termion" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", - "numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "textwrap" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-width 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -599,17 +528,7 @@ name = "thread_local" version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "time" -version = "0.1.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -617,13 +536,13 @@ name = "tinytemplate" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.100 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "unicode-width" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -631,11 +550,6 @@ name = "unicode-xid" version = "0.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "unicode-xid" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "unicode-xid" version = "0.2.0" @@ -643,14 +557,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "walkdir" -version = "2.2.8" +version = "2.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "wasi" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "wasm-bindgen" version = "0.2.50" @@ -665,10 +584,10 @@ name = "wasm-bindgen-backend" version = "0.2.50" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bumpalo 2.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "bumpalo 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-shared 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", @@ -688,7 +607,7 @@ name = "wasm-bindgen-macro-support" version = "0.2.50" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-backend 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", @@ -702,7 +621,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "winapi" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -719,7 +638,7 @@ name = "winapi-util" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -729,90 +648,81 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [metadata] "checksum aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "58fb5e95d83b38284460a5fda7d6470aa0b8844d283a0b614b8535e880800d2d" -"checksum arrayvec 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71" -"checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" -"checksum autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0e49efa51329a5fd37e7c79db4621af617cd4e3e5bc224939808d076077077bf" +"checksum arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "b8d73f9beda665eaa98ab9e4f7442bd4e7de6652587de55b2525e52e29c1b0ba" +"checksum atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "1803c647a3ec87095e7ae7acfca019e98de5ec9a7d01343f611cf3152ed71a90" +"checksum autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b671c8fb71b457dd4ae18c4ba1e59aa81793daacc361d82fcd410cef0d491875" "checksum bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3d155346769a6855b86399e9bc3814ab343cd3d62c7e985113d46a0ec3c281fd" -"checksum bstr 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6cc0572e02f76cb335f309b19e0a0d585b4f62788f7d26de2a13a836a637385f" -"checksum bumpalo 2.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2cd43d82f27d68911e6ee11ee791fb248f138f5d69424dc02e098d4f152b0b05" +"checksum bstr 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8d6c2c5b58ab920a4f5aeaaca34b4488074e8cc7596af94e6f8c6ff247c60245" +"checksum bumpalo 2.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ad807f2fc2bf185eeb98ff3a901bd46dc5ad58163d0fa4577ba0d25674d71708" "checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5" "checksum c2-chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7d64d04786e0f528460fc884753cf8dddcc466be308f6026f8e355c41a0e4101" "checksum cast 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "926013f2860c46252efceabb19f4a6b308197505082c609025aa6706c011d427" "checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33" -"checksum chrono 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "27429a03ca54100bf6bdc726c09adc46a74187ac93f9ce96dc7aaa9594ebf707" "checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9" "checksum criterion 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "938703e165481c8d612ea3479ac8342e5615185db37765162e762ec3523e2fc6" "checksum criterion-plot 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eccdc6ce8bbe352ca89025bee672aa6d24f4eb8c53e3a8b5d1bc58011da072a2" -"checksum crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "05e44b8cf3e1a625844d1750e1f7820da46044ff6d28f4d43e455ba3e5bb2c13" -"checksum crossbeam-epoch 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "04c9e3102cc2d69cd681412141b390abd55a362afc1540965dad0ad4d34280b4" +"checksum crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b18cd2e169ad86297e6bc0ad9aa679aee9daa4f19e8163860faf7c164e4f5a71" +"checksum crossbeam-epoch 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fedcd6772e37f3da2a9af9bf12ebe046c0dfe657992377b4df982a2b54cd37a9" "checksum crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b" -"checksum crossbeam-utils 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f8306fcef4a7b563b76b7dd949ca48f52bc1141aa067d2ea09565f3e2652aa5c" +"checksum crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6" "checksum csv 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "37519ccdfd73a75821cac9319d4fce15a81b9fcf75f951df5b9988aa3a0af87d" "checksum csv-core 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9b5cadb6b25c77aeff80ba701712494213f4a8418fcda2ee11b6560c3ad0bf4c" "checksum either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5527cfe0d098f36e3f8839852688e63c8fff1c90b2b405aef730615f9a7bcf7b" "checksum gc 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "75656800ec248b3d0c33b685e442a67e7308009ae59b1f8eb60c4f09ebebb512" "checksum gc_derive 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2501c15cbaf28a0c2214617aa85351982a933161d7937fe6cd71c855364e0ea6" -"checksum getrandom 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "e65cce4e5084b14874c4e7097f38cab54f47ee554f9194673456ea379dcc4c55" +"checksum getrandom 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "473a1265acc8ff1e808cd0a1af8cee3c2ee5200916058a2ca113c29f2d903571" "checksum itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5b8467d9c1cebe26feb08c640139247fac215782d35371ade9a2136ed6085358" "checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" -"checksum js-sys 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "eac16f41aa9b9388230b1d6617d7ed897a1af5416b8fe1c8734dcef79c7aae10" -"checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" -"checksum libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)" = "3262021842bf00fe07dbd6cf34ff25c99d7a7ebef8deea84db72be3ea3bb0aff" -"checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" +"checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +"checksum libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)" = "34fcd2c08d2f832f376f4173a231990fa5aef4e99fb569867318a227ef4c06ba" +"checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" "checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e" -"checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" +"checksum memoffset 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ce6075db033bbbb7ee5a0bbd3a3186bbae616f57fb001c485c7ff77955f8177f" "checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" -"checksum num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09" "checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32" "checksum num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bcef43580c035376c0705c42792c294b66974abbfd2789b511784023f71f3273" -"checksum numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" "checksum ppv-lite86 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e3cbf9f658cdb5000fcf6f362b8ea2ba154b9f146a61c7a20d647034c6b6561b" -"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" -"checksum proc-macro2 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "175a40b9cf564ce9bf050654633dbf339978706b8ead1a907bb970b63185dd95" +"checksum proc-macro2 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e98a83a9f9b331f54b924e68a66acb1bb35cb01fb0a23645139967abefb697e8" "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" -"checksum quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faf4799c5d274f3868a4aae320a0a182cbd2baee377b378f080e16a23e9d80db" "checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" "checksum rand 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d47eab0e83d9693d40f825f86948aa16eff6750ead4bdffc4ab95b8b3a7f052c" -"checksum rand_chacha 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e193067942ef6f485a349a113329140d0ab9e2168ce92274499bb0e9a4190d9d" -"checksum rand_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "615e683324e75af5d43d8f7a39ffe3ee4a9dc42c5c701167a71dc59c3a493aca" +"checksum rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853" +"checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" "checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" "checksum rand_os 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a788ae3edb696cfcba1c19bfd388cc4b8c21f8a408432b199c072825084da58a" "checksum rand_xoshiro 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0e18c91676f670f6f0312764c759405f13afb98d5d73819840cf72a518487bff" -"checksum rayon 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a4b0186e22767d5b9738a05eab7c6ac90b15db17e5b5f9bd87976dd7d89a10a4" -"checksum rayon-core 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ebbe0df8435ac0c397d467b6cad6d25543d06e8a019ef3f6af3c384597515bd2" -"checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" -"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" -"checksum regex 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc98360d9e6ad383647702acc90f80b0582eac3ea577ab47d96325d3575de908" -"checksum regex-automata 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "3ed09217220c272b29ef237a974ad58515bde75f194e3ffa7e6d0bf0f3b01f86" +"checksum rayon 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "83a27732a533a1be0a0035a111fe76db89ad312f6f0347004c220c57f209a123" +"checksum rayon-core 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "98dcf634205083b17d0861252431eb2acbfb698ab7478a2d20de07954f47ec7b" +"checksum regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dc220bd33bdce8f093101afe22a037b8eb0e5af33592e6a9caafff0d4cb81cbd" +"checksum regex-automata 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "92b73c2a1770c255c240eaa4ee600df1704a38dc3feaa6e949e7fcd4f8dc09f9" "checksum regex-syntax 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "11a7e20d1cce64ef2fed88b66d347f88bd9babb82845b2b858f3edbf59a4f716" +"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" "checksum ryu 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c92464b447c0ee8c4fb3824ecc8383b81717b9f1e74ba2e72540aef7b9f82997" -"checksum same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8f20c4be53a8a1ff4c1f1b2bd14570d2f634628709752f0702ecdd2b3f9a5267" -"checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" -"checksum serde 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)" = "076a696fdea89c19d3baed462576b8f6d663064414b5c793642da8dfeb99475b" -"checksum serde_derive 1.0.94 (registry+https://github.com/rust-lang/crates.io-index)" = "ef45eb79d6463b22f5f9e16d283798b7c0175ba6050bc25c1a946c122727fe7b" +"checksum same-file 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "585e8ddcedc187886a30fa705c47985c3fa88d06624095856b36ca0b82ff4421" +"checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" +"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" +"checksum serde 1.0.100 (registry+https://github.com/rust-lang/crates.io-index)" = "f4473e8506b213730ff2061073b48fa51dcc66349219e2e7c5608f0296a1d95a" +"checksum serde_derive 1.0.100 (registry+https://github.com/rust-lang/crates.io-index)" = "11e410fde43e157d789fc290d26bc940778ad0fdd47836426fbac36573710dbb" "checksum serde_json 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)" = "051c49229f282f7c6f3813f8286cc1e3323e8051823fce42c7ea80fe13521704" -"checksum spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44363f6f51401c34e7be73db0db371c04705d35efbe9f7d6082e03a921a32c55" "checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" -"checksum syn 0.15.39 (registry+https://github.com/rust-lang/crates.io-index)" = "b4d960b829a55e56db167e861ddb43602c003c7be0bee1d345021703fac2fb7c" "checksum syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "66850e97125af79138385e9b88339cbcd037e3f28ceab8c5ad98e64f0f1f80bf" "checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" "checksum synstructure 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3a761d12e6d8dcb4dcf952a7a89b475e3a9d69e4a69307e01a470977642914bd" -"checksum termion 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6a8fb22f7cde82c8220e5aeacb3258ed7ce996142c77cba193f203515e26c330" "checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" -"checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" "checksum tinytemplate 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4574b75faccaacddb9b284faecdf0b544b80b6b294f3d062d325c5726a209c20" -"checksum unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526" +"checksum unicode-width 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7007dbd421b92cc6e28410fe7362e2e0a2503394908f417b68ec8d1c364c4e20" "checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" -"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" -"checksum walkdir 2.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "c7904a7e2bb3cdf0cf5e783f44204a85a37a93151738fa349f06680f59a98b45" +"checksum walkdir 2.2.9 (registry+https://github.com/rust-lang/crates.io-index)" = "9658c94fa8b940eab2250bd5a457f9c48b748420d71293b165c8cdbe2f55f71e" +"checksum wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b89c3ce4ce14bdc6fb6beaf9ec7928ca331de5df7e5ea278375642a2f478570d" "checksum wasm-bindgen 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)" = "dcddca308b16cd93c2b67b126c688e5467e4ef2e28200dc7dfe4ae284f2faefc" "checksum wasm-bindgen-backend 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)" = "f805d9328b5fc7e5c6399960fd1889271b9b58ae17bdb2417472156cc9fafdd0" "checksum wasm-bindgen-macro 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)" = "3ff88201a482abfc63921621f6cb18eb1efd74f136b05e5841e7f8ca434539e9" "checksum wasm-bindgen-macro-support 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)" = "6a433d89ecdb9f77d46fcf00c8cf9f3467b7de9954d8710c175f61e2e245bb0e" "checksum wasm-bindgen-shared 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)" = "d41fc1bc3570cdf8d108c15e014045fd45a95bb5eb36605f96a90461fc34027d" -"checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770" +"checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/Cargo.toml b/Cargo.toml index 96f7b8e7df..16d5145dae 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,6 +9,7 @@ keywords = ["javascript", "compiler", "lexer", "parser", "js"] license = "Unlicense/MIT" exclude = [".vscode/*", "Dockerfile", "Makefile", ".editorConfig"] edition = "2018" +default-run = "boa" [features] default = ["wasm-bindgen"] @@ -18,7 +19,6 @@ gc = "^0.3.3" gc_derive = "^0.3.2" serde_json = "^1.0.40" rand = "^0.7.0" -chrono = "^0.4.8" regex = "^1.3.0" # Optional Dependencies @@ -35,3 +35,11 @@ path = "src/lib/lib.rs" [[bench]] name = "string" harness = false + +[[bin]] +name = "boa" +path = "src/bin/bin.rs" + +[[bin]] +name = "boashell" +path = "src/bin/shell.rs" diff --git a/Dockerfile b/Dockerfile index 7c79aade53..538f0b0fb1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,7 +18,7 @@ RUN apt-get -y update && \ RUN wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add - RUN apt-add-repository "deb http://apt.llvm.org/stretch/ llvm-toolchain-stretch-6.0 main" RUN apt-get -y update -# RUN sudo apt-get -y install clang-6.0 lldb-6.0 +RUN sudo apt-get -y lldb CMD ["/bin/bash"] \ No newline at end of file diff --git a/src/bin/shell.rs b/src/bin/shell.rs new file mode 100644 index 0000000000..f94c3835ae --- /dev/null +++ b/src/bin/shell.rs @@ -0,0 +1,65 @@ +#![forbid( + warnings, + anonymous_parameters, + unused_extern_crates, + unused_import_braces, + missing_copy_implementations, + //trivial_casts, + variant_size_differences, + missing_debug_implementations, + trivial_numeric_casts +)] +// Debug trait derivation will show an error if forbidden. +#![deny(unused_qualifications, unsafe_code)] +#![deny(clippy::all)] +#![warn(clippy::pedantic)] +#![allow( + missing_docs, + clippy::many_single_char_names, + clippy::unreadable_literal, + clippy::excessive_precision, + clippy::module_name_repetitions +)] + +use boa::{exec::Executor, forward_val}; +use std::{env, fs::read_to_string, process::exit}; + +fn print_usage() { + println!( + "Usage: +boa [file.js] + Interpret and execute file.js + (if no file given, defaults to tests/js/test.js" + ); +} + +pub fn main() -> Result<(), std::io::Error> { + let args: Vec = env::args().collect(); + let read_file; + + match args.len() { + // One argument passed, assumed this is the test file + 2 => { + read_file = &args[1]; + } + // Some other number of arguments passed: not supported + _ => { + print_usage(); + exit(1); + } + } + + let buffer = read_to_string(read_file)?; + + let mut engine = Executor::new(); + let init = r#" + const print = console.log; + "#; + + forward_val(&mut engine, init).unwrap(); + match forward_val(&mut engine, &buffer) { + Ok(v) => print!("{}", v.to_string()), + Err(v) => eprint!("{}", v.to_string()), + } + Ok(()) +} diff --git a/src/lib/exec.rs b/src/lib/exec.rs index ff57410186..c4e843d9d3 100644 --- a/src/lib/exec.rs +++ b/src/lib/exec.rs @@ -1,7 +1,7 @@ use crate::{ environment::lexical_environment::{new_function_environment, LexicalEnvironment}, js::{ - array, console, function, + array, boolean, console, function, function::{Function, RegularFunction}, json, math, object, object::{ObjectKind, INSTANCE_PROTOTYPE, PROTOTYPE}, @@ -266,7 +266,7 @@ impl Executor for Interpreter { }) } ExprDef::Construct(ref callee, ref args) => { - let func = self.run(callee)?; + let func_object = self.run(callee)?; let mut v_args = Vec::with_capacity(args.len()); for arg in args.iter() { v_args.push(self.run(arg)?); @@ -275,19 +275,25 @@ impl Executor for Interpreter { // Create a blank object, then set its __proto__ property to the [Constructor].prototype this.borrow().set_internal_slot( INSTANCE_PROTOTYPE, - func.borrow().get_field_slice(PROTOTYPE), + func_object.borrow().get_field_slice(PROTOTYPE), ); - match *func { + + let construct = func_object.get_internal_slot("construct"); + + match *construct { ValueData::Function(ref inner_func) => match inner_func.clone().into_inner() { Function::NativeFunc(ref ntv) => { let func = ntv.data; - func(&this, &v_args, self) + match func(&this, &v_args, self) { + Ok(_) => Ok(this), + Err(ref v) => Err(v.clone()), + } } Function::RegularFunc(ref data) => { // Create new scope let env = &mut self.environment; env.push(new_function_environment( - func.clone(), + construct.clone(), this.clone(), Some(env.get_current_environment_ref().clone()), )); @@ -386,11 +392,12 @@ impl InterpreterBuilder { object::init(&global); console::init(&global); math::init(&global); - array::init(&global); function::init(&global); json::init(&global); - regexp::init(&global); - string::init(&global); + global.set_field_slice("String", string::create_constructor(&global)); + global.set_field_slice("RegExp", regexp::create_constructor(&global)); + global.set_field_slice("Array", array::create_constructor(&global)); + global.set_field_slice("Boolean", boolean::create_constructor(&global)); Self { global } } diff --git a/src/lib/js/array.rs b/src/lib/js/array.rs index e8767636dd..86664930d0 100644 --- a/src/lib/js/array.rs +++ b/src/lib/js/array.rs @@ -2,7 +2,7 @@ use crate::{ exec::Interpreter, js::{ function::NativeFunctionData, - object::{ObjectKind, PROTOTYPE}, + object::{Object, ObjectKind, PROTOTYPE}, property::Property, value::{from_value, to_value, ResultValue, Value, ValueData}, }, @@ -11,7 +11,7 @@ use gc::Gc; /// Utility function for creating array objects: `array_obj` can be any array with /// prototype already set (it will be wiped and recreated from `array_contents`) -fn create_array_object(array_obj: &Value, array_contents: &[Value]) -> ResultValue { +fn construct_array(array_obj: &Value, array_contents: &[Value]) -> ResultValue { let array_obj_ptr = array_obj.clone(); // Wipe existing contents of the array object @@ -53,14 +53,14 @@ pub fn make_array(this: &Value, args: &[Value], _: &mut Interpreter) -> ResultVa // to its Javascript Identifier (global constructor method name) this.set_kind(ObjectKind::Array); match args.len() { - 0 => create_array_object(this, &[]), + 0 => construct_array(this, &[]), 1 => { - let array = create_array_object(this, &[]).unwrap(); + let array = construct_array(this, &[]).unwrap(); let size: i32 = from_value(args[0].clone()).unwrap(); array.set_field_slice("length", to_value(size)); Ok(array) } - _ => create_array_object(this, args), + _ => construct_array(this, args), } } @@ -99,7 +99,7 @@ pub fn concat(this: &Value, args: &[Value], _: &mut Interpreter) -> ResultValue } } - create_array_object(this, &new_values) + construct_array(this, &new_values) } /// Array.prototype.push ( ...items ) @@ -252,30 +252,38 @@ pub fn unshift(this: &Value, args: &[Value], _: &mut Interpreter) -> ResultValue } /// Create a new `Array` object -pub fn _create(global: &Value) -> Value { - let array = to_value(make_array as NativeFunctionData); - let proto = ValueData::new_obj(Some(global)); +pub fn create_constructor(global: &Value) -> Value { + // Create Constructor + let mut array_constructor = Object::default(); + array_constructor.kind = ObjectKind::Function; + array_constructor.set_internal_method("construct", make_array); + // Todo: add call function + array_constructor.set_internal_method("call", make_array); + + // Create prototype + let array_prototype = ValueData::new_obj(Some(global)); + let length = Property::default().get(to_value(get_array_length as NativeFunctionData)); - proto.set_prop_slice("length", length); + array_prototype.set_prop_slice("length", length); let concat_func = to_value(concat as NativeFunctionData); concat_func.set_field_slice("length", to_value(1_i32)); - proto.set_field_slice("concat", concat_func); + array_prototype.set_field_slice("concat", concat_func); let push_func = to_value(push as NativeFunctionData); push_func.set_field_slice("length", to_value(1_i32)); - proto.set_field_slice("push", push_func); - proto.set_field_slice("pop", to_value(pop as NativeFunctionData)); - proto.set_field_slice("join", to_value(join as NativeFunctionData)); - proto.set_field_slice("reverse", to_value(reverse as NativeFunctionData)); - proto.set_field_slice("shift", to_value(shift as NativeFunctionData)); - proto.set_field_slice("unshift", to_value(unshift as NativeFunctionData)); - array.set_field_slice(PROTOTYPE, proto); - array -} -/// Initialise the global object with the `Array` object -pub fn init(global: &Value) { - global.set_field_slice("Array", _create(global)); + array_prototype.set_field_slice("push", push_func); + array_prototype.set_field_slice("pop", to_value(pop as NativeFunctionData)); + array_prototype.set_field_slice("join", to_value(join as NativeFunctionData)); + array_prototype.set_field_slice("reverse", to_value(reverse as NativeFunctionData)); + array_prototype.set_field_slice("shift", to_value(shift as NativeFunctionData)); + array_prototype.set_field_slice("unshift", to_value(unshift as NativeFunctionData)); + + let array = to_value(array_constructor); + array.set_field_slice(PROTOTYPE, to_value(array_prototype.clone())); + + array_prototype.set_field_slice("constructor", array.clone()); + array } #[cfg(test)] diff --git a/src/lib/js/boolean.rs b/src/lib/js/boolean.rs index da01dbf827..97a3e66786 100644 --- a/src/lib/js/boolean.rs +++ b/src/lib/js/boolean.rs @@ -1,17 +1,151 @@ -use gc::Gc; -use js::value::{to_value, ResultValue, Value, ValueData}; +use crate::{ + exec::Interpreter, + js::{ + function::NativeFunctionData, + object::{Object, ObjectKind, PROTOTYPE}, + value::{to_value, ResultValue, Value, ValueData}, + }, +}; +use std::{borrow::Borrow, ops::Deref}; -/// Create a new boolean -pub fn make_boolean(_: Vec, _: Value, _: Value, this: Value) -> ResultValue { - Ok(Gc::new(ValueData::Undefined)) +/// Create a new boolean object - [[Construct]] +pub fn construct_boolean(this: &Value, args: &[Value], _: &mut Interpreter) -> ResultValue { + this.set_kind(ObjectKind::Boolean); + + // Get the argument, if any + match args.get(0) { + Some(ref value) => { + this.set_internal_slot("BooleanData", to_boolean(value)); + } + None => { + this.set_internal_slot("BooleanData", to_boolean(&to_value(false))); + } + } + + // no need to return `this` as its passed by reference + Ok(this.clone()) +} + +/// Return a boolean literal [[Call]] +pub fn call_boolean(_: &Value, args: &[Value], _: &mut Interpreter) -> ResultValue { + // Get the argument, if any + match args.get(0) { + Some(ref value) => Ok(to_boolean(value)), + None => Ok(to_boolean(&to_value(false))), + } } + +/// https://tc39.es/ecma262/#sec-boolean.prototype.tostring +pub fn to_string(this: &Value, _: &[Value], _: &mut Interpreter) -> ResultValue { + let b = this_boolean_value(this); + Ok(to_value(b.to_string())) +} + +/// https://tc39.es/ecma262/#sec-boolean.prototype.valueof +pub fn value_of(this: &Value, _: &[Value], _: &mut Interpreter) -> ResultValue { + Ok(this_boolean_value(this)) +} + /// Create a new `Boolean` object -pub fn _create(global: Value) -> Value { - let boolean = to_value(make_boolean); - boolean -} -/// Initialise the global object with the `Error` object -pub fn init(global: &Value) { - let global_ptr = global.borrow(); - global_ptr.set_field_slice("Boolean", _create(global)); +pub fn create_constructor(global: &Value) -> Value { + let mut boolean = Object::default(); + boolean.kind = ObjectKind::Function; + boolean.set_internal_method("construct", construct_boolean); + boolean.set_internal_method("call", call_boolean); + // Create Prototype + // https://tc39.es/ecma262/#sec-properties-of-the-boolean-prototype-object + let boolean_prototype = ValueData::new_obj(Some(global)); + boolean_prototype.set_internal_slot("BooleanData", to_boolean(&to_value(false))); + boolean_prototype.set_field_slice("toString", to_value(to_string as NativeFunctionData)); + boolean_prototype.set_field_slice("valueOf", to_value(value_of as NativeFunctionData)); + + let boolean_value = to_value(boolean); + boolean_prototype.set_field_slice("constructor", to_value(boolean_value.clone())); + boolean_value.set_field_slice(PROTOTYPE, boolean_prototype); + boolean_value +} + +// === Utility Functions === +/// [toBoolean](https://tc39.github.io/ecma262/#sec-toboolean) +/// Creates a new boolean value from the input +pub fn to_boolean(value: &Value) -> Value { + match *value.deref().borrow() { + ValueData::Object(_) => to_value(true), + ValueData::String(ref s) if !s.is_empty() => to_value(true), + ValueData::Number(n) if n != 0.0 && !n.is_nan() => to_value(true), + ValueData::Integer(n) if n != 0 => to_value(true), + ValueData::Boolean(v) => to_value(v), + _ => to_value(false), + } +} + +pub fn this_boolean_value(value: &Value) -> Value { + match *value.deref().borrow() { + ValueData::Boolean(v) => to_value(v), + ValueData::Object(ref v) => (v).deref().borrow().get_internal_slot("BooleanData"), + _ => to_value(false), + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::exec::Executor; + use crate::{forward, forward_val, js::value::same_value}; + + #[test] + fn check_boolean_constructor_is_function() { + let global = ValueData::new_obj(None); + let boolean_constructor = create_constructor(&global); + assert_eq!(boolean_constructor.is_function(), true); + } + + #[test] + fn constructor_gives_true_instance() { + let mut engine = Executor::new(); + let init = r#" + const trueVal = new Boolean(true); + const trueNum = new Boolean(1); + const trueString = new Boolean("true"); + const trueBool = new Boolean(trueVal); + "#; + + forward(&mut engine, init); + let true_val = forward_val(&mut engine, "trueVal").expect("value expected"); + let true_num = forward_val(&mut engine, "trueNum").expect("value expected"); + let true_string = forward_val(&mut engine, "trueString").expect("value expected"); + let true_bool = forward_val(&mut engine, "trueBool").expect("value expected"); + + // Values should all be objects + assert_eq!(true_val.is_object(), true); + assert_eq!(true_num.is_object(), true); + assert_eq!(true_string.is_object(), true); + assert_eq!(true_bool.is_object(), true); + + // Values should all be truthy + assert_eq!(true_val.is_true(), true); + assert_eq!(true_num.is_true(), true); + assert_eq!(true_string.is_true(), true); + assert_eq!(true_bool.is_true(), true); + } + + #[test] + fn instances_have_correct_proto_set() { + let mut engine = Executor::new(); + let init = r#" + const boolInstance = new Boolean(true); + const boolProto = Boolean.prototype; + "#; + + forward(&mut engine, init); + let bool_instance = forward_val(&mut engine, "boolInstance").expect("value expected"); + let bool_prototype = forward_val(&mut engine, "boolProto").expect("value expected"); + + assert!(same_value( + &bool_instance.get_internal_slot("__proto__"), + &bool_prototype, + true + )); + } + } diff --git a/src/lib/js/console.rs b/src/lib/js/console.rs index 00bbd0ce24..c15ef22742 100644 --- a/src/lib/js/console.rs +++ b/src/lib/js/console.rs @@ -2,7 +2,6 @@ use crate::exec::Interpreter; use crate::js::function::NativeFunctionData; use crate::js::object::{ObjectKind, INSTANCE_PROTOTYPE}; use crate::js::value::{from_value, to_value, ResultValue, Value, ValueData}; -use chrono::Local; use gc::Gc; use std::fmt::Write; use std::iter::FromIterator; @@ -29,6 +28,10 @@ fn log_string_from(x: Value) -> String { .expect("Cannot clone primitive value from String"); write!(s, "{}", str_val).unwrap(); } + ObjectKind::Boolean => { + let bool_data = v.borrow().get_internal_slot("BooleanData").to_string(); + write!(s, "Boolean {{ {} }}", bool_data).unwrap(); + } ObjectKind::Array => { write!(s, "[").unwrap(); let len: i32 = from_value( @@ -103,11 +106,7 @@ pub fn log(_: &Value, args: &[Value], _: &mut Interpreter) -> ResultValue { let args: Vec = FromIterator::from_iter(args.iter().map(|x| log_string_from(x.clone()))); - println!( - "{}: {}", - Local::now().format("%X").to_string(), - args.join(" ") - ); + println!("{}", args.join(" ")); Ok(Gc::new(ValueData::Undefined)) } /// Print a javascript value to the standard error stream @@ -116,11 +115,7 @@ pub fn error(_: &Value, args: &[Value], _: &mut Interpreter) -> ResultValue { args.iter() .map(|x| from_value::(x.clone()).unwrap()), ); - println!( - "{}: {}", - Local::now().format("%X").to_string(), - args.join(" ") - ); + println!("{}", args.join(" ")); Ok(Gc::new(ValueData::Undefined)) } /// Create a new `console` object diff --git a/src/lib/js/mod.rs b/src/lib/js/mod.rs index 1ae77c6df5..1c59657f31 100644 --- a/src/lib/js/mod.rs +++ b/src/lib/js/mod.rs @@ -1,5 +1,7 @@ /// The global `Array` object pub mod array; +// The global `Boolean` object +pub mod boolean; /// The global `console` object pub mod console; /// The global `Error` object diff --git a/src/lib/js/object.rs b/src/lib/js/object.rs index 5368d8051b..0afac09af7 100644 --- a/src/lib/js/object.rs +++ b/src/lib/js/object.rs @@ -72,6 +72,11 @@ impl Object { self.internal_slots.insert(name.to_string(), val); } + /// Utility function to set an internal slot which is a function + pub fn set_internal_method(&mut self, name: &str, val: NativeFunctionData) { + self.internal_slots.insert(name.to_string(), to_value(val)); + } + /// Return a new Boolean object whose [[BooleanData]] internal slot is set to argument. fn from_boolean(argument: &Value) -> Self { let mut obj = Object { @@ -123,6 +128,7 @@ impl Object { ValueData::Boolean(_) => Ok(Self::from_boolean(value)), ValueData::Number(_) => Ok(Self::from_number(value)), ValueData::String(_) => Ok(Self::from_string(value)), + ValueData::Object(ref obj) => Ok(obj.borrow().clone()), _ => Err(()), } } @@ -152,7 +158,7 @@ impl Object { while !done { if p.is_null() { done = true - } else if same_value(&to_value(self.clone()), &p) { + } else if same_value(&to_value(self.clone()), &p, false) { return false; } else { p = p.get_internal_slot(PROTOTYPE); @@ -223,6 +229,7 @@ impl Object { true } + #[allow(clippy::option_unwrap_used)] pub fn define_own_property(&mut self, property_key: String, desc: Property) -> bool { let mut current = self.get_own_property(&to_value(property_key.to_string())); let extensible = self.is_extensible(); @@ -287,7 +294,7 @@ impl Object { current.get = None; current.set = None; } - self.properties.insert(property_key, current); + self.properties.insert(property_key, current.clone()); // 7 } else if current.is_data_descriptor() && desc.is_data_descriptor() { // a @@ -300,6 +307,7 @@ impl Object { && !same_value( &desc.value.clone().unwrap(), ¤t.value.clone().unwrap(), + false, ) { return false; @@ -309,10 +317,89 @@ impl Object { } // 8 } else { + if !current.configurable.unwrap() { + if desc.set.is_some() + && !same_value( + &desc.set.clone().unwrap(), + ¤t.set.clone().unwrap(), + false, + ) + { + return false; + } + + if desc.get.is_some() + && !same_value( + &desc.get.clone().unwrap(), + ¤t.get.clone().unwrap(), + false, + ) + { + return false; + } + } + return true; } + // 9 + Property::assign(&mut current, &desc); true } + + // [[Delete]] + pub fn delete(&mut self, prop_key: &Value) -> bool { + debug_assert!(Property::is_property_key(prop_key)); + let desc = self.get_own_property(prop_key); + if desc + .value + .clone() + .expect("unable to get value") + .is_undefined() + { + return true; + } + if desc.configurable.expect("unable to get value") { + self.properties.remove(&prop_key.to_string()); + return true; + } + + false + } + + // [[Get]] + pub fn get(&self, val: &Value) -> Value { + debug_assert!(Property::is_property_key(val)); + let desc = self.get_own_property(val); + if desc.value.clone().is_none() + || desc + .value + .clone() + .expect("Failed to get object") + .is_undefined() + { + // parent will either be null or an Object + let parent = self.get_prototype_of(); + if parent.is_null() { + return Gc::new(ValueData::Undefined); + } + + let parent_obj = Object::from(&parent).expect("Failed to get object"); + + return parent_obj.get(val); + } + + if desc.is_data_descriptor() { + return desc.value.clone().expect("failed to extract value"); + } + + let getter = desc.get.clone(); + if getter.is_none() || getter.expect("Failed to get object").is_undefined() { + return Gc::new(ValueData::Undefined); + } + + // TODO!!!!! Call getter from here + Gc::new(ValueData::Undefined) + } } #[derive(Trace, Finalize, Clone, Debug)] diff --git a/src/lib/js/property.rs b/src/lib/js/property.rs index 18dff5780d..44eca65d9a 100644 --- a/src/lib/js/property.rs +++ b/src/lib/js/property.rs @@ -106,6 +106,29 @@ impl Property { pub fn is_generic_descriptor(&self) -> bool { !self.is_accessor_descriptor() && !self.is_data_descriptor() } + + /// This copies only present property fields from B to A + pub fn assign(a: &mut Property, b: &Property) { + if b.get.is_some() { + a.get = b.get.clone(); + } + + if b.set.is_some() { + a.set = b.set.clone(); + } + + if b.configurable.is_some() { + a.configurable = b.configurable; + } + + if b.writable.is_some() { + a.writable = b.writable; + } + + if b.enumerable.is_some() { + a.enumerable = b.enumerable; + } + } } impl Default for Property { diff --git a/src/lib/js/regexp.rs b/src/lib/js/regexp.rs index 96a8efcbe7..6b0a26d5ac 100644 --- a/src/lib/js/regexp.rs +++ b/src/lib/js/regexp.rs @@ -7,7 +7,7 @@ use crate::{ exec::Interpreter, js::{ function::NativeFunctionData, - object::{InternalState, ObjectKind, PROTOTYPE}, + object::{InternalState, Object, ObjectKind, PROTOTYPE}, property::Property, value::{from_value, to_value, FromValue, ResultValue, Value, ValueData}, }, @@ -258,8 +258,15 @@ pub fn to_string(this: &Value, _: &[Value], _: &mut Interpreter) -> ResultValue } /// Create a new `RegExp` object -pub fn _create(global: &Value) -> Value { - let regexp = to_value(make_regexp as NativeFunctionData); +pub fn create_constructor(global: &Value) -> Value { + // Create constructor function + let mut regexp_constructor = Object::default(); + regexp_constructor.kind = ObjectKind::Function; + regexp_constructor.set_internal_method("construct", make_regexp); + // Todo: add call function, currently call points to contructor, this is wrong + regexp_constructor.set_internal_method("call", make_regexp); + + // Create prototype let proto = ValueData::new_obj(Some(global)); proto.set_field_slice("test", to_value(test as NativeFunctionData)); proto.set_field_slice("exec", to_value(exec as NativeFunctionData)); @@ -273,17 +280,16 @@ pub fn _create(global: &Value) -> Value { proto.set_prop_slice("source", _make_prop(get_source)); proto.set_prop_slice("sticky", _make_prop(get_sticky)); proto.set_prop_slice("unicode", _make_prop(get_unicode)); - regexp.set_field_slice(PROTOTYPE, proto); - regexp -} -/// Initialise the `RegExp` object on the global object -pub fn init(global: &Value) { - global.set_field_slice("RegExp", _create(global)); + let regexp = to_value(regexp_constructor); + regexp.set_field_slice(PROTOTYPE, proto.clone()); + proto.set_field_slice("constructor", regexp.clone()); + regexp } #[cfg(test)] mod tests { + use super::*; use crate::exec::Executor; use crate::forward; @@ -302,6 +308,13 @@ mod tests { assert_eq!(forward(&mut engine, "ctor_literal.test('1.0')"), "true"); } + #[test] + fn check_regexp_constructor_is_function() { + let global = ValueData::new_obj(None); + let regexp_constructor = create_constructor(&global); + assert_eq!(regexp_constructor.is_function(), true); + } + // TODO: uncomment this test when property getters are supported // #[test] diff --git a/src/lib/js/string.rs b/src/lib/js/string.rs index 1a478a16b6..b6099ac1f6 100644 --- a/src/lib/js/string.rs +++ b/src/lib/js/string.rs @@ -2,12 +2,11 @@ use crate::{ exec::Interpreter, js::{ function::NativeFunctionData, - object::{ObjectKind, PROTOTYPE}, + object::{Object, ObjectKind, PROTOTYPE}, property::Property, value::{from_value, to_value, ResultValue, Value, ValueData}, }, }; -use gc::Gc; use std::{ cmp::{max, min}, f64::NAN, @@ -522,8 +521,17 @@ pub fn trim_end(this: &Value, _: &[Value], ctx: &mut Interpreter) -> ResultValue } /// Create a new `String` object -pub fn _create(global: &Value) -> Value { - let string = to_value(make_string as NativeFunctionData); +pub fn create_constructor(global: &Value) -> Value { + // Create constructor function object + let mut string_constructor = Object::default(); + string_constructor.kind = ObjectKind::Function; + + string_constructor.set_internal_method("construct", make_string); + // Todo: add call internal method (should be easy) + // Currently call points to the constructor function, this is wrong + string_constructor.set_internal_method("call", make_string); + + // Create prototype let proto = ValueData::new_obj(Some(global)); let prop = Property::default().get(to_value(get_string_length as NativeFunctionData)); @@ -543,13 +551,16 @@ pub fn _create(global: &Value) -> Value { proto.set_field_slice("padStart", to_value(pad_start as NativeFunctionData)); proto.set_field_slice("trim", to_value(trim as NativeFunctionData)); proto.set_field_slice("trimStart", to_value(trim_start as NativeFunctionData)); + + let string = to_value(string_constructor); + proto.set_field_slice("constructor", string.clone()); string.set_field_slice(PROTOTYPE, proto); string } /// Initialise the `String` object on the global object pub fn init(global: &Value) { - global.set_field_slice("String", _create(global)); + global.set_field_slice("String", create_constructor(global)); } #[cfg(test)] @@ -561,7 +572,7 @@ mod tests { #[test] fn check_string_constructor_is_function() { let global = ValueData::new_obj(None); - let string_constructor = _create(&global); + let string_constructor = create_constructor(&global); assert_eq!(string_constructor.is_function(), true); } diff --git a/src/lib/js/value.rs b/src/lib/js/value.rs index 758374b397..c203c6055c 100644 --- a/src/lib/js/value.rs +++ b/src/lib/js/value.rs @@ -94,6 +94,7 @@ impl ValueData { pub fn is_function(&self) -> bool { match *self { ValueData::Function(_) => true, + ValueData::Object(ref o) => o.deref().borrow().get_internal_slot("call").is_function(), _ => false, } } @@ -524,6 +525,7 @@ impl ValueData { } /// Get the type of the value + /// https://tc39.es/ecma262/#sec-typeof-operator pub fn get_type(&self) -> &'static str { match *self { ValueData::Number(_) | ValueData::Integer(_) => "number", @@ -531,7 +533,14 @@ impl ValueData { ValueData::Boolean(_) => "boolean", ValueData::Null => "null", ValueData::Undefined => "undefined", - _ => "object", + ValueData::Function(_) => "function", + ValueData::Object(ref o) => { + if o.deref().borrow().get_internal_slot("call").is_null() { + "object" + } else { + "function" + } + } } } } @@ -559,37 +568,7 @@ impl Display for ValueData { _ => v.to_string(), } ), - ValueData::Object(ref v) => { - write!(f, "{{")?; - // Print public properties - if let Some((last_key, _)) = v.borrow().properties.iter().last() { - for (key, val) in v.borrow().properties.iter() { - write!( - f, - "{}: {}", - key, - val.value - .as_ref() - .unwrap_or(&Gc::new(ValueData::Undefined)) - .clone() - )?; - if key != last_key { - write!(f, ", ")?; - } - } - }; - - // Print internal slots - if let Some((last_key, _)) = v.borrow().internal_slots.iter().last() { - for (key, val) in v.borrow().internal_slots.iter() { - write!(f, "[[{}]]: {}", key, &val)?; - if key != last_key { - write!(f, ", ")?; - } - } - }; - write!(f, "}}") - } + ValueData::Object(_) => write!(f, "{{}}"), ValueData::Integer(v) => write!(f, "{}", v), ValueData::Function(ref v) => match *v.borrow() { Function::NativeFunc(_) => write!(f, "function() {{ [native code] }}"), @@ -919,7 +898,15 @@ pub fn to_value(v: A) -> Value { /// Such a comparison is performed as follows: /// /// https://tc39.es/ecma262/#sec-samevalue -pub fn same_value(x: &Value, y: &Value) -> bool { +/// strict mode currently compares the pointers +pub fn same_value(x: &Value, y: &Value, strict: bool) -> bool { + if strict { + // Do both Values point to the same underlying valueData? + let x_ptr = Gc::into_raw(x.clone()); + let y_ptr = Gc::into_raw(y.clone()); + return x_ptr == y_ptr; + } + if x.get_type() != y.get_type() { return false; } @@ -948,6 +935,11 @@ pub fn same_value_non_number(x: &Value, y: &Value) -> bool { from_value::(x.clone()).expect("failed to get value") == from_value::(y.clone()).expect("failed to get value") } + "object" => { + let b = ValueData::new_obj(None); + dbg!(b == b); + *x == *y + } _ => false, } } diff --git a/src/lib/lib.rs b/src/lib/lib.rs index 52ff9a9141..dc9458447d 100644 --- a/src/lib/lib.rs +++ b/src/lib/lib.rs @@ -40,6 +40,7 @@ pub mod syntax; use crate::{ exec::{Executor, Interpreter}, + js::value::ResultValue, syntax::{ast::expr::Expr, lexer::Lexer, parser::Parser}, }; use wasm_bindgen::prelude::*; @@ -71,6 +72,16 @@ pub fn forward(engine: &mut Interpreter, src: &str) -> String { } } +/// Execute the code using an existing Interpreter +/// The str is consumed and the state of the Interpreter is changed +/// Similar to `forward`, except the current value is returned instad of the string +/// If the interpreter fails parsing an error value is returned instead (error object) +pub fn forward_val(engine: &mut Interpreter, src: &str) -> ResultValue { + // Setup executor + let expr = parser_expr(src); + engine.run(&expr) +} + /// Create a clean Interpreter and execute the code pub fn exec(src: &str) -> String { let mut engine: Interpreter = Executor::new(); diff --git a/tests/js/test.js b/tests/js/test.js index a9d33a6991..ffbdea4081 100644 --- a/tests/js/test.js +++ b/tests/js/test.js @@ -1 +1,2 @@ -("Jason").charAt(2); +let a = "hello"; +print(a);