MCPcopy Index your code
hub / github.com/RustPython/RustPython / ternary_op

Method ternary_op

crates/vm/src/vm/vm_ops.rs:292–382  ·  view source on GitHub ↗
(
        &self,
        a: &PyObject,
        b: &PyObject,
        c: &PyObject,
        op_slot: PyNumberTernaryOp,
        op_str: &str,
    )

Source from the content-addressed store, hash-verified

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) {

Callers 1

ternary_iopMethod · 0.80

Calls 10

method_is_overloadedFunction · 0.85
left_ternary_opMethod · 0.80
isMethod · 0.80
right_ternary_opMethod · 0.80
fast_issubclassMethod · 0.80
right_method_nameMethod · 0.80
ErrClass · 0.50
classMethod · 0.45
mapMethod · 0.45
is_noneMethod · 0.45

Tested by

no test coverage detected