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
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)
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)])
def new_object(self): from rtda.heap.Object import Object return Object.new_object(self)