Author: chip
Date: Tue May 23 11:06:17 2006
New Revision: 12774

Modified:
   trunk/docs/pdds/clip/pdd23_exceptions.pod

Log:
Half-done.  The new opcodes and directives are certain,
and can be the basis of implementation work immediately.

Modified: trunk/docs/pdds/clip/pdd23_exceptions.pod
==============================================================================
--- trunk/docs/pdds/clip/pdd23_exceptions.pod   (original)
+++ trunk/docs/pdds/clip/pdd23_exceptions.pod   Tue May 23 11:06:17 2006
@@ -3,7 +3,7 @@
 
 =head1 NAME
 
-docs/pdds/clip/pdd23_exceptions.pod - Parrot Exceptions
+docs/pdds/pdd23_exceptions.pod - Parrot Exceptions
 
 =head1 ABSTRACT
 
@@ -16,169 +16,108 @@
 
 =head1 DESCRIPTION
 
-An exception system gives user-developed code control over how run-time
-error conditions are handled. Exceptions are errors or unusual
-conditions that require special processing. An exception handler
-performs the necessary steps to appropriately respond to a particular
-kind of exception.
+An exception system gives user-developed code control over how run-time error
+conditions are handled.  Exceptions are errors or unusual conditions that
+require special processing.  An exception handler performs the necessary steps
+to appropriately respond to a particular kind of exception.
+
+Parrot is designed to support dynamic languages, but Parrot compromises the
+principle of dynamic behavior when necessary. For example, Parrot requires any
+given subroutine to be fully compiled before it can be called.
+
+Since the structure and content of a compiled subroutine are fixed at compile
+time, it would be wasteful use the dynamic execution of opcodes at runtime to
+keep track of meta-information about that structure -- I<including the spans
+of opcodes that the programmer expects to throw exceptions, and how the
+programmer wants to handle them.>
+
+=head2 Exception PIR Directives
+
+These are the PIR directives relevant to exceptions and exception handlers:
+
+=over
+
+=item B<.begin_eh I<LABEL>>
+
+A C<.begin_eh> directive marks the beginning of a span of opcodes which the
+programmer expects to throw an exception.  If an exception occurs in the
+execution of the given opcode span, Parrot will transfer control to I<LABEL>.
+
+[XXX - Is a label a good approach?  Treating exception handlers as label jumps
+rather than full subroutines may be error-prone, but having the lexical stack
+conveniently at hand is worth a lot.]
+
+=item B<.end_eh>
+
+A C<.end_eh> marks the end of the most recent (innermost) still-open exception
+handler opcode span.
+
+=back
 
 =head2 Exception Opcodes
 
 These are the opcodes relevant to exceptions and exception handlers:
 
-=over
+=item B<throw I<PMC>>
+
+The C<throw> opcode throws the given PMC as an exception.
+
+Any PMC can be thrown, as long as you're prepared to catch it.  If there's any
+chance of cross-language calls -- and in a Parrot environment, cross-language
+operations are kind of the point -- then be prepared to catch object of
+classes you would never throw yourself.
+
+However, it is I<VERY STRONGLY RECOMMENDED> for inter-HLL operation that any
+thrown PMC that can possibly escape your private sandbox should meet the
+minimal interface requirements of the C<parrot;exception> class.
 
-=item *
+=item B<rethrow>
 
-C<push_eh> creates an exception handler and pushes it onto the control
-stack. It takes a label (the location of the exception handler) as its
-only argument. [Is this right? Treating exception handlers as label
-jumps rather than full subroutines is error-prone.]
-
-=item *
-
-C<clear_eh> removes the most recently added exception from the control
-stack.
-
-=item *
-
-C<throw> throws an exception object.
-
-=item *
-
-C<rethrow> rethrows an exception object. It can only be called from
-inside an exception handler.
-
-=item *
-
-C<die> throws an exception. It takes two arguments, one for the severity
-of the exception and one for the type of exception.
-
-If the severity is C<EXCEPT_DOOMED>, it exits via a call to
-C<_exit($2)>, which is not a catchable exception.
-
-These are the constants defined for severity:
-
-  0    EXCEPT_NORMAL
-  1    EXCEPT_WARNING
-  2    EXCEPT_ERROR
-  3    EXCEPT_SEVERE
-  4    EXCEPT_FATAL
-  5    EXCEPT_DOOMED
-  6    EXCEPT_EXIT
-
-These are the constants defined for exception types:
-
-  0    E_Exception
-  1    E_SystemExit
-  2    E_StopIteration
-  3    E_StandardError
-  4    E_KeyboardInterrupt
-  5    E_ImportError
-  6    E_EnvironmentError
-  7    E_IOError
-  8    E_OSError
-  9    E_WindowsError
-  10   E_VMSError
-  11   E_EOFError
-  12   E_RuntimeError
-  13   E_NotImplementedError
-  14   E_LibraryNotLoadedError
-  15   E_NameError
-  16   E_UnboundLocalError
-  17   E_AttributeError
-  18   E_SyntaxError
-  19   E_IndentationError
-  20   E_TabError
-  21   E_TypeError
-  22   E_AssertionError
-  23   E_LookupError
-  24   E_IndexError
-  25   E_KeyError
-  26   E_ArithmeticError
-  27   E_OverflowError
-  28   E_ZeroDivisionError
-  29   E_FloatingPointError
-  30   E_ValueError
-  31   E_UnicodeError
-  32   E_UnicodeEncodeError
-  33   E_UnicodeDecodeError
-  34   E_UnicodeTranslateError
-  35   E_ReferenceError
-  36   E_SystemError
-  37   E_MemoryError
-  37   E_LAST_PYTHON_E
-  38   BAD_BUFFER_SIZE
-  39   MISSING_ENCODING_NAME
-  40   INVALID_STRING_REPRESENTATION
-  41   ICU_ERROR
-  42   UNIMPLEMENTED
-  43   NULL_REG_ACCESS
-  44   NO_REG_FRAMES
-  45   SUBSTR_OUT_OF_STRING
-  46   ORD_OUT_OF_STRING
-  47   MALFORMED_UTF8
-  48   MALFORMED_UTF16
-  49   MALFORMED_UTF32
-  50   INVALID_CHARACTER
-  51   INVALID_CHARTYPE
-  52   INVALID_ENCODING
-  53   INVALID_CHARCLASS
-  54   NEG_REPEAT
-  55   NEG_SUBSTR
-  56   NEG_SLEEP
-  57   NEG_CHOP
-  58   INVALID_OPERATION
-  59   ARG_OP_NOT_HANDLED
-  60   KEY_NOT_FOUND
-  61   JIT_UNAVAILABLE
-  62   EXEC_UNAVAILABLE
-  63   INTERP_ERROR
-  64   PREDEREF_LOAD_ERROR
-  65   PARROT_USAGE_ERROR
-  66   PIO_ERROR
-  67   PARROT_POINTER_ERROR
-  68   DIV_BY_ZERO
-  69   PIO_NOT_IMPLEMENTED
-  70   ALLOCATION_ERROR
-  71   INTERNAL_PANIC
-  72   OUT_OF_BOUNDS
-  73   JIT_ERROR
-  74   EXEC_ERROR
-  75   ILL_INHERIT
-  76   NO_PREV_CS
-  77   NO_CLASS
-  78   LEX_NOT_FOUND
-  79   PAD_NOT_FOUND
-  80   ATTRIB_NOT_FOUND
-  81   GLOBAL_NOT_FOUND
-  82   METH_NOT_FOUND
-  83   WRITE_TO_CONSTCLASS
-  84   NOSPAWN
-  85   INTERNAL_NOT_IMPLEMENTED
-  86   ERR_OVERFLOW
-  87   LOSSY_CONVERSION
-
-=item *
-
-C<exit> throws an exception of severity C<EXCEPT_EXIT>. It takes a
-single argument for the exception type.
-
-=item *
-
-C<pushaction> pushes a subroutine object onto the control stack. If the
-control stack is unwound due to an exception (or C<popmark>, or
-subroutine return), the subroutine is invoked with an integer argument:
-C<0> means a normal return; C<1> means an exception has been raised.
-[Seems like there's lots of room for dangerous collisions here.]
+The C<rethrow> opcode rethrows the exception object which is currently being
+handled.  It can only be called from inside an exception handler.
+
+=item B<die> I<-- dead>
+
+The C<die> opcode is, ironically enough, now dead.  This section of the docs
+will be deleted soon.
+
+=item B<exit>
+
+The C<exit> opcode throws an exception of type C<parrot;exception;exit>.  If
+not caught, this exception results eventually in Parrot executing C<exit(0)>.
+
+=item B<pushaction I<SUBPMC>>
+
+C<pushaction> pushes a subroutine object onto the control stack.  If the
+control stack is unwound due to an exception (or C<popmark>, or subroutine
+return), the subroutine is invoked with an integer argument: C<0> means a
+normal return is in progress; C<1> means the stack is unwinding due to an
+exception.
+
+[XXX - Seems like there's lots of room for dangerous collisions here.
+Keep on the lookout.]
 
 =back
 
-=head1 IMPLEMENTATION
+=head1 STANDARD EXCEPTION CLASSES
+
+Parrot comes with a small hierarchy of classes designed to be thrown.  Parrot
+throws them when internal Parrot errors occur, and HLL creators and end users
+can throw them too.
+
+[[[[ TODO - introduce herarchy and minimal interface ]]]]
+
+
+
+-------------------[ WHERE CHIP LEFT OFF EDITING ]---------------------
+-------------[ TEXT BELOW THIS POINT IS PROBABLY WRONG ]---------------
+
+
+=head1 HOW PARROT HANDLES EXCEPTIONS
 
-[I'm not convinced the control stack is the right way to handle
-exceptions. Most of Parrot is based on the continuation-passing style of
-control, shouldn't exceptions be based on it too? See bug #38850.]
+[I'm not convinced the control stack is the right way to handle exceptions.
+Most of Parrot is based on the continuation-passing style of control,
+shouldn't exceptions be based on it too? See bug #38850.]
 
 =head2 Opcodes that Throw Exceptions
 

Reply via email to