diff options
author | ronny | 2001-07-18 17:01:52 +0000 |
---|---|---|
committer | ronny | 2001-07-18 17:01:52 +0000 |
commit | 25c3160e7ef1c3e3be6febb620764643044c8a3a (patch) | |
tree | 026c6c752286a3733d7b379f7b63c36beaca1c1b /backend | |
parent | replaced 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.icl | 24 |
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 |