@@ -434,6 +434,15 @@ static void jl_method_set_source(jl_method_t *m, jl_code_info_t *src)
434
434
set_lineno = 1 ;
435
435
}
436
436
}
437
+ else if (jl_is_expr (st ) && ((jl_expr_t * )st )-> head == meta_sym &&
438
+ jl_expr_nargs (st ) > 1 && jl_exprarg (st ,0 ) == (jl_value_t * )nospecialize_sym ) {
439
+ for (size_t j = 1 ; j < jl_expr_nargs (st ); j ++ ) {
440
+ jl_value_t * aj = jl_exprarg (st , j );
441
+ if (jl_is_slot (aj ))
442
+ m -> nospec |= (1 << (jl_slot_number (aj ) - 2 ));
443
+ }
444
+ st = jl_nothing ;
445
+ }
437
446
else {
438
447
st = jl_resolve_globals (st , m -> module , sparam_vars );
439
448
}
@@ -465,6 +474,7 @@ JL_DLLEXPORT jl_method_t *jl_new_method_uninit(jl_module_t *module)
465
474
m -> file = empty_sym ;
466
475
m -> line = 0 ;
467
476
m -> called = 0xff ;
477
+ m -> nospec = 0 ;
468
478
m -> invokes .unknown = NULL ;
469
479
m -> isstaged = 0 ;
470
480
m -> isva = 0 ;
@@ -642,6 +652,16 @@ JL_DLLEXPORT void jl_method_def(jl_svec_t *argdata,
642
652
jl_methtable_t * mt ;
643
653
jl_sym_t * name ;
644
654
jl_method_t * m = NULL ;
655
+ size_t i , na = jl_svec_len (atypes );
656
+ int32_t nospec = 0 ;
657
+ for (i = 1 ; i < na ; i ++ ) {
658
+ jl_value_t * ti = jl_svecref (atypes , i );
659
+ if (ti == jl_ANY_flag ||
660
+ (jl_is_vararg_type (ti ) && jl_tparam0 (jl_unwrap_unionall (ti )) == jl_ANY_flag )) {
661
+ nospec |= (1 << (i - 1 ));
662
+ jl_svecset (atypes , i , jl_substitute_var (ti , (jl_tvar_t * )jl_ANY_flag , (jl_value_t * )jl_any_type ));
663
+ }
664
+ }
645
665
jl_value_t * argtype = (jl_value_t * )jl_apply_tuple_type (atypes );
646
666
JL_GC_PUSH3 (& f , & m , & argtype );
647
667
@@ -675,6 +695,7 @@ JL_DLLEXPORT void jl_method_def(jl_svec_t *argdata,
675
695
}
676
696
677
697
m = jl_new_method (f , name , module , (jl_tupletype_t * )argtype , nargs , isva , tvars , isstaged == jl_true );
698
+ m -> nospec |= nospec ;
678
699
679
700
if (jl_has_free_typevars (argtype )) {
680
701
jl_exceptionf (jl_argumenterror_type ,
@@ -686,7 +707,6 @@ JL_DLLEXPORT void jl_method_def(jl_svec_t *argdata,
686
707
687
708
jl_check_static_parameter_conflicts (m , f , tvars );
688
709
689
- size_t i , na = jl_svec_len (atypes );
690
710
for (i = 0 ; i < na ; i ++ ) {
691
711
jl_value_t * elt = jl_svecref (atypes , i );
692
712
if (!jl_is_type (elt ) && !jl_is_typevar (elt )) {
0 commit comments