Skip to content

Commit 8294d4a

Browse files
committed
Disallow __debug__ as args, kwargs name.
1 parent a0472e1 commit 8294d4a

File tree

2 files changed

+43
-19
lines changed

2 files changed

+43
-19
lines changed

compiler/codegen/src/compile.rs

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -315,8 +315,13 @@ impl Compiler {
315315
fn name(&mut self, name: &str) -> bytecode::NameIdx {
316316
self._name_inner(name, |i| &mut i.name_cache)
317317
}
318-
fn varname(&mut self, name: &str) -> bytecode::NameIdx {
319-
self._name_inner(name, |i| &mut i.varname_cache)
318+
fn varname(&mut self, name: &str) -> CompileResult<bytecode::NameIdx> {
319+
if Compiler::is_forbidden_arg_name(name) {
320+
return Err(self.error(CodegenErrorType::SyntaxError(format!(
321+
"cannot assign to {name}",
322+
))));
323+
}
324+
Ok(self._name_inner(name, |i| &mut i.varname_cache))
320325
}
321326
fn _name_inner(
322327
&mut self,
@@ -942,24 +947,17 @@ impl Compiler {
942947
.chain(&args.args)
943948
.chain(&args.kwonlyargs);
944949
for name in args_iter {
945-
if Compiler::is_forbidden_arg_name(&name.node.arg) {
946-
return Err(self.error(CodegenErrorType::SyntaxError(format!(
947-
"cannot assign to {}",
948-
&name.node.arg
949-
))));
950-
}
951-
self.varname(&name.node.arg);
950+
self.varname(&name.node.arg)?;
952951
}
953952

954-
let mut compile_varargs = |va: Option<&ast::Arg>, flag| {
955-
if let Some(name) = va {
956-
self.current_codeinfo().flags |= flag;
957-
self.varname(&name.node.arg);
958-
}
959-
};
960-
961-
compile_varargs(args.vararg.as_deref(), bytecode::CodeFlags::HAS_VARARGS);
962-
compile_varargs(args.kwarg.as_deref(), bytecode::CodeFlags::HAS_VARKEYWORDS);
953+
if let Some(name) = args.vararg.as_deref() {
954+
self.current_codeinfo().flags |= bytecode::CodeFlags::HAS_VARARGS;
955+
self.varname(&name.node.arg)?;
956+
}
957+
if let Some(name) = args.kwarg.as_deref() {
958+
self.current_codeinfo().flags |= bytecode::CodeFlags::HAS_VARKEYWORDS;
959+
self.varname(&name.node.arg)?;
960+
}
963961

964962
Ok(funcflags)
965963
}
@@ -2565,7 +2563,7 @@ impl Compiler {
25652563
0,
25662564
name.to_owned(),
25672565
);
2568-
let arg0 = self.varname(".0");
2566+
let arg0 = self.varname(".0")?;
25692567

25702568
let return_none = init_collection.is_none();
25712569
// Create empty object of proper type:
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from testutils import assert_raises
2+
3+
def raisesSyntaxError(parse_stmt, exec_stmt=None):
4+
with assert_raises(SyntaxError):
5+
compile(parse_stmt, '<test>', 'exec')
6+
if exec_stmt is not None:
7+
source = "\n".join([parse_stmt, exec_stmt])
8+
exec(source)
9+
10+
# Check that errors are raised during parsing.
11+
raisesSyntaxError("def f(**__debug__): pass")
12+
raisesSyntaxError("def f(*__debug__): pass")
13+
raisesSyntaxError("def f(__debug__): pass")
14+
raisesSyntaxError("def f(__debug__=1): pass")
15+
16+
# Similarly but during execution.
17+
raisesSyntaxError("def f(**kwargs): pass", "f(__debug__=1)")
18+
raisesSyntaxError("", "__debug__=1")
19+
raisesSyntaxError("", "obj.__debug__ = 1")
20+
raisesSyntaxError("", "__debug__ := 1")
21+
raisesSyntaxError("", "del __debug__")
22+
raisesSyntaxError("", "(a, __debug__, c) = (1, 2, 3)")
23+
raisesSyntaxError("", "(a, *__debug__, c) = (1, 2, 3)")
24+
25+
# TODO:
26+
# raisesSyntaxError("", "__debug__ : int")

0 commit comments

Comments
 (0)