@@ -200,7 +200,7 @@ translateExpression (SApp True name vars) =
200200 "new __IDRRT__.Tailcall("
201201 ++ "function(){\n"
202202 ++ "return " ++ translateFunctionCall name vars
203− ++ ";\n});"
203+ ++ ";\n})"
204204
205205translateExpression (SOp op vars)
206206 | (LPlus _) <- op
@@ -356,19 +356,27 @@ translateExpression (SOp op vars)
356356 ++ translateVariableName rhs
357357
358358translateExpression (SError msg) =
359− "(function(){throw \'" ++ msg ++ "\';})();"
359+ "(function(){throw \'" ++ msg ++ "\';})()"
360360
361361translateExpression (SForeign _ _ "putStr" [(FString, var)]) =
362− "__IDRRT__.print(" ++ translateVariableName var ++ ");"
362+ "__IDRRT__.print(" ++ translateVariableName var ++ ")"
363363
364364translateExpression (SForeign _ _ fun args)
365− | "." `isPrefixOf` fun, "[]=" `isSuffixOf` fun
365+ | "[]=" `isSuffixOf` fun
366366 , (obj:idx:val:[]) <- args =
367− concat [object obj, field, index idx, assign val]
367+ concat [object obj, index idx, assign val]
368368
369− | "." `isPrefixOf` fun, "[]" `isSuffixOf` fun
369+ | "[]" `isSuffixOf` fun
370370 , (obj:idx:[]) <- args =
371− concat [object obj, field, index idx]
371+ object obj ++ index idx
372+
373+ | "[" `isPrefixOf` fun && "]=" `isSuffixOf` fun
374+ , (obj:val:[]) <- args =
375+ concat [object obj, '[' : name ++ "]", assign val]
376+
377+ | "[" `isPrefixOf` fun && "]" `isSuffixOf` fun
378+ , (obj:[]) <- args =
379+ object obj ++ '[' : name ++ "]"
372380
373381 | "." `isPrefixOf` fun, "=" `isSuffixOf` fun
374382 , (obj:val:[]) <- args =
@@ -402,9 +410,16 @@ translateExpression (SForeign _ _ fun args)
402410 array = name
403411 object o = translateVariableName (snd o)
404412 index i = "[" ++ translateVariableName (snd i) ++ "]"
405− assign v = '=' : translateVariableName (snd v)
413+ assign v = '=' : generateWrapper v
406414 arguments as =
407− '(' : intercalate "," (map (translateVariableName . snd) as) ++ ")"
415+ '(' : intercalate "," (map generateWrapper as) ++ ")"
416+
417+ generateWrapper (ffunc, name)
418+ | FFunction <- ffunc = "__IDRRT__.ffiWrap(" ++ translateVariableName name ++ ")"
419+ | FFunctionIO <- ffunc = "__IDRRT__.ffiWrap(" ++ translateVariableName name ++ ")"
420+
421+ generateWrapper (_, name) =
422+ translateVariableName name
408423
409424translateExpression (SChkCase var cases) =
410425 "(function(e){\n"