1
0
Fork 0
mirror of https://github.com/ton-blockchain/ton synced 2025-03-09 15:40:10 +00:00

fix(vm): fix saving ret on deep jump (#1487)

This commit is contained in:
Ivan Kalinin 2025-01-24 15:41:43 +01:00 committed by GitHub
parent fe46f0e238
commit 0f6cf13d45
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 16 additions and 2 deletions

View file

@ -247,6 +247,11 @@ int VmState::jump(Ref<Continuation> cont) {
// general jump to continuation cont // general jump to continuation cont
int VmState::jump(Ref<Continuation> cont, int pass_args) { int VmState::jump(Ref<Continuation> cont, int pass_args) {
cont = adjust_jump_cont(std::move(cont), pass_args);
return jump_to(std::move(cont));
}
Ref<Continuation> VmState::adjust_jump_cont(Ref<Continuation> cont, int pass_args) {
const ControlData* cont_data = cont->get_cdata(); const ControlData* cont_data = cont->get_cdata();
if (cont_data) { if (cont_data) {
// first do the checks // first do the checks
@ -287,7 +292,7 @@ int VmState::jump(Ref<Continuation> cont, int pass_args) {
consume_stack_gas(copy); consume_stack_gas(copy);
} }
} }
return jump_to(std::move(cont)); return cont;
} else { } else {
// have no continuation data, situation is somewhat simpler // have no continuation data, situation is somewhat simpler
if (pass_args >= 0) { if (pass_args >= 0) {
@ -299,7 +304,7 @@ int VmState::jump(Ref<Continuation> cont, int pass_args) {
consume_stack_gas(pass_args); consume_stack_gas(pass_args);
} }
} }
return jump_to(std::move(cont)); return cont;
} }
} }

View file

@ -347,6 +347,7 @@ class VmState final : public VmStateInterface {
int call(Ref<Continuation> cont, int pass_args, int ret_args = -1); int call(Ref<Continuation> cont, int pass_args, int ret_args = -1);
int jump(Ref<Continuation> cont); int jump(Ref<Continuation> cont);
int jump(Ref<Continuation> cont, int pass_args); int jump(Ref<Continuation> cont, int pass_args);
Ref<Continuation> adjust_jump_cont(Ref<Continuation> cont, int pass_args);
int ret(); int ret();
int ret(int ret_args); int ret(int ret_args);
int ret_alt(); int ret_alt();
@ -374,6 +375,14 @@ class VmState final : public VmStateInterface {
if (cnt > free_nested_cont_jump && global_version >= 9) { if (cnt > free_nested_cont_jump && global_version >= 9) {
consume_gas(1); consume_gas(1);
} }
if (cont.not_null()) {
const ControlData* cont_data = cont->get_cdata();
if (cont_data && (cont_data->stack.not_null() || cont_data->nargs >= 0)) {
// if cont has non-empty stack or expects fixed number of arguments, jump is not simple
cont = adjust_jump_cont(std::move(cont), -1);
}
}
} }
return res; return res;
} }