@@ -338,14 +338,13 @@ codegenJS_all target definitions includes filename outputType = do
338 main = compileJS $
338 main = compileJS $
339 JSAlloc "main" $ Just $ JSFunction [] (
339 JSAlloc "main" $ Just $ JSFunction [] (
340 JSSeq [ JSAlloc "vm" (Just $ JSNew "i$VM" [])
340 JSSeq [ JSAlloc "vm" (Just $ JSNew "i$VM" [])
341+ , JSApp (JSIdent "i$SCHED") [JSIdent "vm"]
341 , JSApp (
342 , JSApp (
342 JSIdent (translateName (sMN 0 "runMain"))
343 JSIdent (translateName (sMN 0 "runMain"))
344− , JSNum (JSInt 0)
344+ ) [JSNum (JSInt 0)]
346− , JSWhile (JSProj (JSProj (JSIdent ("vm")) "callstack") "length") (
345+ , JSWhile (JSProj jsCALLSTACK "length") (
347− JSSeq [ JSAlloc "func" (Just (JSApp (JSProj (JSProj (JSIdent ("vm")) "callstack") "pop") []))
346+ JSSeq [ JSAlloc "func" (Just (JSApp (JSProj jsCALLSTACK "pop") []))
348− , JSAlloc "args" (Just (JSApp (JSProj (JSProj (JSIdent ("vm")) "callstack") "pop") []))
347+ , JSAlloc "args" (Just (JSApp (JSProj jsCALLSTACK "pop") []))
349 , JSApp (JSProj (JSIdent "func") "apply") [JSThis, JSIdent "args"]
348 , JSApp (JSProj (JSIdent "func") "apply") [JSThis, JSIdent "args"]
@@ -404,17 +403,13 @@ splitFunction (JSAlloc name (Just (JSFunction args body@(JSSeq _)))) = do
405 newCall :: Int -> JS
404 newCall :: Int -> JS
406 newCall depth =
405 newCall depth =
407− JSApp (JSIdent "i$CALL") [ JSIdent "vm"
406+ JSApp (JSIdent "i$CALL") [ JSIdent $ name ++ "$" ++ show depth
408− , JSIdent $ name ++ "$" ++ show depth
407+ , JSArray [jsOLDBASE, jsMYOLDBASE]
409− , JSArray [JSIdent "vm"
411− , JSIdent "myoldbase"
415 newFun :: [JS] -> JS
410 newFun :: [JS] -> JS
416 newFun seq =
411 newFun seq =
417− JSAlloc name (Just $ JSFunction ["vm", "oldbase", "myoldbase"] (JSSeq seq))
412+ JSAlloc name (Just $ JSFunction ["oldbase", "myoldbase"] (JSSeq seq))
419splitFunction js = return js
414splitFunction js = return js
@@ -424,13 +419,10 @@ translateDecl info (name@(MN 0 fun), bc)
424 allocCaseFunctions (snd body)
419 allocCaseFunctions (snd body)
425 ++ [ JSAlloc (
420 ++ [ JSAlloc (
426 translateName name
421 translateName name
427− ) (Just $ JSFunction ["vm", "oldbase"] (
422+ ) (Just $ JSFunction ["oldbase"] (
428 JSSeq $ JSAlloc "myoldbase" Nothing : map (translateBC info) (fst body) ++ [
423 JSSeq $ JSAlloc "myoldbase" Nothing : map (translateBC info) (fst body) ++ [
429 JSCond [ ( (translateReg $ caseReg (snd body)) `jsInstanceOf` "i$CON" `jsAnd` (JSProj (translateReg $ caseReg (snd body)) "app")
424 JSCond [ ( (translateReg $ caseReg (snd body)) `jsInstanceOf` "i$CON" `jsAnd` (JSProj (translateReg $ caseReg (snd body)) "app")
430− , JSApp (JSProj (translateReg $ caseReg (snd body)) "app") [ JSIdent "vm"
425+ , JSApp (JSProj (translateReg $ caseReg (snd body)) "app") [jsOLDBASE, jsMYOLDBASE]
432− , JSIdent "myoldbase"
435 , ( JSNoop
427 , ( JSNoop
436 , JSSeq $ map (translateBC info) (defaultCase (snd body))
428 , JSSeq $ map (translateBC info) (defaultCase (snd body))
@@ -445,13 +437,10 @@ translateDecl info (name@(MN 0 fun), bc)
445 allocCaseFunctions (snd body)
437 allocCaseFunctions (snd body)
446 ++ [ JSAlloc (
438 ++ [ JSAlloc (
447 translateName name
439 translateName name
448− ) (Just $ JSFunction ["vm", "oldbase"] (
440+ ) (Just $ JSFunction ["oldbase"] (
449 JSSeq $ JSAlloc "myoldbase" Nothing : map (translateBC info) (fst body) ++ [
441 JSSeq $ JSAlloc "myoldbase" Nothing : map (translateBC info) (fst body) ++ [
450 JSCond [ ( (translateReg $ caseReg (snd body)) `jsInstanceOf` "i$CON" `jsAnd` (JSProj (translateReg $ caseReg (snd body)) "ev")
442 JSCond [ ( (translateReg $ caseReg (snd body)) `jsInstanceOf` "i$CON" `jsAnd` (JSProj (translateReg $ caseReg (snd body)) "ev")
451− , JSApp (JSProj (translateReg $ caseReg (snd body)) "ev") [ JSIdent "vm"
443+ , JSApp (JSProj (translateReg $ caseReg (snd body)) "ev") [jsOLDBASE, jsMYOLDBASE]
453− , JSIdent "myoldbase"
456 , ( JSNoop
445 , ( JSNoop
457 , JSSeq $ map (translateBC info) (defaultCase (snd body))
446 , JSSeq $ map (translateBC info) (defaultCase (snd body))
@@ -487,7 +476,7 @@ translateDecl info (name@(MN 0 fun), bc)
487 prepBranch (tag, code) =
476 prepBranch (tag, code) =
488 JSAlloc (
477 JSAlloc (
489 translateName name ++ "$" ++ show tag
478 translateName name ++ "$" ++ show tag
490− ) (Just $ JSFunction ["vm", "oldbase", "myoldbase"] (
479+ ) (Just $ JSFunction ["oldbase", "myoldbase"] (
491 JSSeq $ map (translateBC info) code
480 JSSeq $ map (translateBC info) code
@@ -495,7 +484,7 @@ translateDecl info (name@(MN 0 fun), bc)
495translateDecl info (name, bc) =
484translateDecl info (name, bc) =
496 [ JSAlloc (
485 [ JSAlloc (
497 translateName name
486 translateName name
498− ) (Just $ JSFunction ["vm", "oldbase"] (
487+ ) (Just $ JSFunction ["oldbase"] (
499 JSSeq $ JSAlloc "myoldbase" Nothing : map (translateBC info)bc
488 JSSeq $ JSAlloc "myoldbase" Nothing : map (translateBC info)bc
@@ -504,28 +493,10 @@ translateDecl info (name, bc) =
505translateReg :: Reg -> JS
494translateReg :: Reg -> JS
506translateReg reg
495translateReg reg
507− | RVal <- reg = JSProj (JSIdent "vm") "ret"
496+ | RVal <- reg = jsRET
508 | Tmp <- reg = JSProj (JSIdent "vm") "reg1"
497 | Tmp <- reg = JSProj (JSIdent "vm") "reg1"
511− JSProj (JSIdent "vm") "valstack"
512− ) (JSProj (JSIdent "vm") "valstack_base")
513− | L n <- reg =
498+ | L n <- reg = jsLOC n
515− JSProj (JSIdent "vm") "valstack"
517− JSBinOp "+" (JSProj (JSIdent "vm") "valstack_base") (JSNum (JSInt n))
521− JSProj (JSIdent "vm") "valstack"
522− ) (JSProj (JSIdent "vm") "valstack_top")
523− | T n <- reg =
499+ | T n <- reg = jsTOP n
525− JSProj (JSIdent "vm") "valstack"
527− JSBinOp "+" (JSProj (JSIdent "vm") "valstack_top") (JSNum (JSInt n))
530translateConstant :: Const -> JS
501translateConstant :: Const -> JS
531translateConstant (I i) = JSNum (JSInt i)
502translateConstant (I i) = JSNum (JSInt i)
@@ -593,19 +564,13 @@ jsCALL :: CompileInfo -> Name -> JS
593jsCALL _ n =
564jsCALL _ n =
595 JSIdent "i$CALL"
566 JSIdent "i$CALL"
596− ) [ JSIdent "vm", JSIdent (translateName n), JSArray [ JSIdent "vm"
567+ ) [JSIdent (translateName n), JSArray [jsMYOLDBASE]]
597− , JSIdent "myoldbase"
601jsTAILCALL :: CompileInfo -> Name -> JS
569jsTAILCALL :: CompileInfo -> Name -> JS
602jsTAILCALL _ n =
570jsTAILCALL _ n =
604 JSIdent "i$CALL"
572 JSIdent "i$CALL"
605− ) [ JSIdent "vm", JSIdent (translateName n), JSArray [ JSIdent "vm"
573+ ) [JSIdent (translateName n), JSArray [jsOLDBASE]]
610jsFOREIGN :: CompileInfo -> Reg -> String -> [(FType, Reg)] -> JS
575jsFOREIGN :: CompileInfo -> Reg -> String -> [(FType, Reg)] -> JS
611jsFOREIGN _ reg n args =
576jsFOREIGN _ reg n args =
@@ -616,56 +581,25 @@ jsFOREIGN _ reg n args =
618jsREBASE :: CompileInfo -> JS
583jsREBASE :: CompileInfo -> JS
619−jsREBASE _ =
584+jsREBASE _ = JSAssign jsSTACKBASE jsOLDBASE
621− JSProj (JSIdent "vm") "valstack_base"
626jsSTOREOLD :: CompileInfo ->JS
586jsSTOREOLD :: CompileInfo ->JS
627−jsSTOREOLD _ =
587+jsSTOREOLD _ = JSAssign jsMYOLDBASE jsSTACKBASE
631− JSProj (JSIdent "vm") "valstack_base"
634jsADDTOP :: CompileInfo -> Int -> JS
589jsADDTOP :: CompileInfo -> Int -> JS
635jsADDTOP info n
590jsADDTOP info n
636 | 0 <- n = JSNoop
591 | 0 <- n = JSNoop
637 | otherwise =
592 | otherwise =
638− JSBinOp "+=" (JSProj (JSIdent "vm") "valstack_top") (JSNum (JSInt n))
593+ JSBinOp "+=" jsSTACKTOP (JSNum (JSInt n))
640jsTOPBASE :: CompileInfo -> Int -> JS
595jsTOPBASE :: CompileInfo -> Int -> JS
641−jsTOPBASE info n
596+jsTOPBASE _ 0 = JSAssign jsSTACKTOP jsSTACKBASE
642− | 0 <- n =
597+jsTOPBASE _ n = JSAssign jsSTACKTOP (JSBinOp "+" jsSTACKBASE (JSNum (JSInt n)))
644− JSProj (JSIdent "vm") "valstack_top"
646− JSProj (JSIdent "vm") "valstack_base"
650− JSProj (JSIdent "vm") "valstack_top"
652− JSBinOp "+" (JSProj (JSIdent "vm") "valstack_base") (JSNum (JSInt n))
655jsBASETOP :: CompileInfo -> Int -> JS
600jsBASETOP :: CompileInfo -> Int -> JS
656−jsBASETOP info n
601+jsBASETOP _ 0 = JSAssign jsSTACKBASE jsSTACKTOP
657− | 0 <- n =
602+jsBASETOP _ n = JSAssign jsSTACKBASE (JSBinOp "+" jsSTACKTOP (JSNum (JSInt n)))
659− JSProj (JSIdent "vm") "valstack_base"
661− JSProj (JSIdent "vm") "valstack_top"
665− JSProj (JSIdent "vm") "valstack_base"
667− JSBinOp "+" (JSProj (JSIdent "vm") "valstack_top") (JSNum (JSInt n))
670jsNULL :: CompileInfo -> Reg -> JS
604jsNULL :: CompileInfo -> Reg -> JS
671jsNULL _ r = JSAssign (translateReg r) JSNull
605jsNULL _ r = JSAssign (translateReg r) JSNull
@@ -674,7 +608,7 @@ jsERROR :: CompileInfo -> String -> JS
674jsERROR _ = JSError
608jsERROR _ = JSError
676jsSLIDE :: CompileInfo -> Int -> JS
610jsSLIDE :: CompileInfo -> Int -> JS
677−jsSLIDE _ n = JSApp (JSIdent "i$SLIDE") [JSIdent "vm", JSNum (JSInt n)]
611+jsSLIDE _ n = JSApp (JSIdent "i$SLIDE") [JSNum (JSInt n)]
679jsMKCON :: CompileInfo -> Reg -> Int -> [Reg] -> JS
613jsMKCON :: CompileInfo -> Reg -> Int -> [Reg] -> JS
680jsMKCON info r t rs =
614jsMKCON info r t rs =
@@ -776,8 +710,7 @@ jsCONSTCASE info reg cases def =
777jsPROJECT :: CompileInfo -> Reg -> Int -> Int -> JS
711jsPROJECT :: CompileInfo -> Reg -> Int -> Int -> JS
778jsPROJECT _ reg loc ar =
712jsPROJECT _ reg loc ar =
779− JSApp (JSIdent "i$PROJECT") [ JSIdent "vm"
713+ JSApp (JSIdent "i$PROJECT") [ translateReg reg
781 , JSNum (JSInt loc)
714 , JSNum (JSInt loc)
782 , JSNum (JSInt ar)
715 , JSNum (JSInt ar)
@@ -1392,6 +1325,35 @@ jsOP _ reg op args = JSAssign (translateReg reg) jsOP'
1392jsRESERVE :: CompileInfo -> Int -> JS
1325jsRESERVE :: CompileInfo -> Int -> JS
1393jsRESERVE _ _ = JSNoop
1326jsRESERVE _ _ = JSNoop
1329+jsSTACK = JSIdent "i$valstack"
1332+jsCALLSTACK = JSIdent "i$callstack"
1335+jsSTACKBASE = JSIdent "i$valstack_base"
1338+jsSTACKTOP = JSIdent "i$valstack_top"
1341+jsOLDBASE = JSIdent "oldbase"
1344+jsMYOLDBASE = JSIdent "myoldbase"
1347+jsRET = JSIdent "i$ret"
1350+jsLOC 0 = JSIndex jsSTACK jsSTACKBASE
1351+jsLOC n = JSIndex jsSTACK (JSBinOp "+" jsSTACKBASE (JSNum (JSInt n)))
1354+jsTOP 0 = JSIndex jsSTACK jsSTACKTOP
1355+jsTOP n = JSIndex jsSTACK (JSBinOp "+" jsSTACKTOP (JSNum (JSInt n)))
1395translateBC :: CompileInfo -> BC -> JS
1357translateBC :: CompileInfo -> BC -> JS
1396translateBC info bc
1358translateBC info bc
1397 | ASSIGN r1 r2 <- bc = jsASSIGN info r1 r2
1359 | ASSIGN r1 r2 <- bc = jsASSIGN info r1 r2