示例#1
0
def j_string(loader: ClassLoader, python_str):
    """
    根据python字符串返回相应的Java字符串实例
    :param loader: 
    :param python_str: 
    :return:
    """

    # 如果Java字符串已经在池中,直接返回
    interned_str = interned_strings.get(python_str)
    if interned_str:
        return interned_str

    # 把python字符串(utf-8格式)转成Java字符数组(utf-16格式)
    chars = string_to_utf16(python_str)
    # 创建一个Java字符串实例
    j_chars = Object(loader.load_class("[C"), chars)

    # 把字符串实例的value变量设置成刚刚转换过来的字符数组
    j_str = loader.load_class("java/lang/String").new_object()
    j_str.set_ref_var("value", "[C", j_chars)

    # 把Java字符串放入池中
    interned_strings[python_str] = j_str
    return j_str
示例#2
0
def arraycopy(frame: Frame):
    local_vars = frame.local_vars
    # 从局部变量表中获取5个参数
    src = local_vars.get_ref(0)
    src_pos = local_vars.get_numeric(1)
    dest = local_vars.get_ref(2)
    dest_pos = local_vars.get_numeric(3)
    length = local_vars.get_numeric(4)

    # 源数据和目标数组都不能为None,否则按照System类的Javadoc应抛出NullPointerException异常
    if src is None and dest is None:
        raise RuntimeError("java.lang.NullPointerException")

    # 源数据和目标数据必须兼容才能拷贝,否则抛出ArrayStoreException异常
    if not check_array_copy(src, dest):
        raise RuntimeError("java.lang.ArrayStoreException")

    # 检查src_pos、dest_pos和length参数,有问题则抛出IndexOutOfBoundsException异常
    if src_pos < 0 or dest_pos < 0 or length < 0 \
            or src_pos + length > src.array_length() \
            or dest_pos + length > dest.array_length():
        raise RuntimeError("java.lang.IndexOutOfBoundsException")

    Object.array_copy(src, dest, src_pos, dest_pos, length)
示例#3
0
 def new_array(self, count):
     from rtda.heap.Object import Object
     if not self.is_array():
         raise RuntimeError("Not array class: " + self.name)
     return Object(self, [0 for _ in range(count)])
示例#4
0
 def new_object(self):
     from rtda.heap.Object import Object
     return Object.new_object(self)