@@ -327,6 +327,211 @@ public void testNullReturn() {
327
327
assertEquals ("The operation DynamicVariadicNull must return a non-null value, but did return a null value." , e .getMessage ());
328
328
}
329
329
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
+
330
535
private static int countInstructions (BytecodeRootNode root , String name ) throws AssertionError {
331
536
int count = 0 ;
332
537
for (Instruction instr : root .getBytecodeNode ().getInstructions ()) {
0 commit comments