@@ -77,30 +77,40 @@ static int NOINLINE compare_svec(jl_svec_t *a, jl_svec_t *b)
77
77
// See comment above for an explanation of NOINLINE.
78
78
static int NOINLINE compare_fields (jl_value_t * a , jl_value_t * b , jl_datatype_t * dt )
79
79
{
80
- size_t nf = jl_datatype_nfields (dt );
81
- for (size_t f = 0 ; f < nf ; f ++ ) {
80
+ size_t f , nf = jl_datatype_nfields (dt );
81
+ for (f = 0 ; f < nf ; f ++ ) {
82
82
size_t offs = jl_field_offset (dt , f );
83
83
char * ao = (char * )jl_data_ptr (a ) + offs ;
84
84
char * bo = (char * )jl_data_ptr (b ) + offs ;
85
- int eq ;
86
85
if (jl_field_isptr (dt , f )) {
87
86
jl_value_t * af = * (jl_value_t * * )ao ;
88
87
jl_value_t * bf = * (jl_value_t * * )bo ;
89
- if (af == bf ) eq = 1 ;
90
- else if (af == NULL || bf == NULL ) eq = 0 ;
91
- else eq = jl_egal (af , bf );
88
+ if (af != bf ) {
89
+ if (af == NULL || bf == NULL )
90
+ return 0 ;
91
+ if (!jl_egal (af , bf ))
92
+ return 0 ;
93
+ }
92
94
}
93
95
else {
94
96
jl_datatype_t * ft = (jl_datatype_t * )jl_field_type (dt , f );
97
+ if (jl_is_uniontype (ft )) {
98
+ uint8_t asel = ((uint8_t * )ao )[jl_field_size (dt , f ) - 1 ];
99
+ uint8_t bsel = ((uint8_t * )bo )[jl_field_size (dt , f ) - 1 ];
100
+ if (asel != bsel )
101
+ return 0 ;
102
+ ft = (jl_datatype_t * )jl_nth_union_component ((jl_value_t * )ft , asel );
103
+ }
95
104
if (!ft -> layout -> haspadding ) {
96
- eq = bits_equal (ao , bo , jl_field_size (dt , f ));
105
+ if (!bits_equal (ao , bo , jl_field_size (dt , f )))
106
+ return 0 ;
97
107
}
98
108
else {
99
109
assert (jl_datatype_nfields (ft ) > 0 );
100
- eq = compare_fields ((jl_value_t * )ao , (jl_value_t * )bo , ft );
110
+ if (!compare_fields ((jl_value_t * )ao , (jl_value_t * )bo , ft ))
111
+ return 0 ;
101
112
}
102
113
}
103
- if (!eq ) return 0 ;
104
114
}
105
115
return 1 ;
106
116
}
@@ -127,9 +137,11 @@ JL_DLLEXPORT int jl_egal(jl_value_t *a, jl_value_t *b)
127
137
return 0 ;
128
138
return !memcmp (jl_string_data (a ), jl_string_data (b ), l );
129
139
}
130
- if (dt -> mutabl ) return 0 ;
140
+ if (dt -> mutabl )
141
+ return 0 ;
131
142
size_t sz = jl_datatype_size (dt );
132
- if (sz == 0 ) return 1 ;
143
+ if (sz == 0 )
144
+ return 1 ;
133
145
size_t nf = jl_datatype_nfields (dt );
134
146
if (nf == 0 )
135
147
return bits_equal (jl_data_ptr (a ), jl_data_ptr (b ), sz );
@@ -161,10 +173,10 @@ static uintptr_t bits_hash(void *b, size_t sz)
161
173
static uintptr_t NOINLINE hash_svec (jl_svec_t * v )
162
174
{
163
175
uintptr_t h = 0 ;
164
- size_t l = jl_svec_len (v );
165
- for ( size_t i = 0 ; i < l ; i ++ ) {
166
- jl_value_t * x = jl_svecref (v ,i );
167
- uintptr_t u = x == NULL ? 0 : jl_object_id (x );
176
+ size_t i , l = jl_svec_len (v );
177
+ for ( i = 0 ; i < l ; i ++ ) {
178
+ jl_value_t * x = jl_svecref (v , i );
179
+ uintptr_t u = ( x == NULL ) ? 0 : jl_object_id (x );
168
180
h = bitmix (h , u );
169
181
}
170
182
return h ;
@@ -188,9 +200,11 @@ static uintptr_t jl_object_id_(jl_value_t *tv, jl_value_t *v)
188
200
if (dt == jl_typename_type )
189
201
return ((jl_typename_t * )v )-> hash ;
190
202
#ifdef _P64
191
- if (v == jl_ANY_flag ) return 0x31c472f68ee30bddULL ;
203
+ if (v == jl_ANY_flag )
204
+ return 0x31c472f68ee30bddULL ;
192
205
#else
193
- if (v == jl_ANY_flag ) return 0x8ee30bdd ;
206
+ if (v == jl_ANY_flag )
207
+ return 0x8ee30bdd ;
194
208
#endif
195
209
if (dt == jl_string_type ) {
196
210
#ifdef _P64
@@ -199,24 +213,29 @@ static uintptr_t jl_object_id_(jl_value_t *tv, jl_value_t *v)
199
213
return memhash32_seed (jl_string_data (v ), jl_string_len (v ), 0xedc3b677 );
200
214
#endif
201
215
}
202
- if (dt -> mutabl ) return inthash ((uintptr_t )v );
216
+ if (dt -> mutabl )
217
+ return inthash ((uintptr_t )v );
203
218
size_t sz = jl_datatype_size (tv );
204
219
uintptr_t h = jl_object_id (tv );
205
- if (sz == 0 ) return ~h ;
206
- size_t nf = jl_datatype_nfields (dt );
207
- if (nf == 0 ) {
220
+ if (sz == 0 )
221
+ return ~h ;
222
+ size_t f , nf = jl_datatype_nfields (dt );
223
+ if (nf == 0 )
208
224
return bits_hash (jl_data_ptr (v ), sz ) ^ h ;
209
- }
210
- for (size_t f = 0 ; f < nf ; f ++ ) {
225
+ for (f = 0 ; f < nf ; f ++ ) {
211
226
size_t offs = jl_field_offset (dt , f );
212
227
char * vo = (char * )jl_data_ptr (v ) + offs ;
213
228
uintptr_t u ;
214
229
if (jl_field_isptr (dt , f )) {
215
230
jl_value_t * f = * (jl_value_t * * )vo ;
216
- u = f == NULL ? 0 : jl_object_id (f );
231
+ u = ( f == NULL ) ? 0 : jl_object_id (f );
217
232
}
218
233
else {
219
234
jl_datatype_t * fieldtype = (jl_datatype_t * )jl_field_type (dt , f );
235
+ if (jl_is_uniontype (fieldtype )) {
236
+ uint8_t sel = ((uint8_t * )vo )[jl_field_size (dt , f ) - 1 ];
237
+ fieldtype = (jl_datatype_t * )jl_nth_union_component ((jl_value_t * )fieldtype , sel );
238
+ }
220
239
assert (jl_is_datatype (fieldtype ) && !fieldtype -> abstract && !fieldtype -> mutabl );
221
240
if (fieldtype -> layout -> haspadding )
222
241
u = jl_object_id_ ((jl_value_t * )fieldtype , (jl_value_t * )vo );
@@ -244,7 +263,7 @@ JL_CALLABLE(jl_f_is)
244
263
JL_NARGS (== = , 2 , 2 );
245
264
if (args [0 ] == args [1 ])
246
265
return jl_true ;
247
- return jl_egal (args [0 ],args [1 ]) ? jl_true : jl_false ;
266
+ return jl_egal (args [0 ], args [1 ]) ? jl_true : jl_false ;
248
267
}
249
268
250
269
JL_CALLABLE (jl_f_typeof )
0 commit comments