Lines Matching defs:vm

6  * $Id: vm.c,v 1.17 2010/09/13 18:43:04 asau Exp $
53 #define FICL_VM_CHECK(vm) \
54 FICL_VM_ASSERT(vm, (*(vm->ip - 1)) == vm->runningWord)
56 #define FICL_VM_CHECK(vm)
63 ficlVmBranchRelative(ficlVm *vm, int offset)
65 vm->ip += offset;
70 * Creates a virtual machine either from scratch (if vm is NULL on entry)
75 ficlVmCreate(ficlVm *vm, unsigned nPStack, unsigned nRStack)
77 if (vm == NULL) {
78 vm = (ficlVm *)ficlMalloc(sizeof (ficlVm));
79 FICL_ASSERT(NULL, vm);
80 memset(vm, 0, sizeof (ficlVm));
83 if (vm->dataStack)
84 ficlStackDestroy(vm->dataStack);
85 vm->dataStack = ficlStackCreate(vm, "data", nPStack);
87 if (vm->returnStack)
88 ficlStackDestroy(vm->returnStack);
89 vm->returnStack = ficlStackCreate(vm, "return", nRStack);
92 if (vm->floatStack)
93 ficlStackDestroy(vm->floatStack);
94 vm->floatStack = ficlStackCreate(vm, "float", nPStack);
97 ficlVmReset(vm);
98 return (vm);
107 ficlVmDestroy(ficlVm *vm)
109 if (vm) {
110 ficlFree(vm->dataStack);
111 ficlFree(vm->returnStack);
113 ficlFree(vm->floatStack);
115 ficlFree(vm);
127 ficlVmExecuteWord(ficlVm *vm, ficlWord *pWord)
129 ficlVmInnerLoop(vm, pWord);
133 ficlVmOptimizeJumpToJump(ficlVm *vm, ficlIp ip)
149 ficlVmOptimizeJumpToJump(vm, destination);
198 _CHECK_STACK(vm->dataStack, dataTop, pop, push)
200 _CHECK_STACK(vm->floatStack, floatTop, pop, push)
202 _CHECK_STACK(vm->returnStack, returnTop, pop, push)
206 vm->floatStack->top = floatTop;
208 floatTop = vm->floatStack->top;
216 vm->returnStack->frame = frame;
218 frame = vm->returnStack->frame;
225 vm->ip = (ficlIp)ip; \
226 vm->dataStack->top = dataTop; \
227 vm->returnStack->top = returnTop; \
232 ip = (ficlInstruction *)vm->ip; \
233 dataTop = vm->dataStack->top; \
234 returnTop = vm->returnStack->top; \
239 ficlVmInnerLoop(ficlVm *vm, ficlWord *fw)
268 oldExceptionHandler = vm->exceptionHandler;
270 vm->exceptionHandler = &exceptionHandler;
277 vm->exceptionHandler = oldExceptionHandler;
278 ficlVmThrow(vm, except);
294 ficlVmThrowError(vm,
1155 ficlVmOptimizeJumpToJump(vm, vm->ip - 1);
1164 ficlVmOptimizeJumpToJump(vm, vm->ip - 1);
1314 ficlDictionary *dictionary = ficlVmGetDictionary(vm);
1401 dictionary = ficlVmGetDictionary(vm);
1411 dictionary = ficlVmGetDictionary(vm);
1978 * (See the vm.c for its implementation of member function
2027 (++dataTop)->p = &vm->user[i];
2049 (vm)->runningWord = fw;
2050 fw->code(vm);
2057 vm->exceptionHandler = oldExceptionHandler;
2065 ficlVmGetDictionary(ficlVm *vm)
2067 FICL_VM_ASSERT(vm, vm);
2068 return (vm->callback.system->dictionary);
2080 ficlVmGetString(ficlVm *vm, ficlCountedString *counted, char delimiter)
2082 ficlString s = ficlVmParseStringEx(vm, delimiter, 0);
2102 ficlVmGetWord(ficlVm *vm)
2104 ficlString s = ficlVmGetWord0(vm);
2107 ficlVmThrow(vm, FICL_VM_STATUS_RESTART);
2123 ficlVmGetWord0(ficlVm *vm)
2125 char *trace = ficlVmGetInBuf(vm);
2126 char *stop = ficlVmGetInBufEnd(vm);
2151 ficlVmUpdateTib(vm, trace);
2163 ficlVmGetWordToPad(ficlVm *vm)
2166 char *pad = (char *)vm->pad;
2167 s = ficlVmGetWord(vm);
2182 * updates the vm input buffer to consume all these chars, including the
2188 ficlVmParseString(ficlVm *vm, char delimiter)
2190 return (ficlVmParseStringEx(vm, delimiter, 1));
2194 ficlVmParseStringEx(ficlVm *vm, char delimiter, char skipLeadingDelimiters)
2197 char *trace = ficlVmGetInBuf(vm);
2198 char *stop = ficlVmGetInBufEnd(vm);
2222 ficlVmUpdateTib(vm, trace);
2231 ficlVmPop(ficlVm *vm)
2233 return (ficlStackPop(vm->dataStack));
2240 ficlVmPush(ficlVm *vm, ficlCell c)
2242 ficlStackPush(vm->dataStack, c);
2249 ficlVmPopIP(ficlVm *vm)
2251 vm->ip = (ficlIp)(ficlStackPopPointer(vm->returnStack));
2258 ficlVmPushIP(ficlVm *vm, ficlIp newIP)
2260 ficlStackPushPointer(vm->returnStack, (void *)vm->ip);
2261 vm->ip = newIP;
2269 ficlVmPushTib(ficlVm *vm, char *text, ficlInteger nChars, ficlTIB *pSaveTib)
2272 *pSaveTib = vm->tib;
2274 vm->tib.text = text;
2275 vm->tib.end = text + nChars;
2276 vm->tib.index = 0;
2280 ficlVmPopTib(ficlVm *vm, ficlTIB *pTib)
2283 vm->tib = *pTib;
2291 ficlVmQuit(ficlVm *vm)
2293 ficlStackReset(vm->returnStack);
2294 vm->restart = 0;
2295 vm->ip = NULL;
2296 vm->runningWord = NULL;
2297 vm->state = FICL_VM_STATE_INTERPRET;
2298 vm->tib.text = NULL;
2299 vm->tib.end = NULL;
2300 vm->tib.index = 0;
2301 vm->pad[0] = '\0';
2302 vm->sourceId.i = 0;
2309 ficlVmReset(ficlVm *vm)
2311 ficlVmQuit(vm);
2312 ficlStackReset(vm->dataStack);
2314 ficlStackReset(vm->floatStack);
2316 vm->base = 10;
2321 * Binds the specified output callback to the vm. If you pass NULL,
2325 ficlVmSetTextOut(ficlVm *vm, ficlOutputFunction textOut)
2327 vm->callback.textOut = textOut;
2331 ficlVmTextOut(ficlVm *vm, char *text)
2333 ficlCallbackTextOut((ficlCallback *)vm, text);
2338 ficlVmErrorOut(ficlVm *vm, char *text)
2340 ficlCallbackErrorOut((ficlCallback *)vm, text);
2348 ficlVmThrow(ficlVm *vm, int except)
2350 if (vm->exceptionHandler)
2351 longjmp(*(vm->exceptionHandler), except);
2355 ficlVmThrowError(ficlVm *vm, char *fmt, ...)
2360 vsprintf(vm->pad, fmt, list);
2362 strcat(vm->pad, "\n");
2364 ficlVmErrorOut(vm, vm->pad);
2365 longjmp(*(vm->exceptionHandler), FICL_VM_STATUS_ERROR_EXIT);
2369 ficlVmThrowErrorVararg(ficlVm *vm, char *fmt, va_list list)
2371 vsprintf(vm->pad, fmt, list);
2377 strcat(vm->pad, "\n");
2379 ficlVmErrorOut(vm, vm->pad);
2380 longjmp(*(vm->exceptionHandler), FICL_VM_STATUS_ERROR_EXIT);
2388 ficlVmEvaluate(ficlVm *vm, char *s)
2391 ficlCell id = vm->sourceId;
2393 vm->sourceId.i = -1;
2395 returnValue = ficlVmExecuteString(vm, string);
2396 vm->sourceId = id;
2411 * and the vm has been reset to recover (some or all
2415 * time to delete the vm, etc -- or you can ignore this
2419 ficlVmExecuteString(ficlVm *vm, ficlString s)
2421 ficlSystem *system = vm->callback.system;
2429 FICL_VM_ASSERT(vm, vm);
2430 FICL_VM_ASSERT(vm, system->interpreterLoop[0]);
2432 ficlVmPushTib(vm, FICL_STRING_GET_POINTER(s),
2438 oldState = vm->exceptionHandler;
2441 vm->exceptionHandler = &vmState;
2446 if (vm->restart) {
2447 vm->runningWord->code(vm);
2448 vm->restart = 0;
2450 ficlVmPushIP(vm, &(system->interpreterLoop[0]));
2453 ficlVmInnerLoop(vm, 0);
2457 vm->restart = 1;
2462 ficlVmPopIP(vm);
2464 if ((vm->state != FICL_VM_STATE_COMPILE) &&
2465 (vm->sourceId.i == 0))
2466 ficlVmTextOut(vm, FICL_PROMPT);
2476 if (vm->state == FICL_VM_STATE_COMPILE) {
2483 ficlVmQuit(vm);
2490 if (vm->state == FICL_VM_STATE_COMPILE) {
2498 ficlVmReset(vm);
2502 vm->exceptionHandler = oldState;
2503 ficlVmPopTib(vm, &saveficlTIB);
2525 ficlVmExecuteXT(ficlVm *vm, ficlWord *pWord)
2532 FICL_VM_ASSERT(vm, vm);
2533 FICL_VM_ASSERT(vm, vm->callback.system->exitInnerWord);
2539 oldRunningWord = vm->runningWord;
2543 oldState = vm->exceptionHandler;
2545 vm->exceptionHandler = &vmState;
2549 ficlVmPopIP(vm);
2551 ficlVmPushIP(vm, &(vm->callback.system->exitInnerWord));
2555 ficlVmExecuteWord(vm, pWord);
2556 ficlVmInnerLoop(vm, 0);
2572 vm->exceptionHandler = oldState;
2573 ficlVmThrow(vm, except);
2578 vm->exceptionHandler = oldState;
2579 vm->runningWord = oldRunningWord;
2592 ficlVmParseNumber(ficlVm *vm, ficlString s)
2597 unsigned base = vm->base;
2647 ficlStackPushInteger(vm->dataStack, accumulator);
2648 if (vm->state == FICL_VM_STATE_COMPILE)
2649 ficlPrimitiveLiteralIm(vm);
2653 ficlStackPushInteger(vm->dataStack, -1);
2655 ficlStackPushInteger(vm->dataStack, 0);
2656 if (vm->state == FICL_VM_STATE_COMPILE)
2657 ficlPrimitiveLiteralIm(vm);
2672 ficlVmDictionarySimpleCheck(ficlVm *vm, ficlDictionary *dictionary, int cells)
2678 ficlVmThrowError(vm, "Error: dictionary full");
2684 ficlVmThrowError(vm, "Error: dictionary underflow");
2687 FICL_IGNORE(vm);
2694 ficlVmDictionaryCheck(ficlVm *vm, ficlDictionary *dictionary, int cells)
2697 ficlVmDictionarySimpleCheck(vm, dictionary, cells);
2701 ficlVmThrowError(vm, "Error: search order overflow");
2704 ficlVmThrowError(vm, "Error: search order underflow");
2707 FICL_IGNORE(vm);
2714 ficlVmDictionaryAllot(ficlVm *vm, ficlDictionary *dictionary, int n)
2716 FICL_VM_DICTIONARY_SIMPLE_CHECK(vm, dictionary, n);
2717 FICL_IGNORE(vm);
2722 ficlVmDictionaryAllotCells(ficlVm *vm, ficlDictionary *dictionary, int cells)
2724 FICL_VM_DICTIONARY_SIMPLE_CHECK(vm, dictionary, cells);
2725 FICL_IGNORE(vm);
2750 ficlVmParseWord(ficlVm *vm, ficlString name)
2752 ficlDictionary *dictionary = ficlVmGetDictionary(vm);
2755 FICL_VM_DICTIONARY_CHECK(vm, dictionary, 0);
2756 FICL_STACK_CHECK(vm->dataStack, 0, 0);
2759 if (vm->callback.system->localsCount > 0) {
2760 tempFW = ficlSystemLookupLocal(vm->callback.system, name);
2765 if (vm->state == FICL_VM_STATE_INTERPRET) {
2768 ficlVmThrowError(vm,
2772 ficlVmExecuteWord(vm, tempFW);
2775 } else { /* (vm->state == FICL_VM_STATE_COMPILE) */
2778 ficlVmExecuteWord(vm, tempFW);