@@ -197,6 +197,14 @@ jsBigInt val =
197jsVar :: Int -> String
197jsVar :: Int -> String
198jsVar = ("__var_" ++) . show
198jsVar = ("__var_" ++) . show
200+jsLet :: String -> JS -> JS -> JS
201+jsLet name value body =
200codegenJavaScript
208codegenJavaScript
201 :: JSTarget
209 :: JSTarget
202 -> [(Name, SDecl)]
210 -> [(Name, SDecl)]
@@ -326,20 +334,34 @@ translateDeclaration (path, SFun name params stackSize body)
326 , (SLet var val next) <- body
334 , (SLet var val next) <- body
327 , (SChkCase cvar cases) <- next =
335 , (SChkCase cvar cases) <- next =
328 let fun = translateExpression body in
336 let fun = translateExpression body in
329− jsDecl $ jsFun fun
337+ {-jsDecl $ jsFun fun-}
330− | (MN _ "EVAL") <- name
331− , (SChkCase var cases) <- body =
332− let fun = translateExpression body in
333− JSSeq [ lookupTable var cases
338+ JSSeq [ lookupTable Nothing var cases
334− , jsDecl $ JSFunction ["arg0"] (JSRaw $
339+ , jsDecl $ JSFunction ["fn0", "arg0"] (
340+ JSSeq [ JSRaw "var __var_0 = fn0"
341+ , jsLet (translateVariableName var) (
342+ translateExpression val
335− concat [ "if (arg0 instanceof __IDRRT__Con "
344+ concat [ "(" ++ translateVariableName var ++ " instanceof __IDRRT__Con "
336− , " && " ++ lookupTableName ++ ".hasOwnProperty(arg0.tag))"
345+ , " && " ++ lookupTableName ++ ".hasOwnProperty(" ++ translateVariableName var ++ ".tag)) ? "
337− , "return " ++ lookupTableName ++ "[arg0.tag](arg0);"
346+ , lookupTableName ++ "[" ++ translateVariableName var ++ ".tag](fn0,arg0," ++ translateVariableName var ++ ") : null;"
339− , "return arg0;"
348+ )
353+ | (MN _ "EVAL") <- name
354+ , (SChkCase var cases) <- body =
355+ JSSeq [ lookupTable Nothing var cases
356+ , jsDecl $ JSFunction ["arg0"] (JSRaw $
357+ concat [ "if (arg0 instanceof __IDRRT__Con "
358+ , " && " ++ lookupTableName ++ ".hasOwnProperty(arg0.tag))"
359+ , "return " ++ lookupTableName ++ "[arg0.tag](arg0);"
343 | otherwise =
365 | otherwise =
344 let fun = translateExpression body in
366 let fun = translateExpression body in
345 jsDecl $ jsFun fun
367 jsDecl $ jsFun fun
@@ -356,8 +378,8 @@ translateDeclaration (path, SFun name params stackSize body)
356 lookupTableName :: String
378 lookupTableName :: String
357 lookupTableName = idrLTNamespace ++ translateName name
379 lookupTableName = idrLTNamespace ++ translateName name
359− lookupTable :: LVar -> [SAlt] -> JS
381+ lookupTable :: Maybe (String, String) -> LVar -> [SAlt] -> JS
360− lookupTable var cases =
382+ lookupTable m var cases =
361 JSAlloc lookupTableName $ Just (
383 JSAlloc lookupTableName $ Just (
362 JSObject $ catMaybes $ map (lookupEntry var) cases
384 JSObject $ catMaybes $ map (lookupEntry var) cases
@@ -397,11 +419,14 @@ translateVariableName (Loc i) =
398translateExpression :: SExp -> JS
420translateExpression :: SExp -> JS
399translateExpression (SLet name value body) =
421translateExpression (SLet name value body) =
422+ jsLet (translateVariableName name) (
423+ translateExpression value
424+ ) (translateExpression body)
400− JSApp (
425+ {-JSApp (-}
401− JSFunction [translateVariableName name] (
426+ {-JSFunction [translateVariableName name] (-}
402− JSReturn $ translateExpression body
427+ {-JSReturn $ translateExpression body-}
404− ) [translateExpression value]
429+ {-) [translateExpression value]-}
406translateExpression (SConst cst) =
431translateExpression (SConst cst) =
407 translateConstant cst
432 translateConstant cst