1
- use crate :: core:: types:: { RcVar , Type , Variable , VariableInner , VariableType } ;
1
+ use crate :: core:: types:: { RcVar , Type , Variable , VariableFactory , VariableInner , VariableType } ;
2
2
use crate :: core:: { Term , TypedNode , TypedProgram , UntypedProgram } ;
3
3
use crate :: jet:: Application ;
4
4
use crate :: merkle:: cmr;
@@ -53,7 +53,7 @@ fn unify(mut alpha: RcVar, mut beta: RcVar) -> Result<(), Error> {
53
53
mem:: replace ( & mut be_borr. inner , VariableInner :: EqualTo ( alpha. clone ( ) ) )
54
54
} ;
55
55
match be_var {
56
- VariableInner :: Free => { } // nothing to do
56
+ VariableInner :: Free ( _ ) => { } // nothing to do
57
57
VariableInner :: Bound ( be_type, _) => bind ( & alpha, be_type) ?,
58
58
VariableInner :: EqualTo ( ..) => unreachable ! ( ) ,
59
59
VariableInner :: Finalized ( ..) => unreachable ! ( ) ,
@@ -67,7 +67,7 @@ fn bind(rcvar: &RcVar, ty: VariableType) -> Result<(), Error> {
67
67
// hold `Rc`s
68
68
let self_var = rcvar. borrow ( ) . inner . clone ( ) ;
69
69
match self_var {
70
- VariableInner :: Free => {
70
+ VariableInner :: Free ( _ ) => {
71
71
rcvar. borrow_mut ( ) . inner = VariableInner :: Bound ( ty, false ) ;
72
72
Ok ( ( ) )
73
73
}
@@ -109,7 +109,7 @@ fn finalize(var: RcVar) -> Result<Arc<Type>, Error> {
109
109
let mut var_borr = var. borrow_mut ( ) ;
110
110
111
111
let existing_type = match var_borr. inner {
112
- VariableInner :: Free => VariableType :: Unit ,
112
+ VariableInner :: Free ( _ ) => VariableType :: Unit ,
113
113
VariableInner :: Bound ( ref ty, ref mut occurs_check) => {
114
114
if * occurs_check {
115
115
return Err ( Error :: OccursCheck ) ;
@@ -137,7 +137,7 @@ fn finalize(var: RcVar) -> Result<Arc<Type>, Error> {
137
137
138
138
let sub1_borr = sub1. borrow_mut ( ) ;
139
139
let final1 = match sub1_borr. inner {
140
- VariableInner :: Free => {
140
+ VariableInner :: Free ( _ ) => {
141
141
drop ( sub1_borr) ;
142
142
Type :: unit ( )
143
143
}
@@ -155,7 +155,7 @@ fn finalize(var: RcVar) -> Result<Arc<Type>, Error> {
155
155
// drop(sub1_borr);
156
156
let sub2_borr = sub2. borrow_mut ( ) ;
157
157
let final2 = match sub2_borr. inner {
158
- VariableInner :: Free => {
158
+ VariableInner :: Free ( _ ) => {
159
159
drop ( sub2_borr) ;
160
160
Type :: unit ( )
161
161
}
@@ -199,12 +199,13 @@ pub(crate) fn type_check<Witness, App: Application>(
199
199
let mut rcs = Vec :: < Rc < UnificationArrow > > :: with_capacity ( vec_nodes. len ( ) ) ;
200
200
let mut finals = Vec :: < TypedNode < Witness , App > > :: with_capacity ( vec_nodes. len ( ) ) ;
201
201
let pow2s = Variable :: powers_of_two ( ) ;
202
+ let mut naming = VariableFactory :: new ( ) ;
202
203
203
204
// Compute most general unifier for all types in the DAG
204
205
for ( idx, program_node) in vec_nodes. iter ( ) . enumerate ( ) {
205
206
let node = UnificationArrow {
206
- source : Variable :: free ( ) ,
207
- target : Variable :: free ( ) ,
207
+ source : naming . free_variable ( ) ,
208
+ target : naming . free_variable ( ) ,
208
209
} ;
209
210
210
211
match program_node {
@@ -213,25 +214,27 @@ pub(crate) fn type_check<Witness, App: Application>(
213
214
Term :: InjL ( i) => {
214
215
let i = idx - i;
215
216
unify ( node. source . clone ( ) , rcs[ i] . source . clone ( ) ) ?;
216
- let target_type = VariableType :: Sum ( rcs[ i] . target . clone ( ) , Variable :: free ( ) ) ;
217
+ let target_type = VariableType :: Sum ( rcs[ i] . target . clone ( ) , naming . free_variable ( ) ) ;
217
218
bind ( & node. target , target_type) ?;
218
219
}
219
220
Term :: InjR ( i) => {
220
221
let i = idx - i;
221
222
unify ( node. source . clone ( ) , rcs[ i] . source . clone ( ) ) ?;
222
- let target_type = VariableType :: Sum ( Variable :: free ( ) , rcs[ i] . target . clone ( ) ) ;
223
+ let target_type = VariableType :: Sum ( naming . free_variable ( ) , rcs[ i] . target . clone ( ) ) ;
223
224
bind ( & node. target , target_type) ?;
224
225
}
225
226
Term :: Take ( i) => {
226
227
let i = idx - i;
227
228
unify ( node. target . clone ( ) , rcs[ i] . target . clone ( ) ) ?;
228
- let target_type = VariableType :: Product ( rcs[ i] . source . clone ( ) , Variable :: free ( ) ) ;
229
+ let target_type =
230
+ VariableType :: Product ( rcs[ i] . source . clone ( ) , naming. free_variable ( ) ) ;
229
231
bind ( & node. source , target_type) ?;
230
232
}
231
233
Term :: Drop ( i) => {
232
234
let i = idx - i;
233
235
unify ( node. target . clone ( ) , rcs[ i] . target . clone ( ) ) ?;
234
- let target_type = VariableType :: Product ( Variable :: free ( ) , rcs[ i] . source . clone ( ) ) ;
236
+ let target_type =
237
+ VariableType :: Product ( naming. free_variable ( ) , rcs[ i] . source . clone ( ) ) ;
235
238
bind ( & node. source , target_type) ?;
236
239
}
237
240
Term :: Comp ( i, j) => {
@@ -242,12 +245,12 @@ pub(crate) fn type_check<Witness, App: Application>(
242
245
}
243
246
Term :: Case ( i, j) | Term :: AssertL ( i, j) | Term :: AssertR ( i, j) => {
244
247
let ( i, j) = ( idx - i, idx - j) ;
245
- let var1 = Variable :: free ( ) ;
246
- let var2 = Variable :: free ( ) ;
247
- let var3 = Variable :: free ( ) ;
248
+ let var1 = naming . free_variable ( ) ;
249
+ let var2 = naming . free_variable ( ) ;
250
+ let var3 = naming . free_variable ( ) ;
248
251
249
252
let sum12_ty = VariableType :: Sum ( var1. clone ( ) , var2. clone ( ) ) ;
250
- let sum12_var = Variable :: free ( ) ;
253
+ let sum12_var = naming . free_variable ( ) ;
251
254
bind ( & sum12_var, sum12_ty) ?;
252
255
253
256
let source_ty = VariableType :: Product ( sum12_var, var3. clone ( ) ) ;
@@ -282,10 +285,10 @@ pub(crate) fn type_check<Witness, App: Application>(
282
285
let ( i, j) = ( idx - i, idx - j) ;
283
286
// See chapter 6 (Delegation) of TR
284
287
// Be careful, this order changed! https://github.com/ElementsProject/simplicity/pull/46
285
- let var_a = Variable :: free ( ) ;
286
- let var_b = Variable :: free ( ) ;
287
- let var_c = Variable :: free ( ) ;
288
- let var_d = Variable :: free ( ) ;
288
+ let var_a = naming . free_variable ( ) ;
289
+ let var_b = naming . free_variable ( ) ;
290
+ let var_c = naming . free_variable ( ) ;
291
+ let var_d = naming . free_variable ( ) ;
289
292
290
293
let s_source =
291
294
Variable :: bound ( VariableType :: Product ( pow2s[ 8 ] . clone ( ) , var_a. clone ( ) ) ) ;
0 commit comments