@@ -76,6 +76,36 @@ class HLL::Backend::Parrot {
76
76
pir::interpinfo__Ii(pir::const::INTERPINFO_ACTIVE_PMCS),
77
77
]);
78
78
}
79
+
80
+ method stages () {
81
+ ' post pir evalpmc'
82
+ }
83
+
84
+ method post ($ source , * % adverbs ) {
85
+ nqp ::getcomp(' QAST' ). post($ source )
86
+ }
87
+
88
+ method pirbegin () {
89
+ " .include 'cclass.pasm'\n "
90
+ ~ " .include 'except_severity.pasm'\n "
91
+ ~ " .include 'except_types.pasm'\n "
92
+ ~ " .include 'iglobals.pasm'\n "
93
+ ~ " .include 'interpinfo.pasm'\n "
94
+ ~ " .include 'iterator.pasm'\n "
95
+ ~ " .include 'sysinfo.pasm'\n "
96
+ ~ " .include 'stat.pasm'\n "
97
+ ~ " .include 'datatypes.pasm'\n "
98
+ ~ " .include 'libpaths.pasm'\n "
99
+ }
100
+
101
+ method pir ($ source , * % adverbs ) {
102
+ self . pirbegin() ~ $ source . pir()
103
+ }
104
+
105
+ method evalpmc ($ source , * % adverbs ) {
106
+ my $ compiler := nqp ::getcomp(' PIR' );
107
+ $ compiler ($ source )
108
+ }
79
109
}
80
110
81
111
# Role specifying the default backend for this build.
@@ -103,7 +133,7 @@ class HLL::Compiler does HLL::Backend::Default {
103
133
$ ! backend := self . default_backend();
104
134
105
135
# Default stages.
106
- @ ! stages := nqp :: split (' ' , ' start parse ast post pir evalpmc ' );
136
+ @ ! stages := nqp :: split (' ' , ' start parse ast ' ~ $ ! backend . stages() );
107
137
108
138
# Command options and usage.
109
139
@ ! cmdoptions := nqp :: split (' ' , ' e=s help|h target=s trace|t=s encoding=s output|o=s combine version|v show-config verbose-config|V stagestats=s? ll-exception rxtrace nqpevent=s profile profile-compile' );
@@ -417,20 +447,50 @@ class HLL::Compiler does HLL::Backend::Default {
417
447
return self . dumper($ r , $ target , | % adverbs );
418
448
}
419
449
}
450
+
451
+ method exists_stage ($ stage ) {
452
+ my $ found := 0 ;
453
+ for self . stages() {
454
+ if $ _ eq $ stage {
455
+ return 1 ;
456
+ }
457
+ }
458
+ return 0 ;
459
+ }
420
460
421
- method compile ($ source , * % adverbs ) {
461
+ method compile ($ source , : $ from , * % adverbs ) {
422
462
my % * COMPILING <%?OPTIONS > := % adverbs ;
423
463
424
464
my $ target := nqp :: lc (% adverbs <target >);
425
465
my $ result := $ source ;
426
466
my $ stderr := nqp ::getstderr();
427
467
my $ stdin := nqp ::getstdin();
428
468
my $ stagestats := % adverbs <stagestats >;
469
+ unless $ from eq ' ' || self . exists_stage($ from ) {
470
+ nqp ::die(" Unknown compilation input '$ _ '" );
471
+ }
472
+ unless $ target eq ' ' || self . exists_stage($ target ) {
473
+ nqp ::die(" Unknown compilation target '$ _ '" );
474
+ }
429
475
for self . stages() {
476
+ if $ from ne ' ' {
477
+ if $ _ eq $ from {
478
+ $ from := ' ' ;
479
+ }
480
+ next ;
481
+ }
430
482
my $ timestamp := nqp ::time_n();
431
- $ result := self . " $ _" ($ result , | % adverbs );
483
+ if nqp :: can (self , $ _ ) {
484
+ $ result := self . " $ _" ($ result , | % adverbs );
485
+ }
486
+ elsif nqp :: can ($ ! backend , $ _ ) {
487
+ $ result := $ ! backend . " $ _" ($ result , | % adverbs );
488
+ }
489
+ else {
490
+ nqp ::die(" Unknown compilation stage '$ _ '" );
491
+ }
432
492
my $ diff := nqp ::time_n() - $ timestamp ;
433
- if nqp :: defined ($ stagestats ) {
493
+ if nqp :: defined ($ stagestats ) && $ from eq ' ' {
434
494
nqp ::printfh($ stderr , nqp :: sprintf (" Stage %-11s: %7.3f" , [$ _ , $ diff ]));
435
495
$ ! backend . force_gc() if nqp ::bitand_i($ stagestats , 0x4 );
436
496
nqp ::printfh($ stderr , $ ! backend . vmstat())
@@ -472,32 +532,6 @@ class HLL::Compiler does HLL::Backend::Default {
472
532
$ ast ;
473
533
}
474
534
475
- method post ($ source , * % adverbs ) {
476
- nqp ::getcomp(' QAST' ). post($ source )
477
- }
478
-
479
- method pirbegin () {
480
- " .include 'cclass.pasm'\n "
481
- ~ " .include 'except_severity.pasm'\n "
482
- ~ " .include 'except_types.pasm'\n "
483
- ~ " .include 'iglobals.pasm'\n "
484
- ~ " .include 'interpinfo.pasm'\n "
485
- ~ " .include 'iterator.pasm'\n "
486
- ~ " .include 'sysinfo.pasm'\n "
487
- ~ " .include 'stat.pasm'\n "
488
- ~ " .include 'datatypes.pasm'\n "
489
- ~ " .include 'libpaths.pasm'\n "
490
- }
491
-
492
- method pir ($ source , * % adverbs ) {
493
- self . pirbegin() ~ $ source . pir()
494
- }
495
-
496
- method evalpmc ($ source , * % adverbs ) {
497
- my $ compiler := nqp ::getcomp(' PIR' );
498
- $ compiler ($ source )
499
- }
500
-
501
535
method dumper ($ obj , $ name , * % options ) {
502
536
if nqp :: can ($ obj , ' dump' ) {
503
537
nqp :: print ($ obj . dump());
0 commit comments