@@ -22,8 +22,23 @@ JL_DLLEXPORT int jl_is_valid_oc_argtype(jl_tupletype_t *argt, jl_method_t *sourc
2222 return 1 ;
2323}
2424
25- jl_opaque_closure_t * jl_new_opaque_closure (jl_tupletype_t * argt , jl_value_t * rt_lb , jl_value_t * rt_ub ,
26- jl_value_t * source_ , jl_value_t * * env , size_t nenv )
25+ static jl_value_t * prepend_type (jl_value_t * t0 , jl_tupletype_t * t )
26+ {
27+ jl_svec_t * sig_args = NULL ;
28+ JL_GC_PUSH1 (& sig_args );
29+ size_t nsig = 1 + jl_svec_len (t -> parameters );
30+ sig_args = jl_alloc_svec_uninit (nsig );
31+ jl_svecset (sig_args , 0 , t0 );
32+ for (size_t i = 0 ; i < nsig - 1 ; ++ i ) {
33+ jl_svecset (sig_args , 1 + i , jl_tparam (t , i ));
34+ }
35+ jl_value_t * sigtype = (jl_value_t * )jl_apply_tuple_type_v (jl_svec_data (sig_args ), nsig );
36+ JL_GC_POP ();
37+ return sigtype ;
38+ }
39+
40+ static jl_opaque_closure_t * new_opaque_closure (jl_tupletype_t * argt , jl_value_t * rt_lb , jl_value_t * rt_ub ,
41+ jl_value_t * source_ , jl_value_t * captures )
2742{
2843 if (!jl_is_tuple_type ((jl_value_t * )argt )) {
2944 jl_error ("OpaqueClosure argument tuple must be a tuple type" );
@@ -40,26 +55,19 @@ jl_opaque_closure_t *jl_new_opaque_closure(jl_tupletype_t *argt, jl_value_t *rt_
4055 }
4156 if (jl_nparams (argt ) + 1 - jl_is_va_tuple (argt ) < source -> nargs - source -> isva )
4257 jl_error ("Argument type tuple has too few required arguments for method" );
43- jl_task_t * ct = jl_current_task ;
58+ jl_value_t * sigtype = NULL ;
59+ JL_GC_PUSH1 (& sigtype );
60+ sigtype = prepend_type (jl_typeof (captures ), argt );
61+
4462 jl_value_t * oc_type JL_ALWAYS_LEAFTYPE ;
4563 oc_type = jl_apply_type2 ((jl_value_t * )jl_opaque_closure_type , (jl_value_t * )argt , rt_ub );
4664 JL_GC_PROMISE_ROOTED (oc_type );
47- jl_value_t * captures = NULL , * sigtype = NULL ;
48- jl_svec_t * sig_args = NULL ;
49- JL_GC_PUSH3 (& captures , & sigtype , & sig_args );
50- captures = jl_f_tuple (NULL , env , nenv );
5165
52- size_t nsig = 1 + jl_svec_len (argt -> parameters );
53- sig_args = jl_alloc_svec_uninit (nsig );
54- jl_svecset (sig_args , 0 , jl_typeof (captures ));
55- for (size_t i = 0 ; i < nsig - 1 ; ++ i ) {
56- jl_svecset (sig_args , 1 + i , jl_tparam (argt , i ));
57- }
58- sigtype = (jl_value_t * )jl_apply_tuple_type_v (jl_svec_data (sig_args ), nsig );
5966 jl_method_instance_t * mi = jl_specializations_get_linfo (source , sigtype , jl_emptysvec );
6067 size_t world = jl_atomic_load_acquire (& jl_world_counter );
6168 jl_code_instance_t * ci = jl_compile_method_internal (mi , world );
6269
70+ jl_task_t * ct = jl_current_task ;
6371 jl_opaque_closure_t * oc = (jl_opaque_closure_t * )jl_gc_alloc (ct -> ptls , sizeof (jl_opaque_closure_t ), oc_type );
6472 JL_GC_POP ();
6573 oc -> source = source ;
@@ -82,6 +90,52 @@ jl_opaque_closure_t *jl_new_opaque_closure(jl_tupletype_t *argt, jl_value_t *rt_
8290 return oc ;
8391}
8492
93+ jl_opaque_closure_t * jl_new_opaque_closure (jl_tupletype_t * argt , jl_value_t * rt_lb , jl_value_t * rt_ub ,
94+ jl_value_t * source_ , jl_value_t * * env , size_t nenv )
95+ {
96+ jl_value_t * captures = jl_f_tuple (NULL , env , nenv );
97+ JL_GC_PUSH1 (& captures );
98+ jl_opaque_closure_t * oc = new_opaque_closure (argt , rt_lb , rt_ub , source_ , captures );
99+ JL_GC_POP ();
100+ return oc ;
101+ }
102+
103+ jl_method_t * jl_make_opaque_closure_method (jl_module_t * module , jl_value_t * name ,
104+ int nargs , jl_value_t * functionloc , jl_code_info_t * ci , int isva );
105+
106+ JL_DLLEXPORT jl_code_instance_t * jl_new_codeinst (
107+ jl_method_instance_t * mi , jl_value_t * rettype ,
108+ jl_value_t * inferred_const , jl_value_t * inferred ,
109+ int32_t const_flags , size_t min_world , size_t max_world ,
110+ uint32_t ipo_effects , uint32_t effects , jl_value_t * argescapes ,
111+ uint8_t relocatability );
112+
113+ JL_DLLEXPORT void jl_mi_cache_insert (jl_method_instance_t * mi JL_ROOTING_ARGUMENT ,
114+ jl_code_instance_t * ci JL_ROOTED_ARGUMENT JL_MAYBE_UNROOTED );
115+
116+ JL_DLLEXPORT jl_opaque_closure_t * jl_new_opaque_closure_from_code_info (jl_tupletype_t * argt , jl_value_t * rt_lb , jl_value_t * rt_ub ,
117+ jl_module_t * mod , jl_code_info_t * ci , int lineno , jl_value_t * file , int nargs , int isva , jl_value_t * env )
118+ {
119+ if (!ci -> inferred )
120+ jl_error ("CodeInfo must already be inferred" );
121+ jl_value_t * root = NULL , * sigtype = NULL ;
122+ jl_code_instance_t * inst = NULL ;
123+ JL_GC_PUSH3 (& root , & sigtype , & inst );
124+ root = jl_box_long (lineno );
125+ root = jl_new_struct (jl_linenumbernode_type , root , file );
126+ root = (jl_value_t * )jl_make_opaque_closure_method (mod , jl_nothing , nargs , root , ci , isva );
127+
128+ sigtype = prepend_type (jl_typeof (env ), argt );
129+ jl_method_instance_t * mi = jl_specializations_get_linfo ((jl_method_t * )root , sigtype , jl_emptysvec );
130+ inst = jl_new_codeinst (mi , rt_ub , NULL , (jl_value_t * )ci ,
131+ 0 , ((jl_method_t * )root )-> primary_world , -1 , 0 , 0 , jl_nothing , 0 );
132+ jl_mi_cache_insert (mi , inst );
133+
134+ jl_opaque_closure_t * oc = new_opaque_closure (argt , rt_lb , rt_ub , root , env );
135+ JL_GC_POP ();
136+ return oc ;
137+ }
138+
85139JL_CALLABLE (jl_new_opaque_closure_jlcall )
86140{
87141 if (nargs < 4 )
0 commit comments