@@ -839,8 +839,47 @@ unfoldLookupTable :: [JS] -> [JS]
839unfoldLookupTable input =
839unfoldLookupTable input =
840 let (evals, evalunfold) = unfoldLT "__IDRLT__mEVAL0" input
840 let (evals, evalunfold) = unfoldLT "__IDRLT__mEVAL0" input
841 (applys, applyunfold) = unfoldLT "__IDRLT__mAPPLY0" evalunfold
841 (applys, applyunfold) = unfoldLT "__IDRLT__mAPPLY0" evalunfold
842− js = applyunfold in expandCons evals applys js
843+ adaptRuntime $ expandCons evals applys js
845+ adaptRuntime :: [JS] -> [JS]
847+ adaptCon . adaptApply "__var_2" . adaptApply "ev" . adaptEval
850+ adaptApply var = map (jsSubst (
851+ JSIndex (JSIdent "__IDRLT__mAPPLY0") (JSProj (JSIdent var) "tag")
852+ ) (JSProj (JSIdent var) "app"))
855+ adaptEval = map (jsSubst (
856+ JSIndex (JSIdent "__IDRLT__mEVAL0") (JSProj (JSIdent "arg0") "tag")
857+ ) (JSProj (JSIdent "arg0") "eval"))
863+ adaptCon' front ((JSAlloc "__IDRRT__Con" (Just body)):back) =
866+ adaptCon' front (next:back) =
867+ adaptCon' (front ++ [next]) back
869+ adaptCon' front [] = front
873+ JSAlloc "__IDRRT__Con" (Just $
874+ JSFunction newArgs (
875+ JSSeq (map newVar newArgs)
879+ newVar var = JSAssign (JSProj JSThis var) (JSIdent var)
880+ newArgs = ["tag", "eval", "app", "vars"]
844 unfoldLT :: String -> [JS] -> ([Int], [JS])
883 unfoldLT :: String -> [JS] -> ([Int], [JS])
845 unfoldLT lt js =
884 unfoldLT lt js =
846 let (table, code) = extractLT lt js
885 let (table, code) = extractLT lt js
@@ -1184,8 +1223,10 @@ translateDeclaration (path, SFun name params stackSize body)
1184 , (SLet var val next) <- body
1223 , (SLet var val next) <- body
1185 , (SChkCase cvar cases) <- next
1224 , (SChkCase cvar cases) <- next
1186 , ap == txt "APPLY" =
1225 , ap == txt "APPLY" =
1187− let lvar = translateVariableName var
1226+ let lvar = translateVariableName var
1228+ (JSIndex (JSIdent t) (JSProj (JSIdent lvar) "tag"))
1188− lookup = "[" ++ lvar ++ ".tag](fn0,arg0," ++ lvar ++ ")" in
1229+ [JSIdent "fn0", JSIdent "arg0", JSIdent lvar]) in
1189 [ lookupTable [(var, "chk")] var cases
1230 [ lookupTable [(var, "chk")] var cases
1190 , jsDecl $ JSFunction ["fn0", "arg0"] (
1231 , jsDecl $ JSFunction ["fn0", "arg0"] (
1191 JSSeq [ JSAlloc "__var_0" (Just $ JSIdent "fn0")
1232 JSSeq [ JSAlloc "__var_0" (Just $ JSIdent "fn0")
@@ -1195,10 +1236,7 @@ translateDeclaration (path, SFun name params stackSize body)
1195 , JSReturn $ (JSTernary (
1236 , JSReturn $ (JSTernary (
1196 (JSVar var `jsInstanceOf` jsCon) `jsAnd`
1237 (JSVar var `jsInstanceOf` jsCon) `jsAnd`
1197 (hasProp lookupTableName (translateVariableName var))
1238 (hasProp lookupTableName (translateVariableName var))
1199− lookupTableName ++ lookup
1239+ ) (lookup lookupTableName) JSNull)