aboutsummaryrefslogtreecommitdiff
path: root/main/Mac/cache_variable.icl
diff options
context:
space:
mode:
Diffstat (limited to 'main/Mac/cache_variable.icl')
-rw-r--r--main/Mac/cache_variable.icl52
1 files changed, 52 insertions, 0 deletions
diff --git a/main/Mac/cache_variable.icl b/main/Mac/cache_variable.icl
new file mode 100644
index 0000000..8ed2579
--- /dev/null
+++ b/main/Mac/cache_variable.icl
@@ -0,0 +1,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
+ };