faylang / fay

A proper subset of Haskell that compiles to JavaScript
https://github.com/faylang/fay/wiki
BSD 3-Clause "New" or "Revised" License
1.29k stars 86 forks source link

Optimize away EmptyDataDecls, unknown, and Ptr in the FFI #338

Open bergmark opened 10 years ago

bergmark commented 10 years ago
data Text
data JQuery

select :: Text -> Fay JQuery
select = ffi "$(%1)"

currently produces:

Test.select = function($p1){
  return new Fay$$$(function(){
    return new Fay$$Monad(Fay$$jsToFay(["user","JQuery",[]],$(Fay$$fayToJs(["user","Text",[]],$p1))));
  });
};

This is unnecessary, we know that an EmptyDataDecl won't result in any transcoding. This can be fixed manually by:

select :: Ptr Text -> Fay (Ptr JQuery)
select = ffi "$(%1)"
Test.select = function($p1){
  return new Fay$$$(function(){
    return new Fay$$Monad($($p1));
  });
};

The compiler can easily do this instead of the user, just keep track of all types that are EmptyDataDecls (Fay.Compiler.InitialPass) and turn the type into x or Ptr Foo while compiling FFI declarations (Fay.Compiler.FFI).

bergmark commented 10 years ago

Also, all calls with the argument ["unknown"] and ["ptr"] can be dropped. This can be done in the FFI or in the optimizer.