示例#1
0
文件: ops_cond.py 项目: googya/pyjvm
def op_0xc0(frame):  # checkcast
    index = (ord(frame.code[frame.pc]) << 8) + ord(frame.code[frame.pc + 1])
    frame.pc += 2
    ref = frame.stack.pop()
    if ref is None:
        frame.stack.append(ref)
        return
    cp_item = frame.this_class.constant_pool[index]
    assert cp_item[0] == 7  # CONSTANT_Class_info
    klass_name = frame.this_class.constant_pool[cp_item[1]][1]
    klass = frame.vm.get_class(klass_name)
    object_klass = None
    if ref[1] > 0:  # regular ref
        o = frame.vm.heap[ref[1]]
        object_klass = o.java_class
    else:  # vmo
        object_klass = frame.vm.get_class(VM_CLASS_NAMES[ref[1]])

    if checkcast(object_klass, klass, frame.vm):
        frame.stack.append(ref)
    else:
        frame.vm.raise_exception(frame, "java/lang/ClassCastException")
示例#2
0
def instanceof(frame):
    index = (ord(frame.code[frame.pc]) << 8) + ord(frame.code[frame.pc + 1])
    frame.pc += 2
    ref = frame.stack.pop()
    if ref is None:
        frame.stack.append(0)
        return
    cp_item = frame.this_class.constant_pool[index]
    assert cp_item[0] == 7  # CONSTANT_Class_info
    klass_name = frame.this_class.constant_pool[cp_item[1]][1]
    klass = frame.vm.get_class(klass_name)
    o = frame.vm.heap[ref[1]]
    object_klass = None
    if ref[1] > 0:  # regular ref
        o = frame.vm.heap[ref[1]]
        object_klass = o.java_class
    else:  # vmo
        object_klass = frame.vm.get_class(VM_CLASS_NAMES[ref[1]])

    if checkcast(object_klass, klass, frame.vm):
        frame.stack.append(1)
    else:
        frame.stack.append(0)
示例#3
0
def instanceof(frame):
    index = (ord(frame.code[frame.pc]) << 8) + ord(frame.code[frame.pc + 1])
    frame.pc += 2
    ref = frame.stack.pop()
    if ref is None:
        frame.stack.append(0)
        return
    cp_item = frame.this_class.constant_pool[index]
    assert cp_item[0] == 7  # CONSTANT_Class_info
    klass_name = frame.this_class.constant_pool[cp_item[1]][1]
    klass = frame.vm.get_class(klass_name)
    o = frame.vm.heap[ref[1]]
    object_klass = None
    if ref[1] > 0:  # regular ref
        o = frame.vm.heap[ref[1]]
        object_klass = o.java_class
    else:  # vmo
        object_klass = frame.vm.get_class(VM_CLASS_NAMES[ref[1]])

    if checkcast(object_klass, klass, frame.vm):
        frame.stack.append(1)
    else:
        frame.stack.append(0)
示例#4
0
def checkcast_(
        frame
):  # FIXME: rename pyjvm.checkcast and rename this func to checkcast
    index = (ord(frame.code[frame.pc]) << 8) + ord(frame.code[frame.pc + 1])
    frame.pc += 2
    ref = frame.stack.pop()
    if ref is None:
        frame.stack.append(ref)
        return
    cp_item = frame.this_class.constant_pool[index]
    assert cp_item[0] == 7  # CONSTANT_Class_info
    klass_name = frame.this_class.constant_pool[cp_item[1]][1]
    klass = frame.vm.get_class(klass_name)
    object_klass = None
    if ref[1] > 0:  # regular ref
        o = frame.vm.heap[ref[1]]
        object_klass = o.java_class
    else:  # vmo
        object_klass = frame.vm.get_class(VM_CLASS_NAMES[ref[1]])

    if checkcast(object_klass, klass, frame.vm):
        frame.stack.append(ref)
    else:
        frame.vm.raise_exception(frame, "java/lang/ClassCastException")