@@ -1,7 +1,8 @@
1{-# LANGUAGE PatternGuards #-}
1{-# LANGUAGE PatternGuards #-}
4+ BigInteger Javascript code taken from:
4− BigInteger Javascript code taken from https://github.com/peterolson/BigInteger.js
5+ https://github.com/peterolson/BigInteger.js
7module IRTS.CodegenJavaScript (codegenJavaScript) where
8module IRTS.CodegenJavaScript (codegenJavaScript) where
@@ -258,25 +259,18 @@ translateExpression _ (SOp op vars)
258 , (lhs:rhs:_) <- vars = translateBinaryOp ">" lhs rhs
259 , (lhs:rhs:_) <- vars = translateBinaryOp ">" lhs rhs
259 | LGe <- op
260 | LGe <- op
260 , (lhs:rhs:_) <- vars = translateBinaryOp ">=" lhs rhs
261 , (lhs:rhs:_) <- vars = translateBinaryOp ">=" lhs rhs
262− | LFPlus <- op
263+ , (lhs:rhs:_) <- vars = translateBinaryOp "&" lhs rhs
263− , (lhs:rhs:_) <- vars = translateBinaryOp "+" lhs rhs
264+ | LOr <- op
264− | LFMinus <- op
265+ , (lhs:rhs:_) <- vars = translateBinaryOp "|" lhs rhs
265− , (lhs:rhs:_) <- vars = translateBinaryOp "-" lhs rhs
266+ | LXOr <- op
266− | LFTimes <- op
267+ , (lhs:rhs:_) <- vars = translateBinaryOp "^" lhs rhs
267− , (lhs:rhs:_) <- vars = translateBinaryOp "*" lhs rhs
268+ | LSHL <- op
268− | LFDiv <- op
269+ , (lhs:rhs:_) <- vars = translateBinaryOp "<<" rhs lhs
269− , (lhs:rhs:_) <- vars = translateBinaryOp "/" lhs rhs
270+ | LSHR <- op
270− | LFEq <- op
271+ , (lhs:rhs:_) <- vars = translateBinaryOp ">>" rhs lhs
271− , (lhs:rhs:_) <- vars = translateBinaryOp "==" lhs rhs
272+ | LCompl <- op
272− | LFLt <- op
273+ , (arg:_) <- vars = "~" ++ translateVariableName arg
273− , (lhs:rhs:_) <- vars = translateBinaryOp "<" lhs rhs
275− , (lhs:rhs:_) <- vars = translateBinaryOp "<=" lhs rhs
277− , (lhs:rhs:_) <- vars = translateBinaryOp ">" lhs rhs
279− , (lhs:rhs:_) <- vars = translateBinaryOp ">=" lhs rhs
281 | LBPlus <- op
275 | LBPlus <- op
282 , (lhs:rhs:_) <- vars = translateBinaryOp ".add(" lhs rhs ++ ")"
276 , (lhs:rhs:_) <- vars = translateBinaryOp ".add(" lhs rhs ++ ")"
@@ -298,24 +292,91 @@ translateExpression _ (SOp op vars)
298 , (lhs:rhs:_) <- vars = translateBinaryOp ".greater(" lhs rhs ++ ")"
292 , (lhs:rhs:_) <- vars = translateBinaryOp ".greater(" lhs rhs ++ ")"
299 | LBGe <- op
293 | LBGe <- op
300 , (lhs:rhs:_) <- vars = translateBinaryOp ".greaterOrEquals(" lhs rhs ++ ")"
294 , (lhs:rhs:_) <- vars = translateBinaryOp ".greaterOrEquals(" lhs rhs ++ ")"
297+ , (lhs:rhs:_) <- vars = translateBinaryOp "+" lhs rhs
299+ , (lhs:rhs:_) <- vars = translateBinaryOp "-" lhs rhs
301+ , (lhs:rhs:_) <- vars = translateBinaryOp "*" lhs rhs
303+ , (lhs:rhs:_) <- vars = translateBinaryOp "/" lhs rhs
305+ , (lhs:rhs:_) <- vars = translateBinaryOp "==" lhs rhs
307+ , (lhs:rhs:_) <- vars = translateBinaryOp "<" lhs rhs
309+ , (lhs:rhs:_) <- vars = translateBinaryOp "<=" lhs rhs
311+ , (lhs:rhs:_) <- vars = translateBinaryOp ">" lhs rhs
313+ , (lhs:rhs:_) <- vars = translateBinaryOp ">=" lhs rhs
316+ , (lhs:rhs:_) <- vars = translateBinaryOp "+" lhs rhs
318+ , (lhs:rhs:_) <- vars = translateBinaryOp "==" lhs rhs
320+ , (lhs:rhs:_) <- vars = translateBinaryOp "<" lhs rhs
323+ , (arg:_) <- vars = "parseInt(" ++ translateVariableName arg ++ ")"
325+ , (arg:_) <- vars = "String(" ++ translateVariableName arg ++ ")"
327+ , (arg:_) <- vars = "__IDR__.bigint(" ++ translateVariableName arg ++ ")"
329+ , (arg:_) <- vars = translateVariableName arg ++ ".valueOf()"
301 | LBigStr <- op
330 | LBigStr <- op
302 , (arg:_) <- vars = translateVariableName arg ++ ".toString()"
331 , (arg:_) <- vars = translateVariableName arg ++ ".toString()"
333+ , (arg:_) <- vars = "__IDR__.bigint(" ++ translateVariableName arg ++ ")"
335+ , (arg:_) <- vars = "String(" ++ translateVariableName arg ++ ")"
337+ , (arg:_) <- vars = "parseFloat(" ++ translateVariableName arg ++ ")"
339+ , (arg:_) <- vars = translateVariableName arg
341+ , (arg:_) <- vars = translateVariableName arg
344+ , (arg:_) <- vars = "Math.exp(" ++ translateVariableName arg ++ ")"
346+ , (arg:_) <- vars = "Math.log(" ++ translateVariableName arg ++ ")"
348+ , (arg:_) <- vars = "Math.sin(" ++ translateVariableName arg ++ ")"
350+ , (arg:_) <- vars = "Math.cos(" ++ translateVariableName arg ++ ")"
352+ , (arg:_) <- vars = "Math.tan(" ++ translateVariableName arg ++ ")"
354+ , (arg:_) <- vars = "Math.asin(" ++ translateVariableName arg ++ ")"
356+ , (arg:_) <- vars = "Math.acos(" ++ translateVariableName arg ++ ")"
358+ , (arg:_) <- vars = "Math.atan(" ++ translateVariableName arg ++ ")"
360+ , (arg:_) <- vars = "Math.sqrt(" ++ translateVariableName arg ++ ")"
362+ , (arg:_) <- vars = "Math.floor(" ++ translateVariableName arg ++ ")"
364+ , (arg:_) <- vars = "Math.ceil(" ++ translateVariableName arg ++ ")"
367+ , (lhs:rhs:_) <- vars = translateBinaryOp "+" lhs rhs
304 | LStrHead <- op
368 | LStrHead <- op
305 , (arg:_) <- vars = translateVariableName arg ++ "[0]"
369 , (arg:_) <- vars = translateVariableName arg ++ "[0]"
371+ , (arg:_) <- vars = let v = translateVariableName arg in
372+ v ++ "split('').reverse().join('')"
374+ , (lhs:rhs:_) <- vars = let l = translateVariableName lhs
375+ r = translateVariableName rhs in
376+ l ++ "[" ++ r ++ "]"
306 | LStrTail <- op
377 | LStrTail <- op
307 , (arg:_) <- vars = let v = translateVariableName arg in
378 , (arg:_) <- vars = let v = translateVariableName arg in
308 v ++ ".substr(1," ++ v ++ ".length-1)"
379 v ++ ".substr(1," ++ v ++ ".length-1)"
310− , (lhs:rhs:_) <- vars = translateBinaryOp "+" lhs rhs
312− , (lhs:rhs:_) <- vars = translateBinaryOp "==" lhs rhs
314− , (lhs:rhs:_) <- vars = translateBinaryOp "+" lhs rhs
317− , (arg:_) <- vars = "String(" ++ translateVariableName arg ++ ");"
320 translateBinaryOp :: String -> LVar -> LVar -> String
381 translateBinaryOp :: String -> LVar -> LVar -> String
321 translateBinaryOp f lhs rhs =
382 translateBinaryOp f lhs rhs =