mirror of
https://github.com/ton-blockchain/ton
synced 2025-02-12 11:12:16 +00:00
fix(vm): fix saving ret
on deep jump (#1487)
This commit is contained in:
parent
fe46f0e238
commit
0f6cf13d45
2 changed files with 16 additions and 2 deletions
|
@ -247,6 +247,11 @@ int VmState::jump(Ref<Continuation> cont) {
|
|||
|
||||
// general jump to continuation cont
|
||||
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();
|
||||
if (cont_data) {
|
||||
// first do the checks
|
||||
|
@ -287,7 +292,7 @@ int VmState::jump(Ref<Continuation> cont, int pass_args) {
|
|||
consume_stack_gas(copy);
|
||||
}
|
||||
}
|
||||
return jump_to(std::move(cont));
|
||||
return cont;
|
||||
} else {
|
||||
// have no continuation data, situation is somewhat simpler
|
||||
if (pass_args >= 0) {
|
||||
|
@ -299,7 +304,7 @@ int VmState::jump(Ref<Continuation> cont, int pass_args) {
|
|||
consume_stack_gas(pass_args);
|
||||
}
|
||||
}
|
||||
return jump_to(std::move(cont));
|
||||
return cont;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -347,6 +347,7 @@ class VmState final : public VmStateInterface {
|
|||
int call(Ref<Continuation> cont, int pass_args, int ret_args = -1);
|
||||
int jump(Ref<Continuation> cont);
|
||||
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_args);
|
||||
int ret_alt();
|
||||
|
@ -374,6 +375,14 @@ class VmState final : public VmStateInterface {
|
|||
if (cnt > free_nested_cont_jump && global_version >= 9) {
|
||||
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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue