Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tolk v0.8: preparation for structures; indexed access var.0 #1503

Merged
merged 5 commits into from
Feb 3, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 14 additions & 5 deletions crypto/smartcont/tolk-stdlib/common.tolk
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Standard library for Tolk (LGPL licence).
// It contains common functions that are available out of the box, the user doesn't have to import anything.
// More specific functions are required to be imported explicitly, like "@stdlib/tvm-dicts".
tolk 0.7
tolk 0.8

/**
Tuple manipulation primitives.
@@ -21,23 +21,32 @@ fun tuplePush<T>(mutate self: tuple, value: T): void
asm "TPUSH";

/// Returns the first element of a non-empty tuple.
/// `t.0` is actually the same as `t.tupleFirst()`
@pure
fun tupleFirst<T>(t: tuple): T
fun tupleFirst<T>(self: tuple): T
asm "FIRST";

/// Returns the [`index`]-th element of a tuple.
/// `t.i` is actually the same as `t.tupleAt(i)`
@pure
fun tupleAt<T>(t: tuple, index: int): T
fun tupleAt<T>(self: tuple, index: int): T
builtin;

/// Sets the [`index`]-th element of a tuple to a specified value
/// (element with this index must already exist, a new element isn't created).
/// `t.i = value` is actually the same as `t.tupleSetAt(value, i)`
@pure
fun tupleSetAt<T>(mutate self: tuple, value: T, index: int): void
builtin;

/// Returns the size of a tuple (elements count in it).
@pure
fun tupleSize(t: tuple): int
fun tupleSize(self: tuple): int
asm "TLEN";

/// Returns the last element of a non-empty tuple.
@pure
fun tupleLast<T>(t: tuple): T
fun tupleLast<T>(self: tuple): T
asm "LAST";


2 changes: 1 addition & 1 deletion crypto/smartcont/tolk-stdlib/gas-payments.tolk
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// A part of standard library for Tolk
tolk 0.7
tolk 0.8

/**
Gas and payment related primitives.
2 changes: 1 addition & 1 deletion crypto/smartcont/tolk-stdlib/lisp-lists.tolk
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// A part of standard library for Tolk
tolk 0.7
tolk 0.8

/**
Lisp-style lists are nested 2-elements tuples: `(1, (2, (3, null)))` represents list `[1, 2, 3]`.
2 changes: 1 addition & 1 deletion crypto/smartcont/tolk-stdlib/tvm-dicts.tolk
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// A part of standard library for Tolk
tolk 0.7
tolk 0.8

/**
Dictionaries are represented as `cell` data type (cells can store anything, dicts in particular).
2 changes: 1 addition & 1 deletion crypto/smartcont/tolk-stdlib/tvm-lowlevel.tolk
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// A part of standard library for Tolk
tolk 0.7
tolk 0.8

/// Usually `c3` has a continuation initialized by the whole code of the contract. It is used for function calls.
/// The primitive returns the current value of `c3`.
32 changes: 30 additions & 2 deletions tolk-tester/tests/a10.tolk
Original file line number Diff line number Diff line change
@@ -78,6 +78,17 @@ fun testStartBalanceCodegen2() {
return first;
}

global cur: [int, int, int];
global next: [int, int, int];

@method_id(95)
fun test95() {
cur = [1, 2, 3];
next = [2, 3, 4];
(cur, next) = (next, [3, 4, 5]);
return (cur, next);
}

/**
method_id | in | out
@testcase | 0 | 101 15 | 100 1
@@ -90,6 +101,7 @@ fun testStartBalanceCodegen2() {
@testcase | 89 | 4 | 1 4 1 4
@testcase | 91 | | 10
@testcase | 92 | | 10 32
@testcase | 95 | | [ 2 3 4 ] [ 3 4 5 ]

@fif_codegen
"""
@@ -104,9 +116,9 @@ fun testStartBalanceCodegen2() {
testDumpDontPolluteStack PROC:<{
...
DUMPSTK
x{6d79} PUSHSLICE // f s _9
x{6d79} PUSHSLICE // f s '5
STRDUMP DROP
SBITS // f _11
SBITS // f '6
}>
"""

@@ -127,4 +139,20 @@ fun testStartBalanceCodegen2() {
FIRST // first
}>
"""

@fif_codegen
"""
test95 PROC:<{
...
next GETGLOB // '10
3 PUSHINT // '10 '12=3
4 PUSHINT // '10 '12=3 '13=4
5 PUSHINT // '10 '12=3 '13=4 '14=5
TRIPLE // '15 '16
next SETGLOB
cur SETGLOB
cur GETGLOB // '17
next GETGLOB // '17 '18
}>
"""
*/
3 changes: 3 additions & 0 deletions tolk-tester/tests/a6.tolk
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
fun f(a: int, b: int, c: int, d: int, e: int, f: int): (int, int) {
// solve a 2x2 linear equation
var D: int = a*d - b*c;;;; var Dx: int = e*d-b*f ;;;; var Dy: int = a * f - e * c;
__expect_type(D, "int");
__expect_type(D*D, "int");
__expect_type(calc_phi, "() -> int");
return (Dx/D,Dy/D);
};;;;

4 changes: 2 additions & 2 deletions tolk-tester/tests/a6_1.tolk
Original file line number Diff line number Diff line change
@@ -7,7 +7,7 @@ fun main(a: int, b: int, c: int, d: int, e: int, f: int): (int, int) {

@method_id(101)
fun testDivMod(x: int, y: int) {
return [divMod(x, y), modDiv(x, y), mulDivMod(x, y, 10)];
return (divMod(x, y), modDiv(x, y), mulDivMod(x, y, 10));
}

/**
@@ -18,5 +18,5 @@ fun testDivMod(x: int, y: int) {
@testcase | 0 | 448 -433 -444 792 150012 -356232 | -218 -572
@testcase | 0 | -40 -821 433 -734 -721629 -741724 | -206 889
@testcase | 0 | -261 -98 -494 868 -166153 733738 | 263 995
@testcase | 101 | 112 3 | [ 37 1 1 37 33 6 ]
@testcase | 101 | 112 3 | 37 1 1 37 33 6
*/
13 changes: 11 additions & 2 deletions tolk-tester/tests/allow_post_modification.tolk
Original file line number Diff line number Diff line change
@@ -89,12 +89,14 @@ fun test_if_else(x: int): (int, int, int, int, int) {

@method_id(21)
fun test_assign_with_inner(x: int) {
return (x, x += 10, [(x, x += 20, eq(x -= 50), x)], eq2((x, x *= eq(x /= 2))));
var result = (x, x += 10, [x, x += 20, eq(x -= 50), x], eq2((x, x *= eq(x /= 2))));
return result;
}

@method_id(22)
fun test_assign_with_mutate(x: int) {
return (x, mul2(mutate x, x += 5), x.`~inc`(mul2(mutate x, x)), x);
var (result, _) = ((x, mul2(mutate x, x += 5), x.`~inc`(mul2(mutate x, x)), x), 0);
return result;
}

@method_id(23)
@@ -138,5 +140,12 @@ fun main() {
inc CALLDICT // self newY
}>
"""

@fif_codegen
"""
test_assign_tensor_global PROC:<{
// x.0 x.1
"""

@code_hash 7627024945492125068389905298530400936797031708759561372406088054030801992712
*/
12 changes: 12 additions & 0 deletions tolk-tester/tests/assignment-tests.tolk
Original file line number Diff line number Diff line change
@@ -14,6 +14,18 @@ fun autoInferIntNull(x: int) {
return x;
}

fun typesAsIdentifiers(builder: builder) {
var int = 1;
var cell = builder.endCell();
var slice = cell.beginParse();
{
var cell: cell = cell;
var tuple: tuple = createEmptyTuple();
var bool: bool = tuple.tupleAt<int>(0) > 0;
}
return int;
}

fun main(value: int) {
var (x: int, y) = (autoInferIntNull(value), autoInferIntNull(value * 2));
if (x == null && y == null) { return null; }
54 changes: 27 additions & 27 deletions tolk-tester/tests/bit-operators.tolk
Original file line number Diff line number Diff line change
@@ -127,10 +127,10 @@ fun testBoolCompareOptimized(x: bool) {
"""
boolWithBitwiseConst PROC:<{
//
0 PUSHINT // _3
-1 PUSHINT // _3 _5
0 PUSHINT // _3 _5 _7
-1 PUSHINT // _3 _5 _7 _8
0 PUSHINT // '3
-1 PUSHINT // '3 '5
0 PUSHINT // '3 '5 '7
-1 PUSHINT // '3 '5 '7 '8
}>
"""

@@ -142,35 +142,35 @@ fun testBoolCompareOptimized(x: bool) {
UNTIL:<{
INC // i n cnt
s2 PUSH // i n cnt i
NOT // i n cnt _6
NOT // i n cnt '6
}> // i n cnt
UNTIL:<{
INC // i n cnt
s2 PUSH // i n cnt i
NOT // i n cnt _9
NOT // i n cnt '9
}> // i n cnt
UNTIL:<{
INC // i n cnt
OVER // i n cnt n
0 EQINT // i n cnt _12
0 EQINT // i n cnt '12
}> // i n cnt
s0 s2 XCHG // cnt n i
NOT // cnt n _13
SWAP // cnt _13 n
0 EQINT // cnt _13 _14
NOT // cnt n '13
SWAP // cnt '13 n
0 EQINT // cnt '13 '14
}>
"""

@fif_codegen
"""
testConstNegateCodegen PROC:<{
//
TRUE // _0
FALSE // _0 _1
FALSE // _0 _1 _2
TRUE // _0 _1 _2 _3
TRUE // _0 _1 _2 _3 _4
FALSE // _0 _1 _2 _3 _4 _5
TRUE // '0
FALSE // '0 '1
FALSE // '0 '1 '2
TRUE // '0 '1 '2 '3
TRUE // '0 '1 '2 '3 '4
FALSE // '0 '1 '2 '3 '4 '5
}>
"""

@@ -179,11 +179,11 @@ fun testBoolCompareOptimized(x: bool) {
testBoolNegateOptimized PROC:<{
// x
DUP // x x
NOT // x _1
OVER // x _1 x
NOT // x _1 _2
NOT // x '1
OVER // x '1 x
NOT // x '1 '2
s2 s(-1) PUXC
TRUE // x _1 x _2 _3
TRUE // x '1 x '2 '3
}>
"""

@@ -192,13 +192,13 @@ fun testBoolCompareOptimized(x: bool) {
testBoolCompareOptimized PROC:<{
// x
DUP // x x
NOT // x _1
OVER // x _1 x
eqX CALLDICT // x _1 _2
NOT // x _1 _3
s2 PUSH // x _1 _3 x
eqX CALLDICT // x _1 _3 _4
s3 PUSH // x _1 _3 _4 x
NOT // x '1
OVER // x '1 x
eqX CALLDICT // x '1 '2
NOT // x '1 '3
s2 PUSH // x '1 '3 x
eqX CALLDICT // x '1 '3 '4
s3 PUSH // x '1 '3 '4 x
}>
"""
*/
20 changes: 10 additions & 10 deletions tolk-tester/tests/cells-slices.tolk
Original file line number Diff line number Diff line change
@@ -216,16 +216,16 @@ Note, that since 'compute-asm-ltr' became on be default, chaining methods codege
"""
test6 PROC:<{
//
NEWC // _0
1 PUSHINT // _0 _1=1
SWAP // _1=1 _0
32 STU // _0
2 PUSHINT // _0 _5=2
SWAP // _5=2 _0
32 STU // _0
3 PUSHINT // _0 _9=3
SWAP // _9=3 _0
32 STU // _0
NEWC // '0
1 PUSHINT // '0 '1=1
SWAP // '1=1 '0
32 STU // '0
2 PUSHINT // '0 '4=2
SWAP // '4=2 '0
32 STU // '0
3 PUSHINT // '0 '7=3
SWAP // '7=3 '0
32 STU // '0
}>
"""
*/
6 changes: 3 additions & 3 deletions tolk-tester/tests/codegen_check_demo.tolk
Original file line number Diff line number Diff line change
@@ -35,7 +35,7 @@ Below, I just give examples of @fif_codegen tag:
"""
main PROC:<{
// s
17 PUSHINT // s _1=17
17 PUSHINT // s '1=17
OVER // s z=17 t
WHILE:<{
...
@@ -63,7 +63,7 @@ main PROC:<{
@fif_codegen
"""
OVER
0 GTINT // s z t _5
0 GTINT // s z t '5
"""

@fif_codegen
@@ -83,7 +83,7 @@ FALSE
}>
"""

@fif_codegen NOT // _8
@fif_codegen NOT // '8
@fif_codegen main PROC:<{

@fif_codegen_avoid PROCINLINE
Loading