(
&self,
a: &PyObject,
b: &PyObject,
c: &PyObject,
op_slot: PyNumberTernaryOp,
op_str: &str,
)
| 290 | } |
| 291 | |
| 292 | fn ternary_op( |
| 293 | &self, |
| 294 | a: &PyObject, |
| 295 | b: &PyObject, |
| 296 | c: &PyObject, |
| 297 | op_slot: PyNumberTernaryOp, |
| 298 | op_str: &str, |
| 299 | ) -> PyResult { |
| 300 | let class_a = a.class(); |
| 301 | let class_b = b.class(); |
| 302 | let class_c = c.class(); |
| 303 | |
| 304 | // Number slots are inherited, direct access is O(1) |
| 305 | let slot_a = class_a.slots.as_number.left_ternary_op(op_slot); |
| 306 | let slot_a_addr = slot_a.map(|x| x as usize); |
| 307 | let mut slot_b = None; |
| 308 | let left_b_addr; |
| 309 | |
| 310 | if !class_a.is(class_b) { |
| 311 | let slot_bb = class_b.slots.as_number.right_ternary_op(op_slot); |
| 312 | if slot_bb.map(|x| x as usize) != slot_a_addr { |
| 313 | slot_b = slot_bb; |
| 314 | } |
| 315 | left_b_addr = class_b |
| 316 | .slots |
| 317 | .as_number |
| 318 | .left_ternary_op(op_slot) |
| 319 | .map(|x| x as usize); |
| 320 | } else { |
| 321 | left_b_addr = slot_a_addr; |
| 322 | } |
| 323 | |
| 324 | if let Some(slot_a) = slot_a { |
| 325 | if let Some(slot_bb) = slot_b |
| 326 | && class_b.fast_issubclass(class_a) |
| 327 | && (slot_a_addr != left_b_addr |
| 328 | || method_is_overloaded( |
| 329 | class_a, |
| 330 | class_b, |
| 331 | op_slot.right_method_name(self), |
| 332 | self, |
| 333 | )?) |
| 334 | { |
| 335 | let ret = slot_bb(a, b, c, self)?; |
| 336 | if !ret.is(&self.ctx.not_implemented) { |
| 337 | return Ok(ret); |
| 338 | } |
| 339 | slot_b = None; |
| 340 | } |
| 341 | let ret = slot_a(a, b, c, self)?; |
| 342 | if !ret.is(&self.ctx.not_implemented) { |
| 343 | return Ok(ret); |
| 344 | } |
| 345 | } |
| 346 | |
| 347 | if let Some(slot_b) = slot_b { |
| 348 | let ret = slot_b(a, b, c, self)?; |
| 349 | if !ret.is(&self.ctx.not_implemented) { |
no test coverage detected