@@ -44,9 +44,60 @@ func (g *generator) generate(buf *InstructionBuffer, statement ast.Statement, pc
4444 * buf = append (* buf , ir.Closure {
4545 Body : cmdbuf ,
4646 })
47+ case ast.List :
48+ g .handleList (buf , v )
4749 }
4850}
4951
52+ func (g * generator ) handleList (buf * InstructionBuffer , l ast.List ) {
53+ g .generate (buf , l .Left , nil )
54+
55+ var bodybuf InstructionBuffer
56+ g .generate (& bodybuf , l .Right , nil )
57+
58+ buf .add (ir.IfLastExitCode {
59+ Zero : l .Operator == "&&" ,
60+ Body : bodybuf ,
61+ })
62+ }
63+
64+ func (g * generator ) handlePipeline (buf * InstructionBuffer , p ast.Pipeline ) {
65+ buf .add (ir .NewPipelineWaitgroup ("pipelineWaitgroup" ))
66+
67+ for i , cmd := range p {
68+ if i < (len (p ) - 1 ) { //last command doesn't need a pipe
69+ buf .add (ir.NewPipe {
70+ Writer : fmt .Sprintf ("pipeWriter%d" , i + 1 ),
71+ Reader : fmt .Sprintf ("pipeReader%d" , i + 1 ),
72+ })
73+ }
74+
75+ var pc pipeContext
76+ if i == 0 {
77+ pc = pipeContext {
78+ writer : fmt .Sprintf ("pipeWriter%d" , i + 1 ),
79+ stderr : cmd .Stderr ,
80+ }
81+ } else if i == (len (p ) - 1 ) {
82+ pc = pipeContext {
83+ reader : fmt .Sprintf ("pipeReader%d" , i ),
84+ }
85+ } else {
86+ pc = pipeContext {
87+ writer : fmt .Sprintf ("pipeWriter%d" , i + 1 ),
88+ reader : fmt .Sprintf ("pipeReader%d" , i ),
89+ stderr : cmd .Stderr ,
90+ }
91+ }
92+
93+ pc .waitgroup = "pipelineWaitgroup"
94+ g .generate (buf , cmd .Command , & pc )
95+ }
96+
97+ buf .add (ir .WaitPipelineWaitgroup ("pipelineWaitgroup" ))
98+
99+ }
100+
50101func (g * generator ) handleSimpleCommand (buf * InstructionBuffer , cmd ast.Command , pc * pipeContext ) {
51102 buf .add (ir.Declare {Name : "commandName" , Value : g .handleExpression (cmd .Name )})
52103 buf .add (ir.DeclareSlice {Name : "arguments" })
@@ -258,40 +309,3 @@ type pipeContext struct {
258309 waitgroup string
259310 stderr bool
260311}
261-
262- func (g * generator ) handlePipeline (buf * InstructionBuffer , p ast.Pipeline ) {
263- buf .add (ir .NewPipelineWaitgroup ("pipelineWaitgroup" ))
264-
265- for i , cmd := range p {
266- if i < (len (p ) - 1 ) { //last command doesn't need a pipe
267- buf .add (ir.NewPipe {
268- Writer : fmt .Sprintf ("pipeWriter%d" , i + 1 ),
269- Reader : fmt .Sprintf ("pipeReader%d" , i + 1 ),
270- })
271- }
272-
273- var pc pipeContext
274- if i == 0 {
275- pc = pipeContext {
276- writer : fmt .Sprintf ("pipeWriter%d" , i + 1 ),
277- stderr : cmd .Stderr ,
278- }
279- } else if i == (len (p ) - 1 ) {
280- pc = pipeContext {
281- reader : fmt .Sprintf ("pipeReader%d" , i ),
282- }
283- } else {
284- pc = pipeContext {
285- writer : fmt .Sprintf ("pipeWriter%d" , i + 1 ),
286- reader : fmt .Sprintf ("pipeReader%d" , i ),
287- stderr : cmd .Stderr ,
288- }
289- }
290-
291- pc .waitgroup = "pipelineWaitgroup"
292- g .generate (buf , cmd .Command , & pc )
293- }
294-
295- buf .add (ir .WaitPipelineWaitgroup ("pipelineWaitgroup" ))
296-
297- }
0 commit comments