diff options
Diffstat (limited to 'erts/emulator/beam/error.h')
-rw-r--r-- | erts/emulator/beam/error.h | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/erts/emulator/beam/error.h b/erts/emulator/beam/error.h new file mode 100644 index 0000000000..4930def4ed --- /dev/null +++ b/erts/emulator/beam/error.h @@ -0,0 +1,196 @@ +/* + * %CopyrightBegin% + * + * Copyright Ericsson AB 1996-2009. All Rights Reserved. + * + * The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved online at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * %CopyrightEnd% + */ + +#ifndef __ERROR_H__ +#define __ERROR_H__ + +/* + * There are three primary exception classes: + * + * - exit Process termination - not an error. + * - error Error (adds stacktrace; will be logged). + * - thrown Nonlocal return (turns into a 'nocatch' + * error if not caught by the process). + * + * In addition, we define a number of exit codes as a convenient + * short-hand: instead of building the error descriptor term at the time + * the exception is raised, it is built as necessary when the exception + * is handled. Examples are EXC_NORMAL, EXC_BADARG, EXC_BADARITH, etc. + * Some of these have convenient aliases, like BADARG and BADARITH. + */ + +/* + * Bits 0-1 index the 'exception class tag' table. + */ +#define EXC_CLASSBITS 3 +#define GET_EXC_CLASS(x) ((x) & EXC_CLASSBITS) + +/* + * Exception class tags (indices into the 'exception_tag' array) + */ +#define EXTAG_ERROR 0 +#define EXTAG_EXIT 1 +#define EXTAG_THROWN 2 + +#define NUMBER_EXC_TAGS 3 /* The number of exception class tags */ + +/* + * Exit code flags (bits 2-7) + * + * These flags make is easier and quicker to decide what to do with the + * exception in the early stages, before a handler is found, and also + * maintains some separation between the class tag and the actions. + */ +#define EXF_PANIC (1<<2) /* ignore catches */ +#define EXF_THROWN (1<<3) /* nonlocal return */ +#define EXF_LOG (1<<4) /* write to logger on termination */ +#define EXF_NATIVE (1<<5) /* occurred in native code */ +#define EXF_SAVETRACE (1<<6) /* save stack trace in internal form */ +#define EXF_ARGLIST (1<<7) /* has arglist for top of trace */ + +#define EXC_FLAGBITS 0x00fc + +/* + * The primary fields of an exception code + */ +#define EXF_PRIMARY (EXF_PANIC | EXF_THROWN | EXF_LOG | EXF_NATIVE) +#define PRIMARY_EXCEPTION(x) ((x) & (EXF_PRIMARY | EXC_CLASSBITS)) +#define NATIVE_EXCEPTION(x) ((x) | EXF_NATIVE) + +/* + * Bits 8-12 of the error code are used for indexing into + * the short-hand error descriptor table. + */ +#define EXC_INDEXBITS 0x1f00 +#define GET_EXC_INDEX(x) (((x) & EXC_INDEXBITS) >> 8) + +/* + * Exit codes used for raising a fresh exception. The primary exceptions + * share index 0 in the descriptor table. EXC_NULL signals that no + * exception has occurred. The primary exit codes EXC_EXIT, EXC_ERROR + * and EXC_THROWN are the basis for all other exit codes, and must + * always have the EXF_SAVETRACE flag set so that a trace is saved + * whenever a new exception occurs; the flag is then cleared. + */ +#define EXC_NULL 0 /* Initial value for p->freason */ +#define EXC_PRIMARY (0 | EXF_SAVETRACE) +#define EXC_ERROR (EXC_PRIMARY | EXTAG_ERROR | EXF_LOG) + /* Generic error (exit term + * in p->fvalue) */ +#define EXC_EXIT (EXC_PRIMARY | EXTAG_EXIT) + /* Generic exit (exit term + * in p->fvalue) */ +#define EXC_THROWN (EXC_PRIMARY | EXTAG_THROWN | EXF_THROWN) + /* Generic nonlocal return + * (thrown term in p->fvalue) */ + +#define EXC_ERROR_2 (EXC_ERROR | EXF_ARGLIST) + /* Error with given arglist term + * (exit reason in p->fvalue) */ + +#define EXC_NORMAL ((1 << 8) | EXC_EXIT) + /* Normal exit (reason 'normal') */ +#define EXC_INTERNAL_ERROR ((2 << 8) | EXC_ERROR | EXF_PANIC) + /* Things that shouldn't happen */ +#define EXC_BADARG ((3 << 8) | EXC_ERROR) + /* Bad argument to a BIF */ +#define EXC_BADARITH ((4 << 8) | EXC_ERROR) + /* Bad arithmetic */ +#define EXC_BADMATCH ((5 << 8) | EXC_ERROR) + /* Bad match in function body */ +#define EXC_FUNCTION_CLAUSE ((6 << 8) | EXC_ERROR) + /* No matching function head */ +#define EXC_CASE_CLAUSE ((7 << 8) | EXC_ERROR) + /* No matching case clause */ +#define EXC_IF_CLAUSE ((8 << 8) | EXC_ERROR) + /* No matching if clause */ +#define EXC_UNDEF ((9 << 8) | EXC_ERROR) + /* No farity that matches */ +#define EXC_BADFUN ((10 << 8) | EXC_ERROR) + /* Not an existing fun */ +#define EXC_BADARITY ((11 << 8) | EXC_ERROR) + /* Attempt to call fun with + * wrong number of arguments. */ +#define EXC_TIMEOUT_VALUE ((12 << 8) | EXC_ERROR) + /* Bad time out value */ +#define EXC_NOPROC ((13 << 8) | EXC_ERROR) + /* No process or port */ +#define EXC_NOTALIVE ((14 << 8) | EXC_ERROR) + /* Not distributed */ +#define EXC_SYSTEM_LIMIT ((15 << 8) | EXC_ERROR) + /* Ran out of something */ +#define EXC_TRY_CLAUSE ((16 << 8) | EXC_ERROR) + /* No matching try clause */ +#define EXC_NOTSUP ((17 << 8) | EXC_ERROR) + /* Not supported */ + +#define NUMBER_EXIT_CODES 18 /* The number of exit code indices */ + +/* + * Internal pseudo-error codes. + */ +#define TRAP (1 << 8) /* BIF Trap to erlang code */ + +/* + * Aliases for some common exit codes. + */ +#define BADARG EXC_BADARG +#define BADARITH EXC_BADARITH +#define BADMATCH EXC_BADMATCH +#define SYSTEM_LIMIT EXC_SYSTEM_LIMIT + + +/* + * Pseudo error codes (these are never seen by the user). + */ +#define TLOAD_OK 0 /* The threaded code linking was successful */ +#define TLOAD_MAGIC_NUMBER 1 /* Wrong kind of object file */ +#define TLOAD_FORMAT 2 /* Format error while reading object code */ +#define TLOAD_MODULE 3 /* Module name in object code does not match */ +#define TLOAD_SIZE 4 /* Given size in object code differs from actual size */ + +/* + * The exception stack trace parameters. + */ +#define MAX_BACKTRACE_SIZE 64 /* whatever - just not too huge */ +#define DEFAULT_BACKTRACE_SIZE 8 + +/* + * The table translating an exception code to an atom. + */ +extern Eterm error_atom[NUMBER_EXIT_CODES]; + +/* + * The exception tag table. + */ +extern Eterm exception_tag[NUMBER_EXC_TAGS]; + +/* + * The quick-saved stack trace structure + */ +struct StackTrace { + Eterm header; /* bignum header - must be first in struct */ + Eterm freason; /* original exception reason is saved in the struct */ + Eterm* pc; + Eterm* current; + int depth; /* number of saved pointers in trace[] */ + Eterm *trace[1]; /* varying size - must be last in struct */ +}; + +#endif /* __ERROR_H__ */ |