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
|
/*****
* genv.h
* Andy Hammerlindl 2002/08/29
*
* This is the global environment for the translation of programs. In
* actuality, it is basically a module manager. When a module is
* requested, it looks for the corresponding filename, and if found,
* parses and translates the file, returning the resultant module.
*
* genv sets up the basic type bindings and function bindings for
* builtin functions, casts and operators, and imports plain (if set),
* but all other initialization, is done by the local environmet defined
* in env.h.
*****/
#ifndef GENV_H
#define GENV_H
#include "common.h"
#include "table.h"
#include "record.h"
#include "absyn.h"
#include "access.h"
#include "coenv.h"
#include "stack.h"
using types::record;
using vm::lambda;
namespace trans {
class genv : public gc {
// The initializer functions for imports, indexed by filename.
typedef mem::map<CONST string,record *> importMap;
importMap imap;
// List of modules in translation. Used to detect and prevent infinite
// recursion in loading modules.
mem::list<string> inTranslation;
// Checks for recursion in loading, reporting an error and throwing an
// exception if it occurs.
void checkRecursion(string filename);
// Translate a module to build the record type.
record *loadModule(symbol name, string s);
public:
genv();
// Get an imported module, translating if necessary.
record *getModule(symbol name, string s);
// Uses the filename->record map to build a filename->initializer map to be
// used at runtime.
vm::stack::importInitMap *getInitMap();
};
} // namespace trans
#endif
|