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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
/*****
* access.h
* Andy Hammerlindl 2003/12/03
*
* Describes an "access," a representation of where a variable will be
* stored at runtime, so that read, write, and call instructions can be
* made.
*****/
#ifndef ACCESS_H
#define ACCESS_H
#include <cassert>
#include "errormsg.h"
#include "item.h"
#include "vm.h"
namespace trans {
class frame;
class coder;
enum action {
READ,
WRITE,
CALL
};
// These serves as the base class for the accesses.
class access : public gc {
protected:
// Generic compiler access error - if the compiler functions properly,
// none of these should be reachable by the user.
void error(position pos)
{
em.compiler(pos);
em << "invalid use of access";
}
public:
virtual ~access() = 0;
// Encode a read/write/call of the access when nothing is on the stack.
virtual void encode(action, position pos, coder &)
{
error(pos);
}
// Encode a read/write/call of the access when the frame "top" is on top
// of the stack.
virtual void encode(action, position pos, coder &, frame *)
{
error(pos);
}
};
// This class represents identity conversions in casting.
class identAccess : public access
{
virtual void encode(action act, position, coder&);
};
// Represents a function that is implemented by a built-in C++ function.
class bltinAccess : public access {
vm::bltin f;
public:
bltinAccess(vm::bltin f)
: f(f) {}
void encode(action act, position pos, coder &e);
void encode(action act, position pos, coder &e, frame *);
};
// An access that puts a frame on the top of the stack.
class frameAccess : public access {
frame *f;
public:
frameAccess(frame *f)
: f(f) {}
void encode(action act, position pos, coder &e);
void encode(action act, position pos, coder &e, frame *top);
};
// Represents the access of a local variable.
class localAccess : public access {
Int offset;
frame *level;
public:
localAccess(Int offset, frame *level)
: offset(offset), level(level) {}
void encode(action act, position pos, coder &e);
void encode(action act, position pos, coder &e, frame *top);
};
class qualifiedAccess : public access {
// The location and frame of the record.
access *qualifier;
frame *qualifierLevel;
// The location of the field relative to the record.
access *field;
public:
qualifiedAccess(access *qualifier, frame *qualifierLevel, access *field)
: qualifier(qualifier), qualifierLevel(qualifierLevel), field(field) {}
void encode(action act, position pos, coder &e);
void encode(action act, position pos, coder &e, frame *top);
};
} // namespace trans
#endif // ACCESS_H
|