@@ -116,13 +116,20 @@ valueToJs opts m e (Case values binders) = bindersToJs opts m e binders (map (va
116116valueToJs opts m e (IfThenElse cond th el) = JSConditional (valueToJs opts m e cond) (valueToJs opts m e th) (valueToJs opts m e el)
117117valueToJs opts m e (Accessor prop val) = JSAccessor prop (valueToJs opts m e val)
118118valueToJs opts m e (App val arg) = JSApp (valueToJs opts m e val) [valueToJs opts m e arg]
119−valueToJs opts m e (Abs arg val) = JSFunction Nothing [identToJs arg] (JSBlock [JSReturn (valueToJs opts m e val)])
119+valueToJs opts m e (Abs arg val) = JSFunction Nothing [identToJs arg] (JSBlock [JSReturn (valueToJs opts m (bindName m arg e) val)])
120120valueToJs opts m e (TypedValue _ (Abs arg val) ty) | optionsPerformRuntimeTypeChecks opts = let arg' = identToJs arg in JSFunction Nothing [arg'] (JSBlock $ runtimeTypeChecks arg' ty ++ [JSReturn (valueToJs opts m e val)])
121121valueToJs _ m e (Var ident) = varToJs m e ident
122122valueToJs opts m e (TypedValue _ val _) = valueToJs opts m e val
123123valueToJs _ _ _ (TypeClassDictionary _ _) = error "Type class dictionary was not replaced"
124124valueToJs _ _ _ _ = error "Invalid argument to valueToJs"
125125
126+-- |
127+-- Temporarily extends the environment to include a local variable name introduced by a lambda
128+-- abstraction. The stored type is incorrect, but not used.
129+--
130+bindName :: ModuleName -> Ident -> Environment -> Environment
131+bindName m ident env = env { names = M.insert (m, ident) (unit, LocalVariable) $ names env }
132+
126133runtimeTypeChecks :: String -> Type -> [JS]
127134runtimeTypeChecks arg ty =
128135 let