Button for 1977 Button for 1984 Button for 1990 Button for 1995 Button for MDC Button for notes Button for examples
Left Hand Pointer

QUIT

1995 Version of ANSI (Equivalent to Current ISO Version) of Standard

Right Hand Pointer

8.2.16 Quit

Q[UIT] postcond


[ SP ]
SP expr
SP @ expratom V expr



Quit terminates execution of an argumentless Do command, doargument, xargument, exfunc, exvar, or For command.

Encountering the end-of-routine mark eor is equivalent to an unconditional argumentless Quit.

The effect of executing Quit in the scope of For is fully discussed in 8.2.5. Note the eor never occurs in the scope of For.

If an executed Quit is not in the scope of For, then it is in the scope of some argumentless Do command, doargument, xargument, exfunc, or exvar if not explicitly then implicitly, because the initial activation of a process, including that due to execution of a jobargument, may be thought of as arising from execution of a Do naming the first executed routine of that process.

The effect of executing a Quit in the scope of an argumentless Do command, doargument, xargument, exfunc, or exvar is to restore the previous variable environment (if necessary), restore the value of $Test (if necessary), restore the previous execution level, and continue execution at the location of the invoking argumentless Do command, doargument, xargument, exfunc, or exvar.

If the expr is present in the Quit and the return is not to an exfunc or exvar, an error condition occurs with ecode="M16". If the expr is not present and the return is to an exfunc or exvar, an error condition occurs with ecode="M17".

The following discussion uses terms defined in the Variable Handling (see 7.1.2.2) and Process-Stack (see 7.1.2.3) models and, like those subclauses, does not imply a required implementation technique.

Execution of a Quit occurs as follows:

  1. If an expr is present, evaluate it. This value becomes the value of the invoking exfunc or exvar.
  2. Remove the frame on the top of the PROCESS-STACK. If no such frame exists, then execute an implicit Halt.
  3. If the PROCESS-STACK frame's linked list of CONTEXT-STRUCTUREs contains New NAME-TABLEs, process them in last-in-first-out order from their creation. If the CONTEXT-STRUCTURE is exclusive, make all entries in the currently active local variable NAME-TABLE point to empty DATA-CELLs. In all cases, the New NAME-TABLEs are copied to the currently active NAME-TABLEs. Note that, in the model, Quit never encounters any restart CONTEXT-STRUCTUREs in the linked list because they must have been removed by TCommits or ROLLBACKs for the Quit to reach this point in its execution.
  4. If the frame contains formal list information, extract the formallist and process each name in the list with the following steps:
    1. Search the NAME-TABLE for an entry containing the name. If no such entry is found, processing of this name is complete. Otherwise, proceed to step 2.
    2. Delete the NAME-TABLE entry for this name.
  5. Finally, copy all NAME-TABLE entries from this frame into the NAME-TABLE.

    Processing of this frame is complete, continue at step b.

  6. If the frame is a TStart frame and $TLevel is greater than zero, Quit generates an error with ecode="M42". If the frame is a TStart frame and $TLevel is zero, then the frame is discarded.
  7. If the frame is from an exfunc or exvar or from an argumentless Do command, set the value of $Test to the value saved in the frame.
  8. Restore the execution level and continue execution at the location specified in the frame.
Button for 1977 Button for 1984 Button for 1990 Button for 1995 Button for MDC Button for notes Button for examples

Copyright © Standard Documents; 1977-2018 MUMPS Development Committee;
Copyright © Examples: 1995-2018 Ed de Moel;
Copyright © Annotations: 2003-2008 Jacquard Systems Research
Copyright © Annotations: 2008-2018 Ed de Moel.

This page most recently updated on 13-Sep-2014, 12:20:07 .

For comments, contact Ed de Moel (demoel@jacquardsystems.com)