-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathCirLoopEnv.c
65 lines (51 loc) · 1.29 KB
/
CirLoopEnv.c
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
#include "cir_internal.h"
#include <assert.h>
#define MAX_SCOPES 20
typedef struct LoopScope {
CirStmtId continueStmtId;
CirStmtId breakStmtId;
} LoopScope;
static LoopScope scopes[MAX_SCOPES];
static uint32_t scopeStackTop;
void
CirLoopEnv_pushLoop(CirStmtId continueStmtId, CirStmtId breakStmtId)
{
assert(continueStmtId);
assert(breakStmtId);
if (scopeStackTop >= MAX_SCOPES)
cir_fatal("too many nested loops/switches");
scopes[scopeStackTop].continueStmtId = continueStmtId;
scopes[scopeStackTop].breakStmtId = breakStmtId;
scopeStackTop++;
}
void
CirLoopEnv_pushSwitch(CirStmtId breakStmtId)
{
assert(breakStmtId);
if (scopeStackTop >= MAX_SCOPES)
cir_fatal("too many nested loops/switches");
scopes[scopeStackTop].continueStmtId = CirLoopEnv_getContinueStmtId();
scopes[scopeStackTop].breakStmtId = breakStmtId;
scopeStackTop++;
}
void
CirLoopEnv_pop(void)
{
if (!scopeStackTop)
cir_bug("no more loop scopes to pop");
scopeStackTop--;
}
CirStmtId
CirLoopEnv_getContinueStmtId(void)
{
if (!scopeStackTop)
return 0;
return scopes[scopeStackTop - 1].continueStmtId;
}
CirStmtId
CirLoopEnv_getBreakStmtId(void)
{
if (!scopeStackTop)
return 0;
return scopes[scopeStackTop - 1].breakStmtId;
}