on master help sign in
javascript: refactored FFI and added array operations
98a17bbraichoo
src/IRTS/CodegenJavaScript.hs+40−14
@@ -403,23 +403,49 @@ translateExpression _ (SForeign _ _ "putStr" [(FString, var)]) =
403 "__IDR__.print(" ++ translateVariableName var ++ ");"
403 "__IDR__.print(" ++ translateVariableName var ++ ");"
404
404
405translateExpression _ (SForeign _ _ fun args)
405translateExpression _ (SForeign _ _ fun args)
406+ | "." `isPrefixOf` fun, "[]=" `isSuffixOf` fun
407+ , (obj:idx:val:[]) <- args =
408+ concat [object obj, field, index idx, assign val]
409+
410+ | "." `isPrefixOf` fun, "[]" `isSuffixOf` fun
411+ , (obj:idx:[]) <- args =
412+ concat [object obj, field, index idx]
413+
414+ | "." `isPrefixOf` fun, "=" `isSuffixOf` fun
415+ , (obj:val:[]) <- args =
416+ concat [object obj, field, assign val]
417+
406 | "." `isPrefixOf` fun
418 | "." `isPrefixOf` fun
407− , "=" `isSuffixOf` fun
408− , (a:b:[]) <- args =
419+ , (obj:[]) <- args =
409− translateVariableName (snd a) ++ fun ++ translateVariableName (snd b)
420+ object obj ++ field
410− | "." `isPrefixOf` fun
421+
411− , (a:[]) <- args = translateVariableName (snd a) ++ fun
412 | "." `isPrefixOf` fun
422 | "." `isPrefixOf` fun
413− , (a:[(FUnit, _)]) <- args = translateVariableName (snd a) ++ fun ++ "()"
423+ , (obj:[(FUnit, _)]) <- args =
424+ concat [object obj, method, "()"]
425+
414 | "." `isPrefixOf` fun
426 | "." `isPrefixOf` fun
415− , (a:as) <- args = translateVariableName (snd a) ++ fun
427+ , (obj:as) <- args =
416− ++ "("
428+ concat [object obj, method, arguments as]
417− ++ intercalate "," (map (translateVariableName . snd) as)
429+
418− ++ ");"
430+ | "[]=" == fun
431+ , (idx:val:[]) <- args =
432+ concat [array, index idx, assign val]
433+
434+ | "[]" == fun
435+ , (idx:[]) <- args =
436+ array ++ index idx
437+
419− | otherwise = fun
438+ | otherwise = fun ++ arguments args
420− ++ "("
439+ where
440+ name = filter (`notElem` "[]=") fun
441+ method = name
442+ field = name
443+ array = name
444+ object o = translateVariableName (snd o)
445+ index i = "[" ++ translateVariableName (snd i) ++ "]"
446+ assign v = '=' : translateVariableName (snd v)
447+ arguments as =
421− ++ intercalate "," (map (translateVariableName . snd) args)
448+ '(' : intercalate "," (map (translateVariableName . snd) as) ++ ")"
422− ++ ");"
423
449
424translateExpression modname (SChkCase var cases) =
450translateExpression modname (SChkCase var cases) =
425 "(function(e){\n"
451 "(function(e){\n"