1
0
Fork 0
mirror of https://github.com/ton-blockchain/ton synced 2025-02-15 04:32:21 +00:00

[FunC] Add builtin functions to stdlib.fc

Note, that I have not added all builtin functions.
I filtered out strange and actually unused in practice,
like "int_at()" and similar, or "run_method0()" and similar.
(Probably, they should be dropped off even from builtins)

Also, I've modified some stdlib.fc legacy tests just to ensure
that a resulting hash doesn't change.
This commit is contained in:
Aleksandr Kirsanov 2024-05-08 13:24:11 +03:00
parent cdef8302b0
commit de570873d7
No known key found for this signature in database
GPG key ID: B758BBAA01FFB3D3
10 changed files with 307 additions and 101 deletions

View file

@ -21,12 +21,16 @@ forall X -> X first(tuple t) pure asm "FIRST";
forall X -> X second(tuple t) pure asm "SECOND"; forall X -> X second(tuple t) pure asm "SECOND";
forall X -> X third(tuple t) pure asm "THIRD"; forall X -> X third(tuple t) pure asm "THIRD";
forall X -> X fourth(tuple t) pure asm "3 INDEX"; forall X -> X fourth(tuple t) pure asm "3 INDEX";
forall X -> X at(tuple t, int index) pure builtin;
forall X, Y -> X pair_first([X, Y] p) pure asm "FIRST"; forall X, Y -> X pair_first([X, Y] p) pure asm "FIRST";
forall X, Y -> Y pair_second([X, Y] p) pure asm "SECOND"; forall X, Y -> Y pair_second([X, Y] p) pure asm "SECOND";
forall X, Y, Z -> X triple_first([X, Y, Z] p) pure asm "FIRST"; forall X, Y, Z -> X triple_first([X, Y, Z] p) pure asm "FIRST";
forall X, Y, Z -> Y triple_second([X, Y, Z] p) pure asm "SECOND"; forall X, Y, Z -> Y triple_second([X, Y, Z] p) pure asm "SECOND";
forall X, Y, Z -> Z triple_third([X, Y, Z] p) pure asm "THIRD"; forall X, Y, Z -> Z triple_third([X, Y, Z] p) pure asm "THIRD";
forall X -> X null() pure asm "PUSHNULL"; forall X -> X null() pure asm "PUSHNULL";
forall X -> int null?(X x) pure builtin;
forall X -> X touch(X x) pure builtin;
forall X -> (X, ()) ~touch(X x) pure builtin;
forall X -> (X, ()) ~impure_touch(X x) asm "NOP"; forall X -> (X, ()) ~impure_touch(X x) asm "NOP";
int now() pure asm "NOW"; int now() pure asm "NOW";
@ -47,8 +51,15 @@ int check_data_signature(slice data, slice signature, int public_key) pure asm "
(int, int, int, int) compute_data_size?(cell c, int max_cells) pure asm "CDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT"; (int, int, int, int) compute_data_size?(cell c, int max_cells) pure asm "CDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT";
(int, int, int, int) slice_compute_data_size?(cell c, int max_cells) pure asm "SDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT"; (int, int, int, int) slice_compute_data_size?(cell c, int max_cells) pure asm "SDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT";
// () throw_if(int excno, int cond) asm "THROWARGIF"; () throw(int excno) builtin;
() throw_if(int excno, int cond) builtin;
() throw_unless(int excno, int cond) builtin;
forall X -> () throw_arg(X x, int excno) builtin;
forall X -> () throw_arg_if(X x, int excno, int cond) builtin;
forall X -> () throw_arg_unless(X x, int excno, int cond) builtin;
forall X -> (X, ()) ~dump(X x) builtin;
forall X -> (X, ()) ~strdump(X x) builtin;
() dump_stack() asm "DUMPSTK"; () dump_stack() asm "DUMPSTK";
cell get_data() pure asm "c4 PUSH"; cell get_data() pure asm "c4 PUSH";
@ -66,17 +77,23 @@ int min(int x, int y) pure asm "MIN";
int max(int x, int y) pure asm "MAX"; int max(int x, int y) pure asm "MAX";
(int, int) minmax(int x, int y) pure asm "MINMAX"; (int, int) minmax(int x, int y) pure asm "MINMAX";
int abs(int x) pure asm "ABS"; int abs(int x) pure asm "ABS";
(int, int) divmod(int x, int y) pure builtin;
(int, int) moddiv(int x, int y) pure builtin;
int muldiv(int x, int y, int z) pure builtin;
int muldivr(int x, int y, int z) pure builtin;
int muldivc(int x, int y, int z) pure builtin;
(int, int) muldivmod(int x, int y, int z) pure builtin;
slice begin_parse(cell c) pure asm "CTOS"; slice begin_parse(cell c) pure asm "CTOS";
() end_parse(slice s) asm "ENDS"; () end_parse(slice s) asm "ENDS";
(slice, cell) load_ref(slice s) pure asm( -> 1 0) "LDREF"; (slice, cell) load_ref(slice s) pure asm( -> 1 0) "LDREF";
cell preload_ref(slice s) pure asm "PLDREF"; cell preload_ref(slice s) pure asm "PLDREF";
// (slice, int) ~load_int(slice s, int len) pure asm(s len -> 1 0) "LDIX"; (slice, int) load_int(slice s, int len) pure builtin;
// (slice, int) ~load_uint(slice s, int len) pure asm( -> 1 0) "LDUX"; (slice, int) load_uint(slice s, int len) pure builtin;
// int preload_int(slice s, int len) pure asm "PLDIX"; int preload_int(slice s, int len) pure builtin;
// int preload_uint(slice s, int len) pure asm "PLDUX"; int preload_uint(slice s, int len) pure builtin;
// (slice, slice) load_bits(slice s, int len) pure asm(s len -> 1 0) "LDSLICEX"; (slice, slice) load_bits(slice s, int len) pure builtin;
// slice preload_bits(slice s, int len) pure asm "PLDSLICEX"; slice preload_bits(slice s, int len) pure builtin;
(slice, int) load_grams(slice s) pure asm( -> 1 0) "LDGRAMS"; (slice, int) load_grams(slice s) pure asm( -> 1 0) "LDGRAMS";
slice skip_bits(slice s, int len) pure asm "SDSKIPFIRST"; slice skip_bits(slice s, int len) pure asm "SDSKIPFIRST";
(slice, ()) ~skip_bits(slice s, int len) pure asm "SDSKIPFIRST"; (slice, ()) ~skip_bits(slice s, int len) pure asm "SDSKIPFIRST";
@ -109,8 +126,8 @@ int builder_depth(builder b) pure asm "BDEPTH";
builder begin_cell() pure asm "NEWC"; builder begin_cell() pure asm "NEWC";
cell end_cell(builder b) pure asm "ENDC"; cell end_cell(builder b) pure asm "ENDC";
builder store_ref(builder b, cell c) pure asm(c b) "STREF"; builder store_ref(builder b, cell c) pure asm(c b) "STREF";
// builder store_uint(builder b, int x, int len) pure asm(x b len) "STUX"; builder store_uint(builder b, int x, int len) pure builtin;
// builder store_int(builder b, int x, int len) pure asm(x b len) "STIX"; builder store_int(builder b, int x, int len) pure builtin;
builder store_slice(builder b, slice s) pure asm "STSLICER"; builder store_slice(builder b, slice s) pure asm "STSLICER";
builder store_grams(builder b, int x) pure asm "STGRAMS"; builder store_grams(builder b, int x) pure asm "STGRAMS";
builder store_dict(builder b, cell c) pure asm(c b) "STDICT"; builder store_dict(builder b, cell c) pure asm(c b) "STDICT";

View file

@ -21,12 +21,16 @@ forall X -> X first(tuple t) pure asm "FIRST";
forall X -> X second(tuple t) pure asm "SECOND"; forall X -> X second(tuple t) pure asm "SECOND";
forall X -> X third(tuple t) pure asm "THIRD"; forall X -> X third(tuple t) pure asm "THIRD";
forall X -> X fourth(tuple t) pure asm "3 INDEX"; forall X -> X fourth(tuple t) pure asm "3 INDEX";
forall X -> X at(tuple t, int index) pure builtin;
forall X, Y -> X pair_first([X, Y] p) pure asm "FIRST"; forall X, Y -> X pair_first([X, Y] p) pure asm "FIRST";
forall X, Y -> Y pair_second([X, Y] p) pure asm "SECOND"; forall X, Y -> Y pair_second([X, Y] p) pure asm "SECOND";
forall X, Y, Z -> X triple_first([X, Y, Z] p) pure asm "FIRST"; forall X, Y, Z -> X triple_first([X, Y, Z] p) pure asm "FIRST";
forall X, Y, Z -> Y triple_second([X, Y, Z] p) pure asm "SECOND"; forall X, Y, Z -> Y triple_second([X, Y, Z] p) pure asm "SECOND";
forall X, Y, Z -> Z triple_third([X, Y, Z] p) pure asm "THIRD"; forall X, Y, Z -> Z triple_third([X, Y, Z] p) pure asm "THIRD";
forall X -> X null() pure asm "PUSHNULL"; forall X -> X null() pure asm "PUSHNULL";
forall X -> int null?(X x) pure builtin;
forall X -> X touch(X x) pure builtin;
forall X -> (X, ()) ~touch(X x) pure builtin;
forall X -> (X, ()) ~impure_touch(X x) asm "NOP"; forall X -> (X, ()) ~impure_touch(X x) asm "NOP";
int now() pure asm "NOW"; int now() pure asm "NOW";
@ -47,8 +51,15 @@ int check_data_signature(slice data, slice signature, int public_key) pure asm "
(int, int, int, int) compute_data_size?(cell c, int max_cells) pure asm "CDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT"; (int, int, int, int) compute_data_size?(cell c, int max_cells) pure asm "CDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT";
(int, int, int, int) slice_compute_data_size?(cell c, int max_cells) pure asm "SDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT"; (int, int, int, int) slice_compute_data_size?(cell c, int max_cells) pure asm "SDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT";
;; () throw_if(int excno, int cond) asm "THROWARGIF"; () throw(int excno) builtin;
() throw_if(int excno, int cond) builtin;
() throw_unless(int excno, int cond) builtin;
forall X -> () throw_arg(X x, int excno) builtin;
forall X -> () throw_arg_if(X x, int excno, int cond) builtin;
forall X -> () throw_arg_unless(X x, int excno, int cond) builtin;
forall X -> (X, ()) ~dump(X x) builtin;
forall X -> (X, ()) ~strdump(X x) builtin;
() dump_stack() asm "DUMPSTK"; () dump_stack() asm "DUMPSTK";
cell get_data() pure asm "c4 PUSH"; cell get_data() pure asm "c4 PUSH";
@ -66,17 +77,23 @@ int min(int x, int y) pure asm "MIN";
int max(int x, int y) pure asm "MAX"; int max(int x, int y) pure asm "MAX";
(int, int) minmax(int x, int y) pure asm "MINMAX"; (int, int) minmax(int x, int y) pure asm "MINMAX";
int abs(int x) pure asm "ABS"; int abs(int x) pure asm "ABS";
(int, int) divmod(int x, int y) pure builtin;
(int, int) moddiv(int x, int y) pure builtin;
int muldiv(int x, int y, int z) pure builtin;
int muldivr(int x, int y, int z) pure builtin;
int muldivc(int x, int y, int z) pure builtin;
(int, int) muldivmod(int x, int y, int z) pure builtin;
slice begin_parse(cell c) pure asm "CTOS"; slice begin_parse(cell c) pure asm "CTOS";
() end_parse(slice s) asm "ENDS"; () end_parse(slice s) asm "ENDS";
(slice, cell) load_ref(slice s) pure asm( -> 1 0) "LDREF"; (slice, cell) load_ref(slice s) pure asm( -> 1 0) "LDREF";
cell preload_ref(slice s) pure asm "PLDREF"; cell preload_ref(slice s) pure asm "PLDREF";
;; (slice, int) ~load_int(slice s, int len) pure asm(s len -> 1 0) "LDIX"; (slice, int) load_int(slice s, int len) pure builtin;
;; (slice, int) ~load_uint(slice s, int len) pure asm( -> 1 0) "LDUX"; (slice, int) load_uint(slice s, int len) pure builtin;
;; int preload_int(slice s, int len) pure asm "PLDIX"; int preload_int(slice s, int len) pure builtin;
;; int preload_uint(slice s, int len) pure asm "PLDUX"; int preload_uint(slice s, int len) pure builtin;
;; (slice, slice) load_bits(slice s, int len) pure asm(s len -> 1 0) "LDSLICEX"; (slice, slice) load_bits(slice s, int len) pure builtin;
;; slice preload_bits(slice s, int len) pure asm "PLDSLICEX"; slice preload_bits(slice s, int len) pure builtin;
(slice, int) load_grams(slice s) pure asm( -> 1 0) "LDGRAMS"; (slice, int) load_grams(slice s) pure asm( -> 1 0) "LDGRAMS";
slice skip_bits(slice s, int len) pure asm "SDSKIPFIRST"; slice skip_bits(slice s, int len) pure asm "SDSKIPFIRST";
(slice, ()) ~skip_bits(slice s, int len) pure asm "SDSKIPFIRST"; (slice, ()) ~skip_bits(slice s, int len) pure asm "SDSKIPFIRST";
@ -109,8 +126,8 @@ int builder_depth(builder b) pure asm "BDEPTH";
builder begin_cell() pure asm "NEWC"; builder begin_cell() pure asm "NEWC";
cell end_cell(builder b) pure asm "ENDC"; cell end_cell(builder b) pure asm "ENDC";
builder store_ref(builder b, cell c) pure asm(c b) "STREF"; builder store_ref(builder b, cell c) pure asm(c b) "STREF";
;; builder store_uint(builder b, int x, int len) pure asm(x b len) "STUX"; builder store_uint(builder b, int x, int len) pure builtin;
;; builder store_int(builder b, int x, int len) pure asm(x b len) "STIX"; builder store_int(builder b, int x, int len) pure builtin;
builder store_slice(builder b, slice s) pure asm "STSLICER"; builder store_slice(builder b, slice s) pure asm "STSLICER";
builder store_grams(builder b, int x) pure asm "STGRAMS"; builder store_grams(builder b, int x) pure asm "STGRAMS";
builder store_dict(builder b, cell c) pure asm(c b) "STDICT"; builder store_dict(builder b, cell c) pure asm(c b) "STDICT";

View file

@ -21,12 +21,16 @@ forall X -> X first(tuple t) pure asm "FIRST";
forall X -> X second(tuple t) pure asm "SECOND"; forall X -> X second(tuple t) pure asm "SECOND";
forall X -> X third(tuple t) pure asm "THIRD"; forall X -> X third(tuple t) pure asm "THIRD";
forall X -> X fourth(tuple t) pure asm "3 INDEX"; forall X -> X fourth(tuple t) pure asm "3 INDEX";
forall X -> X at(tuple t, int index) pure builtin;
forall X, Y -> X pair_first([X, Y] p) pure asm "FIRST"; forall X, Y -> X pair_first([X, Y] p) pure asm "FIRST";
forall X, Y -> Y pair_second([X, Y] p) pure asm "SECOND"; forall X, Y -> Y pair_second([X, Y] p) pure asm "SECOND";
forall X, Y, Z -> X triple_first([X, Y, Z] p) pure asm "FIRST"; forall X, Y, Z -> X triple_first([X, Y, Z] p) pure asm "FIRST";
forall X, Y, Z -> Y triple_second([X, Y, Z] p) pure asm "SECOND"; forall X, Y, Z -> Y triple_second([X, Y, Z] p) pure asm "SECOND";
forall X, Y, Z -> Z triple_third([X, Y, Z] p) pure asm "THIRD"; forall X, Y, Z -> Z triple_third([X, Y, Z] p) pure asm "THIRD";
forall X -> X null() pure asm "PUSHNULL"; forall X -> X null() pure asm "PUSHNULL";
forall X -> int null?(X x) pure builtin;
forall X -> X touch(X x) pure builtin;
forall X -> (X, ()) ~touch(X x) pure builtin;
forall X -> (X, ()) ~impure_touch(X x) asm "NOP"; forall X -> (X, ()) ~impure_touch(X x) asm "NOP";
int now() pure asm "NOW"; int now() pure asm "NOW";
@ -47,8 +51,15 @@ int check_data_signature(slice data, slice signature, int public_key) pure asm "
(int, int, int, int) compute_data_size?(cell c, int max_cells) pure asm "CDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT"; (int, int, int, int) compute_data_size?(cell c, int max_cells) pure asm "CDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT";
(int, int, int, int) slice_compute_data_size?(cell c, int max_cells) pure asm "SDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT"; (int, int, int, int) slice_compute_data_size?(cell c, int max_cells) pure asm "SDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT";
;; () throw_if(int excno, int cond) asm "THROWARGIF"; () throw(int excno) builtin;
() throw_if(int excno, int cond) builtin;
() throw_unless(int excno, int cond) builtin;
forall X -> () throw_arg(X x, int excno) builtin;
forall X -> () throw_arg_if(X x, int excno, int cond) builtin;
forall X -> () throw_arg_unless(X x, int excno, int cond) builtin;
forall X -> (X, ()) ~dump(X x) builtin;
forall X -> (X, ()) ~strdump(X x) builtin;
() dump_stack() asm "DUMPSTK"; () dump_stack() asm "DUMPSTK";
cell get_data() pure asm "c4 PUSH"; cell get_data() pure asm "c4 PUSH";
@ -66,17 +77,23 @@ int min(int x, int y) pure asm "MIN";
int max(int x, int y) pure asm "MAX"; int max(int x, int y) pure asm "MAX";
(int, int) minmax(int x, int y) pure asm "MINMAX"; (int, int) minmax(int x, int y) pure asm "MINMAX";
int abs(int x) pure asm "ABS"; int abs(int x) pure asm "ABS";
(int, int) divmod(int x, int y) pure builtin;
(int, int) moddiv(int x, int y) pure builtin;
int muldiv(int x, int y, int z) pure builtin;
int muldivr(int x, int y, int z) pure builtin;
int muldivc(int x, int y, int z) pure builtin;
(int, int) muldivmod(int x, int y, int z) pure builtin;
slice begin_parse(cell c) pure asm "CTOS"; slice begin_parse(cell c) pure asm "CTOS";
() end_parse(slice s) asm "ENDS"; () end_parse(slice s) asm "ENDS";
(slice, cell) load_ref(slice s) pure asm( -> 1 0) "LDREF"; (slice, cell) load_ref(slice s) pure asm( -> 1 0) "LDREF";
cell preload_ref(slice s) pure asm "PLDREF"; cell preload_ref(slice s) pure asm "PLDREF";
;; (slice, int) ~load_int(slice s, int len) pure asm(s len -> 1 0) "LDIX"; (slice, int) load_int(slice s, int len) pure builtin;
;; (slice, int) ~load_uint(slice s, int len) pure asm( -> 1 0) "LDUX"; (slice, int) load_uint(slice s, int len) pure builtin;
;; int preload_int(slice s, int len) pure asm "PLDIX"; int preload_int(slice s, int len) pure builtin;
;; int preload_uint(slice s, int len) pure asm "PLDUX"; int preload_uint(slice s, int len) pure builtin;
;; (slice, slice) load_bits(slice s, int len) pure asm(s len -> 1 0) "LDSLICEX"; (slice, slice) load_bits(slice s, int len) pure builtin;
;; slice preload_bits(slice s, int len) pure asm "PLDSLICEX"; slice preload_bits(slice s, int len) pure builtin;
(slice, int) load_grams(slice s) pure asm( -> 1 0) "LDGRAMS"; (slice, int) load_grams(slice s) pure asm( -> 1 0) "LDGRAMS";
slice skip_bits(slice s, int len) pure asm "SDSKIPFIRST"; slice skip_bits(slice s, int len) pure asm "SDSKIPFIRST";
(slice, ()) ~skip_bits(slice s, int len) pure asm "SDSKIPFIRST"; (slice, ()) ~skip_bits(slice s, int len) pure asm "SDSKIPFIRST";
@ -109,8 +126,8 @@ int builder_depth(builder b) pure asm "BDEPTH";
builder begin_cell() pure asm "NEWC"; builder begin_cell() pure asm "NEWC";
cell end_cell(builder b) pure asm "ENDC"; cell end_cell(builder b) pure asm "ENDC";
builder store_ref(builder b, cell c) pure asm(c b) "STREF"; builder store_ref(builder b, cell c) pure asm(c b) "STREF";
;; builder store_uint(builder b, int x, int len) pure asm(x b len) "STUX"; builder store_uint(builder b, int x, int len) pure builtin;
;; builder store_int(builder b, int x, int len) pure asm(x b len) "STIX"; builder store_int(builder b, int x, int len) pure builtin;
builder store_slice(builder b, slice s) pure asm "STSLICER"; builder store_slice(builder b, slice s) pure asm "STSLICER";
builder store_grams(builder b, int x) pure asm "STGRAMS"; builder store_grams(builder b, int x) pure asm "STGRAMS";
builder store_dict(builder b, cell c) pure asm(c b) "STDICT"; builder store_dict(builder b, cell c) pure asm(c b) "STDICT";

View file

@ -21,12 +21,16 @@ forall X -> X first(tuple t) pure asm "FIRST";
forall X -> X second(tuple t) pure asm "SECOND"; forall X -> X second(tuple t) pure asm "SECOND";
forall X -> X third(tuple t) pure asm "THIRD"; forall X -> X third(tuple t) pure asm "THIRD";
forall X -> X fourth(tuple t) pure asm "3 INDEX"; forall X -> X fourth(tuple t) pure asm "3 INDEX";
forall X -> X at(tuple t, int index) pure builtin;
forall X, Y -> X pair_first([X, Y] p) pure asm "FIRST"; forall X, Y -> X pair_first([X, Y] p) pure asm "FIRST";
forall X, Y -> Y pair_second([X, Y] p) pure asm "SECOND"; forall X, Y -> Y pair_second([X, Y] p) pure asm "SECOND";
forall X, Y, Z -> X triple_first([X, Y, Z] p) pure asm "FIRST"; forall X, Y, Z -> X triple_first([X, Y, Z] p) pure asm "FIRST";
forall X, Y, Z -> Y triple_second([X, Y, Z] p) pure asm "SECOND"; forall X, Y, Z -> Y triple_second([X, Y, Z] p) pure asm "SECOND";
forall X, Y, Z -> Z triple_third([X, Y, Z] p) pure asm "THIRD"; forall X, Y, Z -> Z triple_third([X, Y, Z] p) pure asm "THIRD";
forall X -> X null() pure asm "PUSHNULL"; forall X -> X null() pure asm "PUSHNULL";
forall X -> int null?(X x) pure builtin;
forall X -> X touch(X x) pure builtin;
forall X -> (X, ()) ~touch(X x) pure builtin;
forall X -> (X, ()) ~impure_touch(X x) asm "NOP"; forall X -> (X, ()) ~impure_touch(X x) asm "NOP";
int now() pure asm "NOW"; int now() pure asm "NOW";
@ -47,8 +51,15 @@ int check_data_signature(slice data, slice signature, int public_key) pure asm "
(int, int, int, int) compute_data_size?(cell c, int max_cells) pure asm "CDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT"; (int, int, int, int) compute_data_size?(cell c, int max_cells) pure asm "CDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT";
(int, int, int, int) slice_compute_data_size?(cell c, int max_cells) pure asm "SDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT"; (int, int, int, int) slice_compute_data_size?(cell c, int max_cells) pure asm "SDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT";
// () throw_if(int excno, int cond) asm "THROWARGIF"; () throw(int excno) builtin;
() throw_if(int excno, int cond) builtin;
() throw_unless(int excno, int cond) builtin;
forall X -> () throw_arg(X x, int excno) builtin;
forall X -> () throw_arg_if(X x, int excno, int cond) builtin;
forall X -> () throw_arg_unless(X x, int excno, int cond) builtin;
forall X -> (X, ()) ~dump(X x) builtin;
forall X -> (X, ()) ~strdump(X x) builtin;
() dump_stack() asm "DUMPSTK"; () dump_stack() asm "DUMPSTK";
cell get_data() pure asm "c4 PUSH"; cell get_data() pure asm "c4 PUSH";
@ -66,17 +77,23 @@ int min(int x, int y) pure asm "MIN";
int max(int x, int y) pure asm "MAX"; int max(int x, int y) pure asm "MAX";
(int, int) minmax(int x, int y) pure asm "MINMAX"; (int, int) minmax(int x, int y) pure asm "MINMAX";
int abs(int x) pure asm "ABS"; int abs(int x) pure asm "ABS";
(int, int) divmod(int x, int y) pure builtin;
(int, int) moddiv(int x, int y) pure builtin;
int muldiv(int x, int y, int z) pure builtin;
int muldivr(int x, int y, int z) pure builtin;
int muldivc(int x, int y, int z) pure builtin;
(int, int) muldivmod(int x, int y, int z) pure builtin;
slice begin_parse(cell c) pure asm "CTOS"; slice begin_parse(cell c) pure asm "CTOS";
() end_parse(slice s) asm "ENDS"; () end_parse(slice s) asm "ENDS";
(slice, cell) load_ref(slice s) pure asm( -> 1 0) "LDREF"; (slice, cell) load_ref(slice s) pure asm( -> 1 0) "LDREF";
cell preload_ref(slice s) pure asm "PLDREF"; cell preload_ref(slice s) pure asm "PLDREF";
// (slice, int) ~load_int(slice s, int len) pure asm(s len -> 1 0) "LDIX"; (slice, int) load_int(slice s, int len) pure builtin;
// (slice, int) ~load_uint(slice s, int len) pure asm( -> 1 0) "LDUX"; (slice, int) load_uint(slice s, int len) pure builtin;
// int preload_int(slice s, int len) pure asm "PLDIX"; int preload_int(slice s, int len) pure builtin;
// int preload_uint(slice s, int len) pure asm "PLDUX"; int preload_uint(slice s, int len) pure builtin;
// (slice, slice) load_bits(slice s, int len) pure asm(s len -> 1 0) "LDSLICEX"; (slice, slice) load_bits(slice s, int len) pure builtin;
// slice preload_bits(slice s, int len) pure asm "PLDSLICEX"; slice preload_bits(slice s, int len) pure builtin;
(slice, int) load_grams(slice s) pure asm( -> 1 0) "LDGRAMS"; (slice, int) load_grams(slice s) pure asm( -> 1 0) "LDGRAMS";
slice skip_bits(slice s, int len) pure asm "SDSKIPFIRST"; slice skip_bits(slice s, int len) pure asm "SDSKIPFIRST";
(slice, ()) ~skip_bits(slice s, int len) pure asm "SDSKIPFIRST"; (slice, ()) ~skip_bits(slice s, int len) pure asm "SDSKIPFIRST";
@ -109,8 +126,8 @@ int builder_depth(builder b) pure asm "BDEPTH";
builder begin_cell() pure asm "NEWC"; builder begin_cell() pure asm "NEWC";
cell end_cell(builder b) pure asm "ENDC"; cell end_cell(builder b) pure asm "ENDC";
builder store_ref(builder b, cell c) pure asm(c b) "STREF"; builder store_ref(builder b, cell c) pure asm(c b) "STREF";
// builder store_uint(builder b, int x, int len) pure asm(x b len) "STUX"; builder store_uint(builder b, int x, int len) pure builtin;
// builder store_int(builder b, int x, int len) pure asm(x b len) "STIX"; builder store_int(builder b, int x, int len) pure builtin;
builder store_slice(builder b, slice s) pure asm "STSLICER"; builder store_slice(builder b, slice s) pure asm "STSLICER";
builder store_grams(builder b, int x) pure asm "STGRAMS"; builder store_grams(builder b, int x) pure asm "STGRAMS";
builder store_dict(builder b, cell c) pure asm(c b) "STDICT"; builder store_dict(builder b, cell c) pure asm(c b) "STDICT";

View file

@ -21,12 +21,16 @@ forall X -> X first(tuple t) pure asm "FIRST";
forall X -> X second(tuple t) pure asm "SECOND"; forall X -> X second(tuple t) pure asm "SECOND";
forall X -> X third(tuple t) pure asm "THIRD"; forall X -> X third(tuple t) pure asm "THIRD";
forall X -> X fourth(tuple t) pure asm "3 INDEX"; forall X -> X fourth(tuple t) pure asm "3 INDEX";
forall X -> X at(tuple t, int index) pure builtin;
forall X, Y -> X pair_first([X, Y] p) pure asm "FIRST"; forall X, Y -> X pair_first([X, Y] p) pure asm "FIRST";
forall X, Y -> Y pair_second([X, Y] p) pure asm "SECOND"; forall X, Y -> Y pair_second([X, Y] p) pure asm "SECOND";
forall X, Y, Z -> X triple_first([X, Y, Z] p) pure asm "FIRST"; forall X, Y, Z -> X triple_first([X, Y, Z] p) pure asm "FIRST";
forall X, Y, Z -> Y triple_second([X, Y, Z] p) pure asm "SECOND"; forall X, Y, Z -> Y triple_second([X, Y, Z] p) pure asm "SECOND";
forall X, Y, Z -> Z triple_third([X, Y, Z] p) pure asm "THIRD"; forall X, Y, Z -> Z triple_third([X, Y, Z] p) pure asm "THIRD";
forall X -> X null() pure asm "PUSHNULL"; forall X -> X null() pure asm "PUSHNULL";
forall X -> int null?(X x) pure builtin;
forall X -> X touch(X x) pure builtin;
forall X -> (X, ()) ~touch(X x) pure builtin;
forall X -> (X, ()) ~impure_touch(X x) asm "NOP"; forall X -> (X, ()) ~impure_touch(X x) asm "NOP";
int now() pure asm "NOW"; int now() pure asm "NOW";
@ -47,8 +51,15 @@ int check_data_signature(slice data, slice signature, int public_key) pure asm "
(int, int, int, int) compute_data_size?(cell c, int max_cells) pure asm "CDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT"; (int, int, int, int) compute_data_size?(cell c, int max_cells) pure asm "CDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT";
(int, int, int, int) slice_compute_data_size?(cell c, int max_cells) pure asm "SDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT"; (int, int, int, int) slice_compute_data_size?(cell c, int max_cells) pure asm "SDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT";
;; () throw_if(int excno, int cond) asm "THROWARGIF"; () throw(int excno) builtin;
() throw_if(int excno, int cond) builtin;
() throw_unless(int excno, int cond) builtin;
forall X -> () throw_arg(X x, int excno) builtin;
forall X -> () throw_arg_if(X x, int excno, int cond) builtin;
forall X -> () throw_arg_unless(X x, int excno, int cond) builtin;
forall X -> (X, ()) ~dump(X x) builtin;
forall X -> (X, ()) ~strdump(X x) builtin;
() dump_stack() asm "DUMPSTK"; () dump_stack() asm "DUMPSTK";
cell get_data() pure asm "c4 PUSH"; cell get_data() pure asm "c4 PUSH";
@ -66,17 +77,23 @@ int min(int x, int y) pure asm "MIN";
int max(int x, int y) pure asm "MAX"; int max(int x, int y) pure asm "MAX";
(int, int) minmax(int x, int y) pure asm "MINMAX"; (int, int) minmax(int x, int y) pure asm "MINMAX";
int abs(int x) pure asm "ABS"; int abs(int x) pure asm "ABS";
(int, int) divmod(int x, int y) pure builtin;
(int, int) moddiv(int x, int y) pure builtin;
int muldiv(int x, int y, int z) pure builtin;
int muldivr(int x, int y, int z) pure builtin;
int muldivc(int x, int y, int z) pure builtin;
(int, int) muldivmod(int x, int y, int z) pure builtin;
slice begin_parse(cell c) pure asm "CTOS"; slice begin_parse(cell c) pure asm "CTOS";
() end_parse(slice s) asm "ENDS"; () end_parse(slice s) asm "ENDS";
(slice, cell) load_ref(slice s) pure asm( -> 1 0) "LDREF"; (slice, cell) load_ref(slice s) pure asm( -> 1 0) "LDREF";
cell preload_ref(slice s) pure asm "PLDREF"; cell preload_ref(slice s) pure asm "PLDREF";
;; (slice, int) ~load_int(slice s, int len) pure asm(s len -> 1 0) "LDIX"; (slice, int) load_int(slice s, int len) pure builtin;
;; (slice, int) ~load_uint(slice s, int len) pure asm( -> 1 0) "LDUX"; (slice, int) load_uint(slice s, int len) pure builtin;
;; int preload_int(slice s, int len) pure asm "PLDIX"; int preload_int(slice s, int len) pure builtin;
;; int preload_uint(slice s, int len) pure asm "PLDUX"; int preload_uint(slice s, int len) pure builtin;
;; (slice, slice) load_bits(slice s, int len) pure asm(s len -> 1 0) "LDSLICEX"; (slice, slice) load_bits(slice s, int len) pure builtin;
;; slice preload_bits(slice s, int len) pure asm "PLDSLICEX"; slice preload_bits(slice s, int len) pure builtin;
(slice, int) load_grams(slice s) pure asm( -> 1 0) "LDGRAMS"; (slice, int) load_grams(slice s) pure asm( -> 1 0) "LDGRAMS";
slice skip_bits(slice s, int len) pure asm "SDSKIPFIRST"; slice skip_bits(slice s, int len) pure asm "SDSKIPFIRST";
(slice, ()) ~skip_bits(slice s, int len) pure asm "SDSKIPFIRST"; (slice, ()) ~skip_bits(slice s, int len) pure asm "SDSKIPFIRST";
@ -109,8 +126,8 @@ int builder_depth(builder b) pure asm "BDEPTH";
builder begin_cell() pure asm "NEWC"; builder begin_cell() pure asm "NEWC";
cell end_cell(builder b) pure asm "ENDC"; cell end_cell(builder b) pure asm "ENDC";
builder store_ref(builder b, cell c) pure asm(c b) "STREF"; builder store_ref(builder b, cell c) pure asm(c b) "STREF";
;; builder store_uint(builder b, int x, int len) pure asm(x b len) "STUX"; builder store_uint(builder b, int x, int len) pure builtin;
;; builder store_int(builder b, int x, int len) pure asm(x b len) "STIX"; builder store_int(builder b, int x, int len) pure builtin;
builder store_slice(builder b, slice s) pure asm "STSLICER"; builder store_slice(builder b, slice s) pure asm "STSLICER";
builder store_grams(builder b, int x) pure asm "STGRAMS"; builder store_grams(builder b, int x) pure asm "STGRAMS";
builder store_dict(builder b, cell c) pure asm(c b) "STDICT"; builder store_dict(builder b, cell c) pure asm(c b) "STDICT";

View file

@ -21,12 +21,16 @@ forall X -> X first(tuple t) pure asm "FIRST";
forall X -> X second(tuple t) pure asm "SECOND"; forall X -> X second(tuple t) pure asm "SECOND";
forall X -> X third(tuple t) pure asm "THIRD"; forall X -> X third(tuple t) pure asm "THIRD";
forall X -> X fourth(tuple t) pure asm "3 INDEX"; forall X -> X fourth(tuple t) pure asm "3 INDEX";
forall X -> X at(tuple t, int index) pure builtin;
forall X, Y -> X pair_first([X, Y] p) pure asm "FIRST"; forall X, Y -> X pair_first([X, Y] p) pure asm "FIRST";
forall X, Y -> Y pair_second([X, Y] p) pure asm "SECOND"; forall X, Y -> Y pair_second([X, Y] p) pure asm "SECOND";
forall X, Y, Z -> X triple_first([X, Y, Z] p) pure asm "FIRST"; forall X, Y, Z -> X triple_first([X, Y, Z] p) pure asm "FIRST";
forall X, Y, Z -> Y triple_second([X, Y, Z] p) pure asm "SECOND"; forall X, Y, Z -> Y triple_second([X, Y, Z] p) pure asm "SECOND";
forall X, Y, Z -> Z triple_third([X, Y, Z] p) pure asm "THIRD"; forall X, Y, Z -> Z triple_third([X, Y, Z] p) pure asm "THIRD";
forall X -> X null() pure asm "PUSHNULL"; forall X -> X null() pure asm "PUSHNULL";
forall X -> int null?(X x) pure builtin;
forall X -> X touch(X x) pure builtin;
forall X -> (X, ()) ~touch(X x) pure builtin;
forall X -> (X, ()) ~impure_touch(X x) asm "NOP"; forall X -> (X, ()) ~impure_touch(X x) asm "NOP";
int now() pure asm "NOW"; int now() pure asm "NOW";
@ -47,8 +51,15 @@ int check_data_signature(slice data, slice signature, int public_key) pure asm "
(int, int, int, int) compute_data_size?(cell c, int max_cells) pure asm "CDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT"; (int, int, int, int) compute_data_size?(cell c, int max_cells) pure asm "CDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT";
(int, int, int, int) slice_compute_data_size?(cell c, int max_cells) pure asm "SDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT"; (int, int, int, int) slice_compute_data_size?(cell c, int max_cells) pure asm "SDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT";
;; () throw_if(int excno, int cond) asm "THROWARGIF"; () throw(int excno) builtin;
() throw_if(int excno, int cond) builtin;
() throw_unless(int excno, int cond) builtin;
forall X -> () throw_arg(X x, int excno) builtin;
forall X -> () throw_arg_if(X x, int excno, int cond) builtin;
forall X -> () throw_arg_unless(X x, int excno, int cond) builtin;
forall X -> (X, ()) ~dump(X x) builtin;
forall X -> (X, ()) ~strdump(X x) builtin;
() dump_stack() asm "DUMPSTK"; () dump_stack() asm "DUMPSTK";
cell get_data() pure asm "c4 PUSH"; cell get_data() pure asm "c4 PUSH";
@ -66,17 +77,23 @@ int min(int x, int y) pure asm "MIN";
int max(int x, int y) pure asm "MAX"; int max(int x, int y) pure asm "MAX";
(int, int) minmax(int x, int y) pure asm "MINMAX"; (int, int) minmax(int x, int y) pure asm "MINMAX";
int abs(int x) pure asm "ABS"; int abs(int x) pure asm "ABS";
(int, int) divmod(int x, int y) pure builtin;
(int, int) moddiv(int x, int y) pure builtin;
int muldiv(int x, int y, int z) pure builtin;
int muldivr(int x, int y, int z) pure builtin;
int muldivc(int x, int y, int z) pure builtin;
(int, int) muldivmod(int x, int y, int z) pure builtin;
slice begin_parse(cell c) pure asm "CTOS"; slice begin_parse(cell c) pure asm "CTOS";
() end_parse(slice s) asm "ENDS"; () end_parse(slice s) asm "ENDS";
(slice, cell) load_ref(slice s) pure asm( -> 1 0) "LDREF"; (slice, cell) load_ref(slice s) pure asm( -> 1 0) "LDREF";
cell preload_ref(slice s) pure asm "PLDREF"; cell preload_ref(slice s) pure asm "PLDREF";
;; (slice, int) ~load_int(slice s, int len) pure asm(s len -> 1 0) "LDIX"; (slice, int) load_int(slice s, int len) pure builtin;
;; (slice, int) ~load_uint(slice s, int len) pure asm( -> 1 0) "LDUX"; (slice, int) load_uint(slice s, int len) pure builtin;
;; int preload_int(slice s, int len) pure asm "PLDIX"; int preload_int(slice s, int len) pure builtin;
;; int preload_uint(slice s, int len) pure asm "PLDUX"; int preload_uint(slice s, int len) pure builtin;
;; (slice, slice) load_bits(slice s, int len) pure asm(s len -> 1 0) "LDSLICEX"; (slice, slice) load_bits(slice s, int len) pure builtin;
;; slice preload_bits(slice s, int len) pure asm "PLDSLICEX"; slice preload_bits(slice s, int len) pure builtin;
(slice, int) load_grams(slice s) pure asm( -> 1 0) "LDGRAMS"; (slice, int) load_grams(slice s) pure asm( -> 1 0) "LDGRAMS";
slice skip_bits(slice s, int len) pure asm "SDSKIPFIRST"; slice skip_bits(slice s, int len) pure asm "SDSKIPFIRST";
(slice, ()) ~skip_bits(slice s, int len) pure asm "SDSKIPFIRST"; (slice, ()) ~skip_bits(slice s, int len) pure asm "SDSKIPFIRST";
@ -108,9 +125,9 @@ int builder_depth(builder b) pure asm "BDEPTH";
builder begin_cell() pure asm "NEWC"; builder begin_cell() pure asm "NEWC";
cell end_cell(builder b) pure asm "ENDC"; cell end_cell(builder b) pure asm "ENDC";
builder store_ref(builder b, cell c) pure asm(c b) "STREF"; builder store_ref(builder b, cell c) pure asm(c b) "STREF";
;; builder store_uint(builder b, int x, int len) pure asm(x b len) "STUX"; builder store_uint(builder b, int x, int len) pure builtin;
;; builder store_int(builder b, int x, int len) pure asm(x b len) "STIX"; builder store_int(builder b, int x, int len) pure builtin;
builder store_slice(builder b, slice s) pure asm "STSLICER"; builder store_slice(builder b, slice s) pure asm "STSLICER";
builder store_grams(builder b, int x) pure asm "STGRAMS"; builder store_grams(builder b, int x) pure asm "STGRAMS";
builder store_dict(builder b, cell c) pure asm(c b) "STDICT"; builder store_dict(builder b, cell c) pure asm(c b) "STDICT";

View file

@ -21,12 +21,16 @@ forall X -> X first(tuple t) pure asm "FIRST";
forall X -> X second(tuple t) pure asm "SECOND"; forall X -> X second(tuple t) pure asm "SECOND";
forall X -> X third(tuple t) pure asm "THIRD"; forall X -> X third(tuple t) pure asm "THIRD";
forall X -> X fourth(tuple t) pure asm "3 INDEX"; forall X -> X fourth(tuple t) pure asm "3 INDEX";
forall X -> X at(tuple t, int index) pure builtin;
forall X, Y -> X pair_first([X, Y] p) pure asm "FIRST"; forall X, Y -> X pair_first([X, Y] p) pure asm "FIRST";
forall X, Y -> Y pair_second([X, Y] p) pure asm "SECOND"; forall X, Y -> Y pair_second([X, Y] p) pure asm "SECOND";
forall X, Y, Z -> X triple_first([X, Y, Z] p) pure asm "FIRST"; forall X, Y, Z -> X triple_first([X, Y, Z] p) pure asm "FIRST";
forall X, Y, Z -> Y triple_second([X, Y, Z] p) pure asm "SECOND"; forall X, Y, Z -> Y triple_second([X, Y, Z] p) pure asm "SECOND";
forall X, Y, Z -> Z triple_third([X, Y, Z] p) pure asm "THIRD"; forall X, Y, Z -> Z triple_third([X, Y, Z] p) pure asm "THIRD";
forall X -> X null() pure asm "PUSHNULL"; forall X -> X null() pure asm "PUSHNULL";
forall X -> int null?(X x) pure builtin;
forall X -> X touch(X x) pure builtin;
forall X -> (X, ()) ~touch(X x) pure builtin;
forall X -> (X, ()) ~impure_touch(X x) asm "NOP"; forall X -> (X, ()) ~impure_touch(X x) asm "NOP";
int now() pure asm "NOW"; int now() pure asm "NOW";
@ -47,8 +51,15 @@ int check_data_signature(slice data, slice signature, int public_key) pure asm "
(int, int, int, int) compute_data_size?(cell c, int max_cells) pure asm "CDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT"; (int, int, int, int) compute_data_size?(cell c, int max_cells) pure asm "CDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT";
(int, int, int, int) slice_compute_data_size?(cell c, int max_cells) pure asm "SDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT"; (int, int, int, int) slice_compute_data_size?(cell c, int max_cells) pure asm "SDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT";
;; () throw_if(int excno, int cond) asm "THROWARGIF"; () throw(int excno) builtin;
() throw_if(int excno, int cond) builtin;
() throw_unless(int excno, int cond) builtin;
forall X -> () throw_arg(X x, int excno) builtin;
forall X -> () throw_arg_if(X x, int excno, int cond) builtin;
forall X -> () throw_arg_unless(X x, int excno, int cond) builtin;
forall X -> (X, ()) ~dump(X x) builtin;
forall X -> (X, ()) ~strdump(X x) builtin;
() dump_stack() asm "DUMPSTK"; () dump_stack() asm "DUMPSTK";
cell get_data() pure asm "c4 PUSH"; cell get_data() pure asm "c4 PUSH";
@ -66,17 +77,23 @@ int min(int x, int y) pure asm "MIN";
int max(int x, int y) pure asm "MAX"; int max(int x, int y) pure asm "MAX";
(int, int) minmax(int x, int y) pure asm "MINMAX"; (int, int) minmax(int x, int y) pure asm "MINMAX";
int abs(int x) pure asm "ABS"; int abs(int x) pure asm "ABS";
(int, int) divmod(int x, int y) pure builtin;
(int, int) moddiv(int x, int y) pure builtin;
int muldiv(int x, int y, int z) pure builtin;
int muldivr(int x, int y, int z) pure builtin;
int muldivc(int x, int y, int z) pure builtin;
(int, int) muldivmod(int x, int y, int z) pure builtin;
slice begin_parse(cell c) pure asm "CTOS"; slice begin_parse(cell c) pure asm "CTOS";
() end_parse(slice s) asm "ENDS"; () end_parse(slice s) asm "ENDS";
(slice, cell) load_ref(slice s) pure asm( -> 1 0) "LDREF"; (slice, cell) load_ref(slice s) pure asm( -> 1 0) "LDREF";
cell preload_ref(slice s) pure asm "PLDREF"; cell preload_ref(slice s) pure asm "PLDREF";
;; (slice, int) ~load_int(slice s, int len) pure asm(s len -> 1 0) "LDIX"; (slice, int) load_int(slice s, int len) pure builtin;
;; (slice, int) ~load_uint(slice s, int len) pure asm( -> 1 0) "LDUX"; (slice, int) load_uint(slice s, int len) pure builtin;
;; int preload_int(slice s, int len) pure asm "PLDIX"; int preload_int(slice s, int len) pure builtin;
;; int preload_uint(slice s, int len) pure asm "PLDUX"; int preload_uint(slice s, int len) pure builtin;
;; (slice, slice) load_bits(slice s, int len) pure asm(s len -> 1 0) "LDSLICEX"; (slice, slice) load_bits(slice s, int len) pure builtin;
;; slice preload_bits(slice s, int len) pure asm "PLDSLICEX"; slice preload_bits(slice s, int len) pure builtin;
(slice, int) load_grams(slice s) pure asm( -> 1 0) "LDGRAMS"; (slice, int) load_grams(slice s) pure asm( -> 1 0) "LDGRAMS";
slice skip_bits(slice s, int len) pure asm "SDSKIPFIRST"; slice skip_bits(slice s, int len) pure asm "SDSKIPFIRST";
(slice, ()) ~skip_bits(slice s, int len) pure asm "SDSKIPFIRST"; (slice, ()) ~skip_bits(slice s, int len) pure asm "SDSKIPFIRST";
@ -109,8 +126,8 @@ int builder_depth(builder b) pure asm "BDEPTH";
builder begin_cell() pure asm "NEWC"; builder begin_cell() pure asm "NEWC";
cell end_cell(builder b) pure asm "ENDC"; cell end_cell(builder b) pure asm "ENDC";
builder store_ref(builder b, cell c) pure asm(c b) "STREF"; builder store_ref(builder b, cell c) pure asm(c b) "STREF";
;; builder store_uint(builder b, int x, int len) pure asm(x b len) "STUX"; builder store_uint(builder b, int x, int len) pure builtin;
;; builder store_int(builder b, int x, int len) pure asm(x b len) "STIX"; builder store_int(builder b, int x, int len) pure builtin;
builder store_slice(builder b, slice s) pure asm "STSLICER"; builder store_slice(builder b, slice s) pure asm "STSLICER";
builder store_grams(builder b, int x) pure asm "STGRAMS"; builder store_grams(builder b, int x) pure asm "STGRAMS";
builder store_dict(builder b, cell c) pure asm(c b) "STDICT"; builder store_dict(builder b, cell c) pure asm(c b) "STDICT";

View file

@ -21,12 +21,16 @@ forall X -> X first(tuple t) pure asm "FIRST";
forall X -> X second(tuple t) pure asm "SECOND"; forall X -> X second(tuple t) pure asm "SECOND";
forall X -> X third(tuple t) pure asm "THIRD"; forall X -> X third(tuple t) pure asm "THIRD";
forall X -> X fourth(tuple t) pure asm "3 INDEX"; forall X -> X fourth(tuple t) pure asm "3 INDEX";
forall X -> X at(tuple t, int index) pure builtin;
forall X, Y -> X pair_first([X, Y] p) pure asm "FIRST"; forall X, Y -> X pair_first([X, Y] p) pure asm "FIRST";
forall X, Y -> Y pair_second([X, Y] p) pure asm "SECOND"; forall X, Y -> Y pair_second([X, Y] p) pure asm "SECOND";
forall X, Y, Z -> X triple_first([X, Y, Z] p) pure asm "FIRST"; forall X, Y, Z -> X triple_first([X, Y, Z] p) pure asm "FIRST";
forall X, Y, Z -> Y triple_second([X, Y, Z] p) pure asm "SECOND"; forall X, Y, Z -> Y triple_second([X, Y, Z] p) pure asm "SECOND";
forall X, Y, Z -> Z triple_third([X, Y, Z] p) pure asm "THIRD"; forall X, Y, Z -> Z triple_third([X, Y, Z] p) pure asm "THIRD";
forall X -> X null() pure asm "PUSHNULL"; forall X -> X null() pure asm "PUSHNULL";
forall X -> int null?(X x) pure builtin;
forall X -> X touch(X x) pure builtin;
forall X -> (X, ()) ~touch(X x) pure builtin;
forall X -> (X, ()) ~impure_touch(X x) asm "NOP"; forall X -> (X, ()) ~impure_touch(X x) asm "NOP";
int now() pure asm "NOW"; int now() pure asm "NOW";
@ -47,8 +51,15 @@ int check_data_signature(slice data, slice signature, int public_key) pure asm "
(int, int, int, int) compute_data_size?(cell c, int max_cells) pure asm "CDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT"; (int, int, int, int) compute_data_size?(cell c, int max_cells) pure asm "CDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT";
(int, int, int, int) slice_compute_data_size?(cell c, int max_cells) pure asm "SDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT"; (int, int, int, int) slice_compute_data_size?(cell c, int max_cells) pure asm "SDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT";
;; () throw_if(int excno, int cond) asm "THROWARGIF"; () throw(int excno) builtin;
() throw_if(int excno, int cond) builtin;
() throw_unless(int excno, int cond) builtin;
forall X -> () throw_arg(X x, int excno) builtin;
forall X -> () throw_arg_if(X x, int excno, int cond) builtin;
forall X -> () throw_arg_unless(X x, int excno, int cond) builtin;
forall X -> (X, ()) ~dump(X x) builtin;
forall X -> (X, ()) ~strdump(X x) builtin;
() dump_stack() asm "DUMPSTK"; () dump_stack() asm "DUMPSTK";
cell get_data() pure asm "c4 PUSH"; cell get_data() pure asm "c4 PUSH";
@ -66,17 +77,23 @@ int min(int x, int y) pure asm "MIN";
int max(int x, int y) pure asm "MAX"; int max(int x, int y) pure asm "MAX";
(int, int) minmax(int x, int y) pure asm "MINMAX"; (int, int) minmax(int x, int y) pure asm "MINMAX";
int abs(int x) pure asm "ABS"; int abs(int x) pure asm "ABS";
(int, int) divmod(int x, int y) pure builtin;
(int, int) moddiv(int x, int y) pure builtin;
int muldiv(int x, int y, int z) pure builtin;
int muldivr(int x, int y, int z) pure builtin;
int muldivc(int x, int y, int z) pure builtin;
(int, int) muldivmod(int x, int y, int z) pure builtin;
slice begin_parse(cell c) pure asm "CTOS"; slice begin_parse(cell c) pure asm "CTOS";
() end_parse(slice s) asm "ENDS"; () end_parse(slice s) asm "ENDS";
(slice, cell) load_ref(slice s) pure asm( -> 1 0) "LDREF"; (slice, cell) load_ref(slice s) pure asm( -> 1 0) "LDREF";
cell preload_ref(slice s) pure asm "PLDREF"; cell preload_ref(slice s) pure asm "PLDREF";
;; (slice, int) ~load_int(slice s, int len) pure asm(s len -> 1 0) "LDIX"; (slice, int) load_int(slice s, int len) pure builtin;
;; (slice, int) ~load_uint(slice s, int len) pure asm( -> 1 0) "LDUX"; (slice, int) load_uint(slice s, int len) pure builtin;
;; int preload_int(slice s, int len) pure asm "PLDIX"; int preload_int(slice s, int len) pure builtin;
;; int preload_uint(slice s, int len) pure asm "PLDUX"; int preload_uint(slice s, int len) pure builtin;
;; (slice, slice) load_bits(slice s, int len) pure asm(s len -> 1 0) "LDSLICEX"; (slice, slice) load_bits(slice s, int len) pure builtin;
;; slice preload_bits(slice s, int len) pure asm "PLDSLICEX"; slice preload_bits(slice s, int len) pure builtin;
(slice, int) load_grams(slice s) pure asm( -> 1 0) "LDGRAMS"; (slice, int) load_grams(slice s) pure asm( -> 1 0) "LDGRAMS";
slice skip_bits(slice s, int len) pure asm "SDSKIPFIRST"; slice skip_bits(slice s, int len) pure asm "SDSKIPFIRST";
(slice, ()) ~skip_bits(slice s, int len) pure asm "SDSKIPFIRST"; (slice, ()) ~skip_bits(slice s, int len) pure asm "SDSKIPFIRST";
@ -109,8 +126,8 @@ int builder_depth(builder b) pure asm "BDEPTH";
builder begin_cell() pure asm "NEWC"; builder begin_cell() pure asm "NEWC";
cell end_cell(builder b) pure asm "ENDC"; cell end_cell(builder b) pure asm "ENDC";
builder store_ref(builder b, cell c) pure asm(c b) "STREF"; builder store_ref(builder b, cell c) pure asm(c b) "STREF";
;; builder store_uint(builder b, int x, int len) pure asm(x b len) "STUX"; builder store_uint(builder b, int x, int len) pure builtin;
;; builder store_int(builder b, int x, int len) pure asm(x b len) "STIX"; builder store_int(builder b, int x, int len) pure builtin;
builder store_slice(builder b, slice s) pure asm "STSLICER"; builder store_slice(builder b, slice s) pure asm "STSLICER";
builder store_grams(builder b, int x) pure asm "STGRAMS"; builder store_grams(builder b, int x) pure asm "STGRAMS";
builder store_dict(builder b, cell c) pure asm(c b) "STDICT"; builder store_dict(builder b, cell c) pure asm(c b) "STDICT";

View file

@ -21,12 +21,16 @@ forall X -> X first(tuple t) pure asm "FIRST";
forall X -> X second(tuple t) pure asm "SECOND"; forall X -> X second(tuple t) pure asm "SECOND";
forall X -> X third(tuple t) pure asm "THIRD"; forall X -> X third(tuple t) pure asm "THIRD";
forall X -> X fourth(tuple t) pure asm "3 INDEX"; forall X -> X fourth(tuple t) pure asm "3 INDEX";
forall X -> X at(tuple t, int index) pure builtin;
forall X, Y -> X pair_first([X, Y] p) pure asm "FIRST"; forall X, Y -> X pair_first([X, Y] p) pure asm "FIRST";
forall X, Y -> Y pair_second([X, Y] p) pure asm "SECOND"; forall X, Y -> Y pair_second([X, Y] p) pure asm "SECOND";
forall X, Y, Z -> X triple_first([X, Y, Z] p) pure asm "FIRST"; forall X, Y, Z -> X triple_first([X, Y, Z] p) pure asm "FIRST";
forall X, Y, Z -> Y triple_second([X, Y, Z] p) pure asm "SECOND"; forall X, Y, Z -> Y triple_second([X, Y, Z] p) pure asm "SECOND";
forall X, Y, Z -> Z triple_third([X, Y, Z] p) pure asm "THIRD"; forall X, Y, Z -> Z triple_third([X, Y, Z] p) pure asm "THIRD";
forall X -> X null() pure asm "PUSHNULL"; forall X -> X null() pure asm "PUSHNULL";
forall X -> int null?(X x) pure builtin;
forall X -> X touch(X x) pure builtin;
forall X -> (X, ()) ~touch(X x) pure builtin;
forall X -> (X, ()) ~impure_touch(X x) asm "NOP"; forall X -> (X, ()) ~impure_touch(X x) asm "NOP";
int now() pure asm "NOW"; int now() pure asm "NOW";
@ -47,8 +51,15 @@ int check_data_signature(slice data, slice signature, int public_key) pure asm "
(int, int, int, int) compute_data_size?(cell c, int max_cells) pure asm "CDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT"; (int, int, int, int) compute_data_size?(cell c, int max_cells) pure asm "CDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT";
(int, int, int, int) slice_compute_data_size?(cell c, int max_cells) pure asm "SDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT"; (int, int, int, int) slice_compute_data_size?(cell c, int max_cells) pure asm "SDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT";
;; () throw_if(int excno, int cond) asm "THROWARGIF"; () throw(int excno) builtin;
() throw_if(int excno, int cond) builtin;
() throw_unless(int excno, int cond) builtin;
forall X -> () throw_arg(X x, int excno) builtin;
forall X -> () throw_arg_if(X x, int excno, int cond) builtin;
forall X -> () throw_arg_unless(X x, int excno, int cond) builtin;
forall X -> (X, ()) ~dump(X x) builtin;
forall X -> (X, ()) ~strdump(X x) builtin;
() dump_stack() asm "DUMPSTK"; () dump_stack() asm "DUMPSTK";
cell get_data() pure asm "c4 PUSH"; cell get_data() pure asm "c4 PUSH";
@ -66,17 +77,23 @@ int min(int x, int y) pure asm "MIN";
int max(int x, int y) pure asm "MAX"; int max(int x, int y) pure asm "MAX";
(int, int) minmax(int x, int y) pure asm "MINMAX"; (int, int) minmax(int x, int y) pure asm "MINMAX";
int abs(int x) pure asm "ABS"; int abs(int x) pure asm "ABS";
(int, int) divmod(int x, int y) pure builtin;
(int, int) moddiv(int x, int y) pure builtin;
int muldiv(int x, int y, int z) pure builtin;
int muldivr(int x, int y, int z) pure builtin;
int muldivc(int x, int y, int z) pure builtin;
(int, int) muldivmod(int x, int y, int z) pure builtin;
slice begin_parse(cell c) pure asm "CTOS"; slice begin_parse(cell c) pure asm "CTOS";
() end_parse(slice s) asm "ENDS"; () end_parse(slice s) asm "ENDS";
(slice, cell) load_ref(slice s) pure asm( -> 1 0) "LDREF"; (slice, cell) load_ref(slice s) pure asm( -> 1 0) "LDREF";
cell preload_ref(slice s) pure asm "PLDREF"; cell preload_ref(slice s) pure asm "PLDREF";
;; (slice, int) ~load_int(slice s, int len) pure asm(s len -> 1 0) "LDIX"; (slice, int) load_int(slice s, int len) pure builtin;
;; (slice, int) ~load_uint(slice s, int len) pure asm( -> 1 0) "LDUX"; (slice, int) load_uint(slice s, int len) pure builtin;
;; int preload_int(slice s, int len) pure asm "PLDIX"; int preload_int(slice s, int len) pure builtin;
;; int preload_uint(slice s, int len) pure asm "PLDUX"; int preload_uint(slice s, int len) pure builtin;
;; (slice, slice) load_bits(slice s, int len) pure asm(s len -> 1 0) "LDSLICEX"; (slice, slice) load_bits(slice s, int len) pure builtin;
;; slice preload_bits(slice s, int len) pure asm "PLDSLICEX"; slice preload_bits(slice s, int len) pure builtin;
(slice, int) load_grams(slice s) pure asm( -> 1 0) "LDGRAMS"; (slice, int) load_grams(slice s) pure asm( -> 1 0) "LDGRAMS";
slice skip_bits(slice s, int len) pure asm "SDSKIPFIRST"; slice skip_bits(slice s, int len) pure asm "SDSKIPFIRST";
(slice, ()) ~skip_bits(slice s, int len) pure asm "SDSKIPFIRST"; (slice, ()) ~skip_bits(slice s, int len) pure asm "SDSKIPFIRST";
@ -108,9 +125,9 @@ int builder_depth(builder b) pure asm "BDEPTH";
builder begin_cell() pure asm "NEWC"; builder begin_cell() pure asm "NEWC";
cell end_cell(builder b) pure asm "ENDC"; cell end_cell(builder b) pure asm "ENDC";
builder store_ref(builder b, cell c) pure asm(c b) "STREF"; builder store_ref(builder b, cell c) pure asm(c b) "STREF";
;; builder store_uint(builder b, int x, int len) pure asm(x b len) "STUX"; builder store_uint(builder b, int x, int len) pure builtin;
;; builder store_int(builder b, int x, int len) pure asm(x b len) "STIX"; builder store_int(builder b, int x, int len) pure builtin;
builder store_slice(builder b, slice s) pure asm "STSLICER"; builder store_slice(builder b, slice s) pure asm "STSLICER";
builder store_grams(builder b, int x) pure asm "STGRAMS"; builder store_grams(builder b, int x) pure asm "STGRAMS";
builder store_dict(builder b, cell c) pure asm(c b) "STDICT"; builder store_dict(builder b, cell c) pure asm(c b) "STDICT";

View file

@ -93,6 +93,9 @@ forall X -> X third(tuple t) pure asm "THIRD";
/// Returns the fourth element of a tuple (with unknown element types). /// Returns the fourth element of a tuple (with unknown element types).
forall X -> X fourth(tuple t) pure asm "3 INDEX"; forall X -> X fourth(tuple t) pure asm "3 INDEX";
/// Returns the [`index`]-th element of tuple [`t`].
forall X -> X at(tuple t, int index) pure builtin;
/// Returns the first element of a pair tuple. /// Returns the first element of a pair tuple.
forall X, Y -> X pair_first([X, Y] p) pure asm "FIRST"; forall X, Y -> X pair_first([X, Y] p) pure asm "FIRST";
@ -114,7 +117,16 @@ forall X, Y, Z -> Z triple_third([X, Y, Z] p) pure asm "THIRD";
/// So `null` can actually have any atomic type. /// So `null` can actually have any atomic type.
forall X -> X null() pure asm "PUSHNULL"; forall X -> X null() pure asm "PUSHNULL";
/// Moves a variable [x] to the top of the stack /// Checks whether the argument is null.
forall X -> int null?(X x) pure builtin;
/// Moves a variable [x] to the top of the stack.
forall X -> X touch(X x) pure builtin;
/// Moves a variable [x] to the top of the stack.
forall X -> (X, ()) ~touch(X x) pure builtin;
/// Mark a variable as used, such that the code which produced it won't be deleted even if it is not impure.
forall X -> (X, ()) ~impure_touch(X x) asm "NOP"; forall X -> (X, ()) ~impure_touch(X x) asm "NOP";
@ -199,13 +211,38 @@ int check_data_signature(slice data, slice signature, int public_key) pure asm "
/// however, the data bits and the cell references of [s] are accounted for in `y` and `z`. /// however, the data bits and the cell references of [s] are accounted for in `y` and `z`.
(int, int, int, int) slice_compute_data_size?(slice s, int max_cells) pure asm "SDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT"; (int, int, int, int) slice_compute_data_size?(slice s, int max_cells) pure asm "SDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT";
/// Throws an exception with exit_code excno if cond is not 0 (commented since implemented in compilator) /// Throws exception [`excno`] with parameter zero.
// () throw_if(int excno, int cond) asm "THROWARGIF"; /// In other words, it transfers control to the continuation in `c2`,
/// pushing `0` and [`excno`] into it's stack, and discarding the old stack altogether.
() throw(int excno) builtin;
/// Throws exception [`excno`] with parameter zero only if [`cond`] != `0`.
() throw_if(int excno, int cond) builtin;
/// Throws exception [`excno`] with parameter zero only if [`cond`] == `0`.
() throw_unless(int excno, int cond) builtin;
/// Throws exception [`excno`] with parameter [`x`],
/// by copying [`x`] and [`excno`] into the stack of `c2` and transferring control to `c2`.
forall X -> () throw_arg(X x, int excno) builtin;
/// Throws exception [`excno`] with parameter [`x`] only if [`cond`] != `0`.
forall X -> () throw_arg_if(X x, int excno, int cond) builtin;
/// Throws exception [`excno`] with parameter [`x`] only if [`cond`] == `0`.
forall X -> () throw_arg_unless(X x, int excno, int cond) builtin;
/*** /***
# Debug primitives # Debug primitives
Only works for local TVM execution with debug level verbosity Only works for local TVM execution with debug level verbosity
*/ */
/// Dump a variable [x] to the debug log.
forall X -> (X, ()) ~dump(X x) builtin;
/// Dump a string [x] to the debug log.
forall X -> (X, ()) ~strdump(X x) builtin;
/// Dumps the stack (at most the top 255 values) and shows the total stack depth. /// Dumps the stack (at most the top 255 values) and shows the total stack depth.
() dump_stack() asm "DUMPSTK"; () dump_stack() asm "DUMPSTK";
@ -277,6 +314,25 @@ int max(int x, int y) pure asm "MAX";
/// Computes the absolute value of an integer [x]. /// Computes the absolute value of an integer [x].
int abs(int x) pure asm "ABS"; int abs(int x) pure asm "ABS";
/// Computes the quotient and remainder of [x] / [y]. Example: divmod(112,3) = (37,1)
(int, int) divmod(int x, int y) pure builtin;
/// Computes the remainder and quotient of [x] / [y]. Example: moddiv(112,3) = (1,37)
(int, int) moddiv(int x, int y) pure builtin;
/// Computes multiple-then-divide: floor([x] * [y] / [z]).
/// The intermediate result is stored in a 513-bit integer to prevent precision loss.
int muldiv(int x, int y, int z) pure builtin;
/// Similar to `muldiv`, but rounds the result: round([x] * [y] / [z]).
int muldivr(int x, int y, int z) pure builtin;
/// Similar to `muldiv`, but ceils the result: ceil([x] * [y] / [z]).
int muldivc(int x, int y, int z) pure builtin;
/// Computes the quotient and remainder of ([x] * [y] / [z]). Example: muldivmod(112,3,10) = (33,6)
(int, int) muldivmod(int x, int y, int z) pure builtin;
/* /*
# Slice primitives # Slice primitives
@ -305,25 +361,23 @@ slice begin_parse(cell c) pure asm "CTOS";
/// Preloads the first reference from the slice. /// Preloads the first reference from the slice.
cell preload_ref(slice s) pure asm "PLDREF"; cell preload_ref(slice s) pure asm "PLDREF";
/* Functions below are commented because are implemented on compilator level for optimisation */
/// Loads a signed [len]-bit integer from a slice [s]. /// Loads a signed [len]-bit integer from a slice [s].
// (slice, int) ~load_int(slice s, int len) pure asm(s len -> 1 0) "LDIX"; (slice, int) load_int(slice s, int len) pure builtin;
/// Loads an unsigned [len]-bit integer from a slice [s]. /// Loads an unsigned [len]-bit integer from a slice [s].
// (slice, int) ~load_uint(slice s, int len) pure asm( -> 1 0) "LDUX"; (slice, int) load_uint(slice s, int len) pure builtin;
/// Preloads a signed [len]-bit integer from a slice [s]. /// Preloads a signed [len]-bit integer from a slice [s].
// int preload_int(slice s, int len) pure asm "PLDIX"; int preload_int(slice s, int len) pure builtin;
/// Preloads an unsigned [len]-bit integer from a slice [s]. /// Preloads an unsigned [len]-bit integer from a slice [s].
// int preload_uint(slice s, int len) pure asm "PLDUX"; int preload_uint(slice s, int len) pure builtin;
/// Loads the first `0 ≤ len ≤ 1023` bits from slice [s] into a separate `slice s''`. /// Loads the first `0 ≤ len ≤ 1023` bits from slice [s] into a separate slice `s''`.
// (slice, slice) load_bits(slice s, int len) pure asm(s len -> 1 0) "LDSLICEX"; (slice, slice) load_bits(slice s, int len) pure builtin;
/// Preloads the first `0 ≤ len ≤ 1023` bits from slice [s] into a separate `slice s''`. /// Preloads the first `0 ≤ len ≤ 1023` bits from slice [s] into a separate slice `s''`.
// slice preload_bits(slice s, int len) pure asm "PLDSLICEX"; slice preload_bits(slice s, int len) pure builtin;
/// Loads serialized amount of TonCoins (any unsigned integer up to `2^120 - 1`). /// Loads serialized amount of TonCoins (any unsigned integer up to `2^120 - 1`).
(slice, int) load_grams(slice s) pure asm( -> 1 0) "LDGRAMS"; (slice, int) load_grams(slice s) pure asm( -> 1 0) "LDGRAMS";
@ -432,13 +486,12 @@ cell end_cell(builder b) pure asm "ENDC";
builder store_ref(builder b, cell c) pure asm(c b) "STREF"; builder store_ref(builder b, cell c) pure asm(c b) "STREF";
/// Stores an unsigned [len]-bit integer `x` into `b` for `0 ≤ len ≤ 256`. /// Stores an unsigned [len]-bit integer `x` into `b` for `0 ≤ len ≤ 256`.
// builder store_uint(builder b, int x, int len) pure asm(x b len) "STUX"; builder store_uint(builder b, int x, int len) pure builtin;
/// Stores a signed [len]-bit integer `x` into `b` for` 0 ≤ len ≤ 257`. /// Stores a signed [len]-bit integer `x` into `b` for `0 ≤ len ≤ 257`.
// builder store_int(builder b, int x, int len) pure asm(x b len) "STIX"; builder store_int(builder b, int x, int len) pure builtin;
/// Stores `slice` [s] into `builder` [b].
/// Stores `slice` [s] into `builder` [b]
builder store_slice(builder b, slice s) pure asm "STSLICER"; builder store_slice(builder b, slice s) pure asm "STSLICER";
/// Stores (serializes) an integer [x] in the range `0..2^120 1` into `builder` [b]. /// Stores (serializes) an integer [x] in the range `0..2^120 1` into `builder` [b].