Cleanup val.h docs (#15212)

Co-authored-by: Alon Zakai <azakai@google.com>
diff --git a/site/source/docs/api_reference/val.h.rst b/site/source/docs/api_reference/val.h.rst
index 3cf898c..d056d94 100644
--- a/site/source/docs/api_reference/val.h.rst
+++ b/site/source/docs/api_reference/val.h.rst
@@ -1,10 +1,8 @@
 .. _val-h:
 
-================================
-val.h (under-construction)
-================================
-
-.. COMMENT (Not rendered) : This created from val.h header file on 10 Aug 2014-03
+=====
+val.h
+=====
 
 The *Embind* C++ class :cpp:class:`emscripten::val` (defined in `val.h <https://github.com/emscripten-core/emscripten/blob/main/system/include/emscripten/val.h>`_) is used to *transliterate* JavaScript code to C++.
 
@@ -31,7 +29,7 @@
   .. code:: cpp
 
     val xhr = val::global("XMLHttpRequest").new_();
-    xhr.call("open", std::string("GET"), std::string("http://url"));
+    xhr.call<void>("open", std::string("GET"), std::string("http://url"));
 
   You can test whether the ``open`` method call was successful using :cpp:func:`~emscripten::val::operator[]` to read an object property, then :cpp:func:`~emscripten::val::as` to coerce the type:
 
@@ -48,7 +46,16 @@
     }
 
   See :ref:`embind-val-guide` for other examples.
+  
 
+  .. warning:: JavaScript values can't be shared across threads, so neither can ``val`` instances that bind them.
+    
+    For example, if you want to cache some JavaScript global as a ``val``, you need to retrieve and bind separate instances of that global by its name in each thread.
+    The easiest way to do this is with a ``thread_local`` declaration:
+
+    .. code:: cpp
+
+      thread_local const val Uint8Array = val::global("Uint8Array");
 
   .. todo::
 
@@ -74,193 +81,129 @@
 
     Creates and returns a new ``Array``.
 
-    :returns: The new ``Array``.
-
 
   .. cpp:function:: static val object()
 
     Creates and returns a new ``Object``.
 
-    :returns: The new ``Object``.
-
 
   .. cpp:function:: static val undefined()
 
     Creates a ``val`` that represents ``undefined``.
 
-    :returns: The ``val`` that represents ``undefined``.
-
 
   .. cpp:function:: static val null()
 
-    Creates a ``val`` that represents ``null``. ``val::undefined()`` is the same, but for undefined.
-
-    :returns: A ``val`` that represents ``null``.
-
-
-  .. cpp:function:: static val take_ownership(internal::EM_VAL e)
-
-    **HamishW**-Replace with description.
-
-    :returns: **HamishW**-Replace with description.
+    Creates a ``val`` that represents ``null``.
 
 
   .. cpp:function:: static val global(const char* name)
 
-    Looks up a global symbol.
-
-    :param const char* name: **HamishW**-Replace with description.
-    :returns: **HamishW**-Replace with description.
+    Looks up a global value by the specified ``name``.
 
 
 
   .. cpp:function:: static val module_property(const char* name)
 
-    Looks up a symbol on the emscripten Module object.
-
-    :param const char* name: **HamishW**-Replace with description.
-    :returns: **HamishW**-Replace with description.
+    Looks up a value by the provided ``name`` on the Emscripten Module object.
 
 
   .. cpp:function:: explicit val(T&& value)
 
     Constructor.
 
-    A ``val`` can be constructed by explicit construction from any C++ type. For example, ``val(true)`` or ``val(std::string("foo"))``.
-
-    :param T&& value: Any C++ type.
-
-
-  **HamishW** Don't know how following "floating statement works". Leaving here for discussion
-  ``val() = delete;``
+    Creates a ``val`` by conversion from any Embind-compatible C++ type.
+    For example, ``val(true)`` or ``val(std::string("foo"))``.
 
 
   .. cpp:function:: explicit val(const char* v)
 
-    **HamishW**-Replace with description.
-
-    :param const char* v: **HamishW**-Replace with description.
+    Constructs a ``val`` instance from a string literal.
 
 
   .. cpp:function:: val(val&& v)
-
-    **HamishW**-Replace with description.
-
-    :param val&& v: **HamishW**-Replace with description.
+    
+    Moves ownership of a value to a new ``val`` instance.
 
 
   .. cpp:function:: val(const val& v)
-
-    **HamishW**-Replace with description.
-
-    :param const val& v: **HamishW**-Replace with description.
+    
+    Creates another reference to the same value behind the provided ``val`` instance.
 
 
   .. cpp:function:: ~val()
 
-    Destructor. **HamishW**-Replace with further description or delete comment.
+    Removes the currently bound value by decreasing its refcount.
 
 
   .. cpp:function:: val& operator=(val&& v)
-
-    **HamishW**-Replace with description.
-
-    :param val&& v: **HamishW**-Replace with description.
-    :returns: **HamishW**-Replace with description.
+    
+    Removes a reference to the currently bound value and takes over the provided one.
 
 
   .. cpp:function:: val& operator=(const val& v)
 
-    **HamishW**-Replace with description.
-
-    :param val&& v: **HamishW**-Replace with description.
-    :returns: **HamishW**-Replace with description.
+    Removes a reference to the currently bound value and creates another reference to
+    the value behind the provided ``val`` instance.
 
 
   .. cpp:function:: bool hasOwnProperty(const char* key) const
 
-    Test whether ... **HamishW**-Replace with description.
-
-    :param const char* key: **HamishW**-Replace with description.
-    :returns: **HamishW**-Replace with description.
+    Checks if the JavaScript object has own (non-inherited) property with the specified name.
 
 
-  .. cpp:function:: val new_()
+  .. cpp:function:: val new_(Args&&... args) const
 
-    prototype:
-
-    ::
-
-      template<typename... Args>
-      val new_(Args&&... args) const
-
-    **HamishW**-Replace with description.
-
-    :param Args&&... args: **HamishW**-Replace with description. Note that this is a templated value.
-    :returns: **HamishW**-Replace with description.
+    Assumes that current value is a constructor, and creates an instance of it.
+    Equivalent to a JavaScript expression `new currentValue(...)`.
 
 
 
   .. cpp:function:: val operator[](const T& key) const
 
-    **HamishW**-Replace with description.
-
-    :param const T& key: **HamishW**-Replace with description. Note that this is a templated value.
-    :returns: **HamishW**-Replace with description.
+    Get the specified (``key``) property of a JavaScript object.
 
 
   .. cpp:function:: void set(const K& key, const val& v)
 
-    Set the specified (``key``) property of a JavaScript object (accessed through a ``val``) with the value ``v``. **HamishW**-Replace with description.
-
-    :param const K& key: **HamishW**-Replace with description. Note that this is a templated value.
-    :param const val& v: **HamishW**-Replace with description.   Note that this is a templated value.
+    Set the specified (``key``) property of a JavaScript object (accessed through a ``val``) with the value ``v``.
 
 
-  .. cpp:function:: val operator()(Args&&... args)
-
-    **HamishW**-Replace with description.
-
-    :param Args&&... args: **HamishW**-Replace with description. Note that this is a templated value.
+  .. cpp:function:: val operator()(Args&&... args) const
+    
+    Assumes that current value is a function, and invokes it with provided arguments.
 
 
   .. cpp:function:: ReturnValue call(const char* name, Args&&... args) const
 
-    **HamishW**-Replace with description.
-
-    :param const char* name: **HamishW**-Replace with description.
-    :param Args&&... args: **HamishW**-Replace with description. Note that this is a templated value.
+    Invokes the specified method (``name``) on the current object with provided arguments.
 
 
   .. cpp:function:: T as() const
 
-    **HamishW**-Replace with description.
-
-    :returns: **HamishW**-Replace with description. Note that this is a templated value.
+    Converts current value to the specified C++ type.
 
 
   .. cpp:function:: val typeof() const
 
-    **HamishW**-Replace with description.
-
-    :returns: **HamishW**-Replace with description.
+    Returns the result of a JavaScript ``typeof`` operator invoked on the current value.
 
 
   .. cpp:function:: std::vector<T> vecFromJSArray(const val& v)
 
-    Copies a javascript array into a std::vector, checking the type of each element.
-    For a more efficient but unsafe version working with numbers, see convertJSArrayToNumberVector.
+    Copies a JavaScript array into a ``std::vector<T>``, converting each element via ``.as<T>()``.
+    For a more efficient but unsafe version working with numbers, see ``convertJSArrayToNumberVector``.
 
-    :param val v: The javascript array to be copied
-    :returns: A std::vector<T> made from the javascript array
+    :param val v: The JavaScript array to be copied
+    :returns: A ``std::vector<T>`` made from the javascript array
 
   .. cpp:function:: std::vector<T> convertJSArrayToNumberVector(const val& v)
 
-    Converts a javascript object into a std::vector<T> efficiently, as if using the javascript `Number()` function on each element.
-    This is way more efficient than vecFromJSArray on any array with more than 2 values, but is less safe.
-    No type checking is done, so any invalid array entry will silently be replaced by a NaN value (or 0 for interger types).
+    Converts a JavaScript array into a ``std::vector<T>`` efficiently, as if using the javascript `Number()` function on each element.
+    This is way more efficient than ``vecFromJSArray`` on any array with more than 2 values, but is not suitable for arrays of non-numeric values.
+    No type checking is done, so any invalid array entry will silently be replaced by a NaN value (or 0 for integer types).
 
-    :param val v: The javascript (typed) array to be copied
+    :param val v: The JavaScript (typed) array to be copied
     :returns: A std::vector<T> made from the javascript array
 
 
@@ -270,7 +213,7 @@
 
     :returns: The fulfilled value.
 
-    This method requires :ref:`Asyncify` to be enabled.
+      .. note:: This method requires :ref:`Asyncify` to be enabled.
 
 
 .. cpp:type: EMSCRIPTEN_SYMBOL(name)