Add bitwise operators to CameLIGO

Right now they're defined as '.bor' and '.band' because of a glitch
in CameLIGO's parser where 'X.Y' leads to a parse error if Y is a
keyword or reserved word in CameLIGO.
This commit is contained in:
John David Pressman 2019-10-25 16:12:54 -07:00
parent 5a5c3a8dd4
commit ea661247b6
3 changed files with 32 additions and 1 deletions

View File

@ -177,6 +177,10 @@ module Simplify = struct
("Big_map.literal" , "BIG_MAP_LITERAL" ) ; ("Big_map.literal" , "BIG_MAP_LITERAL" ) ;
("Big_map.empty" , "BIG_MAP_EMPTY" ) ; ("Big_map.empty" , "BIG_MAP_EMPTY" ) ;
("Bitwise.bor" , "OR") ;
("Bitwise.band" , "AND") ;
("Bitwise.xor" , "XOR") ;
("String.length", "SIZE") ; ("String.length", "SIZE") ;
("String.size", "SIZE") ; ("String.size", "SIZE") ;
("String.slice", "SLICE") ; ("String.slice", "SLICE") ;

View File

@ -0,0 +1,10 @@
(* Test CameLIGO bitwise operators *)
let or_op (n : nat) : nat =
Bitwise.bor n 4p
let and_op (n : nat) : nat =
Bitwise.band n 7p
let xor_op (n : nat) : nat =
Bitwise.xor n 7p

View File

@ -194,6 +194,22 @@ let bitwise_arithmetic () : unit result =
let%bind () = expect_eq program "xor_op" (e_nat 7) (e_nat 0) in let%bind () = expect_eq program "xor_op" (e_nat 7) (e_nat 0) in
ok () ok ()
let bitwise_arithmetic_mligo () : unit result =
let%bind program = mtype_file "./contracts/bitwise_arithmetic.mligo" in
let%bind () = expect_eq program "or_op" (e_nat 7) (e_nat 7) in
let%bind () = expect_eq program "or_op" (e_nat 3) (e_nat 7) in
let%bind () = expect_eq program "or_op" (e_nat 2) (e_nat 6) in
let%bind () = expect_eq program "or_op" (e_nat 14) (e_nat 14) in
let%bind () = expect_eq program "or_op" (e_nat 10) (e_nat 14) in
let%bind () = expect_eq program "and_op" (e_nat 7) (e_nat 7) in
let%bind () = expect_eq program "and_op" (e_nat 3) (e_nat 3) in
let%bind () = expect_eq program "and_op" (e_nat 2) (e_nat 2) in
let%bind () = expect_eq program "and_op" (e_nat 14) (e_nat 6) in
let%bind () = expect_eq program "and_op" (e_nat 10) (e_nat 2) in
let%bind () = expect_eq program "xor_op" (e_nat 0) (e_nat 7) in
let%bind () = expect_eq program "xor_op" (e_nat 7) (e_nat 0) in
ok ()
let string_arithmetic () : unit result = let string_arithmetic () : unit result =
let%bind program = type_file "./contracts/string_arithmetic.ligo" in let%bind program = type_file "./contracts/string_arithmetic.ligo" in
let%bind () = expect_eq program "concat_op" (e_string "foo") (e_string "foototo") in let%bind () = expect_eq program "concat_op" (e_string "foo") (e_string "foototo") in
@ -960,7 +976,8 @@ let main = test_suite "Integration (End to End)" [
test "multiple parameters" multiple_parameters ; test "multiple parameters" multiple_parameters ;
test "bool" bool_expression ; test "bool" bool_expression ;
test "arithmetic" arithmetic ; test "arithmetic" arithmetic ;
test "bitiwse_arithmetic" bitwise_arithmetic ; test "bitwise_arithmetic" bitwise_arithmetic ;
test "bitwise_arithmetic (mligo)" bitwise_arithmetic_mligo;
test "string_arithmetic" string_arithmetic ; test "string_arithmetic" string_arithmetic ;
test "string_arithmetic (mligo)" string_arithmetic_mligo ; test "string_arithmetic (mligo)" string_arithmetic_mligo ;
test "bytes_arithmetic" bytes_arithmetic ; test "bytes_arithmetic" bytes_arithmetic ;