81
81
import com .oracle .truffle .api .nodes .ExplodeLoop ;
82
82
import com .oracle .truffle .api .nodes .ExplodeLoop .LoopExplosionKind ;
83
83
import com .oracle .truffle .api .nodes .Node ;
84
+ import com .oracle .truffle .api .profiles .BranchProfile ;
84
85
import com .oracle .truffle .api .profiles .ConditionProfile ;
86
+ import java .util .ArrayList ;
87
+ import java .util .List ;
85
88
86
89
@ ImportStatic ({PythonOptions .class , PGuards .class })
87
90
@ GenerateUncached
@@ -473,6 +476,7 @@ Object[] applyCached(Object callee, @SuppressWarnings("unused") Signature callee
473
476
@ Cached (value = "cachedSignature.getParameterIds()" , dimensions = 1 ) String [] parameters ,
474
477
@ Cached ("parameters.length" ) int positionalParamNum ,
475
478
@ Cached (value = "cachedSignature.getKeywordNames()" , dimensions = 1 ) String [] kwNames ,
479
+ @ Cached BranchProfile posArgOnlyPassedAsKeywordProfile ,
476
480
@ Exclusive @ Cached SearchNamedParameterNode searchParamNode ,
477
481
@ Exclusive @ Cached SearchNamedParameterNode searchKwNode ) {
478
482
PKeyword [] unusedKeywords = takesVarKwds ? new PKeyword [kwLen ] : null ;
@@ -481,6 +485,7 @@ Object[] applyCached(Object callee, @SuppressWarnings("unused") Signature callee
481
485
int additionalKwds = 0 ;
482
486
String lastWrongKeyword = null ;
483
487
int positionalOnlyArgIndex = calleeSignature .getPositionalOnlyArgIndex ();
488
+ List <String > posArgOnlyPassedAsKeywordNames = null ;
484
489
for (int i = 0 ; i < kwLen ; i ++) {
485
490
PKeyword kwArg = keywords [i ];
486
491
String name = kwArg .getName ();
@@ -497,7 +502,8 @@ Object[] applyCached(Object callee, @SuppressWarnings("unused") Signature callee
497
502
if (unusedKeywords != null ) {
498
503
unusedKeywords [k ++] = kwArg ;
499
504
} else {
500
- throw raise .raise (PythonBuiltinClassType .TypeError , ErrorMessages .GOT_SOME_POS_ONLY_ARGS_PASSED_AS_KEYWORD , CreateArgumentsNode .getName (callee ), name );
505
+ posArgOnlyPassedAsKeywordProfile .enter ();
506
+ posArgOnlyPassedAsKeywordNames = addPosArgOnlyPassedAsKeyword (posArgOnlyPassedAsKeywordNames , name );
501
507
}
502
508
} else {
503
509
if (PArguments .getArgument (arguments , kwIdx ) != null ) {
@@ -512,13 +518,14 @@ Object[] applyCached(Object callee, @SuppressWarnings("unused") Signature callee
512
518
lastWrongKeyword = name ;
513
519
}
514
520
}
515
- storeKeywordsOrRaise (callee , arguments , unusedKeywords , k , additionalKwds , lastWrongKeyword , raise );
521
+ storeKeywordsOrRaise (callee , arguments , unusedKeywords , k , additionalKwds , lastWrongKeyword , posArgOnlyPassedAsKeywordNames , posArgOnlyPassedAsKeywordProfile , raise );
516
522
return arguments ;
517
523
}
518
524
519
525
@ Specialization (replaces = "applyCached" )
520
526
Object [] applyUncached (Object callee , Signature calleeSignature , Object [] arguments , PKeyword [] keywords ,
521
527
@ Cached PRaiseNode raise ,
528
+ @ Cached BranchProfile posArgOnlyPassedAsKeywordProfile ,
522
529
@ Exclusive @ Cached SearchNamedParameterNode searchParamNode ,
523
530
@ Exclusive @ Cached SearchNamedParameterNode searchKwNode ) {
524
531
String [] parameters = calleeSignature .getParameterIds ();
@@ -531,6 +538,7 @@ Object[] applyUncached(Object callee, Signature calleeSignature, Object[] argume
531
538
int additionalKwds = 0 ;
532
539
String lastWrongKeyword = null ;
533
540
int positionalOnlyArgIndex = calleeSignature .getPositionalOnlyArgIndex ();
541
+ List <String > posArgOnlyPassedAsKeywordNames = null ;
534
542
for (int i = 0 ; i < kwLen ; i ++) {
535
543
PKeyword kwArg = keywords [i ];
536
544
String name = kwArg .getName ();
@@ -547,7 +555,8 @@ Object[] applyUncached(Object callee, Signature calleeSignature, Object[] argume
547
555
if (unusedKeywords != null ) {
548
556
unusedKeywords [k ++] = kwArg ;
549
557
} else {
550
- throw raise .raise (PythonBuiltinClassType .TypeError , ErrorMessages .GOT_SOME_POS_ONLY_ARGS_PASSED_AS_KEYWORD , CreateArgumentsNode .getName (callee ), name );
558
+ posArgOnlyPassedAsKeywordProfile .enter ();
559
+ posArgOnlyPassedAsKeywordNames = addPosArgOnlyPassedAsKeyword (posArgOnlyPassedAsKeywordNames , name );
551
560
}
552
561
} else {
553
562
if (PArguments .getArgument (arguments , kwIdx ) != null ) {
@@ -562,20 +571,41 @@ Object[] applyUncached(Object callee, Signature calleeSignature, Object[] argume
562
571
lastWrongKeyword = name ;
563
572
}
564
573
}
565
- storeKeywordsOrRaise (callee , arguments , unusedKeywords , k , additionalKwds , lastWrongKeyword , raise );
574
+ storeKeywordsOrRaise (callee , arguments , unusedKeywords , k , additionalKwds , lastWrongKeyword , posArgOnlyPassedAsKeywordNames , posArgOnlyPassedAsKeywordProfile , raise );
566
575
return arguments ;
567
576
}
568
577
569
- private static void storeKeywordsOrRaise (Object callee , Object [] arguments , PKeyword [] unusedKeywords , int unusedKeywordCount , int tooManyKeywords , String lastWrongKeyword , PRaiseNode raise ) {
578
+ @ TruffleBoundary
579
+ private static List <String > addPosArgOnlyPassedAsKeyword (List <String > names , String name ) {
580
+ if (names == null ) {
581
+ List <String > newList = new ArrayList <>();
582
+ newList .add (name );
583
+ return newList ;
584
+ }
585
+ names .add (name );
586
+ return names ;
587
+ }
588
+
589
+ private static void storeKeywordsOrRaise (Object callee , Object [] arguments , PKeyword [] unusedKeywords , int unusedKeywordCount , int tooManyKeywords , String lastWrongKeyword ,
590
+ List <String > posArgOnlyPassedAsKeywordNames , BranchProfile posArgOnlyPassedAsKeywordProfile , PRaiseNode raise ) {
570
591
if (tooManyKeywords == 1 ) {
571
592
throw raise .raise (PythonBuiltinClassType .TypeError , ErrorMessages .GOT_UNEXPECTED_KEYWORD_ARG , CreateArgumentsNode .getName (callee ), lastWrongKeyword );
572
593
} else if (tooManyKeywords > 1 ) {
573
594
throw raise .raise (PythonBuiltinClassType .TypeError , ErrorMessages .GOT_UNEXPECTED_KEYWORD_ARG , CreateArgumentsNode .getName (callee ), tooManyKeywords );
595
+ } else if (posArgOnlyPassedAsKeywordNames != null ) {
596
+ posArgOnlyPassedAsKeywordProfile .enter ();
597
+ String names = joinNames (posArgOnlyPassedAsKeywordNames );
598
+ throw raise .raise (PythonBuiltinClassType .TypeError , ErrorMessages .GOT_SOME_POS_ONLY_ARGS_PASSED_AS_KEYWORD , CreateArgumentsNode .getName (callee ), names );
574
599
} else if (unusedKeywords != null ) {
575
600
PArguments .setKeywordArguments (arguments , Arrays .copyOf (unusedKeywords , unusedKeywordCount ));
576
601
}
577
602
}
578
603
604
+ @ TruffleBoundary
605
+ private static String joinNames (List <String > names ) {
606
+ return String .join (", " , names );
607
+ }
608
+
579
609
@ GenerateUncached
580
610
protected abstract static class SearchNamedParameterNode extends Node {
581
611
public abstract int execute (String [] parameters , String name );
0 commit comments