Exemplo n.º 1
0
 def test_simple(self):
     a = MyPPCAssembler()
     a.blr()
     f = make_func(a, "O", "O")
     assert f(1) == 1
     raises(TypeError, f)
     raises(TypeError, f, 1, 2)
Exemplo n.º 2
0
def access_at():
    a = MyPPCAssembler()

    a.lwzx(r3, r3, r4)
    a.blr()

    return make_func(a, "i", "ii")
Exemplo n.º 3
0
 def test_simple(self):
     a = MyPPCAssembler()
     a.blr()
     f = make_func(a, "O", "O")
     assert f(1) == 1
     raises(TypeError, f)
     raises(TypeError, f, 1, 2)
Exemplo n.º 4
0
 def test_floats(self):
     a = MyPPCAssembler()
     a.fadd(fr1, fr1, fr2)
     a.blr()
     f = make_func(a, 'f', 'ff')
     raises(TypeError, f)
     raises(TypeError, f, 1.0)
     assert f(1.0, 2.0) == 3.0
     raises(TypeError, f, 1.0, 2.0, 3.0)
     raises(TypeError, f, 1.0, 2)
Exemplo n.º 5
0
 def test_signature(self):
     a = MyPPCAssembler()
     a.add(r3, r3, r4)
     a.blr()
     f = make_func(a, "i", "ii")
     raises(TypeError, f)
     raises(TypeError, f, 1)
     assert f(1, 2) == 3
     raises(TypeError, f, 1, 2, 3)
     raises(TypeError, f, 1, "2")
Exemplo n.º 6
0
 def test_fast_entry(self):
     a = MyPPCAssembler()
     a.blr()
     f = make_func(a, "O", "O")
     assert f(1) == 1
     b = MyPPCAssembler()
     from pypy.jit.codegen.ppc.ppcgen import util
     # eurgh!:
     b.load_word(r0, util.access_at(id(f.code), 8) + f.FAST_ENTRY_LABEL)
     b.mtctr(r0)
     b.bctr()
     g = make_func(b, "O", "O")
     assert g(1) == 1
Exemplo n.º 7
0
 def test_less_simple(self):
     a = MyPPCAssembler()
     s = lookup("PyNumber_Add")
     a.load_word(r5, s)
     a.mtctr(r5)
     a.bctr()
     f = make_func(a, "O", "OO")
     raises(TypeError, f)
     raises(TypeError, f, 1)
     assert f(1, 2) == 3
     raises(TypeError, f, 1, 2, 3)
Exemplo n.º 8
0
def access_at():
    a = MyPPCAssembler()

    a.lwzx(r3, r3, r4)
    a.blr()

    return make_func(a, "i", "ii")
Exemplo n.º 9
0
 def test_less_simple(self):
     a = MyPPCAssembler()
     s = lookup("PyNumber_Add")
     a.load_word(r5, s)
     a.mtctr(r5)
     a.bctr()
     f = make_func(a, "O", "OO")
     raises(TypeError, f)
     raises(TypeError, f, 1)
     assert f(1, 2) == 3
     raises(TypeError, f, 1, 2, 3)
Exemplo n.º 10
0
 def test_signature(self):
     a = MyPPCAssembler()
     a.add(r3, r3, r4)
     a.blr()
     f = make_func(a, "i", "ii")
     raises(TypeError, f)
     raises(TypeError, f, 1)
     assert f(1, 2) == 3
     raises(TypeError, f, 1, 2, 3)
     raises(TypeError, f, 1, "2")
Exemplo n.º 11
0
 def test_floats(self):
     a = MyPPCAssembler()
     a.fadd(fr1, fr1, fr2)
     a.blr()
     f = make_func(a, 'f', 'ff')
     raises(TypeError, f)
     raises(TypeError, f, 1.0)
     assert f(1.0, 2.0) == 3.0
     raises(TypeError, f, 1.0, 2.0, 3.0)
     raises(TypeError, f, 1.0, 2)
Exemplo n.º 12
0
    def test_raise(self):
        a = MyPPCAssembler()

        a.mflr(0)
        a.stw(0, 1, 8)
        a.stwu(1, 1, -80)

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

        a.load_word(5, err_set)
        a.mtctr(5)
        a.load_from(3, exc)
        a.mr(4, 3)
        a.bctrl()

        a.li(3, 0)

        a.lwz(0, 1, 88)
        a.addi(1, 1, 80)
        a.mtlr(0)
        a.blr()

        raises(ValueError, a.assemble())
Exemplo n.º 13
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
Exemplo n.º 14
0
    def test_tuplelength2(self):
        a = MyPPCAssembler()

        a.mflr(0)
        a.stw(0, 1, 8)
        a.stwu(1, 1, -80)
        a.mr(3, 4)
        a.load_word(5, lookup("PyTuple_Size"))
        a.mtctr(5)
        a.bctrl()
        a.load_word(5, lookup("PyInt_FromLong"))
        a.mtctr(5)
        a.bctrl()
        a.lwz(0, 1, 88)
        a.addi(1, 1, 80)
        a.mtlr(0)
        a.blr()

        f = a.assemble()
        assert f() == 0
        assert f(1) == 1
        assert f('') == 1
        assert f('', 3) == 2
Exemplo n.º 15
0
    def test_tuplelength(self):
        a = MyPPCAssembler()

        a.lwz(3, 4, pystructs.PyVarObject.ob_size)
        a.load_word(5, lookup("PyInt_FromLong"))
        a.mtctr(5)
        a.bctr()

        f = a.assemble()
        assert f() == 0
        assert f(1) == 1
        assert f('') == 1
Exemplo n.º 16
0
 def testSucceed(idesc, *args):
     a = MyPPCAssembler()
     # "assertNotRaises" :-)
     idesc.__get__(a)(*args)
Exemplo n.º 17
0
 def testFailure(idesc, *args):
     a = MyPPCAssembler()
     raises(ValueError, idesc.__get__(a), *args)
Exemplo n.º 18
0
    def test_numberadd(self):
        a = MyPPCAssembler()

        a.lwz(r5, r4, pystructs.PyVarObject.ob_size)
        a.cmpwi(r5, 2)
        a.bne("err_out")

        a.lwz(r3, r4, 12)
        a.lwz(r4, r4, 16)

        a.load_word(r5, lookup("PyNumber_Add"))
        a.mtctr(r5)
        a.bctr()

        a.label("err_out")

        a.mflr(r0)
        a.stw(r0, r1, 8)
        a.stwu(r1, r1, -80)

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

        a.load_word(r5, err_set)
        a.mtctr(r5)
        a.load_from(r3, exc)
        a.mr(r4, r3)
        a.bctrl()

        a.li(r3, 0)

        a.lwz(r0, r1, 88)
        a.addi(r1, r1, 80)
        a.mtlr(r0)
        a.blr()

        f = a.assemble()

        raises(TypeError, f)
        raises(TypeError, f, '', 1)
        raises(TypeError, f, 1)
        raises(TypeError, f, 1, 2, 3)
        assert f(1, 2) == 3
        assert f('a', 'b') == 'ab'
Exemplo n.º 19
0
    def test_makestring(self):
        a = MyPPCAssembler()

        a.li(r3, 0)
        a.li(r4, 0)
        a.load_word(r5, lookup("PyString_FromStringAndSize"))
        a.mtctr(r5)
        a.bctr()

        f = a.assemble()
        assert f() == ''
Exemplo n.º 20
0
 def test_signature2(self):
     a = MyPPCAssembler()
     a.add(r3, r3, r4)
     a.add(r3, r3, r5)
     a.add(r3, r3, r6)
     a.add(r3, r3, r7)
     s = lookup("PyInt_FromLong")
     a.load_word(r0, s)
     a.mtctr(r0)
     a.bctr()
     f = make_func(a, "O", "iiiii")
     raises(TypeError, f)
     raises(TypeError, f, 1)
     assert f(1, 2, 3, 4, 5) == 1 + 2 + 3 + 4 + 5
     raises(TypeError, f, 1, 2, 3)
     raises(TypeError, f, 1, "2", 3, 4, 5)
Exemplo n.º 21
0
def itoO():
    a = MyPPCAssembler()

    a.blr()

    return make_func(a, "O", "i")
Exemplo n.º 22
0
 def test_fast_entry(self):
     a = MyPPCAssembler()
     a.blr()
     f = make_func(a, "O", "O")
     assert f(1) == 1
     b = MyPPCAssembler()
     from pypy.jit.codegen.ppc.ppcgen import util
     # eurgh!:
     b.load_word(r0, util.access_at(id(f.code), 8) + f.FAST_ENTRY_LABEL)
     b.mtctr(r0)
     b.bctr()
     g = make_func(b, "O", "O")
     assert g(1) == 1
Exemplo n.º 23
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()
Exemplo n.º 24
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
Exemplo n.º 25
0
 def test_signature2(self):
     a = MyPPCAssembler()
     a.add(r3, r3, r4)
     a.add(r3, r3, r5)
     a.add(r3, r3, r6)
     a.add(r3, r3, r7)
     s = lookup("PyInt_FromLong")
     a.load_word(r0, s)
     a.mtctr(r0)
     a.bctr()
     f = make_func(a, "O", "iiiii")
     raises(TypeError, f)
     raises(TypeError, f, 1)
     assert f(1, 2, 3, 4, 5) == 1 + 2 + 3 + 4 + 5
     raises(TypeError, f, 1, 2, 3)
     raises(TypeError, f, 1, "2", 3, 4, 5)
Exemplo n.º 26
0
def itoO():
    a = MyPPCAssembler()

    a.blr()

    return make_func(a, "O", "i")