@@ -1951,26 +1951,6 @@ static jl_value_t *inst_type_w_(jl_value_t *t, jl_value_t **env, size_t n,
1951
1951
static jl_svec_t * inst_all (jl_svec_t * p , jl_value_t * * env , size_t n ,
1952
1952
jl_typestack_t * stack , int check );
1953
1953
1954
- static jl_value_t *
1955
- lookup_type_stack (jl_typestack_t * stack , jl_datatype_t * tt , size_t ntp ,
1956
- jl_value_t * * iparams )
1957
- {
1958
- // if an identical instantiation is already in process somewhere
1959
- // up the stack, return it. this computes a fixed point for
1960
- // recursive types.
1961
- jl_typename_t * tn = tt -> name ;
1962
- while (stack != NULL ) {
1963
- if (stack -> tt -> name == tn &&
1964
- ntp == jl_svec_len (stack -> tt -> parameters ) &&
1965
- typekey_eq (stack -> tt , iparams , ntp )) {
1966
- jl_value_t * lkup = (jl_value_t * )stack -> tt ;
1967
- return lkup == tn -> primary ? NULL : lkup ;
1968
- }
1969
- stack = stack -> prev ;
1970
- }
1971
- return NULL ;
1972
- }
1973
-
1974
1954
static jl_value_t * inst_datatype (jl_datatype_t * dt , jl_svec_t * p , jl_value_t * * iparams , size_t ntp ,
1975
1955
int cacheable , int isabstract , jl_typestack_t * stack ,
1976
1956
jl_value_t * * env , size_t n )
@@ -1985,10 +1965,6 @@ static jl_value_t *inst_datatype(jl_datatype_t *dt, jl_svec_t *p, jl_value_t **i
1985
1965
if (lkup != NULL )
1986
1966
return lkup ;
1987
1967
}
1988
- jl_value_t * stack_lkup = lookup_type_stack (stack , dt , ntp , iparams );
1989
- if (stack_lkup ) {
1990
- return stack_lkup ;
1991
- }
1992
1968
1993
1969
// always use original type constructor
1994
1970
if (!istuple ) {
@@ -2032,6 +2008,8 @@ static jl_value_t *inst_datatype(jl_datatype_t *dt, jl_svec_t *p, jl_value_t **i
2032
2008
ndt -> size = 0 ;
2033
2009
ndt -> alignment = 1 ;
2034
2010
2011
+ if (cacheable ) jl_cache_type_ (ndt );
2012
+
2035
2013
if (istuple )
2036
2014
ndt -> super = jl_any_type ;
2037
2015
else
@@ -2069,10 +2047,6 @@ static jl_value_t *inst_datatype(jl_datatype_t *dt, jl_svec_t *p, jl_value_t **i
2069
2047
ndt -> ninitialized = ntp ;
2070
2048
else
2071
2049
ndt -> ninitialized = dt -> ninitialized ;
2072
-
2073
- if (cacheable )
2074
- jl_cache_type_ (ndt );
2075
-
2076
2050
JL_GC_POP ();
2077
2051
return (jl_value_t * )ndt ;
2078
2052
}
@@ -2239,8 +2213,25 @@ static jl_value_t *inst_type_w_(jl_value_t *t, jl_value_t **env, size_t n,
2239
2213
// if t's parameters are not bound in the environment, return it uncopied (#9378)
2240
2214
if (!bound && t == tc ) { JL_GC_POP (); return (jl_value_t * )t ; }
2241
2215
2242
- jl_value_t * result = inst_datatype (tt , NULL , iparams , ntp , cacheable ,
2243
- isabstract , stack , env , n );
2216
+ // if an identical instantiation is already in process somewhere
2217
+ // up the stack, return it. this computes a fixed point for
2218
+ // recursive types.
2219
+ jl_typestack_t * tmp = stack ;
2220
+ jl_value_t * lkup = NULL ;
2221
+ while (tmp != NULL ) {
2222
+ if (tmp -> tt -> name == tn && ntp == jl_svec_len (tmp -> tt -> parameters ) &&
2223
+ typekey_eq (tmp -> tt , iparams , ntp )) {
2224
+ lkup = (jl_value_t * )tmp -> tt ;
2225
+ break ;
2226
+ }
2227
+ tmp = tmp -> prev ;
2228
+ }
2229
+ if (lkup != NULL && lkup != (jl_value_t * )tc ) {
2230
+ JL_GC_POP ();
2231
+ return lkup ;
2232
+ }
2233
+ jl_value_t * result = inst_datatype ((jl_datatype_t * )tt , NULL , iparams , ntp , cacheable , isabstract ,
2234
+ stack , env , n );
2244
2235
JL_GC_POP ();
2245
2236
return result ;
2246
2237
}
0 commit comments