@@ -57,6 +57,7 @@ data CGConf = CGConf { header :: Text
5757 , initialization :: CGStats -> Text
5858 , writeStrTemplate :: Text
5959 , readStrTemplate :: Text
60+ , extraRunTime :: String
6061 }
6162
6263
@@ -99,6 +100,7 @@ codegenJs conf ci =
99100 else return ""
100101
101102 runtimeCommon <- TIO.readFile $ path </> "Runtime-common.js"
103+ extraRT <- TIO.readFile $ path </> (extraRunTime conf)
102104
103105 includes <- getIncludes $ includes ci
104106 TIO.writeFile (outputFile ci) $ T.concat [ header conf
@@ -109,6 +111,7 @@ codegenJs conf ci =
109111 , doPartials (partialApplications stats)
110112 , includes, "\n"
111113 , runtimeCommon, "\n"
114+ , extraRT, "\n"
112115 , out, "\n"
113116 , "\n"
114117 , jsName (sMN 0 "runMain"), "();\n\n"
@@ -474,8 +477,8 @@ cgConst (BI i) =
474477cgConst (Ch c) = pure $ JsStr [c]
475478cgConst (Str s) = pure $ JsStr s
476479cgConst (Fl f) = pure $ JsNum f
477−cgConst (B8 x) = pure $ JsForeign (T.pack $ "new Uint8Array([" ++ show x ++ "])") []
478−cgConst (B16 x) = pure $ JsForeign (T.pack $ "new Uint16Array([" ++ show x ++ "])") []
480+cgConst (B8 x) = pure $ JsForeign (T.pack $ show x ++ " & 0xFF") []
481+cgConst (B16 x) = pure $ JsForeign (T.pack $ show x ++ " & 0xFFFF") []
479482cgConst (B32 x) = pure $ JsForeign (T.pack $ show x ++ "|0" ) []
480483cgConst (B64 x) =
481484 do
@@ -488,12 +491,11 @@ jsB2I :: JsAST -> JsAST
488491jsB2I x = JsForeign "%0 ? 1|0 : 0|0" [x]
489492
490493cgOp :: PrimFn -> [JsAST] -> State CGBodyState JsAST
491−cgOp (LAnd (ITFixed IT8)) [l, r] = pure $ JsForeign "new Uint8Array([ %0[0] & %1[0] ])" [l,r]
492494cgOp (LPlus ATFloat) [l, r] = pure $ JsBinOp "+" l r
493495cgOp (LPlus (ATInt ITChar)) [l, r] = pure $ JsForeign "String.fromCharCode(%0.charCodeAt(0) + %1.charCodeAt(0))" [l,r]
494496cgOp (LPlus (ATInt ITNative)) [l, r] = pure $ JsForeign "%0+%1|0" [l,r]
495−cgOp (LPlus (ATInt (ITFixed IT8))) [l, r] = pure $ JsForeign "new Uint8Array([ %0[0] + %1[0] ])" [l,r]
496−cgOp (LPlus (ATInt (ITFixed IT16))) [l, r] = pure $ JsForeign "new Uint16Array([ %0[0] + %1[0] ])" [l,r]
497+cgOp (LPlus (ATInt (ITFixed IT8))) [l, r] = pure $ JsForeign "%0 + %1 & 0xFF" [l,r]
498+cgOp (LPlus (ATInt (ITFixed IT16))) [l, r] = pure $ JsForeign "%0 + %1 & 0xFFFF" [l,r]
497499cgOp (LPlus (ATInt (ITFixed IT32))) [l, r] = pure $ JsForeign "%0+%1|0" [l,r]
498500cgOp (LPlus (ATInt ITBig)) [l, r] =
499501 do
@@ -503,25 +505,138 @@ cgOp (LPlus (ATInt (ITFixed IT64))) [l, r] =
503505 do
504506 setUsedITBig
505507 pure $ JsForeign "%0.add(%1).and(new jsbn.BigInteger(%2))" [l,r, JsStr $ show 0xFFFFFFFFFFFFFFFF]
506−cgOp (LLSHR (ITFixed IT8)) [l, r] = pure $ JsForeign "new Uint8Array([ %0[0] >> %1[0] ])" [l,r]
507−cgOp (LLSHR (ITFixed IT16)) [l, r] = pure $ JsForeign "new Uint16Array([ %0[0] >> %1[0] ])" [l,r]
508−cgOp (LLSHR (ITFixed IT32)) [l, r] = pure $ JsForeign "%0 >> %1|0" [l,r]
509−cgOp (LLSHR (ITFixed IT64)) [l, r] =
510− do
511− setUsedITBig
512− pure $ JsForeign "%0.shiftRight(%1)" [l,r]
513508cgOp (LMinus ATFloat) [l, r] = pure $ JsBinOp "-" l r
509+cgOp (LMinus (ATInt ITChar)) [l, r] = pure $ JsForeign "String.fromCharCode(%0.charCodeAt(0) - %1.charCodeAt(0))" [l,r]
514510cgOp (LMinus (ATInt ITNative)) [l, r] = pure $ JsForeign "%0-%1|0" [l,r]
511+cgOp (LMinus (ATInt (ITFixed IT8))) [l, r] = pure $ JsForeign "%0 - %1 & 0xFF" [l,r]
512+cgOp (LMinus (ATInt (ITFixed IT16))) [l, r] = pure $ JsForeign "%0 - %1 & 0xFFFF" [l,r]
513+cgOp (LMinus (ATInt (ITFixed IT32))) [l, r] = pure $ JsForeign "%0-%1|0" [l,r]
515514cgOp (LMinus (ATInt ITBig)) [l, r] =
516515 do
517516 setUsedITBig
518517 pure $ JsMethod l "subtract" [r]
518+cgOp (LMinus (ATInt (ITFixed IT64))) [l, r] =
519+ do
520+ setUsedITBig
521+ pure $ JsForeign "%0.subtract(%1).and(new jsbn.BigInteger(%2))" [l,r, JsStr $ show 0xFFFFFFFFFFFFFFFF]
519522cgOp (LTimes ATFloat) [l, r] = pure $ JsBinOp "*" l r
523+cgOp (LTimes (ATInt ITChar)) [l, r] = pure $ JsForeign "String.fromCharCode(%0.charCodeAt(0) * %1.charCodeAt(0))" [l,r]
520524cgOp (LTimes (ATInt ITNative)) [l, r] = pure $ JsForeign "%0*%1|0" [l,r]
525+cgOp (LTimes (ATInt (ITFixed IT8))) [l, r] = pure $ JsForeign "%0 * %1 & 0xFF" [l,r]
526+cgOp (LTimes (ATInt (ITFixed IT16))) [l, r] = pure $ JsForeign "%0 * %1 & 0xFFFF" [l,r]
527+cgOp (LTimes (ATInt (ITFixed IT32))) [l, r] = pure $ JsForeign "%0*%1|0" [l,r]
521528cgOp (LTimes (ATInt ITBig)) [l, r] =
522529 do
523530 setUsedITBig
524531 pure $ JsMethod l "multiply" [r]
532+cgOp (LTimes (ATInt (ITFixed IT64))) [l, r] =
533+ do
534+ setUsedITBig
535+ pure $ JsForeign "%0.multiply(%1).and(new jsbn.BigInteger(%2))" [l,r, JsStr $ show 0xFFFFFFFFFFFFFFFF]
536+cgOp (LUDiv (ITFixed IT8)) [l, r] = pure $ JsForeign "%0 / %1" [l,r]
537+cgOp (LUDiv (ITFixed IT16)) [l, r] = pure $ JsForeign "%0 / %1" [l,r]
538+cgOp (LUDiv (ITFixed IT32)) [l, r] = pure $ JsForeign "(%0>>>0) / (%1>>>0) |0" [l,r]
539+cgOp (LUDiv (ITFixed IT64)) [l, r] =
540+ do
541+ setUsedITBig
542+ pure $ JsForeign "%0.divide(%1)" [l,r]
543+cgOp (LSDiv ATFloat) [l,r] = pure $ JsBinOp "/" l r
544+cgOp (LSDiv (ATInt (ITFixed IT8))) [l, r] = pure $ JsForeign "%0 / %1" [l,r]
545+cgOp (LSDiv (ATInt (ITFixed IT16))) [l, r] = pure $ JsForeign "%0 / %1" [l,r]
546+cgOp (LSDiv (ATInt (ITFixed IT32))) [l, r] = pure $ JsForeign "%0 / %1 |0" [l,r]
547+cgOp (LSDiv (ATInt (ITFixed IT64))) [l, r] =
548+ do
549+ setUsedITBig
550+ pure $ JsForeign "%0.divide(%1)" [l,r]
551+cgOp (LSDiv (ATInt ITNative)) [l,r] = pure $ JsForeign "%0/%1|0" [l, r]
552+cgOp (LSDiv (ATInt ITBig)) [l,r] =
553+ do
554+ setUsedITBig
555+ pure $ JsMethod l "divide" [r]
556+cgOp (LURem (ITFixed IT8)) [l, r] = pure $ JsForeign "%0 % %1" [l,r]
557+cgOp (LURem (ITFixed IT16)) [l, r] = pure $ JsForeign "%0 % %1" [l,r]
558+cgOp (LURem (ITFixed IT32)) [l, r] = pure $ JsForeign "(%0>>>0) % (%1>>>0) |0" [l,r]
559+cgOp (LURem (ITFixed IT64)) [l,r] =
560+ do
561+ setUsedITBig
562+ pure $ JsMethod l "remainder" [r]
563+cgOp (LSRem ATFloat) [l,r] = pure $ JsBinOp "%" l r
564+cgOp (LSRem (ATInt ITNative)) [l,r] = pure $ JsForeign "%0 % %1 |0" [l,r]
565+cgOp (LSRem (ATInt (ITFixed IT8))) [l, r] = pure $ JsForeign "%0 % %1" [l,r]
566+cgOp (LSRem (ATInt (ITFixed IT16))) [l, r] = pure $ JsForeign "%0 % %1" [l,r]
567+cgOp (LSRem (ATInt (ITFixed IT32))) [l, r] = pure $ JsForeign "%0 % %1 |0" [l,r]
568+cgOp (LSRem (ATInt (ITFixed IT64))) [l, r] =
569+ do
570+ setUsedITBig
571+ pure $ JsMethod l "remainder" [r]
572+cgOp (LSRem (ATInt ITBig)) [l,r] =
573+ do
574+ setUsedITBig
575+ pure $ JsMethod l "remainder" [r]
576+cgOp (LAnd ITNative) [l, r] = pure $ JsForeign "%0 & %1" [l,r]
577+cgOp (LAnd (ITFixed IT8)) [l, r] = pure $ JsForeign "%0 & %1" [l,r]
578+cgOp (LAnd (ITFixed IT16)) [l, r] = pure $ JsForeign "%0 & %1" [l,r]
579+cgOp (LAnd (ITFixed IT32)) [l, r] = pure $ JsForeign "%0 & %1" [l,r]
580+cgOp (LAnd (ITFixed IT64)) [l,r] =
581+ do
582+ setUsedITBig
583+ pure $ JsMethod l "and" [r]
584+cgOp (LAnd ITBig) [l,r] =
585+ do
586+ setUsedITBig
587+ pure $ JsMethod l "and" [r]
588+cgOp (LOr ITNative) [l, r] = pure $ JsForeign "%0 | %1" [l,r]
589+cgOp (LOr (ITFixed IT8)) [l, r] = pure $ JsForeign "%0 | %1" [l,r]
590+cgOp (LOr (ITFixed IT16)) [l, r] = pure $ JsForeign "%0 | %1" [l,r]
591+cgOp (LOr (ITFixed IT32)) [l, r] = pure $ JsForeign "%0 | %1" [l,r]
592+cgOp (LOr (ITFixed IT64)) [l,r] =
593+ do
594+ setUsedITBig
595+ pure $ JsMethod l "or" [r]
596+cgOp (LOr ITBig) [l,r] =
597+ do
598+ setUsedITBig
599+ pure $ JsMethod l "or" [r]
600+cgOp (LXOr ITNative) [l, r] = pure $ JsForeign "%0 ^ %1" [l,r]
601+cgOp (LXOr (ITFixed IT8)) [l, r] = pure $ JsForeign "%0 ^ %1" [l,r]
602+cgOp (LXOr (ITFixed IT16)) [l, r] = pure $ JsForeign "%0 ^ %1" [l,r]
603+cgOp (LXOr (ITFixed IT32)) [l, r] = pure $ JsForeign "%0 ^ %1" [l,r]
604+cgOp (LXOr (ITFixed IT64)) [l,r] =
605+ do
606+ setUsedITBig
607+ pure $ JsMethod l "xor" [r]
608+cgOp (LXOr ITBig) [l,r] =
609+ do
610+ setUsedITBig
611+ pure $ JsMethod l "xor" [r]
612+cgOp (LSHL ITNative) [l, r] = pure $ JsForeign "%0 << %1 |0" [l,r]
613+cgOp (LSHL (ITFixed IT8)) [l, r] = pure $ JsForeign "%0 << %1 & 0xFF" [l,r]
614+cgOp (LSHL (ITFixed IT16)) [l, r] = pure $ JsForeign "%0 << %1 & 0xFFFF" [l,r]
615+cgOp (LSHL (ITFixed IT32)) [l, r] = pure $ JsForeign "%0 << %1 |0" [l,r]
616+cgOp (LTimes (ATInt (ITFixed IT64))) [l, r] =
617+ do
618+ setUsedITBig
619+ pure $ JsForeign "%0.shiftLeft(%1).and(new jsbn.BigInteger(%2))" [l,r, JsStr $ show 0xFFFFFFFFFFFFFFFF]
620+cgOp (LSHL ITBig) [l,r] =
621+ do
622+ setUsedITBig
623+ pure $ JsMethod l "shiftLeft" [r]
624+cgOp (LLSHR ITNative) [l, r] = pure $ JsForeign "%0 >> %1 |0" [l,r]
625+cgOp (LLSHR (ITFixed IT8)) [l, r] = pure $ JsForeign "%0 >> %1" [l,r]
626+cgOp (LLSHR (ITFixed IT16)) [l, r] = pure $ JsForeign "%0 >> %1" [l,r]
627+cgOp (LLSHR (ITFixed IT32)) [l, r] = pure $ JsForeign "%0 >> %1|0" [l,r]
628+cgOp (LLSHR (ITFixed IT64)) [l, r] =
629+ do
630+ setUsedITBig
631+ pure $ JsForeign "%0.shiftRight(%1)" [l,r]
632+cgOp (LASHR ITNative) [l, r] = pure $ JsForeign "%0 >> %1 |0" [l,r]
633+cgOp (LASHR (ITFixed IT8)) [l, r] = pure $ JsForeign "%0 >> %1" [l,r]
634+cgOp (LASHR (ITFixed IT16)) [l, r] = pure $ JsForeign "%0 >> %1" [l,r]
635+cgOp (LASHR (ITFixed IT32)) [l, r] = pure $ JsForeign "%0 >> %1|0" [l,r]
636+cgOp (LASHR (ITFixed IT64)) [l, r] =
637+ do
638+ setUsedITBig
639+ pure $ JsForeign "%0.shiftRight(%1)" [l,r]
525640cgOp (LEq ATFloat) [l, r] = pure $ jsB2I $ JsBinOp "==" l r
526641cgOp (LEq (ATInt ITNative)) [l, r] = pure $ jsB2I $ JsBinOp "==" l r
527642cgOp (LEq (ATInt ITChar)) [l,r] = pure $ jsB2I $ JsBinOp "==" l r
@@ -529,6 +644,41 @@ cgOp (LEq (ATInt ITBig)) [l, r] =
529644 do
530645 setUsedITBig
531646 pure $ jsB2I $ JsMethod l "equals" [r]
647+cgOp (LEq (ATInt (ITFixed IT8))) [l, r] = pure $ jsB2I $ JsBinOp "==" l r
648+cgOp (LEq (ATInt (ITFixed IT16))) [l, r] = pure $ jsB2I $ JsBinOp "==" l r
649+cgOp (LEq (ATInt (ITFixed IT32))) [l, r] = pure $ jsB2I $ JsBinOp "==" l r
650+cgOp (LEq (ATInt (ITFixed IT64))) [l, r] =
651+ do
652+ setUsedITBig
653+ pure $ jsB2I $ JsMethod l "equals" [r]
654+cgOp (LLt (ITFixed IT8)) [l, r] = pure $ JsForeign "%0 < %1" [l,r]
655+cgOp (LLt (ITFixed IT16)) [l, r] = pure $ JsForeign "%0 < %1" [l,r]
656+cgOp (LLt (ITFixed IT32)) [l, r] = pure $ JsForeign "(%0>>>0) < (%1>>>0)" [l,r]
657+cgOp (LLt (ITFixed IT64)) [l, r] =
658+ do
659+ setUsedITBig
660+ pure $ jsB2I $ JsForeign "%0.compareTo(%1) < 0" [l,r]
661+cgOp (LLe (ITFixed IT8)) [l, r] = pure $ JsForeign "%0 <= %1" [l,r]
662+cgOp (LLe (ITFixed IT16)) [l, r] = pure $ JsForeign "%0 <= %1" [l,r]
663+cgOp (LLe (ITFixed IT32)) [l, r] = pure $ JsForeign "(%0>>>0) <= (%1>>>0)" [l,r]
664+cgOp (LLe (ITFixed IT64)) [l, r] =
665+ do
666+ setUsedITBig
667+ pure $ jsB2I $ JsForeign "%0.compareTo(%1) <= 0" [l,r]
668+cgOp (LGt (ITFixed IT8)) [l, r] = pure $ JsForeign "%0 > %1" [l,r]
669+cgOp (LGt (ITFixed IT16)) [l, r] = pure $ JsForeign "%0 > %1" [l,r]
670+cgOp (LGt (ITFixed IT32)) [l, r] = pure $ JsForeign "(%0>>>0) > (%1>>>0)" [l,r]
671+cgOp (LGt (ITFixed IT64)) [l, r] =
672+ do
673+ setUsedITBig
674+ pure $ jsB2I $ JsForeign "%0.compareTo(%1) > 0" [l,r]
675+cgOp (LGe (ITFixed IT8)) [l, r] = pure $ JsForeign "%0 >= %1" [l,r]
676+cgOp (LGe (ITFixed IT16)) [l, r] = pure $ JsForeign "%0 >= %1" [l,r]
677+cgOp (LGe (ITFixed IT32)) [l, r] = pure $ JsForeign "(%0>>>0) >= (%1>>>0)" [l,r]
678+cgOp (LGe (ITFixed IT64)) [l, r] =
679+ do
680+ setUsedITBig
681+ pure $ jsB2I $ JsForeign "%0.compareTo(%1) >= 0" [l,r]
532682cgOp (LSLt ATFloat) [l, r] = pure $ jsB2I $ JsBinOp "<" l r
533683cgOp (LSLt (ATInt ITChar)) [l, r] = pure $ jsB2I $ JsBinOp "<" l r
534684cgOp (LSLt (ATInt ITNative)) [l, r] = pure $ jsB2I $ JsBinOp "<" l r
@@ -536,101 +686,141 @@ cgOp (LSLt (ATInt ITBig)) [l, r] =
536686 do
537687 setUsedITBig
538688 pure $ jsB2I $ JsForeign "%0.compareTo(%1) < 0" [l,r]
689+cgOp (LSLt (ATInt (ITFixed IT8))) [l, r] = pure $ jsB2I $ JsBinOp "<" l r
690+cgOp (LSLt (ATInt (ITFixed IT16))) [l, r] = pure $ jsB2I $ JsBinOp "<" l r
691+cgOp (LSLt (ATInt (ITFixed IT32))) [l, r] = pure $ jsB2I $ JsBinOp "<" l r
692+cgOp (LSLt (ATInt (ITFixed IT64))) [l, r] =
693+ do
694+ setUsedITBig
695+ pure $ jsB2I $ JsForeign "%0.compareTo(%1) < 0" [l,r]
539696cgOp (LSLe ATFloat) [l, r] = pure $ jsB2I $ JsBinOp "<=" l r
540697cgOp (LSLe (ATInt ITNative)) [l, r] = pure $ jsB2I $ JsBinOp "<=" l r
541698cgOp (LSLe (ATInt ITBig)) [l, r] =
542699 do
543700 setUsedITBig
544701 pure $ jsB2I $ JsForeign "%0.compareTo(%1) <= 0" [l,r]
702+cgOp (LSLe (ATInt (ITFixed IT8))) [l, r] = pure $ jsB2I $ JsBinOp "<=" l r
703+cgOp (LSLe (ATInt (ITFixed IT16))) [l, r] = pure $ jsB2I $ JsBinOp "<=" l r
704+cgOp (LSLe (ATInt (ITFixed IT32))) [l, r] = pure $ jsB2I $ JsBinOp "<=" l r
705+cgOp (LSLe (ATInt (ITFixed IT64))) [l, r] =
706+ do
707+ setUsedITBig
708+ pure $ jsB2I $ JsForeign "%0.compareTo(%1) <= 0" [l,r]
545709cgOp (LSGt ATFloat) [l, r] = pure $ jsB2I $ JsBinOp ">" l r
546710cgOp (LSGt (ATInt ITNative)) [l, r] = pure $ jsB2I $ JsBinOp ">" l r
547711cgOp (LSGt (ATInt ITBig)) [l, r] =
548712 do
549713 setUsedITBig
550714 pure $ jsB2I $ JsForeign "%0.compareTo(%1) > 0" [l,r]
715+cgOp (LSGt (ATInt (ITFixed IT8))) [l, r] = pure $ jsB2I $ JsBinOp ">" l r
716+cgOp (LSGt (ATInt (ITFixed IT16))) [l, r] = pure $ jsB2I $ JsBinOp ">" l r
717+cgOp (LSGt (ATInt (ITFixed IT32))) [l, r] = pure $ jsB2I $ JsBinOp ">" l r
718+cgOp (LSGt (ATInt (ITFixed IT64))) [l, r] =
719+ do
720+ setUsedITBig
721+ pure $ jsB2I $ JsForeign "%0.compareTo(%1) > 0" [l,r]
551722cgOp (LSGe ATFloat) [l, r] = pure $ jsB2I $ JsBinOp ">=" l r
552723cgOp (LSGe (ATInt ITNative)) [l, r] = pure $ jsB2I $ JsBinOp ">=" l r
553724cgOp (LSGe (ATInt ITBig)) [l, r] =
554725 do
555726 setUsedITBig
556727 pure $ jsB2I $ JsForeign "%0.compareTo(%1) >= 0" [l,r]
557−cgOp LStrEq [l,r] = pure $ jsB2I $ JsBinOp "==" l r
558−cgOp LStrLen [x] = pure $ JsForeign "%0.length" [x]
559−cgOp LStrHead [x] = pure $ JsArrayProj (JsInt 0) x
560−cgOp LStrIndex [x, y] = pure $ JsArrayProj y x
561−cgOp LStrTail [x] = pure $ JsMethod x "slice" [JsInt 1]
562−cgOp LStrLt [l, r] = pure $ jsB2I $ JsBinOp "<" l r
563−cgOp LStrRev [x] = pure $ JsForeign "%0.split('').reverse().join('')" [x]
564−cgOp (LFloatStr) [x] = pure $ JsApp "String" [x]
565−cgOp (LIntStr ITNative) [x] = pure $ JsApp "String" [x]
566−cgOp (LIntStr ITBig) [x] =
728+cgOp (LSGe (ATInt (ITFixed IT8))) [l, r] = pure $ jsB2I $ JsBinOp ">=" l r
729+cgOp (LSGe (ATInt (ITFixed IT16))) [l, r] = pure $ jsB2I $ JsBinOp ">=" l r
730+cgOp (LSGe (ATInt (ITFixed IT32))) [l, r] = pure $ jsB2I $ JsBinOp ">=" l r
731+cgOp (LSGe (ATInt (ITFixed IT64))) [l, r] =
567732 do
568733 setUsedITBig
569− pure $ JsForeign "%0.toString()" [x]
570−cgOp (LFloatInt ITNative) [x] = pure $ JsForeign "%0|0" [x]
571−cgOp (LStrInt ITNative) [x] = pure $ JsForeign "parseInt(%0)|0" [x]
572−cgOp (LStrFloat) [x] = pure $ JsApp "parseFloat" [x]
573−cgOp (LChInt ITNative) [x] = pure $ JsForeign "%0.charCodeAt(0)|0" [x]
574−cgOp (LIntCh ITNative) [x] = pure $ JsApp "String.fromCharCode" [x]
734+ pure $ jsB2I $ JsForeign "%0.compareTo(%1) >= 0" [l,r]
735+cgOp (LSExt ITNative ITBig) [x] =
736+ do
737+ setUsedITBig
738+ pure $ JsForeign "new jsbn.BigInteger(String(%0))" [x]
739+cgOp (LZExt (ITFixed IT8) ITNative) [x] = pure x
740+cgOp (LZExt (ITFixed IT16) ITNative) [x] = pure x
741+cgOp (LZExt (ITFixed IT32) ITNative) [x] = pure x
742+cgOp (LZExt ITNative ITBig) [x] =
743+ do
744+ setUsedITBig
745+ pure $ JsForeign "new jsbn.BigInteger(String(%0))" [x]
575746cgOp (LTrunc ITBig ITNative) [x] =
576747 do
577748 setUsedITBig
578749 pure $ JsForeign "%0.intValue()|0" [x]
579−cgOp (LTrunc (ITFixed IT16) (ITFixed IT8)) [x] = pure $ JsForeign "new Uint8Array([ %0[0] ])" [x]
580−cgOp (LTrunc (ITFixed IT32) (ITFixed IT8)) [x] = pure $ JsForeign "new Uint8Array([ %0 ])" [x]
750+cgOp (LTrunc (ITFixed IT16) (ITFixed IT8)) [x] = pure $ JsForeign "%0 & 0xFF" [x]
751+cgOp (LTrunc (ITFixed IT32) (ITFixed IT8)) [x] = pure $ JsForeign "%0 & 0xFF" [x]
581752cgOp (LTrunc (ITFixed IT64) (ITFixed IT8)) [x] =
582753 do
583754 setUsedITBig
584− pure $ JsForeign "new Uint8Array([ %0.and(new jsbn.BigInteger(%1)).intValue() ])" [x, JsStr $ show 0xFF]
585−cgOp (LSExt ITNative ITBig) [x] =
755+ pure $ JsForeign "%0.intValue() & 0xFF" [x]
756+cgOp (LTrunc (ITFixed IT32) (ITFixed IT16)) [x] = pure $ JsForeign "%0 & 0xFFFF" [x]
757+cgOp (LTrunc (ITFixed IT64) (ITFixed IT16)) [x] =
586758 do
587759 setUsedITBig
588− pure $ JsForeign "new jsbn.BigInteger(String(%0))" [x]
589−cgOp (LZExt (ITFixed IT8) ITNative) [x] = pure $ JsForeign "%0[0]" [x]
590−cgOp (LZExt ITNative ITBig) [x] =
760+ pure $ JsForeign "%0.intValue() & 0xFFFF" [x]
761+cgOp (LTrunc (ITFixed IT64) (ITFixed IT32)) [x] =
591762 do
592763 setUsedITBig
593− pure $ JsForeign "new jsbn.BigInteger(String(%0))" [x]
764+ pure $ JsForeign "%0.intValue() & 0xFFFFFFFF" [x]
765+cgOp (LTrunc ITBig (ITFixed IT64)) [x] =
766+ do
767+ setUsedITBig
768+ pure $ JsForeign "%0.and(new jsbn.BigInteger(%1))" [x, JsStr $ show 0xFFFFFFFFFFFFFFFF]
769+cgOp LStrConcat [l,r] = pure $ JsBinOp "+" l r
770+cgOp LStrLt [l, r] = pure $ jsB2I $ JsBinOp "<" l r
771+cgOp LStrEq [l,r] = pure $ jsB2I $ JsBinOp "==" l r
772+cgOp LStrLen [x] = pure $ JsForeign "%0.length" [x]
594773cgOp (LIntFloat ITNative) [x] = pure $ x
595774cgOp (LIntFloat ITBig) [x] =
596775 do
597776 setUsedITBig
598777 pure $ JsForeign "%0.intValue()" [x]
599−cgOp LFACos [x] = pure $ JsApp "Math.acos" [x]
600−cgOp LFATan [x] = pure $ JsApp "Math.atan" [x]
601−cgOp LFCos [x] = pure $ JsApp "Math.cos" [x]
602−cgOp LFFloor [x] = pure $ JsApp "Math.floor" [x]
778+cgOp (LFloatInt ITNative) [x] = pure $ JsForeign "%0|0" [x]
779+cgOp (LIntStr ITNative) [x] = pure $ JsApp "String" [x]
780+cgOp (LIntStr ITBig) [x] =
781+ do
782+ setUsedITBig
783+ pure $ JsForeign "%0.toString()" [x]
784+cgOp (LStrInt ITNative) [x] = pure $ JsForeign "parseInt(%0)|0" [x]
785+cgOp (LStrInt ITBig) [x] =
786+ do
787+ setUsedITBig
788+ pure $ JsForeign "new jsbn.BigInteger(%0)" [x]
789+cgOp (LFloatStr) [x] = pure $ JsApp "String" [x]
790+cgOp (LStrFloat) [x] = pure $ JsApp "parseFloat" [x]
791+cgOp (LChInt ITNative) [x] = pure $ JsForeign "%0.charCodeAt(0)|0" [x]
792+cgOp (LIntCh ITNative) [x] = pure $ JsApp "String.fromCharCode" [x]
793+cgOp LFExp [x] = pure $ JsApp "Math.exp" [x]
794+cgOp LFLog [x] = pure $ JsApp "Math.log" [x]
603795cgOp LFSin [x] = pure $ JsApp "Math.sin" [x]
796+cgOp LFCos [x] = pure $ JsApp "Math.cos" [x]
604797cgOp LFTan [x] = pure $ JsApp "Math.tan" [x]
605798cgOp LFASin [x] = pure $ JsApp "Math.asin" [x]
606−cgOp LFCeil [x] = pure $ JsApp "Math.ceil" [x]
607−cgOp LFExp [x] = pure $ JsApp "Math.exp" [x]
608−cgOp LFLog [x] = pure $ JsApp "Math.log" [x]
799+cgOp LFACos [x] = pure $ JsApp "Math.acos" [x]
800+cgOp LFATan [x] = pure $ JsApp "Math.atan" [x]
609801cgOp LFSqrt [x] = pure $ JsApp "Math.sqrt" [x]
802+cgOp LFFloor [x] = pure $ JsApp "Math.floor" [x]
803+cgOp LFCeil [x] = pure $ JsApp "Math.ceil" [x]
610804cgOp LFNegate [x] = pure $ JsForeign "-%0" [x]
611−cgOp (LSDiv ATFloat) [l,r] = pure $ JsBinOp "/" l r
612−cgOp (LSDiv (ATInt ITNative)) [l,r] = pure $ JsForeign "%0/%1|0" [l, r]
613−cgOp (LSDiv (ATInt ITBig)) [l,r] =
614− do
615− setUsedITBig
616− pure $ JsMethod l "divide" [r]
617−cgOp LWriteStr [_,str] =
618− do
619− s <- get
620− put $ s {usedWrite = True}
621− pure $ JsForeign (writeStrTemplate $ conf s) [str]
805+cgOp LStrHead [x] = pure $ JsArrayProj (JsInt 0) x
806+cgOp LStrTail [x] = pure $ JsMethod x "slice" [JsInt 1]
807+cgOp LStrCons [l,r] = pure $ JsForeign "%0+%1" [l,r]
808+cgOp LStrIndex [x, y] = pure $ JsArrayProj y x
809+cgOp LStrRev [x] = pure $ JsForeign "%0.split('').reverse().join('')" [x]
810+cgOp LStrSubstr [offset,len,str] = pure $ JsForeign "%0.substr(Math.max(0,%1), Math.max(0, %2))" [str, offset, len]
622811cgOp LReadStr [_] =
623812 do
624813 s <- get
625814 put $ s {usedRead = True}
626815 pure $ JsForeign (readStrTemplate $ conf s) []
627−cgOp LStrConcat [l,r] = pure $ JsBinOp "+" l r
628−cgOp LStrCons [l,r] = pure $ JsForeign "%0+%1" [l,r]
629−cgOp LStrSubstr [offset,len,str] = pure $ JsForeign "%0.substr(Math.max(0,%1), Math.max(0, %2))" [str, offset, len] -- JsMethod str "substr" [offset, len]
630−cgOp (LSRem (ATInt ITNative)) [l,r] = pure $ JsBinOp "%" l r
631−cgOp (LSRem (ATInt ITBig)) [l,r] =
816+cgOp LWriteStr [_,str] =
632817 do
633− setUsedITBig
634− pure $ JsMethod l "remainder" [r]
818+ s <- get
819+ put $ s {usedWrite = True}
820+ pure $ JsForeign (writeStrTemplate $ conf s) [str]
821+cgOp LSystemInfo [x] = pure $ JsApp "js_idris_systemInfo" [x]
822+cgOp (LExternal name) _ | name == sUN "prim__null" = pure JsNull
823+cgOp (LExternal name) [l,r] | name == sUN "prim__eqPtr" = pure $ JsBinOp "==" l r
635824cgOp LCrash [l] = pure $ JsErrorExp l
825+cgOp LNoOp [x] = pure x
636826cgOp op exps = error ("Operator " ++ show (op, exps) ++ " not implemented")