コード例 #1
0
ファイル: ops_arrays.py プロジェクト: 4toblerone/pyjvm
def newarray(frame):
    atype = ord(frame.code[frame.pc])
    frame.pc += 1
    count = frame.stack.pop()
    jassert_int(count)
    if count < 0:
        frame.vm.raise_exception(frame, "java/lang/NegativeArraySizeException")
        return
    values = None
    if atype in [10, 5, 8, 9, 4]:  # int, char, byte, short, boolean
        values = [0]*count
    elif atype == 7:  # double
        values = [("double", 0.0)] * count
    elif atype == 6:  # float
        values = [("float", 0.0)] * count
    elif atype == 11:  # long
        values = [("long", 0)] * count
    else:
        raise Exception("Array creation for ATYPE {0} not yet supported"
                        .format(atype))
    prims = {4: "[Z", 5: "[C", 6: "[F", 7: "[D", 8: "[B", 9: "[S",
             10: "[I", 11: "[J"}
    array_class = frame.vm.get_class(prims[atype])
    jarray = JArray(array_class, frame.vm)
    jarray.values = values
    ref = frame.vm.add_to_heap(jarray)
    frame.stack.append(ref)
コード例 #2
0
ファイル: ops_calc.py プロジェクト: MatevzFa/pyjvm
def iadd(frame):
    value2 = frame.stack.pop()
    value1 = frame.stack.pop()
    result = value1 + value2
    result = cut_to_int(result)
    jassert_int(result)
    frame.stack.append(result)
コード例 #3
0
def ireturn(frame):
    value = frame.stack.pop()
    logger.debug("To be returned {0}".format(value))
    jassert_int(value)
    frame.ret = value
    frame.has_result = True
    frame.pc = len(frame.code) + 1
コード例 #4
0
ファイル: ops_convert.py プロジェクト: MatevzFa/pyjvm
def i2b(frame):
    value = frame.stack.pop()
    jassert_int(value)
    data = struct.pack(">i", value)
    data = data[3]
    result = struct.unpack(">b", data)[0]
    frame.stack.append(result)
コード例 #5
0
ファイル: ops_arrays.py プロジェクト: MatevzFa/pyjvm
def newarray(frame):
    atype = ord(frame.code[frame.pc])
    frame.pc += 1
    count = frame.stack.pop()
    jassert_int(count)
    if count < 0:
        frame.vm.raise_exception(frame, "java/lang/NegativeArraySizeException")
        return
    values = None
    if atype in [10, 5, 8, 9, 4]:  # int, char, byte, short, boolean
        values = [0] * count
    elif atype == 7:  # double
        values = [("double", 0.0)] * count
    elif atype == 6:  # float
        values = [("float", 0.0)] * count
    elif atype == 11:  # long
        values = [("long", 0)] * count
    else:
        raise Exception(
            "Array creation for ATYPE {0} not yet supported".format(atype))
    prims = {
        4: "[Z",
        5: "[C",
        6: "[F",
        7: "[D",
        8: "[B",
        9: "[S",
        10: "[I",
        11: "[J"
    }
    array_class = frame.vm.get_class(prims[atype])
    jarray = JArray(array_class, frame.vm)
    jarray.values = values
    ref = frame.vm.add_to_heap(jarray)
    frame.stack.append(ref)
コード例 #6
0
ファイル: ops_calc.py プロジェクト: googya/pyjvm
def op_0x60(frame):  # iadd
    value2 = frame.stack.pop()
    value1 = frame.stack.pop()
    result = value1 + value2
    result = cut_to_int(result)
    jassert_int(result)
    frame.stack.append(result)
コード例 #7
0
ファイル: ops_convert.py プロジェクト: MatevzFa/pyjvm
def i2s(frame):
    value = frame.stack.pop()
    jassert_int(value)
    data = struct.pack(">i", value)
    data = data[2:]
    result = struct.unpack(">h", data)[0]
    assert type(result) is int
    frame.stack.append(result)
コード例 #8
0
ファイル: ops_convert.py プロジェクト: MatevzFa/pyjvm
def l2i(frame):
    value = frame.stack.pop()
    jassert_long(value)
    data = struct.pack(">q", value[1])
    data = data[4:]
    result = struct.unpack(">i", data)[0]
    jassert_int(result)
    frame.stack.append(result)
コード例 #9
0
ファイル: ops_convert.py プロジェクト: MatevzFa/pyjvm
def i2c(frame):
    value = frame.stack.pop()
    jassert_int(value)
    data = struct.pack(">i", value)
    data = data[2:]
    result = struct.unpack(">H", data)[0]
    assert type(result) is int
    assert 0 <= result <= int(math.pow(2, 16))
    frame.stack.append(result)
コード例 #10
0
ファイル: ops_cond.py プロジェクト: googya/pyjvm
def op_0x99(frame):  # if_eq
    byte1 = ord(frame.code[frame.pc])
    byte2 = ord(frame.code[frame.pc + 1])
    frame.pc += 2
    offset = struct.unpack(">h", chr(byte1) + chr(byte2))[0]
    value = frame.stack.pop()
    jassert_int(value)
    if value == 0:
        frame.pc += offset - 2 - 1
コード例 #11
0
def ifle(frame):
    byte1 = ord(frame.code[frame.pc])
    byte2 = ord(frame.code[frame.pc + 1])
    frame.pc += 2
    offset = struct.unpack(">h", chr(byte1) + chr(byte2))[0]
    value = frame.stack.pop()
    jassert_int(value)
    if value <= 0:
        frame.pc += offset - 2 - 1
コード例 #12
0
ファイル: ops_shift.py プロジェクト: googya/pyjvm
def op_0x79(frame):  # lshl
    value2 = frame.stack.pop()
    value1 = frame.stack.pop()
    jassert_int(value2)
    jassert_long(value1)
    value2 &= 0b111111
    result = value1[1] << value2
    result = ("long", cut_to_long(result))
    jassert_long(result)
    frame.stack.append(result)
コード例 #13
0
def lshr(frame):
    value2 = frame.stack.pop()
    value1 = frame.stack.pop()
    jassert_int(value2)
    jassert_long(value1)
    value2 &= 0b111111
    result = value1[1] >> value2
    result = ("long", cut_to_long(result))
    jassert_long(result)
    frame.stack.append(result)
コード例 #14
0
def if_icmpgt(frame):
    byte1 = ord(frame.code[frame.pc])
    byte2 = ord(frame.code[frame.pc + 1])
    frame.pc += 2
    offset = struct.unpack(">h", chr(byte1) + chr(byte2))[0]
    value2 = frame.stack.pop()
    value1 = frame.stack.pop()
    jassert_int(value1)
    jassert_int(value2)
    if value1 > value2:
        frame.pc += offset - 2 - 1
コード例 #15
0
ファイル: ops_cond.py プロジェクト: googya/pyjvm
def op_0xa4(frame):  # if_icmple
    byte1 = ord(frame.code[frame.pc])
    byte2 = ord(frame.code[frame.pc + 1])
    frame.pc += 2
    offset = struct.unpack(">h", chr(byte1) + chr(byte2))[0]
    value2 = frame.stack.pop()
    value1 = frame.stack.pop()
    jassert_int(value1)
    jassert_int(value2)
    if value1 <= value2:
        frame.pc += offset - 2 - 1
コード例 #16
0
ファイル: ops_calc.py プロジェクト: MatevzFa/pyjvm
def cut_to_int(value):
    if -2147483648 <= value <= 2147483647:
        return int(value)
    if value & FLAG32:
        value &= 0xFFFFFFFF
        value ^= 0xFFFFFFFF
        value += 1
        value *= -1
    else:
        value &= 0xFFFFFFFF
    jassert_int(value)
    return int(value)
コード例 #17
0
ファイル: ops_calc.py プロジェクト: googya/pyjvm
def cut_to_int(value):
    if -2147483648 <= value <= 2147483647:
        return int(value)
    if value & FLAG32:
        value &= 0xFFFFFFFF
        value ^= 0xFFFFFFFF
        value += 1
        value *= -1
    else:
        value &= 0xFFFFFFFF
    jassert_int(value)
    return int(value)
コード例 #18
0
def lushr(frame):
    value2 = frame.stack.pop()
    value1 = frame.stack.pop()
    jassert_long(value1)
    jassert_int(value2)
    value2 &= 0b111111
    data = struct.pack(">q", value1[1])
    result = struct.unpack(">Q", data)[0]
    result >>= value2
    data = struct.pack(">Q", result)
    result = struct.unpack(">q", data)[0]
    result = ("long", cut_to_long(result))
    jassert_long(result)
    frame.stack.append(result)
コード例 #19
0
ファイル: ops_convert.py プロジェクト: googya/pyjvm
def op_0x8e(frame):  # d2i
    value = frame.stack.pop()
    jassert_double(value)
    if value[1] is None:
        frame.stack.append(0)
    else:
        if value[1] < -2147483648:  # -1 * math.pow(2, 31)
            result = -2147483648
        elif value[1] > 2147483647:  # math.pow(2, 31) - 1
            result = 2147483647
        else:
            result = int(value[1])
        jassert_int(result)
        frame.stack.append(result)
コード例 #20
0
ファイル: ops_convert.py プロジェクト: MatevzFa/pyjvm
def f2i(frame):
    value = frame.stack.pop()
    jassert_float(value)
    if value[1] is None:
        frame.stack.append(0)
    else:
        if value[1] < -2147483648:  # -1 * math.pow(2, 31)
            result = -2147483648
        elif value[1] > 2147483647:  # math.pow(2, 31) - 1
            result = 2147483647
        else:
            result = int(value[1])
        jassert_int(result)
        frame.stack.append(result)
コード例 #21
0
ファイル: ops_arrays.py プロジェクト: MatevzFa/pyjvm
def aaload(frame):
    index = frame.stack.pop()
    ref = frame.stack.pop()
    jassert_int(index)
    if ref is None:
        frame.vm.raise_exception(frame, "java/lang/NullPointerException")
        return
    jassert_ref(ref)
    array = frame.vm.heap[ref[1]]
    values = array.values
    if index < 0 or index >= len(values):
        frame.vm.raise_exception(frame,
                                 "java/lang/ArrayIndexOutOfBoundsException")
        return
    frame.stack.append(values[index])
コード例 #22
0
ファイル: ops_arrays.py プロジェクト: 4toblerone/pyjvm
def aaload(frame):
    index = frame.stack.pop()
    ref = frame.stack.pop()
    jassert_int(index)
    if ref is None:
        frame.vm.raise_exception(frame, "java/lang/NullPointerException")
        return
    jassert_ref(ref)
    array = frame.vm.heap[ref[1]]
    values = array.values
    if index < 0 or index >= len(values):
        frame.vm.raise_exception(frame,
                                 "java/lang/ArrayIndexOutOfBoundsException")
        return
    frame.stack.append(values[index])
コード例 #23
0
ファイル: ops_arrays.py プロジェクト: 4toblerone/pyjvm
def sastore(frame):
    value = frame.stack.pop()
    index = frame.stack.pop()
    ref = frame.stack.pop()
    jassert_int(value)
    jassert_int(index)
    if ref is None:
        frame.vm.raise_exception(frame, "java/lang/NullPointerException")
        return
    jassert_ref(ref)
    array = frame.vm.heap[ref[1]]
    jassert_array(array)
    values = array.values
    if index < 0 or index >= len(values):
        frame.vm.raise_exception(frame,
                                 "java/lang/ArrayIndexOutOfBoundsException")
        return
    values[index] = value
コード例 #24
0
ファイル: ops_arrays.py プロジェクト: MatevzFa/pyjvm
def sastore(frame):
    value = frame.stack.pop()
    index = frame.stack.pop()
    ref = frame.stack.pop()
    jassert_int(value)
    jassert_int(index)
    if ref is None:
        frame.vm.raise_exception(frame, "java/lang/NullPointerException")
        return
    jassert_ref(ref)
    array = frame.vm.heap[ref[1]]
    jassert_array(array)
    values = array.values
    if index < 0 or index >= len(values):
        frame.vm.raise_exception(frame,
                                 "java/lang/ArrayIndexOutOfBoundsException")
        return
    values[index] = value
コード例 #25
0
ファイル: ops_arrays.py プロジェクト: 4toblerone/pyjvm
def anewarray(frame):
    index = (ord(frame.code[frame.pc]) << 8) + ord(frame.code[frame.pc + 1])
    frame.pc += 2
    cp_item = frame.this_class.constant_pool[index]
    assert cp_item[0] == 7  # CONSTANT_Class
    klass_name = frame.this_class.constant_pool[cp_item[1]][1]
    assert type(klass_name) is unicode
    frame.vm.get_class(klass_name)  # make sure it is loaded

    count = frame.stack.pop()
    jassert_int(count)
    if count < 0:
        frame.vm.raise_exception(frame, "java/lang/NegativeArraySizeException")
        return

    values = [None] * count
    array_class = frame.vm.get_class("[L" + klass_name + ";")
    jarray = JArray(array_class, frame.vm)
    jarray.values = values
    ref = frame.vm.add_to_heap(jarray)
    frame.stack.append(ref)
コード例 #26
0
ファイル: ops_arrays.py プロジェクト: MatevzFa/pyjvm
def anewarray(frame):
    index = (ord(frame.code[frame.pc]) << 8) + ord(frame.code[frame.pc + 1])
    frame.pc += 2
    cp_item = frame.this_class.constant_pool[index]
    assert cp_item[0] == 7  # CONSTANT_Class
    klass_name = frame.this_class.constant_pool[cp_item[1]][1]
    assert type(klass_name) is unicode
    frame.vm.get_class(klass_name)  # make sure it is loaded

    count = frame.stack.pop()
    jassert_int(count)
    if count < 0:
        frame.vm.raise_exception(frame, "java/lang/NegativeArraySizeException")
        return

    values = [None] * count
    array_class = frame.vm.get_class("[L" + klass_name + ";")
    jarray = JArray(array_class, frame.vm)
    jarray.values = values
    ref = frame.vm.add_to_heap(jarray)
    frame.stack.append(ref)
コード例 #27
0
ファイル: ops_cond.py プロジェクト: googya/pyjvm
def op_0xaa(frame):  # tableswitch
    index = frame.stack.pop()
    jassert_int(index)
    last_pc = frame.pc - 1
    while frame.pc % 4 != 0:
        frame.pc += 1
    default = struct.unpack(">i", frame.code[frame.pc:frame.pc + 4])[0]
    frame.pc += 4
    low = struct.unpack(">i", frame.code[frame.pc:frame.pc + 4])[0]
    frame.pc += 4
    high = struct.unpack(">i", frame.code[frame.pc:frame.pc + 4])[0]
    frame.pc += 4
    if index < low or index > high:
        frame.pc = last_pc + default
        return
    count = high - low + 1
    offsets = []
    for i in range(count):
        offsets.append(struct.unpack(">i",
                                     frame.code[frame.pc:frame.pc + 4])[0])
        frame.pc += 4
    frame.pc = last_pc + offsets[index - low]
コード例 #28
0
def tableswitch(frame):
    index = frame.stack.pop()
    jassert_int(index)
    last_pc = frame.pc - 1
    while frame.pc % 4 != 0:
        frame.pc += 1
    default = struct.unpack(">i", frame.code[frame.pc:frame.pc + 4])[0]
    frame.pc += 4
    low = struct.unpack(">i", frame.code[frame.pc:frame.pc + 4])[0]
    frame.pc += 4
    high = struct.unpack(">i", frame.code[frame.pc:frame.pc + 4])[0]
    frame.pc += 4
    if index < low or index > high:
        frame.pc = last_pc + default
        return
    count = high - low + 1
    offsets = []
    for i in range(count):
        offsets.append(
            struct.unpack(">i", frame.code[frame.pc:frame.pc + 4])[0])
        frame.pc += 4
    frame.pc = last_pc + offsets[index - low]
コード例 #29
0
def ixor(frame):
    value2 = frame.stack.pop()
    value1 = frame.stack.pop()
    jassert_int(value2)
    jassert_int(value1)
    result = value1 ^ value2
    result = cut_to_int(result)
    jassert_int(result)
    frame.stack.append(result)
コード例 #30
0
ファイル: ops_shift.py プロジェクト: googya/pyjvm
def op_0x80(frame):  # ior
    value2 = frame.stack.pop()
    value1 = frame.stack.pop()
    jassert_int(value2)
    jassert_int(value1)
    result = value1 | value2
    result = cut_to_int(result)
    jassert_int(result)
    frame.stack.append(result)
コード例 #31
0
ファイル: ops_shift.py プロジェクト: googya/pyjvm
def op_0x7e(frame):  # iand
    value2 = frame.stack.pop()
    value1 = frame.stack.pop()
    jassert_int(value2)
    jassert_int(value1)
    result = value1 & value2
    result = cut_to_int(result)
    jassert_int(result)
    frame.stack.append(result)
コード例 #32
0
ファイル: ops_shift.py プロジェクト: googya/pyjvm
def op_0x78(frame):  # ishl
    value2 = frame.stack.pop()
    value1 = frame.stack.pop()
    jassert_int(value2)
    jassert_int(value1)
    value2 &= 0b11111
    result = value1 << value2
    result = cut_to_int(result)
    jassert_int(result)
    frame.stack.append(result)
コード例 #33
0
def ishr(frame):
    value2 = frame.stack.pop()
    value1 = frame.stack.pop()
    jassert_int(value2)
    jassert_int(value1)
    value2 &= 0b11111
    result = value1 >> value2
    result = cut_to_int(result)
    jassert_int(result)
    frame.stack.append(result)
コード例 #34
0
def iushr(frame):
    value2 = frame.stack.pop()
    value1 = frame.stack.pop()
    jassert_int(value2)
    jassert_int(value1)
    value2 &= 0b11111
    data = struct.pack(">i", value1)
    result = struct.unpack(">I", data)[0]
    result >>= value2
    data = struct.pack(">I", result)
    result = struct.unpack(">i", data)[0]
    jassert_int(value1)
    frame.stack.append(result)
コード例 #35
0
ファイル: ops_setget.py プロジェクト: googya/pyjvm
def op_0x3e(frame):  # istore_3
    value = frame.stack.pop()
    jassert_int(value)
    frame.args[3] = value
コード例 #36
0
ファイル: ops_setget.py プロジェクト: googya/pyjvm
def op_0x3d(frame):  # istore_2
    value = frame.stack.pop()
    jassert_int(value)
    frame.args[2] = value
コード例 #37
0
ファイル: ops_setget.py プロジェクト: googya/pyjvm
def op_0x3c(frame):  # istore_1
    value = frame.stack.pop()
    jassert_int(value)
    frame.args[1] = value
コード例 #38
0
ファイル: ops_setget.py プロジェクト: googya/pyjvm
def op_0x3b(frame):  # istore_0
    value = frame.stack.pop()
    jassert_int(value)
    frame.args[0] = value
コード例 #39
0
ファイル: ops_setget.py プロジェクト: googya/pyjvm
def op_0x36(frame):  # istore
    index = ord(frame.code[frame.pc])
    frame.pc += 1
    value = frame.stack.pop()
    jassert_int(value)
    frame.args[index] = value
コード例 #40
0
ファイル: ops_convert.py プロジェクト: MatevzFa/pyjvm
def i2d(frame):
    value = frame.stack.pop()
    jassert_int(value)
    frame.stack.append(("double", float(value)))
コード例 #41
0
ファイル: ops_convert.py プロジェクト: MatevzFa/pyjvm
def i2f(frame):
    value = frame.stack.pop()
    jassert_int(value)
    frame.stack.append(("float", float(value)))
コード例 #42
0
ファイル: ops_convert.py プロジェクト: MatevzFa/pyjvm
def i2l(frame):
    value = frame.stack.pop()
    jassert_int(value)
    value = long(value)  # no real need
    frame.stack.append(("long", value))
コード例 #43
0
def iload(frame):
    index = ord(frame.code[frame.pc])
    frame.pc += 1
    value = frame.args[index]
    jassert_int(value)
    frame.stack.append(value)
コード例 #44
0
def iload_3(frame):
    value = frame.args[3]
    jassert_int(value)
    frame.stack.append(value)
コード例 #45
0
def istore_3(frame):
    value = frame.stack.pop()
    jassert_int(value)
    frame.args[3] = value
コード例 #46
0
def istore(frame):
    index = ord(frame.code[frame.pc])
    frame.pc += 1
    value = frame.stack.pop()
    jassert_int(value)
    frame.args[index] = value