Created
March 4, 2022 19:11
-
-
Save renatoalencar/12c526d5c5d873fe1292e310a6cca0d2 to your computer and use it in GitHub Desktop.
Deku Lambda VM test cases
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/esy.lock/index.json b/esy.lock/index.json | |
index 472c19f2..950f6e8f 100644 | |
--- a/esy.lock/index.json | |
+++ b/esy.lock/index.json | |
@@ -1,5 +1,5 @@ | |
{ | |
- "checksum": "06f9f237cf9dd0acc2174a26407cd7c3", | |
+ "checksum": "9d0b0d7d646f14d07c9584a66e8ae6a9", | |
"root": "sidechain@link-dev:./package.json", | |
"node": { | |
"yarn-pkg-config@github:esy-ocaml/yarn-pkg-config#db3a0b63883606dd57c54a7158d560d6cba8cd79@d41d8cd9": { | |
@@ -102,7 +102,7 @@ | |
}, | |
"overrides": [], | |
"dependencies": [ | |
- "webpack-merge@5.8.0@d41d8cd9", "webpack@5.69.1@d41d8cd9", | |
+ "webpack-merge@5.8.0@d41d8cd9", "webpack@5.70.0@d41d8cd9", | |
"rechoir@0.7.1@d41d8cd9", "interpret@2.2.0@d41d8cd9", | |
"import-local@3.1.0@d41d8cd9", "fastest-levenshtein@1.0.12@d41d8cd9", | |
"execa@5.1.1@d41d8cd9", "commander@7.2.0@d41d8cd9", | |
@@ -113,14 +113,14 @@ | |
], | |
"devDependencies": [] | |
}, | |
- "webpack@5.69.1@d41d8cd9": { | |
- "id": "webpack@5.69.1@d41d8cd9", | |
+ "webpack@5.70.0@d41d8cd9": { | |
+ "id": "webpack@5.70.0@d41d8cd9", | |
"name": "webpack", | |
- "version": "5.69.1", | |
+ "version": "5.70.0", | |
"source": { | |
"type": "install", | |
"source": [ | |
- "archive:https://registry.npmjs.org/webpack/-/webpack-5.69.1.tgz#sha1:8cfd92c192c6a52c99ab00529b5a0d33aa848dc5" | |
+ "archive:https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz#sha1:3461e6287a72b5e6e2f4872700bc8de0d7500e6d" | |
] | |
}, | |
"overrides": [], | |
@@ -132,7 +132,7 @@ | |
"json-parse-better-errors@1.0.2@d41d8cd9", | |
"graceful-fs@4.2.9@d41d8cd9", "glob-to-regexp@0.4.1@d41d8cd9", | |
"events@3.3.0@d41d8cd9", "eslint-scope@5.1.1@d41d8cd9", | |
- "es-module-lexer@0.9.3@d41d8cd9", "enhanced-resolve@5.9.1@d41d8cd9", | |
+ "es-module-lexer@0.9.3@d41d8cd9", "enhanced-resolve@5.9.2@d41d8cd9", | |
"chrome-trace-event@1.0.3@d41d8cd9", "browserslist@4.19.3@d41d8cd9", | |
"acorn-import-assertions@1.8.0@d41d8cd9", "acorn@8.7.0@d41d8cd9", | |
"@webassemblyjs/wasm-parser@1.11.1@d41d8cd9", | |
@@ -226,7 +226,7 @@ | |
}, | |
"overrides": [], | |
"dependencies": [ | |
- "webpack@5.69.1@d41d8cd9", "terser@5.12.0@d41d8cd9", | |
+ "webpack@5.70.0@d41d8cd9", "terser@5.12.0@d41d8cd9", | |
"source-map@0.6.1@d41d8cd9", "serialize-javascript@6.0.0@d41d8cd9", | |
"schema-utils@3.1.1@d41d8cd9", "jest-worker@27.5.1@d41d8cd9" | |
], | |
@@ -388,7 +388,7 @@ | |
}, | |
"overrides": [], | |
"dependencies": [ | |
- "webpack-cli@4.9.2@d41d8cd9", "webpack@5.69.1@d41d8cd9", | |
+ "webpack-cli@4.9.2@d41d8cd9", "webpack@5.70.0@d41d8cd9", | |
"ocaml@github:esy-ocaml/ocaml#65e3f82dcd867d2b1f27c84597b3c25259b09396@d41d8cd9", | |
"@taquito/taquito@11.2.0@d41d8cd9", | |
"@taquito/signer@11.2.0@d41d8cd9", "@taquito/rpc@11.2.0@d41d8cd9", | |
@@ -410,7 +410,8 @@ | |
"@opam/digestif@opam:1.1.0@a8d16625", | |
"@opam/data-encoding@opam:0.4@edfce09b", | |
"@opam/cmdliner@opam:1.0.4@93208aac", | |
- "@opam/bigstring@opam:0.3@d98556f0" | |
+ "@opam/bigstring@opam:0.3@d98556f0", | |
+ "@opam/alcotest@opam:1.5.0@338d9572" | |
], | |
"devDependencies": [ | |
"prettier@2.5.1@d41d8cd9", | |
@@ -1624,14 +1625,14 @@ | |
"dependencies": [], | |
"devDependencies": [] | |
}, | |
- "enhanced-resolve@5.9.1@d41d8cd9": { | |
- "id": "enhanced-resolve@5.9.1@d41d8cd9", | |
+ "enhanced-resolve@5.9.2@d41d8cd9": { | |
+ "id": "enhanced-resolve@5.9.2@d41d8cd9", | |
"name": "enhanced-resolve", | |
- "version": "5.9.1", | |
+ "version": "5.9.2", | |
"source": { | |
"type": "install", | |
"source": [ | |
- "archive:https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.1.tgz#sha1:e898cea44d9199fd92137496cff5691b910fb43e" | |
+ "archive:https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz#sha1:0224dcd6a43389ebfb2d55efee517e5466772dd9" | |
] | |
}, | |
"overrides": [], | |
@@ -2136,7 +2137,7 @@ | |
}, | |
"overrides": [], | |
"dependencies": [ | |
- "webpack-cli@4.9.2@d41d8cd9", "webpack@5.69.1@d41d8cd9" | |
+ "webpack-cli@4.9.2@d41d8cd9", "webpack@5.70.0@d41d8cd9" | |
], | |
"devDependencies": [] | |
}, | |
diff --git a/package.json b/package.json | |
index a48a360f..5cb9222e 100644 | |
--- a/package.json | |
+++ b/package.json | |
@@ -2,15 +2,8 @@ | |
"name": "sidechain", | |
"esy": { | |
"build": "dune build -p #{self.name}", | |
- "release": { | |
- "bin": [ | |
- "sidecli", | |
- "deku-node" | |
- ] | |
- }, | |
- "buildEnv": { | |
- "PATH": "%{localStore}%/../bin:$PATH" | |
- } | |
+ "release": { "bin": [ "sidecli", "deku-node" ] }, | |
+ "buildEnv": { "PATH": "%{localStore}%/../bin:$PATH" } | |
}, | |
"license": "MIT", | |
"scripts": { | |
@@ -19,32 +12,33 @@ | |
"build_static": "dune build --profile=static --release" | |
}, | |
"dependencies": { | |
- "ocaml": "4.12.", | |
+ "@opam/alcotest": "1.5.0", | |
+ "@opam/bigstring": "*", | |
+ "@opam/cmdliner": "1.0.4", | |
+ "@opam/data-encoding": "*", | |
+ "@opam/digestif": "*", | |
+ "@opam/domainslib": "0.4.1", | |
+ "@opam/dream": "*", | |
"@opam/dune": "~2.9.3", | |
- "@opam/ppx_deriving": "*", | |
- "@opam/ppx_deriving_yojson": "*", | |
+ "@opam/hex": "*", | |
"@opam/lwt": "*", | |
"@opam/mirage-crypto": "*", | |
+ "@opam/mirage-crypto-ec": "*", | |
"@opam/mirage-crypto-pk": "*", | |
"@opam/mirage-crypto-rng": "*", | |
- "@opam/mirage-crypto-ec": "*", | |
- "@opam/dream": "*", | |
- "@opam/piaf": "*", | |
"@opam/mrmime": "0.3.2", | |
- "@opam/hex": "*", | |
+ "@opam/piaf": "*", | |
+ "@opam/ppx_blob": "*", | |
+ "@opam/ppx_deriving": "*", | |
+ "@opam/ppx_deriving_yojson": "*", | |
+ "@opam/secp256k1-internal": "*", | |
"@opam/tezos-micheline": "11.1", | |
- "@opam/digestif": "*", | |
- "@opam/cmdliner": "1.0.4", | |
- "@taquito/taquito": "^11.0.1", | |
- "@taquito/signer": "^11.0.1", | |
"@taquito/rpc": "^11.0.1", | |
+ "@taquito/signer": "^11.0.1", | |
+ "@taquito/taquito": "^11.0.1", | |
+ "ocaml": "4.12.", | |
"webpack": "^5.47.1", | |
- "webpack-cli": "^4.7.1", | |
- "@opam/ppx_blob": "*", | |
- "@opam/secp256k1-internal": "*", | |
- "@opam/bigstring": "*", | |
- "@opam/domainslib": "0.4.1", | |
- "@opam/data-encoding": "*" | |
+ "webpack-cli": "^4.7.1" | |
}, | |
"devDependencies": { | |
"prettier": "^2.3.2", | |
@@ -57,16 +51,18 @@ | |
}, | |
"resolutions": { | |
"ocaml": "esy-ocaml/ocaml#65e3f82dcd867d2b1f27c84597b3c25259b09396", | |
- "@esy-ocaml/reason": "EduardoRFS/reason:reason.json#70984e94eae3084e56d0cfdf7d5d3be1ecda7b18", | |
- "@opam/reason": "EduardoRFS/reason:reason.json#70984e94eae3084e56d0cfdf7d5d3be1ecda7b18", | |
- "@reason-native/rely": "reasonml/reason-native:rely.json#7788757212c5b9365ed839b044c4840e3e917987", | |
- "@reason-native/cli": "reasonml/reason-native:cli.json#7788757212c5b9365ed839b044c4840e3e917987", | |
- "@opam/base-domains": { | |
- "source": "no-source:", | |
- "override": {} | |
- }, | |
+ "@esy-ocaml/reason": | |
+ "EduardoRFS/reason:reason.json#70984e94eae3084e56d0cfdf7d5d3be1ecda7b18", | |
+ "@opam/reason": | |
+ "EduardoRFS/reason:reason.json#70984e94eae3084e56d0cfdf7d5d3be1ecda7b18", | |
+ "@reason-native/rely": | |
+ "reasonml/reason-native:rely.json#7788757212c5b9365ed839b044c4840e3e917987", | |
+ "@reason-native/cli": | |
+ "reasonml/reason-native:cli.json#7788757212c5b9365ed839b044c4840e3e917987", | |
+ "@opam/base-domains": { "source": "no-source:", "override": {} }, | |
"@opam/dream": { | |
- "source": "EduardoRFS/dream:dream.opam#bd4c4b09b0ace2144384f97848bcfd6ad0856e7e", | |
+ "source": | |
+ "EduardoRFS/dream:dream.opam#bd4c4b09b0ace2144384f97848bcfd6ad0856e7e", | |
"override": { | |
"dependencies": { | |
"@opam/websocketaf": "*", | |
@@ -81,7 +77,8 @@ | |
} | |
}, | |
"@opam/piaf": { | |
- "source": "ulrikstrid/piaf:piaf.opam#79e8c830e4268b51d9a76e9ff1322a09aa1b6e14", | |
+ "source": | |
+ "ulrikstrid/piaf:piaf.opam#79e8c830e4268b51d9a76e9ff1322a09aa1b6e14", | |
"override": { | |
"dependencies": { | |
"@opam/base64": "*", | |
@@ -94,75 +91,87 @@ | |
} | |
} | |
}, | |
- "@opam/ssl": "anmonteiro/ocaml-ssl:ssl.opam#35e6dfa65181cccdfeee898702f45eca8afebbd4", | |
- "@opam/httpaf": "anmonteiro/httpaf:httpaf.opam#3a74fd8851e3019f5889ae1bf9350e90ed40017d", | |
- "@opam/httpaf-lwt": "anmonteiro/httpaf:httpaf-lwt.opam#3a74fd8851e3019f5889ae1bf9350e90ed40017d", | |
- "@opam/httpaf-lwt-unix": "anmonteiro/httpaf:httpaf-lwt-unix.opam#3a74fd8851e3019f5889ae1bf9350e90ed40017d", | |
- "@opam/h2": "anmonteiro/ocaml-h2:h2.opam#fa0c8a4746fdc50183e254f8c08239fc5b67717d", | |
- "@opam/h2-lwt": "anmonteiro/ocaml-h2:h2-lwt.opam#fa0c8a4746fdc50183e254f8c08239fc5b67717d", | |
- "@opam/h2-lwt-unix": "anmonteiro/ocaml-h2:h2-lwt-unix.opam#fa0c8a4746fdc50183e254f8c08239fc5b67717d", | |
- "@opam/websocketaf": "anmonteiro/websocketaf:websocketaf.opam#248a2cb0dcffa51996c3ad7643577dce75d67454", | |
- "@opam/websocketaf-lwt": "anmonteiro/websocketaf:websocketaf-lwt.opam#248a2cb0dcffa51996c3ad7643577dce75d67454", | |
- "@opam/websocketaf-lwt-unix": "anmonteiro/websocketaf:websocketaf-lwt-unix.opam#248a2cb0dcffa51996c3ad7643577dce75d67454", | |
- "@opam/ppxlib": "patricoferris/ppxlib:ppxlib.opam#91c39e958fca1dabf16f64dc7699ace7752f0014", | |
- "@opam/easy-format": "nojb/easy-format:easy-format.opam#4568bfa1887146ab6ce41a48c9e00c8c1329c6e4", | |
- "@opam/biniou": "EduardoRFS/biniou:biniou.opam#b5f099b4ad594e68383e55ffde6d296439d341b8", | |
- "@opam/sexplib0": "EduardoRFS/sexplib0:sexplib0.opam#6785e5fe565bdbcdbc00d861654b4f468d7a552c", | |
- "@opam/base": "EduardoRFS/base:base.opam#6ea52922e153b3a3aae6ffbf2379c6f442671ebd", | |
- "@opam/stdio": "janestreet/stdio:stdio.opam#f006beb417ee568c612c3d89824cfb6e15a98568", | |
+ "@opam/ssl": | |
+ "anmonteiro/ocaml-ssl:ssl.opam#35e6dfa65181cccdfeee898702f45eca8afebbd4", | |
+ "@opam/httpaf": | |
+ "anmonteiro/httpaf:httpaf.opam#3a74fd8851e3019f5889ae1bf9350e90ed40017d", | |
+ "@opam/httpaf-lwt": | |
+ "anmonteiro/httpaf:httpaf-lwt.opam#3a74fd8851e3019f5889ae1bf9350e90ed40017d", | |
+ "@opam/httpaf-lwt-unix": | |
+ "anmonteiro/httpaf:httpaf-lwt-unix.opam#3a74fd8851e3019f5889ae1bf9350e90ed40017d", | |
+ "@opam/h2": | |
+ "anmonteiro/ocaml-h2:h2.opam#fa0c8a4746fdc50183e254f8c08239fc5b67717d", | |
+ "@opam/h2-lwt": | |
+ "anmonteiro/ocaml-h2:h2-lwt.opam#fa0c8a4746fdc50183e254f8c08239fc5b67717d", | |
+ "@opam/h2-lwt-unix": | |
+ "anmonteiro/ocaml-h2:h2-lwt-unix.opam#fa0c8a4746fdc50183e254f8c08239fc5b67717d", | |
+ "@opam/websocketaf": | |
+ "anmonteiro/websocketaf:websocketaf.opam#248a2cb0dcffa51996c3ad7643577dce75d67454", | |
+ "@opam/websocketaf-lwt": | |
+ "anmonteiro/websocketaf:websocketaf-lwt.opam#248a2cb0dcffa51996c3ad7643577dce75d67454", | |
+ "@opam/websocketaf-lwt-unix": | |
+ "anmonteiro/websocketaf:websocketaf-lwt-unix.opam#248a2cb0dcffa51996c3ad7643577dce75d67454", | |
+ "@opam/ppxlib": | |
+ "patricoferris/ppxlib:ppxlib.opam#91c39e958fca1dabf16f64dc7699ace7752f0014", | |
+ "@opam/easy-format": | |
+ "nojb/easy-format:easy-format.opam#4568bfa1887146ab6ce41a48c9e00c8c1329c6e4", | |
+ "@opam/biniou": | |
+ "EduardoRFS/biniou:biniou.opam#b5f099b4ad594e68383e55ffde6d296439d341b8", | |
+ "@opam/sexplib0": | |
+ "EduardoRFS/sexplib0:sexplib0.opam#6785e5fe565bdbcdbc00d861654b4f468d7a552c", | |
+ "@opam/base": | |
+ "EduardoRFS/base:base.opam#6ea52922e153b3a3aae6ffbf2379c6f442671ebd", | |
+ "@opam/stdio": | |
+ "janestreet/stdio:stdio.opam#f006beb417ee568c612c3d89824cfb6e15a98568", | |
"@opam/ppx_hash": { | |
"version": "opam:v0.14.0", | |
- "override" : { | |
- "dependencies": { | |
- "@opam/ppx_sexp_conv": "*" | |
- } | |
- } | |
+ "override": { "dependencies": { "@opam/ppx_sexp_conv": "*" } } | |
}, | |
"@opam/ppx_assert": { | |
"version": "opam:v0.14.0", | |
- "override" : { | |
- "dependencies": { | |
- "@opam/ppx_sexp_conv": "*" | |
- } | |
- } | |
+ "override": { "dependencies": { "@opam/ppx_sexp_conv": "*" } } | |
}, | |
"@opam/ppx_base": { | |
"version": "opam:v0.14.0", | |
- "override" : { | |
- "dependencies": { | |
- "@opam/ppx_sexp_conv": "*" | |
- } | |
- } | |
+ "override": { "dependencies": { "@opam/ppx_sexp_conv": "*" } } | |
}, | |
- "@opam/ppx_inline_test": "janestreet/ppx_inline_test:ppx_inline_test.opam#54e0a1cd2402126998d40f653876e59a7011bf75", | |
- "@opam/ppx_sexp_conv": "janestreet/ppx_sexp_conv:ppx_sexp_conv.opam#3d413303de3f76fecb19dc51c85b81c33c5c872a", | |
- "@opam/secp256k1-internal": "git:https://gitlab.com/marigold/ocaml-secp256k1-internal:secp256k1-internal.opam#964026bdb43db3ebffd1643599ec22e4caf8f2bc", | |
+ "@opam/ppx_inline_test": | |
+ "janestreet/ppx_inline_test:ppx_inline_test.opam#54e0a1cd2402126998d40f653876e59a7011bf75", | |
+ "@opam/ppx_sexp_conv": | |
+ "janestreet/ppx_sexp_conv:ppx_sexp_conv.opam#3d413303de3f76fecb19dc51c85b81c33c5c872a", | |
+ "@opam/secp256k1-internal": | |
+ "git:https://gitlab.com/marigold/ocaml-secp256k1-internal:secp256k1-internal.opam#964026bdb43db3ebffd1643599ec22e4caf8f2bc", | |
"@opam/ocaml-lsp-server": { | |
- "source": "EduardoRFS/ocaml-lsp:ocaml-lsp-server.opam#24fcebcec9f1e99815b036a6d45c0f912e8e8a19", | |
- "override": { | |
- "dependencies": { | |
- "@opam/ocamlformat-rpc-lib": "*" | |
- } | |
- } | |
+ "source": | |
+ "EduardoRFS/ocaml-lsp:ocaml-lsp-server.opam#24fcebcec9f1e99815b036a6d45c0f912e8e8a19", | |
+ "override": { "dependencies": { "@opam/ocamlformat-rpc-lib": "*" } } | |
}, | |
- "@opam/ocamlformat": "EduardoRFS/ocamlformat:ocamlformat.opam#832e0a33d5cc05a77a335e6b6fa369172c742c95", | |
- "@opam/ocamlformat-rpc": "EduardoRFS/ocamlformat:ocamlformat-rpc.opam#832e0a33d5cc05a77a335e6b6fa369172c742c95", | |
- "@opam/ocamlformat-rpc-lib": "EduardoRFS/ocamlformat:ocamlformat-rpc-lib.opam#832e0a33d5cc05a77a335e6b6fa369172c742c95", | |
- "@opam/odoc": "ocaml/odoc:odoc.opam#d243b80287a73bf3f34292254b0e9d8b2f56cc47", | |
+ "@opam/ocamlformat": | |
+ "EduardoRFS/ocamlformat:ocamlformat.opam#832e0a33d5cc05a77a335e6b6fa369172c742c95", | |
+ "@opam/ocamlformat-rpc": | |
+ "EduardoRFS/ocamlformat:ocamlformat-rpc.opam#832e0a33d5cc05a77a335e6b6fa369172c742c95", | |
+ "@opam/ocamlformat-rpc-lib": | |
+ "EduardoRFS/ocamlformat:ocamlformat-rpc-lib.opam#832e0a33d5cc05a77a335e6b6fa369172c742c95", | |
+ "@opam/odoc": | |
+ "ocaml/odoc:odoc.opam#d243b80287a73bf3f34292254b0e9d8b2f56cc47", | |
"@opam/odoc-parser": { | |
- "source": "kit-ty-kate/odoc-parser:odoc-parser.opam#bfa00f8b36778e16166e17c529f289633caf9fa7", | |
- "override": { | |
- "dependencies": { | |
- "@opam/camlp-streams": "*" | |
- } | |
- } | |
+ "source": | |
+ "kit-ty-kate/odoc-parser:odoc-parser.opam#bfa00f8b36778e16166e17c529f289633caf9fa7", | |
+ "override": { "dependencies": { "@opam/camlp-streams": "*" } } | |
}, | |
- "@opam/lwt": "kit-ty-kate/lwt:lwt.opam#0c4cc9d1238461b82b92d61c1c007cb1048509be", | |
- "@opam/ocplib-endian": "kit-ty-kate/ocplib-endian:ocplib-endian.opam#8136732deb8e7f69ece0a19cfc9f9a141ebe1d2b", | |
- "@opam/domainslib": "ocaml-multicore/domainslib:domainslib.opam#4ac01e870615e32291f0145a7cbdd5528b88ea59", | |
- "@opam/omd": "EduardoRFS/omd:omd.opam#74477dafa064a621b585eb7b637ad3b1d1b3dfef", | |
- "@opam/camomile": "kit-ty-kate/camomile:camomile.opam#12e8baac3cedaa18b98cdcc2d84196f8e52ee31c", | |
- "@opam/lwt_log": "kit-ty-kate/lwt_log:lwt_log.opam#604644d7c72af1f1e87ab4fc2d7e8f7376c9b906", | |
- "@opam/utop": "EduardoRFS/utop:utop.opam#8f93be9019235ea7224cf792beacad045ba7de4d" | |
+ "@opam/lwt": | |
+ "kit-ty-kate/lwt:lwt.opam#0c4cc9d1238461b82b92d61c1c007cb1048509be", | |
+ "@opam/ocplib-endian": | |
+ "kit-ty-kate/ocplib-endian:ocplib-endian.opam#8136732deb8e7f69ece0a19cfc9f9a141ebe1d2b", | |
+ "@opam/domainslib": | |
+ "ocaml-multicore/domainslib:domainslib.opam#4ac01e870615e32291f0145a7cbdd5528b88ea59", | |
+ "@opam/omd": | |
+ "EduardoRFS/omd:omd.opam#74477dafa064a621b585eb7b637ad3b1d1b3dfef", | |
+ "@opam/camomile": | |
+ "kit-ty-kate/camomile:camomile.opam#12e8baac3cedaa18b98cdcc2d84196f8e52ee31c", | |
+ "@opam/lwt_log": | |
+ "kit-ty-kate/lwt_log:lwt_log.opam#604644d7c72af1f1e87ab4fc2d7e8f7376c9b906", | |
+ "@opam/utop": | |
+ "EduardoRFS/utop:utop.opam#8f93be9019235ea7224cf792beacad045ba7de4d" | |
} | |
-} | |
+} | |
\ No newline at end of file | |
diff --git a/src/lambda_vm/interpreter.ml b/src/lambda_vm/interpreter.ml | |
index 891f5fbe..c3fdb2a5 100644 | |
--- a/src/lambda_vm/interpreter.ml | |
+++ b/src/lambda_vm/interpreter.ml | |
@@ -190,3 +190,39 @@ let execute gas ~arg script = | |
let execute gas ~arg script = | |
try Ok (execute gas ~arg script) with | |
| Error error -> Error error | |
+ | |
+let prim_to_string = function | |
+ | P_neg -> "P_neg" | |
+ | P_add -> "P_add" | |
+ | P_sub -> "P_sub" | |
+ | P_mul -> "P_mul" | |
+ | P_div -> "P_div" | |
+ | P_rem -> "P_rem" | |
+ | P_and -> "P_and" | |
+ | P_or -> "P_or" | |
+ | P_xor -> "P_xor" | |
+ | P_lsl -> "P_lsl" | |
+ | P_lsr -> "P_lsr" | |
+ | P_asr -> "P_asr" | |
+ | |
+let rec pp_value fmt value = | |
+ match value with | |
+ | V_int64 value -> | |
+ Format.fprintf fmt "V_int64 %LdL" value | |
+ | V_pair { first ; second } -> | |
+ Format.pp_print_string fmt "V_pair { first = "; | |
+ pp_value fmt first; | |
+ Format.pp_print_string fmt "; second = "; | |
+ pp_value fmt second; | |
+ Format.pp_print_string fmt " }" | |
+ | V_closure _ -> | |
+ (* TODO: Format this with an unique ID for different closures *) | |
+ Format.pp_print_string fmt "Closure" | |
+ | V_primitive { args ; prim } -> | |
+ Format.fprintf fmt "V_primitive { prim = %s ; args = [" (prim_to_string prim); | |
+ List.iter | |
+ (fun value -> | |
+ pp_value fmt value; | |
+ Format.pp_print_string fmt "; ") | |
+ args; | |
+ Format.pp_print_string fmt "] }" | |
diff --git a/src/lambda_vm/interpreter.mli b/src/lambda_vm/interpreter.mli | |
index a02b49fb..8bebf3b4 100644 | |
--- a/src/lambda_vm/interpreter.mli | |
+++ b/src/lambda_vm/interpreter.mli | |
@@ -14,3 +14,6 @@ type script_result = { | |
} | |
val execute : | |
Gas.t -> arg:Ir.value -> Ir.script -> (script_result, error) result | |
+ | |
+val pp_value : Format.formatter -> Ir.value -> unit | |
+ | |
diff --git a/src/lambda_vm/lambda_vm.mli b/src/lambda_vm/lambda_vm.mli | |
index c0b61f3a..ae79d66e 100644 | |
--- a/src/lambda_vm/lambda_vm.mli | |
+++ b/src/lambda_vm/lambda_vm.mli | |
@@ -29,3 +29,6 @@ type script_result = { | |
} | |
val execute : | |
Gas.t -> arg:value -> script -> (script_result, execution_error) result | |
+ | |
+val pp_value : Format.formatter -> value -> unit | |
+ | |
diff --git a/tests/vm/dune b/tests/vm/dune | |
new file mode 100644 | |
index 00000000..1a339dbd | |
--- /dev/null | |
+++ b/tests/vm/dune | |
@@ -0,0 +1,3 @@ | |
+(test | |
+ (name test) | |
+ (libraries lambda_vm alcotest)) | |
\ No newline at end of file | |
diff --git a/tests/vm/test.ml b/tests/vm/test.ml | |
new file mode 100644 | |
index 00000000..6084b8a9 | |
--- /dev/null | |
+++ b/tests/vm/test.ml | |
@@ -0,0 +1,74 @@ | |
+open Lambda_vm | |
+ | |
+let compilation_error_to_string: compile_error -> string = function | |
+ | Undefined_variable -> "Undefined_variable" | |
+ | |
+let execution_error_to_string = function | |
+ | Undefined_variable -> "Undefined_variable" | |
+ | Over_applied_primitives -> "Over_applied_primitives" | |
+ | Value_is_not_pair -> "Value_is_not_pair" | |
+ | Value_is_not_int64 -> "Value_is_not_int64" | |
+ | Value_is_not_function -> "Value_is_not_function" | |
+ | Value_is_not_zero -> "Value_is_not_zero" | |
+ | |
+let compile_exn gas script = | |
+ match compile gas script with | |
+ | Ok value -> value | |
+ | Error error -> failwith (compilation_error_to_string error) | |
+ | |
+let compile_value_exn gas value = | |
+ match compile_value gas value with | |
+ | Ok value -> value | |
+ | Error error -> failwith (compilation_error_to_string error) | |
+ | |
+let execute_exn gas arg script = | |
+ match execute gas ~arg script with | |
+ | Ok value -> value | |
+ | Error error -> failwith (execution_error_to_string error) | |
+ | |
+let execute_ast gas arg script = | |
+ (* TODO: Use different gas to different stuff *) | |
+ let gas = Gas.make ~initial_gas:gas in | |
+ let script = compile_exn gas script in | |
+ let arg = compile_value_exn gas arg in | |
+ execute_exn gas arg script | |
+ | |
+module Testable = struct | |
+ let value = Alcotest.testable Lambda_vm.pp_value ( = ) | |
+end | |
+ | |
+let test_increment () = | |
+ let script = | |
+ Ast.{ param = "x" | |
+ ; code = Pair { first = App { funct = Prim Add | |
+ ; arg = Pair { first = Var "x" | |
+ ; second = Const 1L } } | |
+ ; second = Pair { first = Const 0L | |
+ ; second = Const 0L } } } | |
+ in | |
+ let result = execute_ast 1901 (Int64 42L) script in | |
+ let expected_value = compile_value_exn (Gas.make ~initial_gas:101) (Int64 43L) in | |
+ | |
+ Alcotest.(check Testable.value) "Same value" expected_value result.storage | |
+ | |
+let test_decrement () = | |
+ let script = | |
+ Ast.{ param = "x" | |
+ ; code = Pair { first = App { funct = Prim Sub | |
+ ; arg = Pair { first = Var "x" | |
+ ; second = Const 1L } } | |
+ ; second = Pair { first = Const 0L | |
+ ; second = Const 0L } } } | |
+ in | |
+ | |
+ let result = execute_ast 1901 (Int64 42L) script in | |
+ let expected_value = compile_value_exn (Gas.make ~initial_gas:101) (Int64 41L) in | |
+ | |
+ Alcotest.(check Testable.value) "Same value" expected_value result.storage | |
+ | |
+let () = | |
+ let open Alcotest in | |
+ run "Lambda VM" [ | |
+ "Simple with primitive operations", | |
+ [ test_case "Increment" `Quick test_increment | |
+ ; test_case "Decrement" `Quick test_decrement ] ] | |
-- | |
2.35.1 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment