Skip to content

Commit 623508e

Browse files
Merge pull request #76 from yassinebenaid/subshells
Subshells
2 parents 7ae7eb9 + 994ba83 commit 623508e

File tree

3 files changed

+627
-1
lines changed

3 files changed

+627
-1
lines changed

generator/compound.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,42 @@ func (g *generator) handleGroup(buf *InstructionBuffer, group ast.Group, pc *pip
4141
Body: cmdbuf,
4242
})
4343
}
44+
45+
func (g *generator) handleSubshell(buf *InstructionBuffer, subshell ast.SubShell, pc *pipeContext) {
46+
var cmdbuf InstructionBuffer
47+
48+
cmdbuf.add(ir.CloneShell{})
49+
50+
g.handleRedirections(&cmdbuf, "subshell", subshell.Redirections, pc, true)
51+
52+
if pc == nil {
53+
for _, cmd := range subshell.Body {
54+
g.generate(&cmdbuf, cmd, nil)
55+
}
56+
} else {
57+
cmdbuf.add(ir.Literal("var done = make(chan struct{},1)"))
58+
cmdbuf.add(ir.Literal(`
59+
pipelineWaitgroup = append(pipelineWaitgroup, runtime.PiplineWaitgroupItem{
60+
Wait: func()error{
61+
<-done
62+
return nil
63+
},
64+
})
65+
`))
66+
67+
var go_routing InstructionBuffer
68+
go_routing.add(ir.Literal("defer streamManager.Destroy()\n"))
69+
for _, cmd := range subshell.Body {
70+
g.generate(&go_routing, cmd, nil)
71+
}
72+
go_routing.add(ir.Literal("done<-struct{}{}\n"))
73+
cmdbuf.add(ir.Closure{
74+
Async: true,
75+
Body: go_routing,
76+
})
77+
}
78+
79+
*buf = append(*buf, ir.Closure{
80+
Body: cmdbuf,
81+
})
82+
}

generator/generator.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ func Generate(script ast.Script) ir.Program {
2020
}
2121
}
2222

23-
type generator struct {}
23+
type generator struct{}
2424

2525
type InstructionBuffer []ir.Instruction
2626

@@ -40,6 +40,10 @@ func (g *generator) generate(buf *InstructionBuffer, statement ast.Statement, pc
4040
g.handleParameterAssignment(buf, v)
4141
case ast.Group:
4242
g.handleGroup(buf, v, pc)
43+
case ast.SubShell:
44+
g.handleSubshell(buf, v, pc)
45+
default:
46+
panic(fmt.Sprintf("unhandled statement type (%T)", statement))
4347
}
4448
}
4549

0 commit comments

Comments
 (0)