on master help sign in
Fix creating new objects with JS FFI
commit1b86a26dd07cf2758406ff4960785ecd2d27d254 authorHamish Mackenzie <Hamish.K.Mackenzie@googlemail.com> dateTue 18 Mar 2014, 22:11 (13 years ago) parent32f8972
1 file changed+19−10
src/Language/Javascript/JSaddle/Object.hs+19−10
src/Language/Javascript/JSaddle/Object.hs+19−10
@@ -264,6 +264,9 @@ prop <# val = do
264264
265265-- | Use this to create a new JavaScript object
266266--
267+-- If you pass more than 7 arguments to a constructor for a built in
268+-- JavaScript type (like Date) then this function will fail.
269+--
267270-- >>> testJSaddle $ new "Date" (2013, 1, 1)
268271-- Fri Feb 01 2013 00:00:00 GMT+1300 (NZDT)
269272new :: (MakeObjectRef constructor, MakeArgRefs args)
@@ -473,6 +476,9 @@ objCallAsFunction = undefined
473476#endif
474477
475478-- | Call a JavaScript object as a constructor. Consider using 'new'.
479+--
480+-- If you pass more than 7 arguments to a constructor for a built in
481+-- JavaScript type (like Date) then this function will fail.
476482objCallAsConstructor :: MakeArgRefs args
477483 => JSObjectRef
478484 -> args
@@ -485,22 +491,25 @@ objCallAsConstructor function args exceptions = do
485491foreign import javascript unsafe "\
486492 try {\
487493 switch($2.length) {\
488− case 0 : $r = new $1();\
489− case 1 : $r = new $1($2[0]);\
490− case 2 : $r = new $1($2[0],$2[1]);\
491− case 3 : $r = new $1($2[0],$2[1],$2[2]);\
492− case 4 : $r = new $1($2[0],$2[1],$2[2],$2[3]);\
493− case 5 : $r = new $1($2[0],$2[1],$2[2],$2[3],$2[4]);\
494− case 6 : $r = new $1($2[0],$2[1],$2[2],$2[3],$2[4],$2[5]);\
495− case 6 : $r = new $1($2[0],$2[1],$2[2],$2[3],$2[4],$2[5],$2[6]);\
494+ case 0 : $r = new $1(); break;\
495+ case 1 : $r = new $1($2[0]); break;\
496+ case 2 : $r = new $1($2[0],$2[1]); break;\
497+ case 3 : $r = new $1($2[0],$2[1],$2[2]); break;\
498+ case 4 : $r = new $1($2[0],$2[1],$2[2],$2[3]); break;\
499+ case 5 : $r = new $1($2[0],$2[1],$2[2],$2[3],$2[4]); break;\
500+ case 6 : $r = new $1($2[0],$2[1],$2[2],$2[3],$2[4],$2[5]); break;\
501+ case 7 : $r = new $1($2[0],$2[1],$2[2],$2[3],$2[4],$2[5],$2[6]); break;\
496502 default:\
497503 var ret;\
498504 var temp = function() {\
499505 ret = $1.apply(this, $2);\
500506 };\
501− temp.prototype = f.prototype;\
507+ temp.prototype = $1.prototype;\
502508 var i = new temp();\
503− $r = ret instanceof Object ? ret : i;\
509+ if(ret instanceof Object)\
510+ return ret;\
511+ i.constructor = $1;\
512+ return i;\
504513 }\
505514 }\
506515 catch(e) {\