ifnull.c
1 /* 2 * Bean Java VM 3 * Copyright (C) 2005-2015 Christian Lins <christian@lins.me> 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 #include <debug.h> 19 #include <vm.h> 20 21 /* Branch if reference is NULL */ 22 void do_IFNULL(Thread *thread) 23 { 24 dbgmsg("IFNULL"); 25 26 Varframe *ref; 27 uint16_t offset; 28 Stackframe *frame = current_frame(thread); 29 30 /* Pop reference from operand stack */ 31 Stack_pop(&(frame->operandStack), (void **) &ref); 32 33 /* Get branch offset */ 34 offset = Get2ByteOperand(current_frame(thread)); 35 36 /* Check if we should branch (ref == NULL) */ 37 if (ref->data.ptr == NULL) { 38 /* -1 because the IP points to the first operand byte */ 39 current_frame(thread)->instPtr += offset - 1; // Correct? 40 } else { 41 /* else do nothing (continue with execution) */ 42 //thread->InstructionPointer++; // done in exec_thread 43 } 44 }