@@ -472,16 +472,16 @@ impl AsSequence for PyDict {
472472impl AsNumber for PyDict {
473473 fn as_number ( ) -> & ' static PyNumberMethods {
474474 static AS_NUMBER : PyNumberMethods = PyNumberMethods {
475- or : Some ( |num , args , vm| {
476- if let Some ( num ) = num . obj . downcast_ref :: < PyDict > ( ) {
477- PyDict :: or ( num , args . to_pyobject ( vm) , vm)
475+ or : Some ( |a , b , vm| {
476+ if let Some ( a ) = a . downcast_ref :: < PyDict > ( ) {
477+ PyDict :: or ( a , b . to_pyobject ( vm) , vm)
478478 } else {
479479 Ok ( vm. ctx . not_implemented ( ) )
480480 }
481481 } ) ,
482- inplace_or : Some ( |num , args , vm| {
483- if let Some ( num ) = num . obj . downcast_ref :: < PyDict > ( ) {
484- PyDict :: ior ( num . to_owned ( ) , args . to_pyobject ( vm) , vm) . map ( |d| d. into ( ) )
482+ inplace_or : Some ( |a , b , vm| {
483+ if let Some ( a ) = a . downcast_ref :: < PyDict > ( ) {
484+ PyDict :: ior ( a . to_owned ( ) , b . to_pyobject ( vm) , vm) . map ( |d| d. into ( ) )
485485 } else {
486486 Ok ( vm. ctx . not_implemented ( ) )
487487 }
@@ -1169,51 +1169,10 @@ impl AsSequence for PyDictKeys {
11691169impl AsNumber for PyDictKeys {
11701170 fn as_number ( ) -> & ' static PyNumberMethods {
11711171 static AS_NUMBER : PyNumberMethods = PyNumberMethods {
1172- subtract : Some ( |num, args, vm| {
1173- let num = PySetInner :: from_iter (
1174- ArgIterable :: try_from_object ( vm, num. obj . to_owned ( ) ) ?. iter ( vm) ?,
1175- vm,
1176- ) ?;
1177- Ok ( PySet {
1178- inner : num
1179- . difference ( ArgIterable :: try_from_object ( vm, args. to_owned ( ) ) ?, vm) ?,
1180- }
1181- . into_pyobject ( vm) )
1182- } ) ,
1183- and : Some ( |num, args, vm| {
1184- let num = PySetInner :: from_iter (
1185- ArgIterable :: try_from_object ( vm, num. obj . to_owned ( ) ) ?. iter ( vm) ?,
1186- vm,
1187- ) ?;
1188- Ok ( PySet {
1189- inner : num
1190- . intersection ( ArgIterable :: try_from_object ( vm, args. to_owned ( ) ) ?, vm) ?,
1191- }
1192- . into_pyobject ( vm) )
1193- } ) ,
1194- xor : Some ( |num, args, vm| {
1195- let num = PySetInner :: from_iter (
1196- ArgIterable :: try_from_object ( vm, num. obj . to_owned ( ) ) ?. iter ( vm) ?,
1197- vm,
1198- ) ?;
1199- Ok ( PySet {
1200- inner : num. symmetric_difference (
1201- ArgIterable :: try_from_object ( vm, args. to_owned ( ) ) ?,
1202- vm,
1203- ) ?,
1204- }
1205- . into_pyobject ( vm) )
1206- } ) ,
1207- or : Some ( |num, args, vm| {
1208- let num = PySetInner :: from_iter (
1209- ArgIterable :: try_from_object ( vm, num. obj . to_owned ( ) ) ?. iter ( vm) ?,
1210- vm,
1211- ) ?;
1212- Ok ( PySet {
1213- inner : num. union ( ArgIterable :: try_from_object ( vm, args. to_owned ( ) ) ?, vm) ?,
1214- }
1215- . into_pyobject ( vm) )
1216- } ) ,
1172+ subtract : Some ( set_inner_number_subtract) ,
1173+ and : Some ( set_inner_number_and) ,
1174+ xor : Some ( set_inner_number_xor) ,
1175+ or : Some ( set_inner_number_or) ,
12171176 ..PyNumberMethods :: NOT_IMPLEMENTED
12181177 } ;
12191178 & AS_NUMBER
@@ -1288,51 +1247,10 @@ impl AsSequence for PyDictItems {
12881247impl AsNumber for PyDictItems {
12891248 fn as_number ( ) -> & ' static PyNumberMethods {
12901249 static AS_NUMBER : PyNumberMethods = PyNumberMethods {
1291- subtract : Some ( |num, args, vm| {
1292- let num = PySetInner :: from_iter (
1293- ArgIterable :: try_from_object ( vm, num. obj . to_owned ( ) ) ?. iter ( vm) ?,
1294- vm,
1295- ) ?;
1296- Ok ( PySet {
1297- inner : num
1298- . difference ( ArgIterable :: try_from_object ( vm, args. to_owned ( ) ) ?, vm) ?,
1299- }
1300- . into_pyobject ( vm) )
1301- } ) ,
1302- and : Some ( |num, args, vm| {
1303- let num = PySetInner :: from_iter (
1304- ArgIterable :: try_from_object ( vm, num. obj . to_owned ( ) ) ?. iter ( vm) ?,
1305- vm,
1306- ) ?;
1307- Ok ( PySet {
1308- inner : num
1309- . intersection ( ArgIterable :: try_from_object ( vm, args. to_owned ( ) ) ?, vm) ?,
1310- }
1311- . into_pyobject ( vm) )
1312- } ) ,
1313- xor : Some ( |num, args, vm| {
1314- let num = PySetInner :: from_iter (
1315- ArgIterable :: try_from_object ( vm, num. obj . to_owned ( ) ) ?. iter ( vm) ?,
1316- vm,
1317- ) ?;
1318- Ok ( PySet {
1319- inner : num. symmetric_difference (
1320- ArgIterable :: try_from_object ( vm, args. to_owned ( ) ) ?,
1321- vm,
1322- ) ?,
1323- }
1324- . into_pyobject ( vm) )
1325- } ) ,
1326- or : Some ( |num, args, vm| {
1327- let num = PySetInner :: from_iter (
1328- ArgIterable :: try_from_object ( vm, num. obj . to_owned ( ) ) ?. iter ( vm) ?,
1329- vm,
1330- ) ?;
1331- Ok ( PySet {
1332- inner : num. union ( ArgIterable :: try_from_object ( vm, args. to_owned ( ) ) ?, vm) ?,
1333- }
1334- . into_pyobject ( vm) )
1335- } ) ,
1250+ subtract : Some ( set_inner_number_subtract) ,
1251+ and : Some ( set_inner_number_and) ,
1252+ xor : Some ( set_inner_number_xor) ,
1253+ or : Some ( set_inner_number_or) ,
13361254 ..PyNumberMethods :: NOT_IMPLEMENTED
13371255 } ;
13381256 & AS_NUMBER
@@ -1358,6 +1276,34 @@ impl AsSequence for PyDictValues {
13581276 }
13591277}
13601278
1279+ fn set_inner_number_op < F > ( a : & PyObject , b : & PyObject , f : F , vm : & VirtualMachine ) -> PyResult
1280+ where
1281+ F : FnOnce ( PySetInner , ArgIterable ) -> PyResult < PySetInner > ,
1282+ {
1283+ let a = PySetInner :: from_iter (
1284+ ArgIterable :: try_from_object ( vm, a. to_owned ( ) ) ?. iter ( vm) ?,
1285+ vm,
1286+ ) ?;
1287+ let b = ArgIterable :: try_from_object ( vm, b. to_owned ( ) ) ?;
1288+ Ok ( PySet { inner : f ( a, b) ? } . into_pyobject ( vm) )
1289+ }
1290+
1291+ fn set_inner_number_subtract ( a : & PyObject , b : & PyObject , vm : & VirtualMachine ) -> PyResult {
1292+ set_inner_number_op ( a, b, |a, b| a. difference ( b, vm) , vm)
1293+ }
1294+
1295+ fn set_inner_number_and ( a : & PyObject , b : & PyObject , vm : & VirtualMachine ) -> PyResult {
1296+ set_inner_number_op ( a, b, |a, b| a. intersection ( b, vm) , vm)
1297+ }
1298+
1299+ fn set_inner_number_xor ( a : & PyObject , b : & PyObject , vm : & VirtualMachine ) -> PyResult {
1300+ set_inner_number_op ( a, b, |a, b| a. symmetric_difference ( b, vm) , vm)
1301+ }
1302+
1303+ fn set_inner_number_or ( a : & PyObject , b : & PyObject , vm : & VirtualMachine ) -> PyResult {
1304+ set_inner_number_op ( a, b, |a, b| a. union ( b, vm) , vm)
1305+ }
1306+
13611307pub ( crate ) fn init ( context : & Context ) {
13621308 PyDict :: extend_class ( context, context. types . dict_type ) ;
13631309 PyDictKeys :: extend_class ( context, context. types . dict_keys_type ) ;
0 commit comments