def compileIfStar(comp, form): """ Compiles the form (if* pred val else?). """ if len(form) != 3 and len(form) != 4: raise CompilerException("if takes 2 or 3 args", form) cmp = comp.compile(form.next().first()) body = comp.compile(form.next().next().first()) if len(form) == 3: body2 = [(LOAD_CONST, None)] else: body2 = comp.compile(form.next().next().next().first()) elseLabel = Label("IfElse") endlabel = Label("IfEnd") condition_name = garg(0).name code = cmp code.append((STORE_FAST, condition_name)) code.append((LOAD_FAST, condition_name)) code.append((LOAD_CONST, None)) code.append((COMPARE_OP, 'is not')) code.extend(emitJump(elseLabel)) code.append((LOAD_FAST, condition_name)) code.append((LOAD_CONST, False)) code.append((COMPARE_OP, 'is not')) # Use is not instead of != as bool is a subclass of int, and # therefore False == 0 code.extend(emitJump(elseLabel)) code.extend(body) code.append((JUMP_ABSOLUTE, endlabel)) code.extend(emitLanding(elseLabel)) code.extend(body2) code.append((endlabel, None)) return code
def compileIf(comp, form): if len(form) != 3 and len(form) != 4: raise CompilerException("if takes 2 or 3 args", form) cmp = comp.compile(form.next().first()) body = comp.compile(form.next().next().first()) if len(form) == 3: body2 = [(LOAD_CONST, None)] else: body2 = comp.compile(form.next().next().next().first()) elseLabel = Label("IfElse") endlabel = Label("IfEnd") condition_name = garg(0).name code = cmp code.append((STORE_FAST, condition_name)) code.append((LOAD_FAST, condition_name)) code.append((LOAD_CONST, None)) code.append((COMPARE_OP, 'is not')) code.extend(emitJump(elseLabel)) code.append((LOAD_FAST, condition_name)) code.append((LOAD_CONST, False)) code.append((COMPARE_OP, '!=')) code.extend(emitJump(elseLabel)) code.extend(body) code.append((JUMP_ABSOLUTE, endlabel)) code.extend(emitLanding(elseLabel)) code.extend(body2) code.append((endlabel, None)) return code
def compileIfStar(comp, form): """ Compiles the form (if* pred val else?). """ if len(form) != 3 and len(form) != 4: raise CompilerException("if takes 2 or 3 args", form) cmp = comp.compile(form.next().first()) body = comp.compile(form.next().next().first()) if len(form) == 3: body2 = tr.ConstNone else: body2 = comp.compile(form.next().next().next().first()) elseLabel = Label("IfElse") endlabel = Label("IfEnd") condresult = tr.Local(garg(0).name) code = tr.Do(tr.StoreLocal(cmp), tr.If(tr.And(IsNot(condresult, tr.ConstNone), IsNot(condresult, tr.ConstFalse)), body, body2)) return code