@@ -482,14 +482,14 @@ translateDeclaration (path, SFun name params stackSize body)
482482 where
483483 hasProp :: String -> String -> JS
484484 hasProp table var =
485− jsMeth (JSRaw table) "hasOwnProperty" [JSRaw $ var ++ ".tag"]
485+ JSIndex (JSRaw table) (JSProj (JSRaw var) "tag")
486486
487487 caseFun :: [(LVar, String)] -> LVar -> SAlt -> JS
488488 caseFun aux var cse =
489489 jsFunAux aux (translateCase (Just (translateVariableName var)) cse)
490490
491− getTag :: SAlt -> Maybe String
492− getTag (SConCase _ tag _ _ _) = Just $ show tag
491+ getTag :: SAlt -> Maybe Int
492+ getTag (SConCase _ tag _ _ _) = Just tag
493493 getTag _ = Nothing
494494
495495 lookupTableName :: String
@@ -498,10 +498,22 @@ translateDeclaration (path, SFun name params stackSize body)
498498 lookupTable :: [(LVar, String)] -> LVar -> [SAlt] -> JS
499499 lookupTable aux var cases =
500500 JSAlloc lookupTableName $ Just (
501− JSObject $ catMaybes $ map (lookupEntry aux var) cases
501+ JSApp (JSFunction [] (
502+ JSSeq $ [
503+ JSAlloc "t" $ Just (JSArray [])
504+ ] ++ assignEntries (catMaybes $ map (lookupEntry aux var) cases) ++ [
505+ JSReturn (JSRaw "t")
506+ ]
507+ )) []
502508 )
503509 where
504− lookupEntry :: [(LVar, String)] -> LVar -> SAlt -> Maybe (String, JS)
510+ assignEntries :: [(Int, JS)] -> [JS]
511+ assignEntries entries =
512+ map (\(tag, fun) ->
513+ JSAssign (JSIndex (JSRaw "t") (JSNum $ JSInt tag)) fun
514+ ) entries
515+
516+ lookupEntry :: [(LVar, String)] -> LVar -> SAlt -> Maybe (Int, JS)
505517 lookupEntry aux var alt = do
506518 tag <- getTag alt
507519 return (tag, caseFun aux var alt)