aboutsummaryrefslogtreecommitdiff
path: root/main/Mac/cache_variable.icl
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
	};