+ $op = $op->first;
+ return undef, 0 if null $op;
+
+ my ($r1, $l1) = $self->inspect($op);
+ return $r1, $l1 if defined $r1 and zero $l1;
+ my $c = count $l1;
+
+ $op = $op->sibling;
+ my ($r2, $l2) = $self->inspect($op);
+
+ $op = $op->sibling;
+ my ($r3, $l3);
+ if (null $op) {
+ # If the logop has no else branch, it can also return the *scalar* result of
+ # the conditional
+ $l3 = { 1 => 1 };
+ } else {
+ ($r3, $l3) = $self->inspect($op);
+ }
+
+ my $r = add $r1, scale $c / 2, add $r2, $r3;
+ my $l = scale $c / 2, add $l2, $l3;
+ return $r, $l;
+
+ return $self->OPc_LISTOP($op);
+}
+
+# LISTOPs
+
+sub OPc_LISTOP {
+ my ($self, $op) = @_;