@@ -63,6 +63,7 @@ function pyconvert_add_rule_high_priority(
6363 type:: Type ,
6464 scope:: Type ,
6565 func:: Function ,
66+ priority:: Int ,
6667)
6768 @nospecialize type scope func
6869 type <: scope || throw (
@@ -75,7 +76,7 @@ function pyconvert_add_rule_high_priority(
7576 type,
7677 scope,
7778 func,
78- typemax (Int) - length (PYCONVERT_RULES),
79+ typemax (Int) ÷ 2 + priority * ( typemax (Int) ÷ 16 ) - length (PYCONVERT_RULES),
7980 ),
8081 )
8182 empty! .(values (PYCONVERT_RULES_CACHE))
@@ -400,50 +401,69 @@ function init_pyconvert()
400401end
401402
402403function init_pyconvert_canonical ()
403- pyconvert_add_rule (" types:NoneType" , Nothing, Any, pyconvert_rule_none)
404- pyconvert_add_rule (" builtins:bool" , Bool, Any, pyconvert_rule_bool)
405- pyconvert_add_rule (" builtins:float" , Float64, Any, pyconvert_rule_float)
406- pyconvert_add_rule (
404+ priority = 0
405+ pyconvert_add_rule_high_priority (" types:NoneType" , Nothing, Any, pyconvert_rule_none, priority)
406+ pyconvert_add_rule_high_priority (" builtins:bool" , Bool, Any, pyconvert_rule_bool, priority)
407+ pyconvert_add_rule_high_priority (" builtins:float" , Float64, Any, pyconvert_rule_float, priority)
408+ pyconvert_add_rule_high_priority (
407409 " builtins:complex" ,
408410 Complex{Float64},
409411 Any,
410412 pyconvert_rule_complex,
413+ priority,
411414 )
412- pyconvert_add_rule (
415+ pyconvert_add_rule_high_priority (" numbers:Integral" , Integer, Any, pyconvert_rule_int, priority)
416+ pyconvert_add_rule_high_priority (
413417 " numbers:Rational" ,
414418 Rational{<: Integer },
415419 Any,
416420 pyconvert_rule_fraction,
421+ priority,
417422 )
418- pyconvert_add_rule (" numbers:Integral" , Integer, Any, pyconvert_rule_int)
419- pyconvert_add_rule (" builtins:str" , String, Any, pyconvert_rule_str)
420- pyconvert_add_rule (
423+ pyconvert_add_rule_high_priority (" builtins:str" , String, Any, pyconvert_rule_str, priority)
424+ pyconvert_add_rule_high_priority (
421425 " builtins:bytes" ,
422426 Base. CodeUnits{UInt8,String},
423427 Any,
424428 pyconvert_rule_bytes,
429+ priority,
425430 )
426- pyconvert_add_rule (
431+ pyconvert_add_rule_high_priority (
427432 " builtins:range" ,
428433 StepRange{<: Integer ,<: Integer },
429434 Any,
430435 pyconvert_rule_range,
436+ priority,
431437 )
432- pyconvert_add_rule (" builtins:tuple" , NamedTuple, Any, pyconvert_rule_iterable)
433- pyconvert_add_rule (" builtins:tuple" , Tuple, Any, pyconvert_rule_iterable)
434- pyconvert_add_rule (" datetime:datetime" , DateTime, Any, pyconvert_rule_datetime)
435- pyconvert_add_rule (" datetime:date" , Date, Any, pyconvert_rule_date)
436- pyconvert_add_rule (" datetime:time" , Time, Any, pyconvert_rule_time)
437- pyconvert_add_rule (
438+ pyconvert_add_rule_high_priority (
439+ " builtins:tuple" ,
440+ NamedTuple,
441+ Any,
442+ pyconvert_rule_iterable,
443+ priority,
444+ )
445+ pyconvert_add_rule_high_priority (" builtins:tuple" , Tuple, Any, pyconvert_rule_iterable, priority)
446+ pyconvert_add_rule_high_priority (
447+ " datetime:datetime" ,
448+ DateTime,
449+ Any,
450+ pyconvert_rule_datetime,
451+ priority,
452+ )
453+ pyconvert_add_rule_high_priority (" datetime:date" , Date, Any, pyconvert_rule_date, priority)
454+ pyconvert_add_rule_high_priority (" datetime:time" , Time, Any, pyconvert_rule_time, priority)
455+ pyconvert_add_rule_high_priority (
438456 " datetime:timedelta" ,
439457 Microsecond,
440458 Any,
441459 pyconvert_rule_timedelta,
460+ priority,
442461 )
443- pyconvert_add_rule (
462+ pyconvert_add_rule_high_priority (
444463 " builtins:BaseException" ,
445464 PyException,
446465 Any,
447466 pyconvert_rule_exception,
467+ priority,
448468 )
449469end
0 commit comments