11structure Main =
22 struct
3+ open Fn.Syntax infix |>
4+
35 structure Instr = LabeledInstr
46
57 fun symbol class name descriptor = {
@@ -272,9 +274,9 @@ structure Main =
272274 ]
273275 }
274276
275- val class = Class.from {
277+ fun class name = Class.from {
276278 accessFlags = [Class.Flag.PUBLIC],
277- thisClass = ClassName.fromString " Main " ,
279+ thisClass = ClassName.fromString name ,
278280 superClass = ClassName.fromString " java/lang/Object" ,
279281 interfaces = [],
280282 attributes = [Attr.SourceFile " main.sml" ],
@@ -297,9 +299,9 @@ structure Main =
297299 string o dropl isSpace o dropr isSpace o full
298300 end
299301
300- fun java classPath className =
302+ fun java { classpath } className =
301303 let
302- val proc = Unix.execute (" /usr/bin/java" , [" -cp" , classPath , className])
304+ val proc = Unix.execute (" /usr/bin/java" , [" -cp" , classpath , className])
303305 val output = TextIO.inputAll (Unix.textInstreamOf proc)
304306 in
305307 Unix.reap proc
@@ -308,27 +310,29 @@ structure Main =
308310
309311 fun main () =
310312 let
313+ val className = " Main"
311314 val workDir = OS.FileSys.getDir ()
312- val bytes = Class.compile class
313- val f = BinIO.openOut (OS.Path.joinDirFile { dir = workDir, file = " Main.class" })
314- val _ = BinIO.output (f, bytes)
315- val _ = BinIO.closeOut f
316- val output = java workDir " Main"
315+ val binDir = OS.Path.joinDirFile { dir = workDir, file = " bin" }
316+ val fileName = OS.Path.joinDirFile { dir = binDir, file = className ^ " .class" }
317+ val classFile = BinIO.openOut fileName
318+ val bytes = Class.compile (class className)
319+ val _ = BinIO.output (classFile, bytes)
320+ val _ = BinIO.closeOut classFile
321+ val output = java { classpath = binDir } className
317322 in
318323 print (output ^ " \n " )
319324 end
320325
321326 fun stackMap () =
322- let
323- val { attributes = [Attr.Code { code, ... }], ... } = nestedLoops
324- val { offsetedInstrs, ... } = Instr.compileList ConstPool.empty code
325- in
326- StackLang.compileCompact
327- (
328- StackLang.interpret
329- (
330- Verifier.verify offsetedInstrs
331- )
332- )
333- end
327+ case nestedLoops of
328+ | { attributes = [Attr.Code { code, ... }], ... } =>
329+ let
330+ val { offsetedInstrs, ... } = Instr.compileList ConstPool.empty code
331+ in
332+ offsetedInstrs
333+ |> Verifier.verify
334+ |> StackLang.interpret
335+ |> StackLang.compileCompact
336+ end
337+ | _ => raise Fail " not implemented"
334338 end
0 commit comments