@@ -95,12 +95,22 @@ static int jl_has_typevars__(jl_value_t *v, int incl_wildcard, jl_value_t **p, s
95
95
if (jl_is_typector (v ))
96
96
return incl_wildcard ;
97
97
jl_svec_t * t ;
98
+ int expect = -1 ;
98
99
if (jl_is_uniontype (v )) {
99
100
t = ((jl_uniontype_t * )v )-> types ;
100
101
}
101
102
else if (jl_is_datatype (v )) {
102
103
if (is_unspec ((jl_datatype_t * )v ))
103
104
return 0 ;
105
+ if (p == NULL ) {
106
+ if (incl_wildcard )
107
+ expect = ((jl_datatype_t * )v )-> haswildcard ;
108
+ else
109
+ expect = ((jl_datatype_t * )v )-> hastypevars ;
110
+ #ifdef NDEBUG
111
+ return expect ;
112
+ #endif
113
+ }
104
114
t = ((jl_datatype_t * )v )-> parameters ;
105
115
}
106
116
else {
@@ -110,14 +120,17 @@ static int jl_has_typevars__(jl_value_t *v, int incl_wildcard, jl_value_t **p, s
110
120
for (i = 0 ; i < l ; i ++ ) {
111
121
jl_value_t * elt = jl_svecref (t , i );
112
122
if (elt != v ) {
113
- if (jl_has_typevars__ (elt , incl_wildcard , p , np ))
123
+ if (jl_has_typevars__ (elt , incl_wildcard , p , np )) {
124
+ if (expect >= 0 ) assert (expect );
114
125
return 1 ;
126
+ }
115
127
}
116
128
}
117
129
// probably not necessary; no reason to use match() instead of subtype()
118
130
// on the unconstrained version of a type
119
131
//if (jl_is_typector(v))
120
132
// return jl_svec_len((((jl_typector_t*)v)->parameters) > 0);
133
+ if (expect >= 0 ) assert (!expect );
121
134
return 0 ;
122
135
}
123
136
@@ -148,26 +161,39 @@ JL_DLLEXPORT int jl_has_typevars(jl_value_t *v)
148
161
JL_DLLEXPORT int jl_is_leaf_type (jl_value_t * v )
149
162
{
150
163
if (jl_is_datatype (v )) {
164
+ int isleaf = ((jl_datatype_t * )v )-> isleaftype ;
165
+ #ifdef NDEBUG
166
+ return isleaf ;
167
+ #else
151
168
if (((jl_datatype_t * )v )-> abstract ) {
152
- if (jl_is_type_type (v ))
153
- return !jl_is_typevar (jl_tparam0 (v ));
154
- return 0 ;
169
+ int x = 0 ;
170
+ if (jl_is_type_type (v )) {
171
+ x = !jl_is_typevar (jl_tparam0 (v ));
172
+ }
173
+ assert (x == isleaf );
174
+ return x ;
155
175
}
156
176
jl_svec_t * t = ((jl_datatype_t * )v )-> parameters ;
157
177
size_t l = jl_svec_len (t );
158
178
if (((jl_datatype_t * )v )-> name == jl_tuple_typename ) {
159
179
for (int i = 0 ; i < l ; i ++ ) {
160
- if (!jl_is_leaf_type (jl_svecref (t ,i )))
180
+ if (!jl_is_leaf_type (jl_svecref (t ,i ))) {
181
+ assert (!isleaf );
161
182
return 0 ;
183
+ }
162
184
}
163
185
}
164
186
else {
165
187
for (int i = 0 ; i < l ; i ++ ) {
166
- if (jl_is_typevar (jl_svecref (t ,i )))
188
+ if (jl_is_typevar (jl_svecref (t ,i ))) {
189
+ assert (!isleaf );
167
190
return 0 ;
191
+ }
168
192
}
169
193
}
194
+ assert (isleaf );
170
195
return 1 ;
196
+ #endif
171
197
}
172
198
return 0 ;
173
199
}
@@ -2039,6 +2065,45 @@ static jl_value_t *lookup_type_stack(jl_typestack_t *stack, jl_datatype_t *tt, s
2039
2065
return NULL ;
2040
2066
}
2041
2067
2068
+ static size_t jl_type_depth (jl_value_t * dt )
2069
+ {
2070
+ if (jl_is_uniontype (dt )) {
2071
+ jl_svec_t * t = ((jl_uniontype_t * )dt )-> types ;
2072
+ size_t i , l = jl_svec_len (t );
2073
+ size_t depth = 0 ;
2074
+ for (i = 0 ; i < l ; i ++ ) {
2075
+ jl_value_t * p = jl_svecref (t , i );
2076
+ size_t d = jl_type_depth (p );
2077
+ if (d > depth )
2078
+ depth = d ;
2079
+ }
2080
+ return depth ;
2081
+ }
2082
+ else if (jl_is_datatype (dt )) {
2083
+ return ((jl_datatype_t * )dt )-> depth ;
2084
+ }
2085
+ return 0 ;
2086
+ }
2087
+
2088
+ void jl_precompute_memoized_dt (jl_datatype_t * dt )
2089
+ {
2090
+ int istuple = dt -> name == jl_tuple_typename ;
2091
+ size_t i , l = jl_nparams (dt );
2092
+ dt -> isleaftype = !dt -> abstract || (jl_type_type != NULL && dt -> name == jl_type_type -> name );
2093
+ for (i = 0 ; i < l ; i ++ ) {
2094
+ jl_value_t * p = jl_tparam (dt , i );
2095
+ size_t d = jl_type_depth (p ) + 1 ;
2096
+ if (d > dt -> depth )
2097
+ dt -> depth = d ;
2098
+ if (!dt -> hastypevars )
2099
+ dt -> hastypevars = jl_has_typevars__ (p , 0 , NULL , 0 );
2100
+ if (!dt -> haswildcard )
2101
+ dt -> haswildcard = jl_has_typevars__ (p , 1 , NULL , 0 );
2102
+ if (dt -> isleaftype )
2103
+ dt -> isleaftype = (istuple ? jl_is_leaf_type (p ) : !jl_is_typevar (p ));
2104
+ }
2105
+ }
2106
+
2042
2107
static jl_value_t * inst_datatype (jl_datatype_t * dt , jl_svec_t * p , jl_value_t * * iparams , size_t ntp ,
2043
2108
int cacheable , int isabstract , jl_typestack_t * stack ,
2044
2109
jl_value_t * * env , size_t n )
@@ -2115,6 +2180,7 @@ static jl_value_t *inst_datatype(jl_datatype_t *dt, jl_svec_t *p, jl_value_t **i
2115
2180
ndt -> ditype = NULL ;
2116
2181
ndt -> size = 0 ;
2117
2182
ndt -> alignment = 1 ;
2183
+ jl_precompute_memoized_dt (ndt );
2118
2184
2119
2185
// assign uid as early as possible
2120
2186
if (cacheable && !ndt -> abstract && ndt -> uid == 0 )
@@ -3340,6 +3406,9 @@ void jl_init_types(void)
3340
3406
//jl_anytuple_type->parameters = jl_svec(1, jl_wrap_vararg((jl_value_t*)NULL, (jl_value_t*)NULL));
3341
3407
jl_anytuple_type -> types = jl_anytuple_type -> parameters ;
3342
3408
jl_anytuple_type -> nfields = 1 ;
3409
+ jl_anytuple_type -> hastypevars = 1 ;
3410
+ jl_anytuple_type -> haswildcard = 1 ;
3411
+ jl_anytuple_type -> isleaftype = 0 ;
3343
3412
3344
3413
jl_tvar_t * tttvar = jl_new_typevar (jl_symbol ("T" ),
3345
3414
(jl_value_t * )jl_bottom_type ,(jl_value_t * )jl_any_type );
0 commit comments