Exemple #1
0
def wrap(funcname, retcode, signature):

    argcount = len(signature)

    ourcode = MyPPCAssembler()
    ourcode.mflr(r0)
    ourcode.stmw(r31, r1, -4)
    ourcode.stw(r0, r1, 8)
    ourcode.stwu(r1, r1, -80)

    ourcode.lwz(r3, r4, 8)
    ourcode.cmpwi(r3, argcount)
    ourcode.bne("argserror")

    assert argcount < 9

    if argcount > 0:
        load_arg(ourcode, 0, signature[0])
    for i in range(2, argcount):
        load_arg(ourcode, i, signature[i])
    if argcount > 1:
        load_arg(ourcode, 1, signature[1])


    ourcode.load_word(r0, lookup(funcname))
    ourcode.mtctr(r0)
    ourcode.bctrl()

    if retcode == 'i':
        s = lookup("PyInt_FromLong")
        ourcode.load_word(r0, s)
        ourcode.mtctr(r0)
        ourcode.bctrl()
    elif retcode == 'f':
        s = lookup("PyFloat_FromDouble")
        ourcode.load_word(r0, s)
        ourcode.mtctr(r0)
        ourcode.bctrl()

    ourcode.label("epilogue")
    ourcode.lwz(r0, r1, 88)
    ourcode.addi(r1, r1, 80)
    ourcode.mtlr(r0)
    ourcode.lmw(r31, r1, -4)
    ourcode.blr()

    err_set = lookup("PyErr_SetObject")
    exc = lookup("PyExc_TypeError")

    ourcode.label("argserror")
    ourcode.load_word(r5, err_set)
    ourcode.mtctr(r5)
    ourcode.load_from(r3, exc)
    ourcode.mr(r4, r3)
    ourcode.bctrl()

    ourcode.li(r3, 0)
    ourcode.b("epilogue")

    return ourcode.assemble()
Exemple #2
0
    def test_intcheck(self):
        a = MyPPCAssembler()

        a.lwz(r5, r4, pystructs.PyVarObject.ob_size)
        a.cmpwi(r5, 1)
        a.bne("not_one")
        a.lwz(r5, r4, pystructs.PyTupleObject.ob_item + 0*4)
        a.lwz(r5, r5, 4)
        a.load_word(r6, lookup("PyInt_Type"))
        a.cmpw(r5, r6)
        a.bne("not_int")
        a.li(r3, 1)
        a.b("exit")
        a.label("not_int")
        a.li(r3, 0)
        a.b("exit")
        a.label("not_one")
        a.li(r3, 2)
        a.label("exit")
        a.load_word(r5, lookup("PyInt_FromLong"))
        a.mtctr(r5)
        a.bctr()

        f = a.assemble()

        assert f() == 2
        assert f("", "") == 2
        assert f("") == 0
        assert f(1) == 1
Exemple #3
0
def make_func(code, retcode, signature, localwords=0):
    """code shouldn't contain prologue/epilogue (or touch r31)"""

    stacksize = 80 + 4*localwords

    argcount = len(signature)

    ourcode = MyPPCAssembler()
    ourcode.mflr(r0)
    ourcode.stmw(r31, r1, -4)
    ourcode.stw(r0, r1, 8)
    ourcode.stwu(r1, r1, -stacksize)

    ourcode.lwz(r3, r4, 8)
    ourcode.cmpwi(r3, argcount)
    ourcode.bne("argserror")

    assert argcount < 9

    if argcount > 0:
        load_arg(ourcode, 0, signature[0])
    for i in range(2, argcount):
        load_arg(ourcode, i, signature[i])
    if argcount > 1:
        load_arg(ourcode, 1, signature[1])

    ourcode.bl(FAST_ENTRY_LABEL)

    if retcode == 'i':
        s = lookup("PyInt_FromLong")
        ourcode.load_word(r0, s)
        ourcode.mtctr(r0)
        ourcode.bctrl()
    elif retcode == 'f':
        s = lookup("PyFloat_FromDouble")
        ourcode.load_word(r0, s)
        ourcode.mtctr(r0)
        ourcode.bctrl()

    ourcode.label("epilogue")
    ourcode.lwz(r0, r1, stacksize + 8)
    ourcode.addi(r1, r1, stacksize)
    ourcode.mtlr(r0)
    ourcode.lmw(r31, r1, -4)
    ourcode.blr()

    err_set = lookup("PyErr_SetObject")
    exc = lookup("PyExc_TypeError")

    ourcode.label("argserror")
    ourcode.load_word(r5, err_set)
    ourcode.mtctr(r5)
    ourcode.load_from(r3, exc)
    ourcode.mr(r4, r3)
    ourcode.bctrl()

    ourcode.li(r3, 0)
    ourcode.b("epilogue")

    ourcode.label(FAST_ENTRY_LABEL)
    # err, should be an Assembler method:
    l = {}
    for k in code.labels:
        l[k] = code.labels[k] + 4*len(ourcode.insts)
    r = code.rlabels.copy()
    for k in code.rlabels:
        r[k + 4*len(ourcode.insts)] = code.rlabels[k]
    ourcode.insts.extend(code.insts)
    ourcode.labels.update(l)
    ourcode.rlabels.update(r)

    r = ourcode.assemble()
    r.FAST_ENTRY_LABEL = ourcode.labels[FAST_ENTRY_LABEL]
    return r