Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
clean-compiler-and-rts
compiler
Commits
5a2556a8
Commit
5a2556a8
authored
Jun 05, 2001
by
Ronny Wichers Schreur
🏘
Browse files
renamed DistributeInfo to DistributeState
changed field name prefix from di_ to ds_
parent
60beb83b
Changes
1
Hide whitespace changes
Inline
Side-by-side
frontend/convertcases.icl
View file @
5a2556a8
...
...
@@ -74,8 +74,8 @@ where
=
weightedRefCount
{
rci_imported
={
cii_dcl_functions
=
dcl_functions
,
cii_common_defs
=
common_defs
,
cii_main_dcl_module_n
=
main_dcl_module_n
},
rci_depth
=
1
}
tb_rhs
{
rcs_var_heap
=
cs_var_heap
,
rcs_expr_heap
=
cs_expr_heap
,
rcs_free_vars
=
[],
rcs_imports
=
collected_imports
}
// ---> ("eliminate_code_sharing_in_function (weightedRefCount)", tb_rhs)
(
tb_rhs
,
{
d
i
_lets
,
d
i
_var_heap
,
d
i
_expr_heap
})
=
distributeLets
1
tb_rhs
{
d
i
_lets
=
[],
d
i
_var_heap
=
rcs_var_heap
,
d
i
_expr_heap
=
rcs_expr_heap
}
(
tb_rhs
,
(
var_heap
,
expr_heap
))
=
buildLetExpr
d
i
_lets
tb_rhs
(
d
i
_var_heap
,
d
i
_expr_heap
)
(
tb_rhs
,
{
d
s
_lets
,
d
s
_var_heap
,
d
s
_expr_heap
})
=
distributeLets
1
tb_rhs
{
d
s
_lets
=
[],
d
s
_var_heap
=
rcs_var_heap
,
d
s
_expr_heap
=
rcs_expr_heap
}
(
tb_rhs
,
(
var_heap
,
expr_heap
))
=
buildLetExpr
d
s
_lets
tb_rhs
(
d
s
_var_heap
,
d
s
_expr_heap
)
=
(
TransformedBody
{
body
&
tb_rhs
=
tb_rhs
},
(
rcs_imports
,
{
cs
&
cs_var_heap
=
var_heap
,
cs_expr_heap
=
expr_heap
}))
==>
(
"eliminate_code_sharing_in_function (distributeLets)"
,
tb_rhs
)
...
...
@@ -388,84 +388,84 @@ where
only if the expression is neither used in the pattern nor in a surrounding expression.
*/
::
Distribute
Info
=
{
d
i
_lets
::
![
VarInfoPtr
]
,
d
i
_var_heap
::
!.
VarHeap
,
d
i
_expr_heap
::
!.
ExpressionHeap
::
Distribute
State
=
{
d
s
_lets
::
![
VarInfoPtr
]
,
d
s
_var_heap
::
!.
VarHeap
,
d
s
_expr_heap
::
!.
ExpressionHeap
}
class
distributeLets
e
::
!
Int
!
e
!*
Distribute
Info
->
(!
e
,
!*
Distribute
Info
)
class
distributeLets
e
::
!
Int
!
e
!*
Distribute
State
->
(!
e
,
!*
Distribute
State
)
instance
distributeLets
Expression
where
distributeLets
depth
(
Var
var
=:{
var_name
,
var_info_ptr
})
d
l_info
=:{
d
i
_var_heap
}
#!
var_info
=
sreadPtr
var_info_ptr
d
i
_var_heap
distributeLets
depth
(
Var
var
=:{
var_name
,
var_info_ptr
})
d
s
=:{
d
s
_var_heap
}
#!
var_info
=
sreadPtr
var_info_ptr
d
s
_var_heap
=
case
var_info
of
VI_LetExpression
lei
|
lei
.
lei_count
==
1
// ==> (var_name, var_info_ptr, lei.lei_count, (lei.lei_expression, lei.lei_depth, depth))
#
(
lei_updated_expr
,
d
l_info
)
=
distributeLets
depth
lei
.
lei_expression
d
l_info
->
(
lei_updated_expr
,
{
d
l_info
&
d
i
_var_heap
=
d
l_info
.
d
i
_var_heap
<:=
#
(
lei_updated_expr
,
d
s
)
=
distributeLets
depth
lei
.
lei_expression
d
s
->
(
lei_updated_expr
,
{
d
s
&
d
s
_var_heap
=
d
s
.
d
s
_var_heap
<:=
(
var_info_ptr
,
VI_LetExpression
{
lei
&
lei_status
=
LES_Updated
lei_updated_expr
})
})
|
lei
.
lei_depth
==
depth
#
d
l_info
=
distributeLetsInLetExpression
depth
var_info_ptr
lei
d
l_info
->
(
Var
{
var
&
var_info_ptr
=
lei
.
lei_var
.
fv_info_ptr
},
d
l_info
)
->
(
Var
{
var
&
var_info_ptr
=
lei
.
lei_var
.
fv_info_ptr
},
d
l_info
)
#
d
s
=
distributeLetsInLetExpression
depth
var_info_ptr
lei
d
s
->
(
Var
{
var
&
var_info_ptr
=
lei
.
lei_var
.
fv_info_ptr
},
d
s
)
->
(
Var
{
var
&
var_info_ptr
=
lei
.
lei_var
.
fv_info_ptr
},
d
s
)
VI_CaseVar
var_info_ptr
->
(
Var
{
var
&
var_info_ptr
=
var_info_ptr
},
d
l_info
)
->
(
Var
{
var
&
var_info_ptr
=
var_info_ptr
},
d
s
)
_
->
(
Var
var
,
d
l_info
)
distributeLets
depth
(
Case
kees
)
d
l_info
#
(
kees
,
d
l_info
)
=
distributeLets
depth
kees
d
l_info
=
(
Case
kees
,
d
l_info
)
distributeLets
depth
(
App
app
=:{
app_args
})
d
l_info
#
(
app_args
,
d
l_info
)
=
distributeLets
depth
app_args
d
l_info
=
(
App
{
app
&
app_args
=
app_args
},
d
l_info
)
distributeLets
depth
(
fun_expr
@
exprs
)
d
l_info
#
(
fun_expr
,
d
l_info
)
=
distributeLets
depth
fun_expr
d
l_info
(
exprs
,
d
l_info
)
=
distributeLets
depth
exprs
d
l_info
=
(
fun_expr
@
exprs
,
d
l_info
)
distributeLets
depth
expr
=:(
BasicExpr
_
_)
d
l_info
=
(
expr
,
d
l_info
)
distributeLets
depth
(
MatchExpr
opt_tuple
constructor
expr
)
d
l_info
#
(
expr
,
d
l_info
)
=
distributeLets
depth
expr
d
l_info
=
(
MatchExpr
opt_tuple
constructor
expr
,
d
l_info
)
distributeLets
depth
(
Selection
opt_tuple
expr
selectors
)
d
l_info
#
(
expr
,
d
l_info
)
=
distributeLets
depth
expr
d
l_info
#
(
selectors
,
d
l_info
)
=
distributeLets
depth
selectors
d
l_info
=
(
Selection
opt_tuple
expr
selectors
,
d
l_info
)
distributeLets
depth
(
Update
expr1
selectors
expr2
)
d
l_info
#
(
expr1
,
d
l_info
)
=
distributeLets
depth
expr1
d
l_info
#
(
selectors
,
d
l_info
)
=
distributeLets
depth
selectors
d
l_info
#
(
expr2
,
d
l_info
)
=
distributeLets
depth
expr2
d
l_info
=
(
Update
expr1
selectors
expr2
,
d
l_info
)
distributeLets
depth
(
RecordUpdate
cons_symbol
expression
expressions
)
d
l_info
#
(
expression
,
d
l_info
)
=
distributeLets
depth
expression
d
l_info
#
(
expressions
,
d
l_info
)
=
distributeLets
depth
expressions
d
l_info
=
(
RecordUpdate
cons_symbol
expression
expressions
,
d
l_info
)
distributeLets
depth
(
TupleSelect
tuple_symbol
arg_nr
expr
)
d
l_info
#
(
expr
,
d
l_info
)
=
distributeLets
depth
expr
d
l_info
=
(
TupleSelect
tuple_symbol
arg_nr
expr
,
d
l_info
)
distributeLets
depth
(
Let
lad
=:{
let_strict_binds
,
let_lazy_binds
,
let_expr
,
let_info_ptr
})
d
l_info
=:{
d
i
_expr_heap
,
d
i
_var_heap
}
#
(
let_info
,
d
i
_expr_heap
)
=
readPtr
let_info_ptr
d
i
_expr_heap
->
(
Var
var
,
d
s
)
distributeLets
depth
(
Case
kees
)
d
s
#
(
kees
,
d
s
)
=
distributeLets
depth
kees
d
s
=
(
Case
kees
,
d
s
)
distributeLets
depth
(
App
app
=:{
app_args
})
d
s
#
(
app_args
,
d
s
)
=
distributeLets
depth
app_args
d
s
=
(
App
{
app
&
app_args
=
app_args
},
d
s
)
distributeLets
depth
(
fun_expr
@
exprs
)
d
s
#
(
fun_expr
,
d
s
)
=
distributeLets
depth
fun_expr
d
s
(
exprs
,
d
s
)
=
distributeLets
depth
exprs
d
s
=
(
fun_expr
@
exprs
,
d
s
)
distributeLets
depth
expr
=:(
BasicExpr
_
_)
d
s
=
(
expr
,
d
s
)
distributeLets
depth
(
MatchExpr
opt_tuple
constructor
expr
)
d
s
#
(
expr
,
d
s
)
=
distributeLets
depth
expr
d
s
=
(
MatchExpr
opt_tuple
constructor
expr
,
d
s
)
distributeLets
depth
(
Selection
opt_tuple
expr
selectors
)
d
s
#
(
expr
,
d
s
)
=
distributeLets
depth
expr
d
s
#
(
selectors
,
d
s
)
=
distributeLets
depth
selectors
d
s
=
(
Selection
opt_tuple
expr
selectors
,
d
s
)
distributeLets
depth
(
Update
expr1
selectors
expr2
)
d
s
#
(
expr1
,
d
s
)
=
distributeLets
depth
expr1
d
s
#
(
selectors
,
d
s
)
=
distributeLets
depth
selectors
d
s
#
(
expr2
,
d
s
)
=
distributeLets
depth
expr2
d
s
=
(
Update
expr1
selectors
expr2
,
d
s
)
distributeLets
depth
(
RecordUpdate
cons_symbol
expression
expressions
)
d
s
#
(
expression
,
d
s
)
=
distributeLets
depth
expression
d
s
#
(
expressions
,
d
s
)
=
distributeLets
depth
expressions
d
s
=
(
RecordUpdate
cons_symbol
expression
expressions
,
d
s
)
distributeLets
depth
(
TupleSelect
tuple_symbol
arg_nr
expr
)
d
s
#
(
expr
,
d
s
)
=
distributeLets
depth
expr
d
s
=
(
TupleSelect
tuple_symbol
arg_nr
expr
,
d
s
)
distributeLets
depth
(
Let
lad
=:{
let_strict_binds
,
let_lazy_binds
,
let_expr
,
let_info_ptr
})
d
s
=:{
d
s
_expr_heap
,
d
s
_var_heap
}
#
(
let_info
,
d
s
_expr_heap
)
=
readPtr
let_info_ptr
d
s
_expr_heap
#
(
EI_LetTypeAndRefCounts
let_type
ref_counts
)
=
let_info
nr_of_strict_lets
=
length
let_strict_binds
let_binds
=
[(
False
,
bind
)
\\
bind
<-
let_lazy_binds
]
d
i
_var_heap
=
set_let_expression_info
depth
let_binds
ref_counts
(
drop
nr_of_strict_lets
let_type
)
d
i
_var_heap
(
let_expr
,
d
l_info
)
=
distributeLets
depth
let_expr
{
d
l_info
&
d
i
_var_heap
=
d
i
_var_heap
,
d
i
_expr_heap
=
d
i
_expr_heap
}
(
let_strict_binds
,
d
l_info
)
=
distributeLets
depth
let_strict_binds
d
l_info
d
l_info
=
foldSt
(
distribute_lets_in_non_distributed_let
depth
)
let_lazy_binds
d
l_info
d
s
_var_heap
=
set_let_expression_info
depth
let_binds
ref_counts
(
drop
nr_of_strict_lets
let_type
)
d
s
_var_heap
(
let_expr
,
d
s
)
=
distributeLets
depth
let_expr
{
d
s
&
d
s
_var_heap
=
d
s
_var_heap
,
d
s
_expr_heap
=
d
s
_expr_heap
}
(
let_strict_binds
,
d
s
)
=
distributeLets
depth
let_strict_binds
d
s
d
s
=
foldSt
(
distribute_lets_in_non_distributed_let
depth
)
let_lazy_binds
d
s
|
nr_of_strict_lets
==
0
=
(
let_expr
,
d
l_info
)
=
(
let_expr
,
d
s
)
=
case
let_expr
of
Let
inner_let
=:{
let_info_ptr
=
inner_let_info_ptr
}
#
(
EI_LetType
strict_inner_types
,
d
i
_expr_heap
)
=
readPtr
inner_let_info_ptr
d
l_info
.
d
i
_expr_heap
d
i
_expr_heap
=
writePtr
inner_let_info_ptr
(
EI_LetType
((
take
nr_of_strict_lets
let_type
)++
strict_inner_types
))
d
i
_expr_heap
#
(
EI_LetType
strict_inner_types
,
d
s
_expr_heap
)
=
readPtr
inner_let_info_ptr
d
s
.
d
s
_expr_heap
d
s
_expr_heap
=
writePtr
inner_let_info_ptr
(
EI_LetType
((
take
nr_of_strict_lets
let_type
)++
strict_inner_types
))
d
s
_expr_heap
->
(
Let
{
inner_let
&
let_strict_binds
=
let_strict_binds
++
inner_let
.
let_strict_binds
},
{
d
l_info
&
d
i
_expr_heap
=
d
i
_expr_heap
})
{
d
s
&
d
s
_expr_heap
=
d
s
_expr_heap
})
_
->
(
Let
{
lad
&
let_strict_binds
=
let_strict_binds
,
let_expr
=
let_expr
,
let_lazy_binds
=
[]},
{
d
l_info
&
d
i
_expr_heap
=
d
l_info
.
d
i
_expr_heap
<:=
(
let_info_ptr
,
EI_LetType
(
take
nr_of_strict_lets
let_type
))})
{
d
s
&
d
s
_expr_heap
=
d
s
.
d
s
_expr_heap
<:=
(
let_info_ptr
,
EI_LetType
(
take
nr_of_strict_lets
let_type
))})
where
set_let_expression_info
depth
[(
let_strict
,
{
lb_src
,
lb_dst
}):
binds
][
ref_count
:
ref_counts
][
type
:
types
]
var_heap
#
(
new_info_ptr
,
var_heap
)
=
newPtr
VI_Empty
var_heap
...
...
@@ -475,22 +475,22 @@ where
set_let_expression_info
depth
[]
_
_
var_heap
=
var_heap
distribute_lets_in_non_distributed_let
depth
{
lb_dst
={
fv_name
,
fv_info_ptr
}}
d
l_info
=:{
d
i
_var_heap
}
#
(
VI_LetExpression
lei
=:{
lei_depth
,
lei_count
,
lei_status
},
d
i
_var_heap
)
=
readPtr
fv_info_ptr
d
i
_var_heap
distribute_lets_in_non_distributed_let
depth
{
lb_dst
={
fv_name
,
fv_info_ptr
}}
d
s
=:{
d
s
_var_heap
}
#
(
VI_LetExpression
lei
=:{
lei_depth
,
lei_count
,
lei_status
},
d
s
_var_heap
)
=
readPtr
fv_info_ptr
d
s
_var_heap
|
lei_count
>
0
// | not lei_moved && lei_count > 0
=
distributeLetsInLetExpression
depth
fv_info_ptr
lei
{
d
l_info
&
d
i
_var_heap
=
d
i
_var_heap
}
=
{
d
l_info
&
d
i
_var_heap
=
d
i
_var_heap
}
=
distributeLetsInLetExpression
depth
fv_info_ptr
lei
{
d
s
&
d
s
_var_heap
=
d
s
_var_heap
}
=
{
d
s
&
d
s
_var_heap
=
d
s
_var_heap
}
==>
(
"distribute_lets_in_non_distributed_let (moved or not used)"
,
lei_count
,
fv_name
)
is_moved
LES_Moved
=
True
is_moved
_
=
False
distributeLets
depth
expr
=:(
TypeCodeExpression
_)
d
l_info
=
(
expr
,
d
l_info
)
distributeLets
depth
(
AnyCodeExpr
in_params
out_params
code_expr
)
d
l_info
=:{
d
i
_var_heap
}
#
(
in_params
,
d
i
_var_heap
)
=
mapSt
determineInputParameter
in_params
d
i
_var_heap
=
(
AnyCodeExpr
in_params
out_params
code_expr
,
{
d
l_info
&
d
i
_var_heap
=
d
i
_var_heap
})
distributeLets
depth
expr
=:(
TypeCodeExpression
_)
d
s
=
(
expr
,
d
s
)
distributeLets
depth
(
AnyCodeExpr
in_params
out_params
code_expr
)
d
s
=:{
d
s
_var_heap
}
#
(
in_params
,
d
s
_var_heap
)
=
mapSt
determineInputParameter
in_params
d
s
_var_heap
=
(
AnyCodeExpr
in_params
out_params
code_expr
,
{
d
s
&
d
s
_var_heap
=
d
s
_var_heap
})
where
determineInputParameter
bind
=:{
bind_dst
}
var_heap
#
(
var_info
,
var_heap
)
=
readPtr
bind_dst
.
var_info_ptr
var_heap
...
...
@@ -500,33 +500,33 @@ where
_
->
(
bind
,
var_heap
)
distributeLets
depth
expr
=:(
ABCCodeExpr
_
_)
d
l_info
=
(
expr
,
d
l_info
)
distributeLets
depth
EE
d
l_info
=
(
EE
,
d
l_info
)
distributeLets
depth
(
NoBind
ptr
)
d
l_info
=
(
NoBind
ptr
,
d
l_info
)
distributeLets
depth
expr
=:(
ABCCodeExpr
_
_)
d
s
=
(
expr
,
d
s
)
distributeLets
depth
EE
d
s
=
(
EE
,
d
s
)
distributeLets
depth
(
NoBind
ptr
)
d
s
=
(
NoBind
ptr
,
d
s
)
instance
distributeLets
Case
where
distributeLets
depth
kees
=:{
case_info_ptr
,
case_guards
,
case_default
,
case_expr
}
d
l_info
=:{
d
i
_var_heap
,
d
i
_expr_heap
}
#
(
EI_CaseTypeAndRefCounts
case_type
{
rcc_all_variables
=
tot_ref_counts
,
rcc_default_variables
=
ref_counts_in_default
,
rcc_pattern_variables
=
ref_counts_in_patterns
},
d
i
_expr_heap
)
=
readPtr
case_info_ptr
d
i
_expr_heap
// d
i
_expr_heap = d
i
_expr_heap <:= (case_info_ptr, EI_CaseType case_type)
distributeLets
depth
kees
=:{
case_info_ptr
,
case_guards
,
case_default
,
case_expr
}
d
s
=:{
d
s
_var_heap
,
d
s
_expr_heap
}
#
(
EI_CaseTypeAndRefCounts
case_type
{
rcc_all_variables
=
tot_ref_counts
,
rcc_default_variables
=
ref_counts_in_default
,
rcc_pattern_variables
=
ref_counts_in_patterns
},
d
s
_expr_heap
)
=
readPtr
case_info_ptr
d
s
_expr_heap
// d
s
_expr_heap = d
s
_expr_heap <:= (case_info_ptr, EI_CaseType case_type)
new_depth
=
inc
depth
(
local_lets
,
d
i
_var_heap
)
=
foldSt
(
mark_local_let_var
new_depth
)
tot_ref_counts
([],
d
i
_var_heap
)
(
case_guards
,
heaps
)
=
distribute_lets_in_patterns
new_depth
ref_counts_in_patterns
case_guards
(
d
i
_var_heap
,
d
i
_expr_heap
)
(
case_default
,
(
d
i
_var_heap
,
d
i
_expr_heap
))
=
distribute_lets_in_default
new_depth
ref_counts_in_default
case_default
heaps
d
i
_var_heap
=
foldSt
reset_local_let_var
local_lets
d
i
_var_heap
(
case_expr
,
d
l_info
)
=
distributeLets
depth
case_expr
{
d
l_info
&
d
i
_var_heap
=
d
i
_var_heap
,
d
i
_expr_heap
=
d
i
_expr_heap
}
=
({
kees
&
case_guards
=
case_guards
,
case_expr
=
case_expr
,
case_default
=
case_default
},
d
l_info
)
(
local_lets
,
d
s
_var_heap
)
=
foldSt
(
mark_local_let_var
new_depth
)
tot_ref_counts
([],
d
s
_var_heap
)
(
case_guards
,
heaps
)
=
distribute_lets_in_patterns
new_depth
ref_counts_in_patterns
case_guards
(
d
s
_var_heap
,
d
s
_expr_heap
)
(
case_default
,
(
d
s
_var_heap
,
d
s
_expr_heap
))
=
distribute_lets_in_default
new_depth
ref_counts_in_default
case_default
heaps
d
s
_var_heap
=
foldSt
reset_local_let_var
local_lets
d
s
_var_heap
(
case_expr
,
d
s
)
=
distributeLets
depth
case_expr
{
d
s
&
d
s
_var_heap
=
d
s
_var_heap
,
d
s
_expr_heap
=
d
s
_expr_heap
}
=
({
kees
&
case_guards
=
case_guards
,
case_expr
=
case_expr
,
case_default
=
case_default
},
d
s
)
where
distribute_lets_in_patterns
depth
ref_counts
(
AlgebraicPatterns
conses
patterns
)
heaps
#
(
patterns
,
heaps
)
=
mapSt
(
distribute_lets_in_alg_pattern
depth
)
(
exactZip
ref_counts
patterns
)
heaps
=
(
AlgebraicPatterns
conses
patterns
,
heaps
)
where
distribute_lets_in_alg_pattern
depth
(
ref_counts
,
pattern
)
(
d
i
_var_heap
,
d
i
_expr_heap
)
#
(
ap_vars
,
d
i
_var_heap
)
=
mapSt
refresh_variable
pattern
.
ap_vars
d
i
_var_heap
(
ap_expr
,
heaps
)
=
distribute_lets_in_pattern_expr
depth
ref_counts
pattern
.
ap_expr
(
d
i
_var_heap
,
d
i
_expr_heap
)
distribute_lets_in_alg_pattern
depth
(
ref_counts
,
pattern
)
(
d
s
_var_heap
,
d
s
_expr_heap
)
#
(
ap_vars
,
d
s
_var_heap
)
=
mapSt
refresh_variable
pattern
.
ap_vars
d
s
_var_heap
(
ap_expr
,
heaps
)
=
distribute_lets_in_pattern_expr
depth
ref_counts
pattern
.
ap_expr
(
d
s
_var_heap
,
d
s
_expr_heap
)
=
({
pattern
&
ap_vars
=
ap_vars
,
ap_expr
=
ap_expr
},
heaps
)
distribute_lets_in_patterns
depth
ref_counts
(
BasicPatterns
type
patterns
)
heaps
#
(
patterns
,
heaps
)
=
mapSt
(
distribute_lets_in_basic_pattern
depth
)
(
exactZip
ref_counts
patterns
)
heaps
...
...
@@ -539,9 +539,9 @@ where
#
(
patterns
,
heaps
)
=
mapSt
(
distribute_lets_in_dynamic_pattern
depth
)
(
exactZip
ref_counts
patterns
)
heaps
=
(
DynamicPatterns
patterns
,
heaps
)
where
distribute_lets_in_dynamic_pattern
depth
(
ref_counts
,
pattern
)
(
d
i
_var_heap
,
d
i
_expr_heap
)
#
(
dp_var
,
d
i
_var_heap
)
=
refresh_variable
pattern
.
dp_var
d
i
_var_heap
(
dp_rhs
,
heaps
)
=
distribute_lets_in_pattern_expr
depth
ref_counts
pattern
.
dp_rhs
(
d
i
_var_heap
,
d
i
_expr_heap
)
distribute_lets_in_dynamic_pattern
depth
(
ref_counts
,
pattern
)
(
d
s
_var_heap
,
d
s
_expr_heap
)
#
(
dp_var
,
d
s
_var_heap
)
=
refresh_variable
pattern
.
dp_var
d
s
_var_heap
(
dp_rhs
,
heaps
)
=
distribute_lets_in_pattern_expr
depth
ref_counts
pattern
.
dp_rhs
(
d
s
_var_heap
,
d
s
_expr_heap
)
=
({
pattern
&
dp_rhs
=
dp_rhs
,
dp_var
=
dp_var
},
heaps
)
distribute_lets_in_default
depth
ref_counts_in_default
(
Yes
expr
)
heaps
...
...
@@ -567,10 +567,10 @@ where
distribute_lets_in_pattern_expr
depth
local_vars
pattern_expr
(
var_heap
,
expr_heap
)
#
var_heap
=
foldSt
(
mark_local_let_var_of_pattern_expr
depth
)
local_vars
var_heap
(
pattern_expr
,
d
l_info
)
=
distributeLets
depth
pattern_expr
{
d
i
_lets
=
[],
d
i
_var_heap
=
var_heap
,
d
i
_expr_heap
=
expr_heap
}
d
l_info
=
foldSt
(
reexamine_local_let_expressions
depth
)
local_vars
d
l_info
=
buildLetExpr
d
l_info
.
d
i
_lets
pattern_expr
(
d
l_info
.
d
i
_var_heap
,
d
l_info
.
d
i
_expr_heap
)
==>
(
"distribute_lets_in_pattern_expr"
,
d
l_info
.
d
i
_lets
)
(
pattern_expr
,
d
s
)
=
distributeLets
depth
pattern_expr
{
d
s
_lets
=
[],
d
s
_var_heap
=
var_heap
,
d
s
_expr_heap
=
expr_heap
}
d
s
=
foldSt
(
reexamine_local_let_expressions
depth
)
local_vars
d
s
=
buildLetExpr
d
s
.
d
s
_lets
pattern_expr
(
d
s
.
d
s
_var_heap
,
d
s
.
d
s
_expr_heap
)
==>
(
"distribute_lets_in_pattern_expr"
,
d
s
.
d
s
_lets
)
mark_local_let_var_of_pattern_expr
depth
{
cv_variable
,
cv_count
}
var_heap
#
(
VI_LetExpression
lei
,
var_heap
)
=
readPtr
cv_variable
var_heap
...
...
@@ -579,24 +579,24 @@ where
==>
(
"mark_local_let_var_of_pattern_expr "
,
lei
.
lei_var
.
fv_name
,
cv_variable
,
(
lei
.
lei_var
.
fv_info_ptr
,
cv_count
,
depth
))
=
var_heap
reexamine_local_let_expressions
depth
{
cv_variable
,
cv_count
}
d
l_info
=:{
d
i
_var_heap
}
reexamine_local_let_expressions
depth
{
cv_variable
,
cv_count
}
d
s
=:{
d
s
_var_heap
}
|
cv_count
>
1
#
(
VI_LetExpression
lei
,
d
i
_var_heap
)
=
readPtr
cv_variable
d
i
_var_heap
#
(
VI_LetExpression
lei
,
d
s
_var_heap
)
=
readPtr
cv_variable
d
s
_var_heap
|
depth
==
lei
.
lei_depth
=
distributeLetsInLetExpression
depth
cv_variable
lei
{
d
l_info
&
d
i
_var_heap
=
d
i
_var_heap
}
=
{
d
l_info
&
d
i
_var_heap
=
d
i
_var_heap
}
=
d
l_info
distributeLetsInLetExpression
depth
let_var_info_ptr
lei
=:{
lei_expression
,
lei_status
=
LES_Moved
}
d
l_info
=
d
l_info
distributeLetsInLetExpression
depth
let_var_info_ptr
lei
=:{
lei_expression
,
lei_status
=
LES_Updated
_}
d
l_info
=
d
l_info
distributeLetsInLetExpression
depth
let_var_info_ptr
lei
=:{
lei_expression
,
lei_status
=
LES_Untouched
}
d
l_info
=:{
d
i
_var_heap
}
#
d
i
_var_heap
=
d
i
_var_heap
<:=
(
let_var_info_ptr
,
VI_LetExpression
{
lei
&
lei_status
=
LES_Updated
EE
})
/* to prevent doing this expression twice */
(
lei_expression
,
d
l_info
)
=
distributeLets
depth
lei_expression
{
d
l_info
&
d
i
_var_heap
=
d
i
_var_heap
}
=
{
d
l_info
&
d
i
_lets
=
[
let_var_info_ptr
:
d
l_info
.
d
i
_lets
],
d
i
_var_heap
=
d
l_info
.
d
i
_var_heap
<:=
(
let_var_info_ptr
,
VI_LetExpression
{
lei
&
lei_status
=
LES_Updated
lei_expression
})}
=
distributeLetsInLetExpression
depth
cv_variable
lei
{
d
s
&
d
s
_var_heap
=
d
s
_var_heap
}
=
{
d
s
&
d
s
_var_heap
=
d
s
_var_heap
}
=
d
s
distributeLetsInLetExpression
depth
let_var_info_ptr
lei
=:{
lei_expression
,
lei_status
=
LES_Moved
}
d
s
=
d
s
distributeLetsInLetExpression
depth
let_var_info_ptr
lei
=:{
lei_expression
,
lei_status
=
LES_Updated
_}
d
s
=
d
s
distributeLetsInLetExpression
depth
let_var_info_ptr
lei
=:{
lei_expression
,
lei_status
=
LES_Untouched
}
d
s
=:{
d
s
_var_heap
}
#
d
s
_var_heap
=
d
s
_var_heap
<:=
(
let_var_info_ptr
,
VI_LetExpression
{
lei
&
lei_status
=
LES_Updated
EE
})
/* to prevent doing this expression twice */
(
lei_expression
,
d
s
)
=
distributeLets
depth
lei_expression
{
d
s
&
d
s
_var_heap
=
d
s
_var_heap
}
=
{
d
s
&
d
s
_lets
=
[
let_var_info_ptr
:
d
s
.
d
s
_lets
],
d
s
_var_heap
=
d
s
.
d
s
_var_heap
<:=
(
let_var_info_ptr
,
VI_LetExpression
{
lei
&
lei_status
=
LES_Updated
lei_expression
})}
buildLetExpr
::
![
VarInfoPtr
]
!
Expression
!*(!*
VarHeap
,
!*
ExpressionHeap
)
->
(!
Expression
,
!(!*
VarHeap
,
!*
ExpressionHeap
))
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment