blob: 8ed25792e60b4c3b7de871e909fd2cc6b627eee0 (
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
|
implementation module cache_variable;
import StdEnv;
import compile;
:: StateVariableContents = State !.DclCache | NoState;
:: StateVariableRecord = {version_number::!Int,contents::!.StateVariableContents};
state_variable_array :: {#StateVariableRecord};
state_variable_array =: {{version_number=0,contents=NoState}};
update_state_variable_array :: !{#StateVariableRecord} !StateVariableRecord !Int -> (!Int,!{#StateVariableRecord});
update_state_variable_array array state_variable_record version_number
= code {
pushI 0
update rStateVariableRecord 1 1
};
make_unique :: !StateVariableContents -> .StateVariableContents;
make_unique _
= code {
fill_a 0 1
pop_a 1
};
store_state :: !*DclCache -> Int;
store_state state
# array = state_variable_array;
# {version_number,contents} = array.[0];
= case contents of {
NoState
# version_number=version_number+1;
# (version_number,array) = update_state_variable_array array {version_number=version_number,contents=State state} version_number;
-> version_number;
_
# version_number=version_number+1;
# (version_number,array) = update_state_variable_array array {version_number=version_number,contents=State state} version_number;
-> version_number;
};
load_state :: Int -> .DclCache;
load_state version_number_argument
# array = state_variable_array;
# {version_number,contents} = array.[0];
= case (make_unique contents) of {
State state
# (version_number,array) = update_state_variable_array array {version_number=version_number,contents=NoState} version_number;
| version_number==version_number_argument
-> state
-> state
};
|