@@ -327,6 +327,211 @@ public void testNullReturn() {
327327 assertEquals ("The operation DynamicVariadicNull must return a non-null value, but did return a null value." , e .getMessage ());
328328 }
329329
330+ @ Test
331+ public void testDynamicVariadicOneScalarOneVariadic () {
332+ var root = parseNode ("testDynamicVariadicOneScalarOneVariadic" , (b ) -> {
333+ b .beginRoot ();
334+ b .beginReturn ();
335+
336+ b .beginVariadicAddInt ();
337+ b .emitLoadConstant (5L );
338+
339+ b .beginDynamicVariadicNums ();
340+ b .emitLoadConstant (3L );
341+ b .endDynamicVariadicNums ();
342+ b .endVariadicAddInt ();
343+
344+ b .endReturn ();
345+ b .endRoot ();
346+ });
347+ assertEquals (2L * 5L + 1L * 5L , root .getCallTarget ().call ());
348+ }
349+
350+ @ Test
351+ public void testDynamicVariadicOneArrayOneVariadic () {
352+ var root = parseNode ("testDynamicVariadicOneArrayOneVariadic" , (b ) -> {
353+ b .beginRoot ();
354+ b .beginReturn ();
355+
356+ b .beginVariadicAddLArr ();
357+ b .emitLoadConstant (new long []{1L , 2L , 3L });
358+
359+ b .beginDynamicVariadicNums ();
360+ b .emitLoadConstant (3L );
361+ b .endDynamicVariadicNums ();
362+ b .endVariadicAddLArr ();
363+
364+ b .endReturn ();
365+ b .endRoot ();
366+ });
367+ assertEquals (2L + 1L , root .getCallTarget ().call ());
368+ }
369+
370+ @ Test
371+ public void testDynamicVariadicOneScalarOneArrayOneVariadic () {
372+ var root = parseNode ("testDynamicVariadicOneScalarOneArrayOneVariadic" , (b ) -> {
373+ b .beginRoot ();
374+ b .beginReturn ();
375+
376+ b .beginVariadicAddIntLArr ();
377+ b .emitLoadConstant (7L );
378+ b .emitLoadConstant (new long []{1L , 2L , 3L });
379+
380+ b .beginDynamicVariadicNums ();
381+ b .emitLoadConstant (3L );
382+ b .endDynamicVariadicNums ();
383+ b .endVariadicAddIntLArr ();
384+
385+ b .endReturn ();
386+ b .endRoot ();
387+ });
388+ assertEquals (2L * 7L + 1L * 7L , root .getCallTarget ().call ());
389+ }
390+
391+ @ Test
392+ public void testDynamicVariadicOneScalarMultipleVariadic () {
393+ /**
394+ * Note regarding the test name: 'Multiple variadic' means one @Variadic argument, but
395+ * multiple calls to operations returning @Variadic. 'Multiple scalar' or 'multiple array'
396+ * really means that the operation has multiples of those arguments.
397+ */
398+ var root = parseNode ("testDynamicVariadicOneScalarMultipleVariadic" , (b ) -> {
399+ b .beginRoot ();
400+ b .beginReturn ();
401+
402+ b .beginVariadicAddInt ();
403+ b .emitLoadConstant (5L );
404+
405+ b .beginDynamicVariadicNums ();
406+ b .emitLoadConstant (3L );
407+ b .endDynamicVariadicNums ();
408+
409+ b .beginDynamicVariadicNums ();
410+ b .emitLoadConstant (3L );
411+ b .endDynamicVariadicNums ();
412+
413+ b .beginDynamicVariadicNums ();
414+ b .emitLoadConstant (3L );
415+ b .endDynamicVariadicNums ();
416+ b .endVariadicAddInt ();
417+
418+ b .endReturn ();
419+ b .endRoot ();
420+ });
421+ assertEquals (2L * 5L + 1L * 5L + 2L * 5L + 1L * 5L + 2L * 5L + 1L * 5L , root .getCallTarget ().call ());
422+ }
423+
424+ @ Test
425+ public void testDynamicVariadicOneArrayMultipleVariadic () {
426+ var root = parseNode ("testDynamicVariadicOneArrayMultipleVariadic" , (b ) -> {
427+ b .beginRoot ();
428+ b .beginReturn ();
429+
430+ b .beginVariadicAddLArr ();
431+ b .emitLoadConstant (new long []{1L , 2L , 3L });
432+
433+ b .beginDynamicVariadicNums ();
434+ b .emitLoadConstant (3L );
435+ b .endDynamicVariadicNums ();
436+
437+ b .beginDynamicVariadicNums ();
438+ b .emitLoadConstant (3L );
439+ b .endDynamicVariadicNums ();
440+
441+ b .beginDynamicVariadicNums ();
442+ b .emitLoadConstant (3L );
443+ b .endDynamicVariadicNums ();
444+ b .endVariadicAddLArr ();
445+
446+ b .endReturn ();
447+ b .endRoot ();
448+ });
449+ assertEquals (2L + 1L + 2L + 1L + 2L + 1L , root .getCallTarget ().call ());
450+ }
451+
452+ @ Test
453+ public void testDynamicVariadicOneScalarOneArrayMultipleVariadic () {
454+ var root = parseNode ("testDynamicVariadicOneScalarOneArrayMultipleVariadic" , (b ) -> {
455+ b .beginRoot ();
456+ b .beginReturn ();
457+
458+ b .beginVariadicAddIntLArr ();
459+ b .emitLoadConstant (7L );
460+ b .emitLoadConstant (new long []{1L , 2L , 3L });
461+
462+ b .beginDynamicVariadicNums ();
463+ b .emitLoadConstant (3L );
464+ b .endDynamicVariadicNums ();
465+
466+ b .beginDynamicVariadicNums ();
467+ b .emitLoadConstant (3L );
468+ b .endDynamicVariadicNums ();
469+
470+ b .beginDynamicVariadicNums ();
471+ b .emitLoadConstant (3L );
472+ b .endDynamicVariadicNums ();
473+ b .endVariadicAddIntLArr ();
474+
475+ b .endReturn ();
476+ b .endRoot ();
477+ });
478+ assertEquals (2L * 7L + 1L * 7L + 2L * 7L + 1L * 7L + 2L * 7L + 1L * 7L , root .getCallTarget ().call ());
479+ }
480+
481+ @ Test
482+ public void testDynamicVariadicMultipleScalarMultipleArrayOneVariadic () {
483+ var root = parseNode ("testDynamicVariadicMultipleScalarMultipleArrayOneVariadic" , (b ) -> {
484+ b .beginRoot ();
485+ b .beginReturn ();
486+
487+ b .beginVariadicAddIntIntLArrLArr ();
488+ b .emitLoadConstant (7L );
489+ b .emitLoadConstant (2L );
490+ b .emitLoadConstant (new long []{1L , 2L , 3L });
491+ b .emitLoadConstant (new long []{4L , 5L , 6L });
492+
493+ b .beginDynamicVariadicNums ();
494+ b .emitLoadConstant (3L );
495+ b .endDynamicVariadicNums ();
496+ b .endVariadicAddIntIntLArrLArr ();
497+
498+ b .endReturn ();
499+ b .endRoot ();
500+ });
501+ assertEquals (2L * 7L * 2L + 1L * 7L * 2L , root .getCallTarget ().call ());
502+ }
503+
504+ @ Test
505+ public void testDynamicVariadicMultipleScalarMultipleArrayMultipleVariadic () {
506+ var root = parseNode ("testDynamicVariadicMultipleScalarMultipleArrayMultipleVariadic" , (b ) -> {
507+ b .beginRoot ();
508+ b .beginReturn ();
509+
510+ b .beginVariadicAddIntIntLArrLArr ();
511+ b .emitLoadConstant (7L );
512+ b .emitLoadConstant (2L );
513+ b .emitLoadConstant (new long []{1L , 2L , 3L });
514+ b .emitLoadConstant (new long []{4L , 5L , 6L });
515+
516+ b .beginDynamicVariadicNums ();
517+ b .emitLoadConstant (3L );
518+ b .endDynamicVariadicNums ();
519+
520+ b .beginDynamicVariadicNums ();
521+ b .emitLoadConstant (3L );
522+ b .endDynamicVariadicNums ();
523+
524+ b .beginDynamicVariadicNums ();
525+ b .emitLoadConstant (3L );
526+ b .endDynamicVariadicNums ();
527+ b .endVariadicAddIntIntLArrLArr ();
528+
529+ b .endReturn ();
530+ b .endRoot ();
531+ });
532+ assertEquals (2L * 7L * 2L + 1L * 7L * 2L + 2L * 7L * 2L + 1L * 7L * 2L + 2L * 7L * 2L + 1L * 7L * 2L , root .getCallTarget ().call ());
533+ }
534+
330535 private static int countInstructions (BytecodeRootNode root , String name ) throws AssertionError {
331536 int count = 0 ;
332537 for (Instruction instr : root .getBytecodeNode ().getInstructions ()) {
0 commit comments