Skip to content

Commit 3f48e4d

Browse files
Merge pull request #7384 from federico-stacks/chore/drop-runtime-exec-time-error
chore: drop variant `CostErrors::ExecutionTimeExpired`
2 parents c7b3520 + 99f464a commit 3f48e4d

8 files changed

Lines changed: 8 additions & 31 deletions

File tree

clarity/src/vm/analysis/errors.rs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -235,11 +235,7 @@ pub enum StaticCheckErrorKind {
235235
/// Failure in cost-tracking due to an unexpected condition or invalid state.
236236
/// The `String` wraps the specific reason for the failure.
237237
CostComputationFailed(String),
238-
// Time checker errors
239-
/// Type-checking time exceeds the allowed budget, halting analysis to ensure responsiveness.
240-
ExecutionTimeExpired,
241238
/// Contract-analysis time exceeds the allowed budget, halting analysis to ensure responsiveness.
242-
/// Distinct from `ExecutionTimeExpired` so an analysis-phase timeout is separable end-to-end.
243239
AnalysisTimeExpired,
244240
/// The read-only checker recursed too deeply while checking native function calls.
245241
ReadOnlyCheckerRecursionLimitExceeded,
@@ -558,7 +554,7 @@ pub enum RuntimeCheckErrorKind {
558554
/// The `String` wraps the specific reason for the failure.
559555
CostComputationFailed(String),
560556
// Time checker errors
561-
/// Type-checking time exceeds the allowed budget, halting analysis to ensure responsiveness.
557+
/// Runtime (eval) execution time exceeds the allowed budget, halting execution to ensure responsiveness.
562558
ExecutionTimeExpired,
563559

564560
/// Value exceeds the maximum allowed size for type-checking or serialization.
@@ -930,7 +926,6 @@ impl From<CostErrors> for StaticCheckErrorKind {
930926
"Unexpected interpreter failure in cost computation".into(),
931927
),
932928
CostErrors::Expect(s) => StaticCheckErrorKind::Unreachable(s),
933-
CostErrors::ExecutionTimeExpired => StaticCheckErrorKind::ExecutionTimeExpired,
934929
}
935930
}
936931
}
@@ -953,7 +948,6 @@ impl From<CostErrors> for RuntimeCheckErrorKind {
953948
"Unexpected interpreter failure in cost computation".into(),
954949
),
955950
CostErrors::Expect(s) => RuntimeCheckErrorKind::Unreachable(s),
956-
CostErrors::ExecutionTimeExpired => RuntimeCheckErrorKind::ExecutionTimeExpired,
957951
}
958952
}
959953
}
@@ -1182,7 +1176,6 @@ impl DiagnosableError for StaticCheckErrorKind {
11821176
StaticCheckErrorKind::CostBalanceExceeded(a, b) => format!("contract execution cost exceeded budget: {a:?} > {b:?}"),
11831177
StaticCheckErrorKind::MemoryBalanceExceeded(a, b) => format!("contract execution cost exceeded memory budget: {a:?} > {b:?}"),
11841178
StaticCheckErrorKind::CostComputationFailed(s) => format!("contract cost computation failed: {s}"),
1185-
StaticCheckErrorKind::ExecutionTimeExpired => "execution time expired".into(),
11861179
StaticCheckErrorKind::AnalysisTimeExpired => "analysis time expired".into(),
11871180
StaticCheckErrorKind::ReadOnlyCheckerRecursionLimitExceeded => "read-only checker exceeded maximum allowed recursion depth".into(),
11881181
StaticCheckErrorKind::InvalidTypeDescription => "supplied type description is invalid".into(),

clarity/src/vm/ast/errors.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,6 @@ pub enum ParseErrorKind {
4141
/// Failure in cost-tracking due to an unexpected condition or invalid state.
4242
/// The `String` represents the specific reason for the failure.
4343
CostComputationFailed(String),
44-
/// Parsing time exceeds the allowed budget, halting AST construction to ensure responsiveness.
45-
ExecutionTimeExpired,
4644

4745
// Structural errors
4846
/// Number of expressions exceeds the maximum allowed limit.
@@ -282,9 +280,6 @@ impl From<CostErrors> for ParseError {
282280
CostErrors::InterpreterFailure | CostErrors::Expect(_) => {
283281
ParseError::new(ParseErrorKind::InterpreterFailure)
284282
}
285-
CostErrors::ExecutionTimeExpired => {
286-
ParseError::new(ParseErrorKind::ExecutionTimeExpired)
287-
}
288283
}
289284
}
290285
}
@@ -410,7 +405,6 @@ impl DiagnosableError for ParseErrorKind {
410405
"unexpected failure while parsing".to_string()
411406
}
412407
ParseErrorKind::InterpreterFailure => "unexpected failure while parsing".to_string(),
413-
ParseErrorKind::ExecutionTimeExpired => "max execution time expired".to_string(),
414408
}
415409
}
416410

clarity/src/vm/clarity.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,6 @@ impl From<StaticCheckError> for ClarityError {
114114
StaticCheckErrorKind::MemoryBalanceExceeded(_a, _b) => {
115115
ClarityError::CostError(ExecutionCost::max_value(), ExecutionCost::max_value())
116116
}
117-
StaticCheckErrorKind::ExecutionTimeExpired => ClarityError::ExecutionTimeExpired,
118117
StaticCheckErrorKind::AnalysisTimeExpired => ClarityError::AnalysisTimeExpired,
119118
_ => ClarityError::StaticCheck(e),
120119
}
@@ -179,7 +178,6 @@ impl From<ParseError> for ClarityError {
179178
ParseErrorKind::MemoryBalanceExceeded(_a, _b) => {
180179
ClarityError::CostError(ExecutionCost::max_value(), ExecutionCost::max_value())
181180
}
182-
ParseErrorKind::ExecutionTimeExpired => ClarityError::ExecutionTimeExpired,
183181
_ => ClarityError::Parse(e),
184182
}
185183
}

clarity/src/vm/costs/errors.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,6 @@ pub enum CostErrors {
4343
/// The `String` wraps the specific reason for the failure.
4444
/// Invalidates Block: false.
4545
CostComputationFailed(String),
46-
// Time checker errors
47-
/// Runtime (eval) execution time exceeds the allowed budget, halting execution to ensure responsiveness.
48-
/// Invalidates Block: false (soft, node-local limit applied only on the mining / block-proposal paths).
49-
ExecutionTimeExpired,
5046
/// Unexpected condition or failure, indicating a bug or invalid state.
5147
/// Invalidates Block: true.
5248
InterpreterFailure,
@@ -69,7 +65,6 @@ impl fmt::Display for CostErrors {
6965
CostErrors::CostContractLoadFailure => write!(f, "Failed to load cost contract"),
7066
CostErrors::InterpreterFailure => write!(f, "Interpreter failure"),
7167
CostErrors::Expect(s) => write!(f, "Expectation failed: {s}"),
72-
CostErrors::ExecutionTimeExpired => write!(f, "Execution time expired"),
7368
}
7469
}
7570
}

clarity/src/vm/mod.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ pub use crate::vm::contexts::{CallStack, ContractContext, LocalContext, MAX_CONT
6464
use crate::vm::contexts::{ExecutionState, GlobalContext, InvocationContext};
6565
use crate::vm::costs::cost_functions::ClarityCostFunction;
6666
use crate::vm::costs::{
67-
CostErrors, CostOverflowingMath, CostTracker, LimitedCostTracker, MemoryConsumer, runtime_cost,
67+
CostOverflowingMath, CostTracker, LimitedCostTracker, MemoryConsumer, runtime_cost,
6868
};
6969
// publish the non-generic StacksEpoch form for use throughout module
7070
pub use crate::vm::database::clarity_db::StacksEpoch;
@@ -492,12 +492,10 @@ fn check_interpreter_abort_condition(
492492
global_context: &GlobalContext,
493493
) -> Result<(), VmExecutionError> {
494494
if global_context.execution_time_tracker.is_expired() {
495-
return Err(CostErrors::ExecutionTimeExpired.into());
495+
return Err(RuntimeCheckErrorKind::ExecutionTimeExpired.into());
496496
}
497497
if let Err(reason) = global_context.abort_callback.check() {
498-
return Err(VmExecutionError::RuntimeCheck(
499-
RuntimeCheckErrorKind::AbortedByExecutionHook(reason),
500-
));
498+
return Err(RuntimeCheckErrorKind::AbortedByExecutionHook(reason).into());
501499
}
502500

503501
Ok(())

clarity/src/vm/tests/simple_apply_eval.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ use crate::vm::types::{
4343
TypeSignature,
4444
};
4545
use crate::vm::{
46-
CallStack, ClarityVersion, ContractContext, CostErrors, GlobalContext, LocalContext, Value,
47-
ValueRef, eval, execute as vm_execute, execute_v2 as vm_execute_v2,
46+
CallStack, ClarityVersion, ContractContext, GlobalContext, LocalContext, Value, ValueRef, eval,
47+
execute as vm_execute, execute_v2 as vm_execute_v2,
4848
execute_with_limited_execution_time as vm_execute_with_limited_execution_time,
4949
execute_with_parameters,
5050
};
@@ -1937,7 +1937,7 @@ fn test_execution_time_expiration() {
19371937
vm_execute_with_limited_execution_time("(+ 1 1)", Duration::from_secs(0))
19381938
.err()
19391939
.unwrap(),
1940-
ClarityEvalError::Vm(CostErrors::ExecutionTimeExpired.into())
1940+
ClarityEvalError::Vm(RuntimeCheckErrorKind::ExecutionTimeExpired.into())
19411941
);
19421942
}
19431943

stackslib/src/chainstate/tests/parse_tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ fn variant_coverage_report(variant: ParseErrorKind) {
6161
CostBalanceExceeded(_, _) => Tested(vec![test_cost_balance_exceeded]),
6262
MemoryBalanceExceeded(_, _) => Unreachable_NotUsed,
6363
CostComputationFailed(_) => Unreachable_ExpectLike,
64-
ExecutionTimeExpired => Unreachable_NotUsed,
6564

65+
// Parse
6666
TooManyExpressions => Unreachable_ExpectLike,
6767
ExpressionStackDepthTooDeep { .. } => Tested(vec![
6868
test_stack_depth_too_deep_case_1_tuple_only_parsing,

stackslib/src/chainstate/tests/static_analysis_tests.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ fn variant_coverage_report(variant: StaticCheckErrorKind) {
6363
CostBalanceExceeded(execution_cost, execution_cost1) => Tested(vec![static_check_error_cost_balance_exceeded]),
6464
MemoryBalanceExceeded(_, _) => Tested(vec![static_check_error_memory_balance_exceeded]),
6565
CostComputationFailed(_) => Unreachable_ExpectLike,
66-
ExecutionTimeExpired => Unreachable_Functionally("Can only be triggered at runtime."),
6766
AnalysisTimeExpired => Unreachable_Functionally(
6867
"All consensus-critical code paths (block validation and transaction processing) pass
6968
`None` for max_analysis_time, so the analysis-phase time tracking stays

0 commit comments

Comments
 (0)