mirror of
https://github.com/ton-blockchain/ton
synced 2025-03-09 15:40:10 +00:00
This commit introduces nullable types `T?` that are distinct from non-nullable `T`. Example: `int?` (int or null) and `int` are different now. Previously, `null` could be assigned to any primitive type. Now, it can be assigned only to `T?`. A non-null assertion operator `!` was also introduced, similar to `!` in TypeScript and `!!` in Kotlin. If `int?` still occupies 1 stack slot, `(int,int)?` and other nullable tensors occupy N+1 slots, the last for "null precedence". `v == null` actually compares that slot. Assigning `(int,int)` to `(int,int)?` implicitly creates a null presence slot. Assigning `null` to `(int,int)?` widens this null value to 3 slots. This is called "type transitioning". All stdlib functions prototypes have been updated to reflect whether they return/accept a nullable or a strict value. This commit also contains refactoring from `const FunctionData*` to `FunctionPtr` and similar.
49 lines
851 B
Text
49 lines
851 B
Text
fun main(): int {
|
|
var c: cell = my_begin_cell().storeInt(demo_10, 32).my_end_cell();
|
|
var cs: slice = my_begin_parse(c);
|
|
var ten: int = cs.loadInt(32);
|
|
return 1 + demo1(ten) + demo_var;
|
|
}
|
|
|
|
@pure
|
|
fun my_begin_cell(): builder
|
|
asm "NEWC";
|
|
@pure
|
|
fun my_end_cell(b: builder): cell
|
|
asm "ENDC";
|
|
@pure
|
|
fun my_begin_parse(c: cell): slice
|
|
asm "CTOS";
|
|
|
|
fun demo1(v: int): int {
|
|
demo_var = 23;
|
|
return v;
|
|
}
|
|
|
|
global demo_var: int;
|
|
const demo_10: int = 10;
|
|
|
|
fun test1(): int {
|
|
var demo_var: int = demo_10;
|
|
var demo_slice: int = demo_20;
|
|
if (demo_var > 0) {
|
|
var demo_var: tuple? = null;
|
|
var demo_slice: tuple? = null;
|
|
}
|
|
return demo_var + demo_slice;
|
|
}
|
|
|
|
global demo_slice: slice;
|
|
const demo_20: int = 20;
|
|
|
|
/**
|
|
@testcase | 0 | | 34
|
|
|
|
@fif_codegen
|
|
"""
|
|
test1 PROC:<{
|
|
//
|
|
30 PUSHINT // '10
|
|
}>
|
|
"""
|
|
*/
|