@@ -117,7 +117,7 @@ valueToJs _ _ _ (StringLiteral s) = JSStringLiteral s
117117valueToJs _ _ _ (BooleanLiteral b) = JSBooleanLiteral b
118118valueToJs opts m e (ArrayLiteral xs) = JSArrayLiteral (map (valueToJs opts m e) xs)
119119valueToJs 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)
121121valueToJs _ m _ (Constructor name) = qualifiedToJS m (Ident . runProperName) name
122122valueToJs opts m e (Case values binders) = bindersToJs opts m e binders (map (valueToJs opts m e) values)
123123valueToJs 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
130130valueToJs _ _ _ (TypeClassDictionary _ _) = error "Type class dictionary was not replaced"
131131valueToJs _ _ _ _ = error "Invalid argument to valueToJs"
132132
133+-- |
134+-- Shallow copy an object.
135+--
136+extendObj :: JS -> [(String, JS)] -> JS
137+extendObj obj sts = JSApp (JSFunction Nothing [] block) []
138+ where
139+ [newObj, key] = take 2 . map identToJs . unusedNames $ (obj, sts)
140+ jsKey = JSVar key
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
149+
133150-- |
134151-- Temporarily extends the environment with a single local variable name
135152--