@@ -200,7 +200,7 @@ translateExpression (SApp True name vars) =
200 "new __IDRRT__.Tailcall("
200 "new __IDRRT__.Tailcall("
201 ++ "function(){\n"
201 ++ "function(){\n"
202 ++ "return " ++ translateFunctionCall name vars
202 ++ "return " ++ translateFunctionCall name vars
203− ++ ";\n});"
203+ ++ ";\n})"
205translateExpression (SOp op vars)
205translateExpression (SOp op vars)
206 | (LPlus _) <- op
206 | (LPlus _) <- op
@@ -356,19 +356,27 @@ translateExpression (SOp op vars)
356 ++ translateVariableName rhs
356 ++ translateVariableName rhs
358translateExpression (SError msg) =
358translateExpression (SError msg) =
359− "(function(){throw \'" ++ msg ++ "\';})();"
359+ "(function(){throw \'" ++ msg ++ "\';})()"
361translateExpression (SForeign _ _ "putStr" [(FString, var)]) =
361translateExpression (SForeign _ _ "putStr" [(FString, var)]) =
362− "__IDRRT__.print(" ++ translateVariableName var ++ ");"
362+ "__IDRRT__.print(" ++ translateVariableName var ++ ")"
364translateExpression (SForeign _ _ fun args)
364translateExpression (SForeign _ _ fun args)
365− | "." `isPrefixOf` fun, "[]=" `isSuffixOf` fun
365+ | "[]=" `isSuffixOf` fun
366 , (obj:idx:val:[]) <- args =
366 , (obj:idx:val:[]) <- args =
367− concat [object obj, field, index idx, assign val]
367+ concat [object obj, index idx, assign val]
369− | "." `isPrefixOf` fun, "[]" `isSuffixOf` fun
369+ | "[]" `isSuffixOf` fun
370 , (obj:idx:[]) <- args =
370 , (obj:idx:[]) <- args =
371− concat [object obj, field, index idx]
371+ object obj ++ index idx
373+ | "[" `isPrefixOf` fun && "]=" `isSuffixOf` fun
374+ , (obj:val:[]) <- args =
375+ concat [object obj, '[' : name ++ "]", assign val]
377+ | "[" `isPrefixOf` fun && "]" `isSuffixOf` fun
378+ , (obj:[]) <- args =
379+ object obj ++ '[' : name ++ "]"
373 | "." `isPrefixOf` fun, "=" `isSuffixOf` fun
381 | "." `isPrefixOf` fun, "=" `isSuffixOf` fun
374 , (obj:val:[]) <- args =
382 , (obj:val:[]) <- args =
@@ -402,9 +410,16 @@ translateExpression (SForeign _ _ fun args)
402 array = name
410 array = name
403 object o = translateVariableName (snd o)
411 object o = translateVariableName (snd o)
404 index i = "[" ++ translateVariableName (snd i) ++ "]"
412 index i = "[" ++ translateVariableName (snd i) ++ "]"
405− assign v = '=' : translateVariableName (snd v)
413+ assign v = '=' : generateWrapper v
406 arguments as =
414 arguments as =
407− '(' : intercalate "," (map (translateVariableName . snd) as) ++ ")"
415+ '(' : intercalate "," (map generateWrapper as) ++ ")"
417+ generateWrapper (ffunc, name)
418+ | FFunction <- ffunc = "__IDRRT__.ffiWrap(" ++ translateVariableName name ++ ")"
419+ | FFunctionIO <- ffunc = "__IDRRT__.ffiWrap(" ++ translateVariableName name ++ ")"
421+ generateWrapper (_, name) =
422+ translateVariableName name
409translateExpression (SChkCase var cases) =
424translateExpression (SChkCase var cases) =
410 "(function(e){\n"
425 "(function(e){\n"