blob: 25b30b2805180252fca0c044895622c9374200f6 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
#ifndef NVIM_EX_EVAL_H
#define NVIM_EX_EVAL_H
#include "nvim/ex_cmds_defs.h" // for exarg_T
#include "nvim/pos.h" // for linenr_T
/* There is no CSF_IF, the lack of CSF_WHILE, CSF_FOR and CSF_TRY means ":if"
* was used. */
#define CSF_TRUE 0x0001 // condition was TRUE
#define CSF_ACTIVE 0x0002 // current state is active
#define CSF_ELSE 0x0004 // ":else" has been passed
#define CSF_WHILE 0x0008 // is a ":while"
#define CSF_FOR 0x0010 // is a ":for"
#define CSF_TRY 0x0100 // is a ":try"
#define CSF_FINALLY 0x0200 // ":finally" has been passed
#define CSF_THROWN 0x0400 // exception thrown to this try conditional
#define CSF_CAUGHT 0x0800 // exception caught by this try conditional
#define CSF_SILENT 0x1000 // "emsg_silent" reset by ":try"
/* Note that CSF_ELSE is only used when CSF_TRY and CSF_WHILE are unset
* (an ":if"), and CSF_SILENT is only used when CSF_TRY is set. */
/*
* What's pending for being reactivated at the ":endtry" of this try
* conditional:
*/
#define CSTP_NONE 0 // nothing pending in ":finally" clause
#define CSTP_ERROR 1 // an error is pending
#define CSTP_INTERRUPT 2 // an interrupt is pending
#define CSTP_THROW 4 // a throw is pending
#define CSTP_BREAK 8 // ":break" is pending
#define CSTP_CONTINUE 16 // ":continue" is pending
#define CSTP_RETURN 24 // ":return" is pending
#define CSTP_FINISH 32 // ":finish" is pending
/*
* A list of error messages that can be converted to an exception. "throw_msg"
* is only set in the first element of the list. Usually, it points to the
* original message stored in that element, but sometimes it points to a later
* message in the list. See cause_errthrow() below.
*/
struct msglist {
char *msg; // original message
char *throw_msg; // msg to throw: usually original one
struct msglist *next; // next of several messages in a row
};
// The exception types.
typedef enum
{
ET_USER, // exception caused by ":throw" command
ET_ERROR, // error exception
ET_INTERRUPT, // interrupt exception triggered by Ctrl-C
} except_type_T;
/*
* Structure describing an exception.
* (don't use "struct exception", it's used by the math library).
*/
typedef struct vim_exception except_T;
struct vim_exception {
except_type_T type; // exception type
char *value; // exception value
struct msglist *messages; // message(s) causing error exception
char_u *throw_name; // name of the throw point
linenr_T throw_lnum; // line number of the throw point
except_T *caught; // next exception on the caught stack
};
/*
* Structure to save the error/interrupt/exception state between calls to
* enter_cleanup() and leave_cleanup(). Must be allocated as an automatic
* variable by the (common) caller of these functions.
*/
typedef struct cleanup_stuff cleanup_T;
struct cleanup_stuff {
int pending; // error/interrupt/exception state
except_T *exception; // exception value
};
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "ex_eval.h.generated.h"
#endif
#endif // NVIM_EX_EVAL_H
|