aboutsummaryrefslogtreecommitdiff
path: root/backend
diff options
context:
space:
mode:
authorronny2001-07-18 17:01:52 +0000
committerronny2001-07-18 17:01:52 +0000
commit25c3160e7ef1c3e3be6febb620764643044c8a3a (patch)
tree026c6c752286a3733d7b379f7b63c36beaca1c1b /backend
parentreplaced VI_Alias with VI_AliasSequenceNumber to avoid potential clashes (diff)
remove bug with numbering strict alias node defs
don't make any assumptions about the order in which variables are visited git-svn-id: https://svn.cs.ru.nl/repos/clean-compiler/trunk@558 1f8540f1-abd5-4d5b-9d24-4c5ce8603e2d
Diffstat (limited to 'backend')
-rw-r--r--backend/backendpreprocess.icl24
1 files changed, 19 insertions, 5 deletions
diff --git a/backend/backendpreprocess.icl b/backend/backendpreprocess.icl
index 92a47d7..a62bc10 100644
--- a/backend/backendpreprocess.icl
+++ b/backend/backendpreprocess.icl
@@ -52,11 +52,24 @@ fromSequencerToPreprocessor aliasDummyId sequencer
o` sequencer
o` fromSequenceState
+assignSequenceNumber :: VarInfoPtr *SequenceState -> *SequenceState
assignSequenceNumber varInfoPtr sequenceState
- :== { sequenceState
- & ss_varHeap = writePtr varInfoPtr (VI_SequenceNumber sequenceState.ss_sequenceNumber) sequenceState.ss_varHeap
- , ss_sequenceNumber = sequenceState.ss_sequenceNumber + 1
- }
+ # (varInfo, ss_varHeap) = readPtr varInfoPtr sequenceState.ss_varHeap
+ | alreadySequenced varInfo
+ = sequenceState
+ // otherwise
+ = { sequenceState
+ & ss_varHeap = writePtr varInfoPtr (VI_SequenceNumber sequenceState.ss_sequenceNumber) sequenceState.ss_varHeap
+ , ss_sequenceNumber = sequenceState.ss_sequenceNumber + 1
+ }
+ where
+ alreadySequenced :: VarInfo -> Bool
+ alreadySequenced (VI_SequenceNumber _)
+ = True
+ alreadySequenced (VI_AliasSequenceNumber _)
+ = True
+ alreadySequenced _
+ = False
instance sequence [a] | sequence a where
sequence list
@@ -156,7 +169,8 @@ instance sequence LetBind where
// the compiled source was a strict alias like "#! x = y"
= case hd app_args of
Var bound_var=:{var_info_ptr}
- # (vi, ss_varHeap) = readPtr var_info_ptr sequenceState.ss_varHeap
+ # sequenceState = assignSequenceNumber var_info_ptr sequenceState
+ (vi, ss_varHeap) = readPtr var_info_ptr sequenceState.ss_varHeap
non_alias_bound_var = case vi of
VI_SequenceNumber _ -> bound_var
VI_AliasSequenceNumber alias_bound_var-> alias_bound_var