Skip to content

Commit

Permalink
Add return_call example for WASM (#2693)
Browse files Browse the repository at this point in the history
* Add return_call example for WASM

* Apply suggestions from code review

Co-authored-by: Yury Delendik <ydelendik@mozilla.com>

* Update return_call.js

* Add comments

* Add the demo to the meta file

---------

Co-authored-by: Yury Delendik <ydelendik@mozilla.com>
Co-authored-by: Brian Thomas Smith <brian@smith.berlin>
  • Loading branch information
3 people authored Oct 10, 2024
1 parent 71e5651 commit b6ed883
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 2 deletions.
6 changes: 4 additions & 2 deletions live-examples/wat-examples/statements/call.wat
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
(module
;; Import the `greet` function from the environment
(import "env" "greet" (func $greet))

(func
;; call the greet function
;; Call the imported `greet` function
call $greet
)

(start 1) ;; run the first function automatically
;; Automatically run the first function when the module starts
(start 1)
)
7 changes: 7 additions & 0 deletions live-examples/wat-examples/statements/meta.json
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,13 @@
"title": "Wat Demo: return",
"type": "wat"
},
"return_call": {
"watExampleCode": "./live-examples/wat-examples/statements/return_call.wat",
"jsExampleCode": "./live-examples/wat-examples/statements/return_call.js",
"fileName": "return_call.html",
"title": "Wat Demo: return_call",
"type": "wat"
},
"select": {
"watExampleCode": "./live-examples/wat-examples/statements/select.wat",
"jsExampleCode": "./live-examples/wat-examples/statements/select.js",
Expand Down
6 changes: 6 additions & 0 deletions live-examples/wat-examples/statements/return_call.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
const url = '{%wasm-url%}';
const { instance } = await WebAssembly.instantiateStreaming(fetch(url));
const result = instance.exports.fac(5n);

console.log(result);
// Expected output: 120n
22 changes: 22 additions & 0 deletions live-examples/wat-examples/statements/return_call.wat
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
(module
;; Calculate the factorial of a number
(func $fac (export "fac") (param $x i64) (result i64)
;; Call the `fac-aux` function with $x and 1 parameters
(return_call $fac-aux (local.get $x) (i64.const 1))
)

;; Perform the factorial calculation
(func $fac-aux (param $x i64) (param $r i64) (result i64)
;; If $x is zero, return the accumulated result $r
(if (result i64) (i64.eqz (local.get $x))
(then (return (local.get $r)))
(else
;; Otherwise, recursively call `fac-aux` with $x-1 and $x*$r
(return_call $fac-aux
(i64.sub (local.get $x) (i64.const 1))
(i64.mul (local.get $x) (local.get $r))
)
)
)
)
)

0 comments on commit b6ed883

Please sign in to comment.