@@ -126,13 +126,27 @@ static int NOINLINE compare_fields(jl_value_t *a, jl_value_t *b, jl_datatype_t *
126
126
return 1 ;
127
127
}
128
128
129
- static int egal_types (jl_value_t * a , jl_value_t * b , jl_typeenv_t * env ) JL_NOTSAFEPOINT
129
+ static int egal_types (jl_value_t * a , jl_value_t * b , jl_typeenv_t * env , int tvar_names ) JL_NOTSAFEPOINT
130
130
{
131
131
if (a == b )
132
132
return 1 ;
133
133
jl_datatype_t * dt = (jl_datatype_t * )jl_typeof (a );
134
134
if (dt != (jl_datatype_t * )jl_typeof (b ))
135
135
return 0 ;
136
+ if (dt == jl_datatype_type ) {
137
+ jl_datatype_t * dta = (jl_datatype_t * )a ;
138
+ jl_datatype_t * dtb = (jl_datatype_t * )b ;
139
+ if (dta -> name != dtb -> name )
140
+ return 0 ;
141
+ size_t i , l = jl_nparams (dta );
142
+ if (jl_nparams (dtb ) != l )
143
+ return 0 ;
144
+ for (i = 0 ; i < l ; i ++ ) {
145
+ if (!egal_types (jl_tparam (dta , i ), jl_tparam (dtb , i ), env , tvar_names ))
146
+ return 0 ;
147
+ }
148
+ return 1 ;
149
+ }
136
150
if (dt == jl_tvar_type ) {
137
151
jl_typeenv_t * pe = env ;
138
152
while (pe != NULL ) {
@@ -142,49 +156,39 @@ static int egal_types(jl_value_t *a, jl_value_t *b, jl_typeenv_t *env) JL_NOTSAF
142
156
}
143
157
return 0 ;
144
158
}
145
- if (dt == jl_uniontype_type ) {
146
- return egal_types (((jl_uniontype_t * )a )-> a , ((jl_uniontype_t * )b )-> a , env ) &&
147
- egal_types (((jl_uniontype_t * )a )-> b , ((jl_uniontype_t * )b )-> b , env );
148
- }
149
159
if (dt == jl_unionall_type ) {
150
160
jl_unionall_t * ua = (jl_unionall_t * )a ;
151
161
jl_unionall_t * ub = (jl_unionall_t * )b ;
152
- if (ua -> var -> name != ub -> var -> name )
162
+ if (tvar_names && ua -> var -> name != ub -> var -> name )
153
163
return 0 ;
154
- if (!(egal_types (ua -> var -> lb , ub -> var -> lb , env ) && egal_types (ua -> var -> ub , ub -> var -> ub , env )))
164
+ if (!(egal_types (ua -> var -> lb , ub -> var -> lb , env , tvar_names ) && egal_types (ua -> var -> ub , ub -> var -> ub , env , tvar_names )))
155
165
return 0 ;
156
166
jl_typeenv_t e = { ua -> var , (jl_value_t * )ub -> var , env };
157
- return egal_types (ua -> body , ub -> body , & e );
167
+ return egal_types (ua -> body , ub -> body , & e , tvar_names );
158
168
}
159
- if (dt == jl_datatype_type ) {
160
- jl_datatype_t * dta = (jl_datatype_t * )a ;
161
- jl_datatype_t * dtb = (jl_datatype_t * )b ;
162
- if (dta -> name != dtb -> name )
163
- return 0 ;
164
- size_t i , l = jl_nparams (dta );
165
- if (jl_nparams (dtb ) != l )
166
- return 0 ;
167
- for (i = 0 ; i < l ; i ++ ) {
168
- if (!egal_types (jl_tparam (dta , i ), jl_tparam (dtb , i ), env ))
169
- return 0 ;
170
- }
171
- return 1 ;
169
+ if (dt == jl_uniontype_type ) {
170
+ return egal_types (((jl_uniontype_t * )a )-> a , ((jl_uniontype_t * )b )-> a , env , tvar_names ) &&
171
+ egal_types (((jl_uniontype_t * )a )-> b , ((jl_uniontype_t * )b )-> b , env , tvar_names );
172
172
}
173
- if (dt == jl_vararg_type )
174
- {
173
+ if (dt == jl_vararg_type ) {
175
174
jl_vararg_t * vma = (jl_vararg_t * )a ;
176
175
jl_vararg_t * vmb = (jl_vararg_t * )b ;
177
176
jl_value_t * vmaT = vma -> T ? vma -> T : (jl_value_t * )jl_any_type ;
178
177
jl_value_t * vmbT = vmb -> T ? vmb -> T : (jl_value_t * )jl_any_type ;
179
- if (!egal_types (vmaT , vmbT , env ))
178
+ if (!egal_types (vmaT , vmbT , env , tvar_names ))
180
179
return 0 ;
181
180
if (vma -> N && vmb -> N )
182
- return egal_types (vma -> N , vmb -> N , env );
181
+ return egal_types (vma -> N , vmb -> N , env , tvar_names );
183
182
return !vma -> N && !vmb -> N ;
184
183
}
185
184
return jl_egal (a , b );
186
185
}
187
186
187
+ JL_DLLEXPORT int jl_types_egal (jl_value_t * a , jl_value_t * b )
188
+ {
189
+ return egal_types (a , b , NULL , 0 );
190
+ }
191
+
188
192
JL_DLLEXPORT int jl_egal (jl_value_t * a JL_MAYBE_UNROOTED , jl_value_t * b JL_MAYBE_UNROOTED ) JL_NOTSAFEPOINT
189
193
{
190
194
// warning: a,b may NOT have been gc-rooted by the caller
@@ -219,7 +223,7 @@ JL_DLLEXPORT int jl_egal(jl_value_t *a JL_MAYBE_UNROOTED, jl_value_t *b JL_MAYBE
219
223
if (nf == 0 || !dt -> layout -> haspadding )
220
224
return bits_equal (a , b , sz );
221
225
if (dt == jl_unionall_type )
222
- return egal_types (a , b , NULL );
226
+ return egal_types (a , b , NULL , 1 );
223
227
return compare_fields (a , b , dt );
224
228
}
225
229
0 commit comments