[pypy-svn] r15832 - pypy/dist/pypy/documentation

arigo at codespeak.net arigo at codespeak.net
Tue Aug 9 17:10:46 CEST 2005


Author: arigo
Date: Tue Aug  9 17:10:39 2005
New Revision: 15832

Modified:
   pypy/dist/pypy/documentation/translation.txt
Log:
Documentation about the interface of HighLevelOp, with a part taken from my
previous check-in message.


Modified: pypy/dist/pypy/documentation/translation.txt
==============================================================================
--- pypy/dist/pypy/documentation/translation.txt	(original)
+++ pypy/dist/pypy/documentation/translation.txt	Tue Aug  9 17:10:39 2005
@@ -833,6 +833,93 @@
 See for example `rpython/rlist.py`_.
 
 
+HighLevelOp interface
++++++++++++++++++++++
+
+In the absence of more extensive documentation about how RPython types are
+implemented, here is the interface and intended usage of the 'hop'
+argument that appears everywhere.  A 'hop' is a HighLevelOp instance,
+which represents a single high-level operation that must be turned into
+one or several low-level operations.
+
+    ``hop.llops``
+        A list-like object that records the low-level operations that
+        correspond to the current block's high-level operations.
+
+    ``hop.genop(opname, list_of_variables, resulttype=resulttype)``
+        Append a low-level operation to ``hop.llops``.  The operation has
+        the given opname and arguments, and returns the given low-level
+        resulttype.  The arguments should come from the ``hop.input*()``
+        functions described below.
+
+    ``hop.gendirectcall(ll_function, var1, var2...)``
+        Like hop.genop(), but produces a ``direct_call`` operation that
+        invokes the given low-level function, which is automatically
+        annotated with low-level types based on the input arguments.
+
+    ``hop.inputargs(r1, r2...)``
+        Reads the high-level Variables and Constants that are the
+        arguments of the operation, and convert them if needed so that
+        they have the specified representations.  You must provide as many
+        representations as the operation has arguments.  Returns a list of
+        (possibly newly converted) Variables and Constants.
+
+    ``hop.inputarg(r, arg=i)``
+        Same as inputargs(), but only converts and returns the ith
+        argument.
+
+    ``hop.inputconst(lltype, value)``
+        Returns a Constant with a low-level type and value.
+
+Manipulation of HighLevelOp instances (this is used e.g. to insert a
+'self' implicit argument to translate method calls):
+
+    ``hop.copy()``
+        Returns a fresh copy that can be manipulated with the functions
+        below.
+
+    ``hop.r_s_popfirstarg()``
+        Removes the first argument of the high-level operation.  This
+        doesn't really changes the source SpaceOperation, but modifies
+        'hop' in such a way that methods like inputargs() no longer see
+        the removed argument.
+
+    ``hop.v_s_insertfirstarg(v_newfirstarg, s_newfirstarg)``
+        Insert an argument in front of the hop.  It must be specified by
+        a Variable (as in calls to hop.genop()) and a corresponding
+        annotation.
+
+    ``hop.swap_fst_snd_args()``
+        Self-descriptive.
+
+Exception handling:
+
+    ``hop.has_implicit_exception(cls)``
+        Checks if hop is in the scope of a branch catching the exception 
+        'cls'.  This is useful for high-level operations like 'getitem'
+        that have several low-level equivalents depending on whether they
+        should check for an IndexError or not.  Calling
+        has_implicit_exception() also has a side-effect: the rtyper
+        records that this exception is being taken care of explicitely.
+
+    ``hop.exception_is_here()``
+        To be called with no argument just before a llop is generated.  It
+        means that the llop in question will be the one that should be
+        protected by the exception catching.  If has_implicit_exception()
+        was called before, then exception_is_here() verifies that *all*
+        except links in the graph have indeed been checked for with an
+        has_implicit_exception().  This is not verified if
+        has_implicit_exception() has never been called -- useful for
+        'direct_call' and other operations that can just raise any exception.
+
+    ``hop.exception_cannot_occur()``
+        A special case for ``override:ignore`` meaning that there is, after
+        all, no operation left that could raise an exception.  (The RTyper
+        class normally verifies that exception_is_here() was really called
+        once for each high-level operation that is in the scope of
+        exception-catching links.)
+
+
 
 .. _C:
 .. _GenC:



More information about the Pypy-commit mailing list