diff --git a/runtime/wasm/domain.wat b/runtime/wasm/domain.wat index 2ba72bcf9..d07d70053 100644 --- a/runtime/wasm/domain.wat +++ b/runtime/wasm/domain.wat @@ -19,11 +19,6 @@ (type $block (array (mut (ref eq)))) (type $function_1 (func (param (ref eq) (ref eq)) (result (ref eq)))) (type $closure (sub (struct (;(field i32);) (field (ref $function_1))))) - (import "sync" "caml_ml_mutex_unlock" - (func $caml_ml_mutex_unlock (param (ref eq)) (result (ref eq)))) - (import "obj" "caml_callback_1" - (func $caml_callback_1 - (param (ref eq)) (param (ref eq)) (result (ref eq)))) (func (export "caml_atomic_cas") (param $ref (ref eq)) (param $o (ref eq)) (param $n (ref eq)) @@ -96,20 +91,9 @@ (param (ref eq)) (result (ref eq)) (ref.i31 (i32.const 1))) - (global $caml_domain_id (mut i32) (i32.const 0)) - (global $caml_domain_latest_id (mut i32) (i32.const 1)) - - (func (export "caml_domain_spawn") - (param $f (ref eq)) (param $mutex (ref eq)) (result (ref eq)) - (local $id i32) (local $old i32) - (local.set $id (global.get $caml_domain_latest_id)) - (global.set $caml_domain_latest_id - (i32.add (local.get $id) (i32.const 1))) - (local.set $old (global.get $caml_domain_id)) - (drop (call $caml_callback_1 (local.get $f) (ref.i31 (i32.const 0)))) - (global.set $caml_domain_id (local.get $old)) - (drop (call $caml_ml_mutex_unlock (local.get $mutex))) - (ref.i31 (local.get $id))) + (global $caml_domain_id (export "caml_domain_id") (mut i32) (i32.const 0)) + (global $caml_domain_latest_id (export "caml_domain_latest_id") (mut i32) + (i32.const 1)) (func (export "caml_ml_domain_id") (param (ref eq)) (result (ref eq)) (ref.i31 (global.get $caml_domain_id))) diff --git a/runtime/wasm/dune b/runtime/wasm/dune index 2923b1ac9..4ec8e8693 100644 --- a/runtime/wasm/dune +++ b/runtime/wasm/dune @@ -3,6 +3,32 @@ (package wasm_of_ocaml-compiler) (files runtime.wasm runtime.js)) +(rule + (target version-dependent.wat) + (deps version-dependent/post-5.2.wat) + (enabled_if + (>= %{ocaml_version} 5.2.0)) + (action + (copy %{deps} %{target}))) + +(rule + (target version-dependent.wat) + (deps version-dependent/post-5.2.wat) + (enabled_if + (and + (>= %{ocaml_version} 5.1.0) + (< %{ocaml_version} 5.2.0))) + (action + (copy %{deps} %{target}))) + +(rule + (target version-dependent.wat) + (deps version-dependent/pre-5.1.wat) + (enabled_if + (< %{ocaml_version} 5.1.0)) + (action + (copy %{deps} %{target}))) + (rule (target runtime.wasm) (deps diff --git a/runtime/wasm/marshal.wat b/runtime/wasm/marshal.wat index 491d84385..46373b2bf 100644 --- a/runtime/wasm/marshal.wat +++ b/runtime/wasm/marshal.wat @@ -48,8 +48,8 @@ (func $caml_find_custom_operations (param (ref $string)) (result (ref null $custom_operations)))) - (global $caml_marshal_header_size (export "caml_marshal_header_size") - (mut i32) (i32.const 20)) + (import "version-dependent" "caml_marshal_header_size" + (global $caml_marshal_header_size i32)) (global $input_val_from_string (ref $string) (array.new_fixed $string 21 diff --git a/runtime/wasm/runtime_events.wat b/runtime/wasm/runtime_events.wat index ff77e5570..8a50583cd 100644 --- a/runtime/wasm/runtime_events.wat +++ b/runtime/wasm/runtime_events.wat @@ -33,10 +33,6 @@ (local.get $evtag) (local.get $evtype))) - (func (export "caml_runtime_events_user_write") - (param (ref eq)) (param (ref eq)) (param (ref eq)) (result (ref eq)) - (ref.i31 (i32.const 0))) - (func (export "caml_runtime_events_user_resolve") (param (ref eq)) (param (ref eq)) (param (ref eq)) (result (ref eq)) (ref.i31 (i32.const 0))) diff --git a/runtime/wasm/version-dependent/post-5.1.wat b/runtime/wasm/version-dependent/post-5.1.wat new file mode 100644 index 000000000..258505a5e --- /dev/null +++ b/runtime/wasm/version-dependent/post-5.1.wat @@ -0,0 +1,46 @@ +;; Wasm_of_ocaml runtime support +;; http://www.ocsigen.org/js_of_ocaml/ +;; +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU Lesser General Public License as published by +;; the Free Software Foundation, with linking exception; +;; either version 2.1 of the License, or (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU Lesser General Public License for more details. +;; +;; You should have received a copy of the GNU Lesser General Public License +;; along with this program; if not, write to the Free Software +;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +(module + (import "obj" "caml_callback_1" + (func $caml_callback_1 + (param (ref eq)) (param (ref eq)) (result (ref eq)))) + (import "sync" "caml_ml_mutex_unlock" + (func $caml_ml_mutex_unlock (param (ref eq)) (result (ref eq)))) + (import "domain" "caml_domain_latest_id" + (global $caml_domain_latest_id (mut i32))) + (import "domain" "caml_domain_id" + (global $caml_domain_id (mut i32))) + + (func (export "caml_runtime_events_user_write") + (param (ref eq)) (param (ref eq)) (result (ref eq)) + (ref.i31 (i32.const 0))) + + (func (export "caml_domain_spawn") + (param $f (ref eq)) (param $mutex (ref eq)) (result (ref eq)) + (local $id i32) (local $old i32) + (local.set $id (global.get $caml_domain_latest_id)) + (global.set $caml_domain_latest_id + (i32.add (local.get $id) (i32.const 1))) + (local.set $old (global.get $caml_domain_id)) + (drop (call $caml_callback_1 (local.get $f) (ref.i31 (i32.const 0)))) + (global.set $caml_domain_id (local.get $old)) + (drop (call $caml_ml_mutex_unlock (local.get $mutex))) + (ref.i31 (local.get $id))) + + (global (export "caml_marshal_header_size") i32 (i32.const 16)) +) diff --git a/runtime/wasm/version-dependent/post-5.2.wat b/runtime/wasm/version-dependent/post-5.2.wat new file mode 100644 index 000000000..b4183d2dc --- /dev/null +++ b/runtime/wasm/version-dependent/post-5.2.wat @@ -0,0 +1,59 @@ +;; Wasm_of_ocaml runtime support +;; http://www.ocsigen.org/js_of_ocaml/ +;; +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU Lesser General Public License as published by +;; the Free Software Foundation, with linking exception; +;; either version 2.1 of the License, or (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU Lesser General Public License for more details. +;; +;; You should have received a copy of the GNU Lesser General Public License +;; along with this program; if not, write to the Free Software +;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +(module + (type $block (array (mut (ref eq)))) + (import "obj" "caml_callback_1" + (func $caml_callback_1 + (param (ref eq)) (param (ref eq)) (result (ref eq)))) + (import "sync" "caml_ml_mutex_unlock" + (func $caml_ml_mutex_unlock (param (ref eq)) (result (ref eq)))) + (import "domain" "caml_domain_latest_id" + (global $caml_domain_latest_id (mut i32))) + (import "domain" "caml_domain_id" + (global $caml_domain_id (mut i32))) + + (func (export "caml_runtime_events_user_write") + (param (ref eq)) (param (ref eq)) (param (ref eq)) (result (ref eq)) + (ref.i31 (i32.const 0))) + + (func (export "caml_domain_spawn") + (param $f (ref eq)) (param $term_sync_v (ref eq)) (result (ref eq)) + (local $id i32) (local $old i32) (local $ts (ref $block)) (local $res (ref eq)) + (local.set $id (global.get $caml_domain_latest_id)) + (global.set $caml_domain_latest_id + (i32.add (local.get $id) (i32.const 1))) + (local.set $old (global.get $caml_domain_id)) + (local.set $res + (call $caml_callback_1 (local.get $f) (ref.i31 (i32.const 0)))) + (global.set $caml_domain_id (local.get $old)) + (local.set $ts (ref.cast (ref $block) (local.get $term_sync_v))) + (drop (call $caml_ml_mutex_unlock (array.get $block (local.get $ts) (i32.const 2)))) + ;; TODO: fix exn case + (array.set + $block + (local.get $ts) + (i32.const 1) + (array.new_fixed + $block + 2 + (ref.i31 (i32.const 0)) + (array.new_fixed $block 2 (ref.i31 (i32.const 0)) (local.get $res)))) + (ref.i31 (local.get $id))) + + (global (export "caml_marshal_header_size") i32 (i32.const 16)) +) diff --git a/runtime/wasm/version-dependent/pre-5.1.wat b/runtime/wasm/version-dependent/pre-5.1.wat new file mode 100644 index 000000000..cc23b90ad --- /dev/null +++ b/runtime/wasm/version-dependent/pre-5.1.wat @@ -0,0 +1,46 @@ +;; Wasm_of_ocaml runtime support +;; http://www.ocsigen.org/js_of_ocaml/ +;; +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU Lesser General Public License as published by +;; the Free Software Foundation, with linking exception; +;; either version 2.1 of the License, or (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU Lesser General Public License for more details. +;; +;; You should have received a copy of the GNU Lesser General Public License +;; along with this program; if not, write to the Free Software +;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +(module + (import "obj" "caml_callback_1" + (func $caml_callback_1 + (param (ref eq)) (param (ref eq)) (result (ref eq)))) + (import "sync" "caml_ml_mutex_unlock" + (func $caml_ml_mutex_unlock (param (ref eq)) (result (ref eq)))) + (import "domain" "caml_domain_latest_id" + (global $caml_domain_latest_id (mut i32))) + (import "domain" "caml_domain_id" + (global $caml_domain_id (mut i32))) + + (func (export "caml_runtime_events_user_write") + (param (ref eq)) (param (ref eq)) (result (ref eq)) + (ref.i31 (i32.const 0))) + + (func (export "caml_domain_spawn") + (param $f (ref eq)) (param $mutex (ref eq)) (result (ref eq)) + (local $id i32) (local $old i32) + (local.set $id (global.get $caml_domain_latest_id)) + (global.set $caml_domain_latest_id + (i32.add (local.get $id) (i32.const 1))) + (local.set $old (global.get $caml_domain_id)) + (drop (call $caml_callback_1 (local.get $f) (ref.i31 (i32.const 0)))) + (global.set $caml_domain_id (local.get $old)) + (drop (call $caml_ml_mutex_unlock (local.get $mutex))) + (ref.i31 (local.get $id))) + + (global (export "caml_marshal_header_size") i32 (i32.const 20)) +)