66 "context"
77 "embed"
88 "errors"
9+ "fmt"
10+ "os"
911 "os/exec"
1012 "strings"
1113 "syscall"
@@ -19,12 +21,12 @@ const timeout = 7 * time.Second
1921var answers embed.FS
2022
2123type Scorecard struct {
22- Answer string
23- Args [] string
24- ExitCode int
25- Pass , Timeout bool
26- Stderr , Stdout []byte
27- Took time.Duration
24+ ASMBytes , ExitCode int
25+ Answer string
26+ Args [] string
27+ Pass , Timeout bool
28+ Stderr , Stdout []byte
29+ Took time.Duration
2830}
2931
3032func getAnswer (holeID , code string ) (args []string , answer string ) {
@@ -93,6 +95,7 @@ func Play(ctx context.Context, holeID, langID, code string) (score Scorecard) {
9395 score .Args , score .Answer = getAnswer (holeID , code )
9496
9597 var stderr , stdout bytes.Buffer
98+ var asmBytesRead , asmBytesWrite * os.File
9699
97100 ctx , cancel := context .WithTimeout (ctx , timeout )
98101 defer cancel ()
@@ -109,7 +112,13 @@ func Play(ctx context.Context, holeID, langID, code string) (score Scorecard) {
109112 // Interpreter
110113 switch langID {
111114 case "assembly" :
112- cmd .Args = []string {"/usr/bin/defasm" , "-r" }
115+ var err error
116+ if asmBytesRead , asmBytesWrite , err = os .Pipe (); err != nil {
117+ panic (err )
118+ }
119+
120+ cmd .Args = []string {"/usr/bin/defasm" , "--size-out=3" , "-r" }
121+ cmd .ExtraFiles = []* os.File {asmBytesWrite }
113122 case "bash" :
114123 cmd .Args = []string {"/usr/bin/bash" , "-s" , "-" }
115124 case "brainfuck" :
@@ -194,6 +203,14 @@ func Play(ctx context.Context, holeID, langID, code string) (score Scorecard) {
194203 }
195204 }
196205
206+ // Actual byte count is printed by the assembler.
207+ if langID == "assembly" {
208+ if _ , err := fmt .Fscanf (asmBytesRead , "%d" , & score .ASMBytes ); err != nil {
209+ panic (err )
210+ }
211+ asmBytesRead .Close ()
212+ }
213+
197214 const maxLength = 128 * 1024 // 128 KiB
198215
199216 // Trim trailing whitespace.
0 commit comments