@Override public void execute(ExecutionNode node, MethodState mState) { // Use result register to store value to compare. Comparison is handled by payload op. HeapItem item = mState.readRegister(register); mState.assignResultRegister(item); // If switch "falls through", will need the immediate op after this. mState.setPseudoInstructionReturnLocation(child); }
mState.assignResultRegister(HeapItem.newUnknown("[I")); } else { mState.assignResultRegister(dimensions, "[I");
private void executeArrayClone(MethodState callerMethodState, ExecutionNode node) { int instanceRegister = parameterRegisters[0]; HeapItem arrayItem = callerMethodState.peekRegister(instanceRegister); if (arrayItem.isUnknown()) { callerMethodState.assignResultRegister(new UnknownValue(), arrayItem.getType()); } else if (arrayItem.isNull()) { // This operation would have thrown a null pointer exception, and nothing else. Throwable exception = new NullPointerException(); addException(exception); node.clearChildren(); } else { Method m = null; try { m = Object.class.getDeclaredMethod("clone"); m.setAccessible(true); Object clone = m.invoke(arrayItem.getValue()); callerMethodState.assignResultRegister(clone, arrayItem.getType()); } catch (Exception e) { // TODO: should handle exceptions here and bubble them up e.printStackTrace(); } } }
private void doTest(Number... values) { when(instruction.getOpcode()).thenReturn(Opcode.FILLED_NEW_ARRAY_RANGE); when(((VariableRegisterInstruction) instruction).getRegisterCount()).thenReturn(values.length); when(((RegisterRangeInstruction) instruction).getStartRegister()).thenReturn(0); int[] expected = new int[values.length]; for (int i = 0; i < expected.length; i++) { expected[i] = values[i].intValue(); HeapItem item = mock(HeapItem.class); when(item.getValue()).thenReturn(expected[i]); when(item.getType()).thenReturn("I"); when(mState.readRegister(i)).thenReturn(item); } op = (FilledNewArrayOp) opFactory.create(location, addressToLocation, vm); op.execute(node, mState); for (int i = 0; i < expected.length; i++) { verify(mState, times(1)).readRegister(eq(i)); } verify(mState, times(1)).assignResultRegister(eq(expected), eq("[I")); }
verify(mState, times(1)).assignResultRegister(eq(expected), eq("[I"));
@Test public void testUnknownValueGivesUnknownArray() { when(instruction.getOpcode()).thenReturn(Opcode.FILLED_NEW_ARRAY); when(((VariableRegisterInstruction) instruction).getRegisterCount()).thenReturn(2); when(itemD.getValue()).thenReturn(new UnknownValue()); when(itemD.isUnknown()).thenReturn(true); when(itemC.getValue()).thenReturn(3); op = (FilledNewArrayOp) opFactory.create(location, addressToLocation, vm); op.execute(node, mState); verify(mState, times(1)).readRegister(eq(REGISTER_D)); verify(mState, times(1)).readRegister(eq(REGISTER_C)); ArgumentCaptor<HeapItem> setItem = ArgumentCaptor.forClass(HeapItem.class); verify(mState, times(1)).assignResultRegister(setItem.capture()); assertEquals(UnknownValue.class, setItem.getValue().getValue().getClass()); assertEquals("[I", setItem.getValue().getType()); assertEquals("filled-new-array {r0, r1}, [I", op.toString()); }
@Test public void testUnknownValueGivesUnknownArray() { when(instruction.getOpcode()).thenReturn(Opcode.FILLED_NEW_ARRAY_RANGE); when(((VariableRegisterInstruction) instruction).getRegisterCount()).thenReturn(6); when(((RegisterRangeInstruction) instruction).getStartRegister()).thenReturn(0); for (int i = 0; i < 6; i++) { HeapItem item = mock(HeapItem.class); when(item.getValue()).thenReturn(i == 3 ? new UnknownValue() : i); when(item.getType()).thenReturn("I"); when(mState.readRegister(i)).thenReturn(item); } op = (FilledNewArrayOp) opFactory.create(location, addressToLocation, vm); op.execute(node, mState); for (int i = 0; i < 6; i++) { verify(mState, times(1)).readRegister(eq(i)); } ArgumentCaptor<HeapItem> setItem = ArgumentCaptor.forClass(HeapItem.class); verify(mState, times(1)).assignResultRegister(setItem.capture()); assertEquals(UnknownValue.class, setItem.getValue().getValue().getClass()); assertEquals("[I", setItem.getValue().getType()); assertEquals("filled-new-array/range {r0 .. r5}, [I", op.toString()); }
callerMethodState.assignResultRegister(item);
callerContext.getMethodState().assignResultRegister(consensus); } else { if (methodSignature.contains(";-><init>(")) {
callerMethodState.assignResultRegister(returnItem);