From b4b12548d3b25bfd783187e2e20e9411a6513546 Mon Sep 17 00:00:00 2001 From: Dmitry Borisenkov Date: Thu, 20 Feb 2020 11:14:45 +0300 Subject: [PATCH] Introduce tvm_setreg, tvm_setglobal overloadable functions --- stdlib/ton-sdk/tvm.c | 3 ++- stdlib/ton-sdk/tvm.h | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/stdlib/ton-sdk/tvm.c b/stdlib/ton-sdk/tvm.c index 8dd7e1165b3a..f1691174ef41 100644 --- a/stdlib/ton-sdk/tvm.c +++ b/stdlib/ton-sdk/tvm.c @@ -65,10 +65,11 @@ Cell Deserialize_Cell() { int s = __builtin_tvm_getglobal(3); struct __attribute__((tvm_tuple)) { __tvm_cell c; __tvm_slice s; } st = __builtin_tvm_ldref(__builtin_tvm_cast_to_slice(s)); - __builtin_tvm_setglobal(3, __builtin_tvm_cast_from_slice(st.s)); + tvm_setglobal(3, st.s); return st.c; } void tvm_accept(void) { __builtin_tvm_accept(); } + diff --git a/stdlib/ton-sdk/tvm.h b/stdlib/ton-sdk/tvm.h index 7a76c0a61f1b..6db60a53ba85 100644 --- a/stdlib/ton-sdk/tvm.h +++ b/stdlib/ton-sdk/tvm.h @@ -38,4 +38,44 @@ Cell Deserialize_Cell (); __tvm_slice __tvm_ldu(__tvm_slice slice, int width, int *value); __tvm_slice __tvm_ldi(__tvm_slice slice, int width, int *value); +__attribute__((overloadable, always_inline)) +static void tvm_setreg(int n, int value) { + __builtin_tvm_setreg(n, value); +} + +__attribute__((overloadable, always_inline)) +static void tvm_setreg(int n, __tvm_builder value) { + __builtin_tvm_setreg(n, __builtin_tvm_cast_from_builder(value)); +} + +__attribute__((overloadable, always_inline)) +static void tvm_setreg(int n, __tvm_cell value) { + __builtin_tvm_setreg(n, __builtin_tvm_cast_from_cell(value)); +} + +__attribute__((overloadable, always_inline)) +static void tvm_setreg(int n, __tvm_slice value) { + __builtin_tvm_setreg(n, __builtin_tvm_cast_from_slice(value)); +} + +__attribute__((overloadable, always_inline)) +static void tvm_setglobal(int n, int value) { + __builtin_tvm_setglobal(n, value); +} + +__attribute__((overloadable, always_inline)) +static void tvm_setglobal(int n, __tvm_builder value) { + __builtin_tvm_setglobal(n, __builtin_tvm_cast_from_builder(value)); +} + +__attribute__((overloadable, always_inline)) +static void tvm_setglobal(int n, __tvm_cell value) { + __builtin_tvm_setglobal(n, __builtin_tvm_cast_from_cell(value)); +} + +__attribute__((overloadable, always_inline)) +static void tvm_setglobal(int n, __tvm_slice value) { + __builtin_tvm_setglobal(n, __builtin_tvm_cast_from_slice(value)); +} + #endif