Skip to content

Commit 1fa8518

Browse files
authored
Analyse code after machine creation (#233)
1 parent 55965c9 commit 1fa8518

File tree

3 files changed

+48
-35
lines changed

3 files changed

+48
-35
lines changed

interpreter/src/lib.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ impl<S> Machine<S> {
5858
self.position
5959
}
6060

61+
pub fn code(&self) -> &[u8] {
62+
&self.code
63+
}
64+
6165
/// Create a new machine with given code and data.
6266
pub fn new(
6367
code: Rc<Vec<u8>>,

src/standard/invoker/mod.rs

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -307,11 +307,8 @@ where
307307
let mut gasometer =
308308
G::new_transact_call(gas_limit, &data, &access_list, self.config)?;
309309
let code = self.resolver.resolve(address, &mut gasometer, handler)?;
310-
if let ResolvedCode::Normal(code) = &code {
311-
gasometer.analyse_code(&code);
312-
}
313310

314-
let machine = routines::make_enter_call_machine(
311+
let mut machine = routines::make_enter_call_machine(
315312
self.config,
316313
code,
317314
data,
@@ -326,6 +323,7 @@ where
326323
gasometer,
327324
handler,
328325
)?;
326+
routines::maybe_analyse_code(&mut machine);
329327

330328
if self.config.increase_state_access_gas {
331329
if self.config.warm_coinbase_address {
@@ -345,11 +343,10 @@ where
345343
access_list,
346344
..
347345
} => {
348-
let mut gasometer =
346+
let gasometer =
349347
G::new_transact_create(gas_limit, &init_code, &access_list, self.config)?;
350-
gasometer.analyse_code(&init_code);
351348

352-
let machine = InvokerControl::Enter(routines::make_enter_create_machine(
349+
let mut machine = routines::make_enter_create_machine(
353350
self.config,
354351
caller,
355352
init_code,
@@ -363,7 +360,8 @@ where
363360
}),
364361
gasometer,
365362
handler,
366-
)?);
363+
)?;
364+
routines::maybe_analyse_code(&mut machine);
367365

368366
Ok((invoke, machine))
369367
}
@@ -502,9 +500,6 @@ where
502500
Ok(code) => code,
503501
Err(err) => return Capture::Exit(Err(err)),
504502
};
505-
if let ResolvedCode::Normal(code) = &code {
506-
submeter.analyse_code(&code);
507-
}
508503

509504
let substate = machine.machine.state.substate(
510505
RuntimeState {
@@ -528,11 +523,10 @@ where
528523
}
529524
CallCreateTrapData::Create(create_trap_data) => {
530525
let code = create_trap_data.code.clone();
531-
let mut submeter = match machine.gasometer.submeter(gas_limit, call_has_value) {
526+
let submeter = match machine.gasometer.submeter(gas_limit, call_has_value) {
532527
Ok(submeter) => submeter,
533528
Err(err) => return Capture::Exit(Err(err)),
534529
};
535-
submeter.analyse_code(&code);
536530

537531
let caller = create_trap_data.scheme.caller();
538532
let address = create_trap_data.scheme.address(handler);
@@ -550,18 +544,15 @@ where
550544
&machine,
551545
);
552546

553-
Capture::Exit(
554-
routines::enter_create_substack(
555-
self.config,
556-
code,
557-
create_trap_data,
558-
is_static,
559-
substate,
560-
submeter,
561-
handler,
562-
)
563-
.map(|(invoke, machine)| (invoke, InvokerControl::Enter(machine))),
564-
)
547+
Capture::Exit(routines::enter_create_substack(
548+
self.config,
549+
code,
550+
create_trap_data,
551+
is_static,
552+
substate,
553+
submeter,
554+
handler,
555+
))
565556
}
566557
}
567558
}

src/standard/invoker/routines.rs

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
use super::{CallTrapData, CreateTrapData, Precompile, ResolvedCode, SubstackInvoke};
1+
use super::{
2+
CallTrapData, CreateTrapData, Precompile, ResolvedCode, SubstackInvoke, TransactGasometer,
3+
};
24
use crate::standard::Config;
35
use crate::{
46
ExitError, ExitException, ExitResult, GasedMachine, Gasometer as GasometerT, InvokerControl,
@@ -8,6 +10,14 @@ use crate::{
810
use alloc::rc::Rc;
911
use primitive_types::{H160, U256};
1012

13+
pub fn maybe_analyse_code<'config, S: AsRef<RuntimeState>, G: TransactGasometer<'config, S>>(
14+
result: &mut InvokerControl<GasedMachine<S, G>, (ExitResult, (S, G, Vec<u8>))>,
15+
) {
16+
if let InvokerControl::Enter(machine) = result {
17+
machine.gasometer.analyse_code(&machine.machine.code())
18+
}
19+
}
20+
1121
pub fn make_enter_call_machine<'config, 'precompile, S, G, H, P>(
1222
config: &'config Config,
1323
code: ResolvedCode<P>,
@@ -61,7 +71,7 @@ pub fn make_enter_create_machine<'config, S, G, H>(
6171
state: S,
6272
gasometer: G,
6373
handler: &mut H,
64-
) -> Result<GasedMachine<S, G>, ExitError>
74+
) -> Result<InvokerControl<GasedMachine<S, G>, (ExitResult, (S, G, Vec<u8>))>, ExitError>
6575
where
6676
S: AsRef<RuntimeState>,
6777
G: GasometerT<S, H>,
@@ -98,11 +108,11 @@ where
98108
state,
99109
);
100110

101-
Ok(GasedMachine {
111+
Ok(InvokerControl::Enter(GasedMachine {
102112
machine,
103113
gasometer,
104114
is_static,
105-
})
115+
}))
106116
}
107117

108118
pub fn enter_call_substack<'config, 'precompile, S, G, H, P>(
@@ -122,14 +132,14 @@ pub fn enter_call_substack<'config, 'precompile, S, G, H, P>(
122132
>
123133
where
124134
S: AsRef<RuntimeState>,
125-
G: GasometerT<S, H>,
135+
G: GasometerT<S, H> + TransactGasometer<'config, S>,
126136
H: RuntimeEnvironment + RuntimeBackend + TransactionalBackend,
127137
P: Precompile<S, G, H>,
128138
{
129139
handler.push_substate();
130140

131141
let work = || -> Result<(SubstackInvoke, _), ExitError> {
132-
let machine = make_enter_call_machine(
142+
let mut machine = make_enter_call_machine(
133143
config,
134144
code,
135145
trap_data.input.clone(),
@@ -139,6 +149,7 @@ where
139149
gasometer,
140150
handler,
141151
)?;
152+
maybe_analyse_code(&mut machine);
142153

143154
Ok((SubstackInvoke::Call { trap: trap_data }, machine))
144155
};
@@ -160,15 +171,21 @@ pub fn enter_create_substack<'config, S, G, H>(
160171
state: S,
161172
gasometer: G,
162173
handler: &mut H,
163-
) -> Result<(SubstackInvoke, GasedMachine<S, G>), ExitError>
174+
) -> Result<
175+
(
176+
SubstackInvoke,
177+
InvokerControl<GasedMachine<S, G>, (ExitResult, (S, G, Vec<u8>))>,
178+
),
179+
ExitError,
180+
>
164181
where
165182
S: AsRef<RuntimeState>,
166-
G: GasometerT<S, H>,
183+
G: GasometerT<S, H> + TransactGasometer<'config, S>,
167184
H: RuntimeEnvironment + RuntimeBackend + TransactionalBackend,
168185
{
169186
handler.push_substate();
170187

171-
let work = || -> Result<(SubstackInvoke, GasedMachine<S, G>), ExitError> {
188+
let work = || -> Result<(SubstackInvoke, InvokerControl<GasedMachine<S, G>, (ExitResult, (S, G, Vec<u8>))>), ExitError> {
172189
let CreateTrapData {
173190
scheme,
174191
value,
@@ -184,9 +201,10 @@ where
184201
value,
185202
};
186203

187-
let machine = make_enter_create_machine(
204+
let mut machine = make_enter_create_machine(
188205
config, caller, code, is_static, transfer, state, gasometer, handler,
189206
)?;
207+
maybe_analyse_code(&mut machine);
190208

191209
Ok((
192210
SubstackInvoke::Create {

0 commit comments

Comments
 (0)