#include "vmbl.h" #include VMBL_Exception VBML_ExecuteInstruction(VMBL_State *vmblState, VMBL_Instruction instruction) { switch (instruction.type) { case INSTRUCTION_PUSH: if (vmblState->stackSize >= VMBL_STACK_SIZE) { return (VMBL_Exception){ EXCEPTION_STACK_OVERFLOW }; } vmblState->stack[vmblState->stackSize++] = instruction.opperand; break; case INSTRUCTION_ADD: if (vmblState->stackSize < 2) { return (VMBL_Exception){ EXCEPTION_STACK_UNDERFLOW }; } vmblState->stack[vmblState->stackSize - 2] += vmblState->stack[vmblState->stackSize - 1]; vmblState->stackSize--; break; default: return (VMBL_Exception) { EXCEPTION_INVALID_OPCODE }; break; } return (VMBL_Exception) { EXCEPTION_NONE }; } void VMBL_Dump(VMBL_State vmblState, VMBL_Exception exception) { fprintf(stderr, "EXCEPTION: %s\n\n", exceptionAsCString(exception)); fprintf(stderr, "Stack:\n"); if (vmblState.stackSize > 0) { for (size_t i = 0; i < vmblState.stackSize; i++) { fprintf(stderr, " 0x%lX: %ld\n", i, vmblState.stack[i]); } } else { fprintf(stderr, " [empty]\n"); } }