So I spent two more hours on this this morning and finally got some good results.
a) I turned on _immutable_ = True on the Code object. Should have done this before.
Then I noticed that the trace contained the creation of the argument list, but that that list was never made. The trace was also making a call out to some C function so that it could do the array = [None] * argc. I couldn't get that to go away even with promoting argc. So I changed pop_values to this instead:
assert False
Since Clojure only supports up to 20 positional arguments, that'll work just fine. Now the last part of my trace consists of this:
+266: label(p0, i26, p5, p7, p15, p17, i21, i25, descr=TargetToken(4302275472))
debug_merge_point(0, 0, 'NO_OP')
debug_merge_point(0, 0, 'PUSH_LOCAL 0')
debug_merge_point(0, 0, 'PUSH_LOCAL 2')
debug_merge_point(0, 0, 'EQ')
+280: i27 = int_eq(i21, i26)
guard_false(i27, descr=<Guard0x1006f6480>) [p0, p5, p7, p15, p17, i26]
debug_merge_point(0, 0, 'COND_JMP 26')
debug_merge_point(0, 0, 'PUSH_LOCAL 0')
debug_merge_point(0, 0, 'PUSH_CONST 1')
debug_merge_point(0, 0, 'PUSH_CONST 2')
debug_merge_point(0, 0, 'INVOKE 2')
debug_merge_point(1, 1, 'ADD')
+289: i28 = int_add(i25, i26)
debug_merge_point(1, 1, 'RETURN')
debug_merge_point(0, 0, 'STORE_LOCAL 0')
debug_merge_point(0, 0, 'JMP 6')
debug_merge_point(0, 0, 'NO_OP')
+295: jump(p0, i28, p5, p7, p15, p17, i21, i25, descr=TargetToken(4302275472))
Which is exactly what I was looking for, an add and an eq.
Thanks for the help everyone!
Timothy