def arraylength(frame): ref = frame.stack.pop() if ref is None: frame.vm.raise_exception(frame, "java/lang/NullPointerException") return assert ref[0] == "ref" array = frame.vm.heap[ref[1]] jassert_array(array) length = len(array.values) frame.stack.append(length)
def vmo1_write___BII_V(frame, args): '''java.io.OutputStream void write(byte[] b, int off, int len) ''' buf = args[1] offset = args[2] length = args[3] arr = frame.vm.heap[buf[1]] jassert_array(arr) chars = arr.values for index in range(offset, offset + length): sys.stdout.write(chr(chars[index]))
def daload(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]] jassert_array(array) values = array.values if index < 0 or index >= len(values): frame.vm.raise_exception(frame, "java/lang/ArrayIndexOutOfBoundsException") return frame.stack.append(values[index])
def java_lang_System_arraycopy__Ljava_lang_Object_ILjava_lang_Object_II_V(frame, args): #ref1, index1, ref2, index2, length count = args[4] index2 = args[3] ref2 = args[2] index1 = args[1] ref1 = args[0] assert type(count) is int assert type(index1) is int assert type(index2) is int assert type(ref1) is tuple and ref1[0] == "ref" assert type(ref2) is tuple and ref2[0] == "ref" arr1 = frame.vm.heap[ref1[1]] arr2 = frame.vm.heap[ref2[1]] jassert_array(arr1) jassert_array(arr2) # TODO NPE arr2.values[index2:index2 + count] = arr1.values[index1:index1 + count]
def java_lang_System_arraycopy__Ljava_lang_Object_ILjava_lang_Object_II_V( frame, args): #ref1, index1, ref2, index2, length count = args[4] index2 = args[3] ref2 = args[2] index1 = args[1] ref1 = args[0] assert type(count) is int assert type(index1) is int assert type(index2) is int assert type(ref1) is tuple and ref1[0] == "ref" assert type(ref2) is tuple and ref2[0] == "ref" arr1 = frame.vm.heap[ref1[1]] arr2 = frame.vm.heap[ref2[1]] jassert_array(arr1) jassert_array(arr2) # TODO NPE arr2.values[index2:index2 + count] = arr1.values[index1:index1 + count]