@@ -117,7 +117,7 @@ valueToJs _ _ _ (StringLiteral s) = JSStringLiteral s
117valueToJs _ _ _ (BooleanLiteral b) = JSBooleanLiteral b
117valueToJs _ _ _ (BooleanLiteral b) = JSBooleanLiteral b
118valueToJs opts m e (ArrayLiteral xs) = JSArrayLiteral (map (valueToJs opts m e) xs)
118valueToJs opts m e (ArrayLiteral xs) = JSArrayLiteral (map (valueToJs opts m e) xs)
119valueToJs opts m e (ObjectLiteral ps) = JSObjectLiteral (map (second (valueToJs opts m e)) ps)
119valueToJs opts m e (ObjectLiteral ps) = JSObjectLiteral (map (second (valueToJs opts m e)) ps)
120−valueToJs opts m e (ObjectUpdate o ps) = JSApp (JSAccessor "extend" (JSVar "Object")) [ valueToJs opts m e o, JSObjectLiteral (map (second (valueToJs opts m e)) ps)]
120+valueToJs opts m e (ObjectUpdate o ps) = extendObj (valueToJs opts m e o) (map (second (valueToJs opts m e)) ps)
121valueToJs _ m _ (Constructor name) = qualifiedToJS m (Ident . runProperName) name
121valueToJs _ m _ (Constructor name) = qualifiedToJS m (Ident . runProperName) name
122valueToJs opts m e (Case values binders) = bindersToJs opts m e binders (map (valueToJs opts m e) values)
122valueToJs opts m e (Case values binders) = bindersToJs opts m e binders (map (valueToJs opts m e) values)
123valueToJs opts m e (IfThenElse cond th el) = JSConditional (valueToJs opts m e cond) (valueToJs opts m e th) (valueToJs opts m e el)
123valueToJs opts m e (IfThenElse cond th el) = JSConditional (valueToJs opts m e cond) (valueToJs opts m e th) (valueToJs opts m e el)
@@ -130,6 +130,23 @@ valueToJs opts m e (TypedValue _ val _) = valueToJs opts m e val
130valueToJs _ _ _ (TypeClassDictionary _ _) = error "Type class dictionary was not replaced"
130valueToJs _ _ _ (TypeClassDictionary _ _) = error "Type class dictionary was not replaced"
131valueToJs _ _ _ _ = error "Invalid argument to valueToJs"
131valueToJs _ _ _ _ = error "Invalid argument to valueToJs"
134+-- Shallow copy an object.
136+extendObj :: JS -> [(String, JS)] -> JS
137+extendObj obj sts = JSApp (JSFunction Nothing [] block) []
139+ [newObj, key] = take 2 . map identToJs . unusedNames $ (obj, sts)
141+ jsNewObj = JSVar newObj
142+ block = JSBlock (objAssign:copy:extend ++ [JSReturn jsNewObj])
143+ objAssign = JSVariableIntroduction newObj (Just $ JSObjectLiteral [])
144+ copy = JSForIn key obj $ JSBlock [JSIfElse cond assign Nothing]
145+ cond = JSApp (JSAccessor "hasOwnProperty" obj) [jsKey]
146+ assign = JSBlock [JSAssignment (JSIndexer jsKey jsNewObj) (JSIndexer jsKey obj)]
147+ stToAssign (s, js) = JSAssignment (JSAccessor s jsNewObj) js
148+ extend = map stToAssign sts
134-- Temporarily extends the environment with a single local variable name
151-- Temporarily extends the environment with a single local variable name