From caa38bd46bdee14557cb6ccdfbfe16fd241baa61 Mon Sep 17 00:00:00 2001 From: y-tak6 Date: Wed, 8 Jan 2025 18:55:33 +0900 Subject: [PATCH 1/3] add definition.md --- definition.md | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 definition.md diff --git a/definition.md b/definition.md new file mode 100644 index 0000000..b024379 --- /dev/null +++ b/definition.md @@ -0,0 +1,54 @@ +# 記法 +シグネチャをつけたモジュールとして定義します. + +## storage +シグネチャ内の1つ目に定義された型がstorage,2つ目に指定された型がmutable storageとして扱われます. +また,3つ目以降に型を定義することはできません. + +## 定義可能な値 +シグネチャ内に記述できる値は関数のみです.関数の第2引数は必須で,storageである必要があります.オプションでmutable storage型の第3引数をつけることができ,以降の引数はつけることはできません.返り値は2番目の要素にstorageを置いた2つ組のタプルである必要があります. + +複数の値を入力として受け取る関数を書く場合はタプル型を使用します. + + +## 型 +### unit型 +`unit`: 可能な値は()です. + +### bool型 +`bool`: 可能な値は`true`と`false`です. + +### uint型 +符号なし整数(unsigned int)型 +`uint`: `UInt`というコンストラクタを伴った符号なし整数.`UInt 1`など + +### sint型 +符号付き整数(signed int)型 +`sint`: `SInt`というコンストラクタを伴った符号なし整数.`SInt 1`など + +### address型 +`address`: アドレスを表す型. + +### タプル型 +`t1 * t2 * ...`:`t1`, `t2`には実際の型が入ります. + +### ハッシュテーブル型 +`(t1, t2) Hashtbl.t`: `t1`, `t2`には実際の型が入り,`t1`から`t2`へのハッシュテーブル型となります. + +## 式 +使用可能な式は関数適用,let式,if式,逐次実行です. +let式で束縛する式としてunit型は使えません.代わりに逐次実行を使用してください. +逐次実行`e1; e2`の`e1`はunit型である必要があり,また,`()`のみの場合は使えません. + + +## 組み込み関数 +### 演算子 +関数として定義されています. +- `<`, `>`, `<=`, `>=`, `=`, `!=` : `'a -> 'a -> bool` 大小や等価性の比較 +- `+`, `-`, `*`, `\`: `sint -> sint -> sint` sint型の演算子 +- `+^`, `-^`, `*^`, `/^`: `uint -> uint -> uint` uint型の演算子 + +## その他関数 +- `caller: unit -> address`: トランザクションを発行したアドレスを返します +- `Hashtbl.find: ('a, 'b) Hashtbl.t -> 'a -> 'b`: Hashtblライブラリ参照. +- `Hashtbl.replace: ('a, 'b) Hashtbl.t -> 'a -> 'b -> unit`: Hashtblライブラリを参照. From 46724833eeaa95bf252e95b936a0453e382f5b3f Mon Sep 17 00:00:00 2001 From: y-tak6 Date: Wed, 8 Jan 2025 19:08:04 +0900 Subject: [PATCH 2/3] first commit From a54d038837bc45b0d0ea3b02142df6d881fae613 Mon Sep 17 00:00:00 2001 From: y-tak6 Date: Thu, 9 Jan 2025 14:54:25 +0900 Subject: [PATCH 3/3] fix a bug that functions which return unit are not available --- sample/contracts/SimpleStorageIf.json | 4 ++-- src/anormal.ml | 4 +++- src/utils.ml | 5 ++++- src/yul_compile.ml | 4 ++-- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/sample/contracts/SimpleStorageIf.json b/sample/contracts/SimpleStorageIf.json index cd1aeda..62cb312 100644 --- a/sample/contracts/SimpleStorageIf.json +++ b/sample/contracts/SimpleStorageIf.json @@ -79,6 +79,6 @@ "stateMutability": "nonpayable" } ], - "bytecode": "335f556102f36100115f396102f35ff3fe6100076102d5565b8063e5c19b2d146101a25780636d4ce63c1461018c5780633088003814610163578063ac08973d1461013a57806350b978401461011157806344f45307146100e8578063e95e21bc146100bf578063fd3ce04014610096576381fe57861461006d575f80fd5b6100906100786102c4565b61008260016102dd565b61008b5f6102dd565b61028f565b506102ca565b6100b96100a16102c4565b6100ab60016102e7565b6100b45f6102e7565b61022c565b506102ca565b6100e26100ca6102c4565b6100d460016102e7565b6100dd5f6102e7565b6101f4565b506102ca565b61010b6100f36102c4565b6100fd60016102dd565b6101065f6102dd565b6101eb565b506102ca565b61013461011c6102c4565b61012660016102dd565b61012f5f6102dd565b6101e2565b506102ca565b61015d6101456102c4565b61014f60016102dd565b6101585f6102dd565b6101da565b506102ca565b61018661016e6102c4565b61017860016102dd565b6101815f6102dd565b6101d2565b506102ca565b61019c6101976102c4565b6101cd565b506102ca565b6101c36101be6101b06102c4565b6101b95f6102dd565b6101c8565b6102bf565b6102d1565b905090565b908190565b929192109190565b929192119190565b92919211159190565b92919210159190565b92919280918115610223575b8161021b575b501581610213575b509190565b90505f61020e565b90505f610206565b80925091610200565b909291925f918060011461026a575f1461024657505b9190565b80600114610261575f1461025a575b610242565b505f610255565b50506001610255565b5080600114610287575f1461027f575b610242565b50600161027a565b50505f61027a565b90929192808211915f9290816001146102b657505f146102af57505b9190565b90506102ab565b925050506102ab565b600155565b60015490565b5f5260205ff35b5f80f35b5f3560e01c90565b6020026004013590565b6102f0906102dd565b9056", - "deployedBytecode": "6100076102d5565b8063e5c19b2d146101a25780636d4ce63c1461018c5780633088003814610163578063ac08973d1461013a57806350b978401461011157806344f45307146100e8578063e95e21bc146100bf578063fd3ce04014610096576381fe57861461006d575f80fd5b6100906100786102c4565b61008260016102dd565b61008b5f6102dd565b61028f565b506102ca565b6100b96100a16102c4565b6100ab60016102e7565b6100b45f6102e7565b61022c565b506102ca565b6100e26100ca6102c4565b6100d460016102e7565b6100dd5f6102e7565b6101f4565b506102ca565b61010b6100f36102c4565b6100fd60016102dd565b6101065f6102dd565b6101eb565b506102ca565b61013461011c6102c4565b61012660016102dd565b61012f5f6102dd565b6101e2565b506102ca565b61015d6101456102c4565b61014f60016102dd565b6101585f6102dd565b6101da565b506102ca565b61018661016e6102c4565b61017860016102dd565b6101815f6102dd565b6101d2565b506102ca565b61019c6101976102c4565b6101cd565b506102ca565b6101c36101be6101b06102c4565b6101b95f6102dd565b6101c8565b6102bf565b6102d1565b905090565b908190565b929192109190565b929192119190565b92919211159190565b92919210159190565b92919280918115610223575b8161021b575b501581610213575b509190565b90505f61020e565b90505f610206565b80925091610200565b909291925f918060011461026a575f1461024657505b9190565b80600114610261575f1461025a575b610242565b505f610255565b50506001610255565b5080600114610287575f1461027f575b610242565b50600161027a565b50505f61027a565b90929192808211915f9290816001146102b657505f146102af57505b9190565b90506102ab565b925050506102ab565b600155565b60015490565b5f5260205ff35b5f80f35b5f3560e01c90565b6020026004013590565b6102f0906102dd565b9056" + "bytecode": "335f5561031f6100115f3961031f5ff3fe610007610301565b8063e5c19b2d146101a25780636d4ce63c1461018c5780633088003814610163578063ac08973d1461013a57806350b978401461011157806344f45307146100e8578063e95e21bc146100bf578063fd3ce04014610096576381fe57861461006d575f80fd5b6100906100786102f0565b6100826001610309565b61008b5f610309565b6102bb565b506102f6565b6100b96100a16102f0565b6100ab6001610313565b6100b45f610313565b61022c565b506102f6565b6100e26100ca6102f0565b6100d46001610313565b6100dd5f610313565b6101f4565b506102f6565b61010b6100f36102f0565b6100fd6001610309565b6101065f610309565b6101eb565b506102f6565b61013461011c6102f0565b6101266001610309565b61012f5f610309565b6101e2565b506102f6565b61015d6101456102f0565b61014f6001610309565b6101585f610309565b6101da565b506102f6565b61018661016e6102f0565b6101786001610309565b6101815f610309565b6101d2565b506102f6565b61019c6101976102f0565b6101cd565b506102f6565b6101c36101be6101b06102f0565b6101b95f610309565b6101c8565b6102eb565b6102fd565b905090565b908190565b929192109190565b929192119190565b92919211159190565b92919210159190565b92919280918115610223575b8161021b575b501581610213575b509190565b90505f61020e565b90505f610206565b80925091610200565b909291927f737472696e670000000000000000000000000000000000000000000000000000805f93918260011461028f5750505f1461026b57505b9190565b80600114610286575f1461027f575b610267565b505f61027a565b5050600161027a565b915091806001146102b1575f146102a85750505b610267565b909150146102a3565b505050505f6102a3565b90929192808211915f9290816001146102e257505f146102db57505b9190565b90506102d7565b925050506102d7565b600155565b60015490565b5f5260205ff35b5f80f35b5f3560e01c90565b6020026004013590565b61031c90610309565b9056", + "deployedBytecode": "610007610301565b8063e5c19b2d146101a25780636d4ce63c1461018c5780633088003814610163578063ac08973d1461013a57806350b978401461011157806344f45307146100e8578063e95e21bc146100bf578063fd3ce04014610096576381fe57861461006d575f80fd5b6100906100786102f0565b6100826001610309565b61008b5f610309565b6102bb565b506102f6565b6100b96100a16102f0565b6100ab6001610313565b6100b45f610313565b61022c565b506102f6565b6100e26100ca6102f0565b6100d46001610313565b6100dd5f610313565b6101f4565b506102f6565b61010b6100f36102f0565b6100fd6001610309565b6101065f610309565b6101eb565b506102f6565b61013461011c6102f0565b6101266001610309565b61012f5f610309565b6101e2565b506102f6565b61015d6101456102f0565b61014f6001610309565b6101585f610309565b6101da565b506102f6565b61018661016e6102f0565b6101786001610309565b6101815f610309565b6101d2565b506102f6565b61019c6101976102f0565b6101cd565b506102f6565b6101c36101be6101b06102f0565b6101b95f610309565b6101c8565b6102eb565b6102fd565b905090565b908190565b929192109190565b929192119190565b92919211159190565b92919210159190565b92919280918115610223575b8161021b575b501581610213575b509190565b90505f61020e565b90505f610206565b80925091610200565b909291927f737472696e670000000000000000000000000000000000000000000000000000805f93918260011461028f5750505f1461026b57505b9190565b80600114610286575f1461027f575b610267565b505f61027a565b5050600161027a565b915091806001146102b1575f146102a85750505b610267565b909150146102a3565b505050505f6102a3565b90929192808211915f9290816001146102e257505f146102db57505b9190565b90506102d7565b925050506102d7565b600155565b60015490565b5f5260205ff35b5f80f35b5f3560e01c90565b6020026004013590565b61031c90610309565b9056" } \ No newline at end of file diff --git a/src/anormal.ml b/src/anormal.ml index 1d87ec4..8b17d11 100644 --- a/src/anormal.ml +++ b/src/anormal.ml @@ -96,7 +96,9 @@ let rec remove_tuple rename e mut : exp * Abi.state_mutability = | ATuple el -> let rec gen_tuple_let = function | [ x ], [ y ] -> Letin ([ x ], LVal y, e2') - | x :: xs, y :: ys -> Letin ([ x ], LVal y, gen_tuple_let (xs, ys)) + | x :: xs, y :: ys -> if y = UnitV then gen_tuple_let (x::xs, ys) else Letin ([ x ], LVal y, gen_tuple_let (xs, ys)) + | [], y :: ys -> if y = UnitV then gen_tuple_let ([], ys) else assert false + | [], [] -> e2' | _ -> assert false in (gen_tuple_let (vars, el), mut) diff --git a/src/utils.ml b/src/utils.ml index a3d255b..99aa476 100644 --- a/src/utils.ml +++ b/src/utils.ml @@ -32,6 +32,7 @@ let count_vars_in_type t = let flatten_tuple_pat p = let rec count_tuple_elem = function + | Tconstr (Path.Pident t_name, _, _) -> if Ident.name t_name = "unit" then 0 else 1 | Tconstr _ -> 1 | Ttuple types -> List.fold_left @@ -48,6 +49,7 @@ let flatten_tuple_pat p = in let rec flatten_tuple_pat_aux (p, t) = match (p, get_desc t) with + | Tpat_any, Tconstr(Path.Pident t_name, _, _) -> if Ident.name t_name = "unit" then ([], []) else assert false | Tpat_any, _ -> ([], [ fresh_var () ]) | Tpat_construct (_, { cstr_res = res_t; _ }, [], _), Tconstr (_, [], _) -> ( @@ -57,7 +59,8 @@ let flatten_tuple_pat p = | _ -> assert false) | Tpat_var (s, _), t -> let n = count_tuple_elem t in - if n > 1 then + if n = 0 then ([], []) + else if n > 1 then let renamed = gen_renaming_ids n in ([ (Ident.unique_name s, renamed) ], renamed) else ([], [ Ident.unique_name s ]) diff --git a/src/yul_compile.ml b/src/yul_compile.ml index fd49b39..1855350 100644 --- a/src/yul_compile.ml +++ b/src/yul_compile.ml @@ -97,7 +97,7 @@ let rec translate_body_aux e acc ret_vars= (* let acc = Exp (letexp_to_yul e1) :: acc in *) translate_body_aux e2 acc ret_vars | Letin (vars, e1, e2) -> - let a = (match e1 with LIf (v, e1', e2') -> + (match e1 with LIf (v, e1', e2') -> let e1_block, _ = translate_body_aux e1' [] vars in let e1_block = List.rev e1_block in let e2_block, _ = translate_body_aux e2' [] vars in @@ -114,7 +114,7 @@ let rec translate_body_aux e acc ret_vars= let acc = (Yul_ast.If (bexp, [Assign ((var, []), v2)])) :: Let ((var, []), v1) :: acc in translate_body_aux e2 acc ret_vars |_ -> let acc = Let ((List.hd vars, List.tl vars), letexp_to_yul e1) :: acc in - translate_body_aux e2 acc ret_vars) in a + translate_body_aux e2 acc ret_vars) | If (v, e1, e2) -> let e1', vars1 = translate_body_aux e1 acc ret_vars in let e1' = List.rev e1' in