From ae6309255d10647151561d7438a4aa5bbcf703bb Mon Sep 17 00:00:00 2001 From: Jeong YunWon Date: Fri, 26 Dec 2025 10:14:16 +0900 Subject: [PATCH] Fix f-string conversion flag ValueError when compiling AST (#6533) The ast_from_object for ConversionFlag was using bytecode::ConvertValueOparg::from_op_arg() which only accepts internal oparg values (0, 1, 2, 3, 255), but Python's AST uses ASCII codes ('s'=115, 'r'=114, 'a'=97, -1=None). This caused compile() on parsed AST with conversion flags to fail with "invalid conversion flag". --- crates/vm/src/stdlib/ast.rs | 1 - crates/vm/src/stdlib/ast/other.rs | 22 ++++++++++------------ 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/crates/vm/src/stdlib/ast.rs b/crates/vm/src/stdlib/ast.rs index 8e03cb225e..b8df86fb09 100644 --- a/crates/vm/src/stdlib/ast.rs +++ b/crates/vm/src/stdlib/ast.rs @@ -15,7 +15,6 @@ use crate::{ builtins::PyIntRef, builtins::{PyDict, PyModule, PyStrRef, PyType}, class::{PyClassImpl, StaticType}, - compiler::core::bytecode::OpArgType, compiler::{CompileError, ParseError}, convert::ToPyObject, }; diff --git a/crates/vm/src/stdlib/ast/other.rs b/crates/vm/src/stdlib/ast/other.rs index cf8a831974..ce7d5fe480 100644 --- a/crates/vm/src/stdlib/ast/other.rs +++ b/crates/vm/src/stdlib/ast/other.rs @@ -1,6 +1,5 @@ use super::*; -use num_traits::ToPrimitive; -use rustpython_compiler_core::{SourceFile, bytecode}; +use rustpython_compiler_core::SourceFile; impl Node for ruff::ConversionFlag { fn ast_to_object(self, vm: &VirtualMachine, _source_file: &SourceFile) -> PyObjectRef { @@ -12,16 +11,15 @@ impl Node for ruff::ConversionFlag { _source_file: &SourceFile, object: PyObjectRef, ) -> PyResult { - i32::try_from_object(vm, object)? - .to_u32() - .and_then(bytecode::ConvertValueOparg::from_op_arg) - .map(|flag| match flag { - bytecode::ConvertValueOparg::None => Self::None, - bytecode::ConvertValueOparg::Str => Self::Str, - bytecode::ConvertValueOparg::Repr => Self::Repr, - bytecode::ConvertValueOparg::Ascii => Self::Ascii, - }) - .ok_or_else(|| vm.new_value_error("invalid conversion flag")) + // Python's AST uses ASCII codes: 's', 'r', 'a', -1=None + // Note: 255 is -1i8 as u8 (ruff's ConversionFlag::None) + match i32::try_from_object(vm, object)? { + -1 | 255 => Ok(Self::None), + x if x == b's' as i32 => Ok(Self::Str), + x if x == b'r' as i32 => Ok(Self::Repr), + x if x == b'a' as i32 => Ok(Self::Ascii), + _ => Err(vm.new_value_error("invalid conversion flag")), + } } }