Skip to content

Commit f5de59a

Browse files
authored
Merge pull request RustPython#1834 from RustPython/coolreader18/jsontests
Add json output for CPython tests
2 parents 3fb1d3f + f66fde5 commit f5de59a

File tree

14 files changed

+782
-73
lines changed

14 files changed

+782
-73
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Lib/_collections_abc.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -836,7 +836,11 @@ def update(*args, **kwds):
836836
len(args))
837837
if args:
838838
other = args[0]
839-
if isinstance(other, Mapping):
839+
try:
840+
mapping_inst = isinstance(other, Mapping)
841+
except TypeError:
842+
mapping_inst = False
843+
if mapping_inst:
840844
for key in other:
841845
self[key] = other[key]
842846
elif hasattr(other, "keys"):

Lib/test/test_unicode.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2417,6 +2417,8 @@ def test_raiseMemError(self):
24172417
self.assertRaises(MemoryError, alloc)
24182418
self.assertRaises(MemoryError, alloc)
24192419

2420+
# TODO: RUSTPYTHON
2421+
@unittest.expectedFailure
24202422
def test_format_subclass(self):
24212423
class S(str):
24222424
def __str__(self):

bytecode/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,4 @@ lz4-compress = "0.1.1"
1515
num-bigint = { version = "0.2", features = ["serde"] }
1616
num-complex = { version = "0.2", features = ["serde"] }
1717
serde = { version = "1.0", features = ["derive"] }
18+
itertools = "0.8"

bytecode/src/bytecode.rs

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
//! implements bytecode structure.
33
44
use bitflags::bitflags;
5+
use itertools::Itertools;
56
use num_bigint::BigInt;
67
use num_complex::Complex64;
78
use serde::{Deserialize, Serialize};
@@ -40,9 +41,9 @@ pub struct CodeObject {
4041
pub flags: CodeFlags,
4142
pub posonlyarg_count: usize, // Number of positional-only arguments
4243
pub arg_names: Vec<String>, // Names of positional arguments
43-
pub varargs: Varargs, // *args or *
44+
pub varargs_name: Option<String>, // *args or *
4445
pub kwonlyarg_names: Vec<String>,
45-
pub varkeywords: Varargs, // **kwargs or **
46+
pub varkeywords_name: Option<String>, // **kwargs or **
4647
pub source_path: String,
4748
pub first_line_number: usize,
4849
pub obj_name: String, // Name of the object that created this code object
@@ -57,6 +58,8 @@ bitflags! {
5758
const NEW_LOCALS = 0x08;
5859
const IS_GENERATOR = 0x10;
5960
const IS_COROUTINE = 0x20;
61+
const HAS_VARARGS = 0x40;
62+
const HAS_VARKEYWORDS = 0x80;
6063
}
6164
}
6265

@@ -70,6 +73,8 @@ impl CodeFlags {
7073
pub const NAME_MAPPING: &'static [(&'static str, CodeFlags)] = &[
7174
("GENERATOR", CodeFlags::IS_GENERATOR),
7275
("COROUTINE", CodeFlags::IS_COROUTINE),
76+
("VARARGS", CodeFlags::HAS_VARARGS),
77+
("VARKEYWORDS", CodeFlags::HAS_VARKEYWORDS),
7378
];
7479
}
7580

@@ -352,13 +357,6 @@ pub enum UnaryOperator {
352357
Plus,
353358
}
354359

355-
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
356-
pub enum Varargs {
357-
None,
358-
Unnamed,
359-
Named(String),
360-
}
361-
362360
/*
363361
Maintain a stack of blocks on the VM.
364362
pub enum BlockType {
@@ -373,9 +371,9 @@ impl CodeObject {
373371
flags: CodeFlags,
374372
posonlyarg_count: usize,
375373
arg_names: Vec<String>,
376-
varargs: Varargs,
374+
varargs_name: Option<String>,
377375
kwonlyarg_names: Vec<String>,
378-
varkeywords: Varargs,
376+
varkeywords_name: Option<String>,
379377
source_path: String,
380378
first_line_number: usize,
381379
obj_name: String,
@@ -387,9 +385,9 @@ impl CodeObject {
387385
flags,
388386
posonlyarg_count,
389387
arg_names,
390-
varargs,
388+
varargs_name,
391389
kwonlyarg_names,
392-
varkeywords,
390+
varkeywords_name,
393391
source_path,
394392
first_line_number,
395393
obj_name,
@@ -418,6 +416,29 @@ impl CodeObject {
418416
})
419417
}
420418

419+
pub fn varnames(&self) -> impl Iterator<Item = &str> + '_ {
420+
self.arg_names
421+
.iter()
422+
.map(String::as_str)
423+
.chain(self.kwonlyarg_names.iter().map(String::as_str))
424+
.chain(
425+
self.instructions
426+
.iter()
427+
.filter_map(|i| match i {
428+
Instruction::LoadName {
429+
name,
430+
scope: NameScope::Local,
431+
}
432+
| Instruction::StoreName {
433+
name,
434+
scope: NameScope::Local,
435+
} => Some(name.as_str()),
436+
_ => None,
437+
})
438+
.unique(),
439+
)
440+
}
441+
421442
fn display_inner(
422443
&self,
423444
f: &mut fmt::Formatter,

compiler/src/compile.rs

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use crate::symboltable::{
1414
};
1515
use itertools::Itertools;
1616
use num_complex::Complex64;
17-
use rustpython_bytecode::bytecode::{self, CallType, CodeObject, Instruction, Label, Varargs};
17+
use rustpython_bytecode::bytecode::{self, CallType, CodeObject, Instruction, Label};
1818
use rustpython_parser::{ast, parser};
1919

2020
type BasicOutputStream = PeepholeOptimizer<CodeObjectStream>;
@@ -191,9 +191,9 @@ impl<O: OutputStream> Compiler<O> {
191191
Default::default(),
192192
0,
193193
Vec::new(),
194-
Varargs::None,
194+
None,
195195
Vec::new(),
196-
Varargs::None,
196+
None,
197197
self.source_path.clone().unwrap(),
198198
line_number,
199199
obj_name,
@@ -710,14 +710,29 @@ impl<O: OutputStream> Compiler<O> {
710710
flags |= bytecode::CodeFlags::HAS_KW_ONLY_DEFAULTS;
711711
}
712712

713+
let mut compile_varargs = |va: &ast::Varargs, flag| match va {
714+
ast::Varargs::None => None,
715+
ast::Varargs::Unnamed => {
716+
flags |= flag;
717+
None
718+
}
719+
ast::Varargs::Named(name) => {
720+
flags |= flag;
721+
Some(name.arg.clone())
722+
}
723+
};
724+
725+
let varargs_name = compile_varargs(&args.vararg, bytecode::CodeFlags::HAS_VARARGS);
726+
let varkeywords_name = compile_varargs(&args.kwarg, bytecode::CodeFlags::HAS_VARKEYWORDS);
727+
713728
let line_number = self.get_source_line_number();
714729
self.push_output(CodeObject::new(
715730
flags,
716731
args.posonlyargs_count,
717732
args.args.iter().map(|a| a.arg.clone()).collect(),
718-
compile_varargs(&args.vararg),
733+
varargs_name,
719734
args.kwonlyargs.iter().map(|a| a.arg.clone()).collect(),
720-
compile_varargs(&args.kwarg),
735+
varkeywords_name,
721736
self.source_path.clone().unwrap(),
722737
line_number,
723738
name.to_owned(),
@@ -994,9 +1009,9 @@ impl<O: OutputStream> Compiler<O> {
9941009
Default::default(),
9951010
0,
9961011
vec![],
997-
Varargs::None,
1012+
None,
9981013
vec![],
999-
Varargs::None,
1014+
None,
10001015
self.source_path.clone().unwrap(),
10011016
line_number,
10021017
name.to_owned(),
@@ -1944,9 +1959,9 @@ impl<O: OutputStream> Compiler<O> {
19441959
Default::default(),
19451960
1,
19461961
vec![".0".to_owned()],
1947-
Varargs::None,
1962+
None,
19481963
vec![],
1949-
Varargs::None,
1964+
None,
19501965
self.source_path.clone().unwrap(),
19511966
line_number,
19521967
name.clone(),
@@ -2269,14 +2284,6 @@ fn compile_location(location: &ast::Location) -> bytecode::Location {
22692284
bytecode::Location::new(location.row(), location.column())
22702285
}
22712286

2272-
fn compile_varargs(varargs: &ast::Varargs) -> bytecode::Varargs {
2273-
match varargs {
2274-
ast::Varargs::None => bytecode::Varargs::None,
2275-
ast::Varargs::Unnamed => bytecode::Varargs::Unnamed,
2276-
ast::Varargs::Named(param) => bytecode::Varargs::Named(param.arg.clone()),
2277-
}
2278-
}
2279-
22802287
fn compile_conversion_flag(conversion_flag: ast::ConversionFlag) -> bytecode::ConversionFlag {
22812288
match conversion_flag {
22822289
ast::ConversionFlag::Ascii => bytecode::ConversionFlag::Ascii,

tests/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
snippets/whats_left_*.py
22
.cache/
3+
cpython_tests_results.json
4+

0 commit comments

Comments
 (0)