| \ ***************************************************************************** |
| \ * Copyright (c) 2011 IBM Corporation |
| \ * All rights reserved. |
| \ * This program and the accompanying materials |
| \ * are made available under the terms of the BSD License |
| \ * which accompanies this distribution, and is available at |
| \ * http://www.opensource.org/licenses/bsd-license.php |
| \ * |
| \ * Contributors: |
| \ * IBM Corporation - initial implementation |
| \ ****************************************************************************/ |
| \ * |
| \ * Support for old-fashioned local values in FCODE. |
| \ * |
| \ * There is one old FCODE tokenizer that uses the FCODE opcodes in the range |
| \ * of 0x407 to 0x41f for supporting Forth local values. Each locals stack |
| \ * frame contains 8 variables. The opcodes from 0x407 to 0x40f are used to |
| \ * push 0 up to 8 values from the normal data stack into the current locals |
| \ * stack frame. All other variables in the current stack frame are not |
| \ * pre-initialized. |
| \ * The opcodes from 0x410 to 0x417 can be used for reading the first, second, |
| \ * ... eighth value out of the locals stack frame, and the opcode from 0x418 |
| \ * to 0x41f can be used to set the first, second, ... eighth value in the |
| \ * stack frame respectively. |
| \ * |
| |
| 80 cells CONSTANT LOCALS-STACK-SIZE |
| |
| LOCALS-STACK-SIZE BUFFER: localsstackbuf |
| |
| localsstackbuf VALUE localsstack |
| |
| |
| : fc-local@ ( n -- val ) |
| cells localsstack swap - @ |
| ; |
| |
| : fc-local-1-@ 1 fc-local@ ; |
| : fc-local-2-@ 2 fc-local@ ; |
| : fc-local-3-@ 3 fc-local@ ; |
| : fc-local-4-@ 4 fc-local@ ; |
| : fc-local-5-@ 5 fc-local@ ; |
| : fc-local-6-@ 6 fc-local@ ; |
| : fc-local-7-@ 7 fc-local@ ; |
| : fc-local-8-@ 8 fc-local@ ; |
| |
| |
| : fc-local! ( val n -- ) |
| cells localsstack swap - ! |
| ; |
| |
| : fc-local-1-! 1 fc-local! ; |
| : fc-local-2-! 2 fc-local! ; |
| : fc-local-3-! 3 fc-local! ; |
| : fc-local-4-! 4 fc-local! ; |
| : fc-local-5-! 5 fc-local! ; |
| : fc-local-6-! 6 fc-local! ; |
| : fc-local-7-! 7 fc-local! ; |
| : fc-local-8-! 8 fc-local! ; |
| |
| |
| 0 VALUE uses-locals? |
| |
| \ Create space for the current function on the locals stack. |
| \ Pre-initialized the n first locals with the n top-most data stack items. |
| \ Note: Each function can use up to 8 (initialized or uninitialized) locals. |
| : (fc-push-locals) ( ... n -- ) |
| \ cr ." pushing " dup . ." locals" cr |
| 8 cells localsstack + TO localsstack |
| localsstack localsstackbuf - |
| LOCALS-STACK-SIZE > ABORT" Locals stack exceeded!" |
| ?dup IF |
| ( ... n ) 1 swap DO |
| i fc-local! \ Store pre-initialized locals |
| -1 +LOOP |
| THEN |
| ; |
| |
| : fc-push-locals ( n -- ) |
| \ cr ." compiling push for " dup . ." locals" cr |
| uses-locals? ABORT" Definition pushes locals multiple times!" |
| true TO uses-locals? |
| ( n ) ['] literal execute |
| ['] (fc-push-locals) compile, |
| ; |
| |
| : fc-push-0-locals 0 fc-push-locals ; |
| : fc-push-1-locals 1 fc-push-locals ; |
| : fc-push-2-locals 2 fc-push-locals ; |
| : fc-push-3-locals 3 fc-push-locals ; |
| : fc-push-4-locals 4 fc-push-locals ; |
| : fc-push-5-locals 5 fc-push-locals ; |
| : fc-push-6-locals 6 fc-push-locals ; |
| : fc-push-7-locals 7 fc-push-locals ; |
| : fc-push-8-locals 8 fc-push-locals ; |
| |
| |
| : fc-pop-locals ( -- ) |
| \ ." popping locals" cr |
| localsstack 8 cells - TO localsstack |
| localsstack localsstackbuf - 0 < ABORT" Locals stack underflow!" |
| ; |
| |
| |
| : fc-locals-exit |
| uses-locals? IF |
| \ ." compiling pop-locals for exit" cr |
| ['] fc-pop-locals compile, |
| THEN |
| ['] exit compile, |
| ; |
| |
| : fc-locals-b(;) |
| uses-locals? IF |
| \ ." compiling pop-locals for b(;)" cr |
| ['] fc-pop-locals compile, |
| THEN |
| false TO uses-locals? |
| ['] b(;) execute |
| ; |
| |
| |
| : fc-set-locals-tokens ( -- ) |
| ['] fc-push-0-locals 1 407 set-token |
| ['] fc-push-1-locals 1 408 set-token |
| ['] fc-push-2-locals 1 409 set-token |
| ['] fc-push-3-locals 1 40a set-token |
| ['] fc-push-4-locals 1 40b set-token |
| ['] fc-push-5-locals 1 40c set-token |
| ['] fc-push-6-locals 1 40d set-token |
| ['] fc-push-7-locals 1 40e set-token |
| ['] fc-push-8-locals 1 40f set-token |
| |
| ['] fc-local-1-@ 0 410 set-token |
| ['] fc-local-2-@ 0 411 set-token |
| ['] fc-local-3-@ 0 412 set-token |
| ['] fc-local-4-@ 0 413 set-token |
| ['] fc-local-5-@ 0 414 set-token |
| ['] fc-local-6-@ 0 415 set-token |
| ['] fc-local-7-@ 0 416 set-token |
| ['] fc-local-8-@ 0 417 set-token |
| |
| ['] fc-local-1-! 0 418 set-token |
| ['] fc-local-2-! 0 419 set-token |
| ['] fc-local-3-! 0 41a set-token |
| ['] fc-local-4-! 0 41b set-token |
| ['] fc-local-5-! 0 41c set-token |
| ['] fc-local-6-! 0 41d set-token |
| ['] fc-local-7-! 0 41e set-token |
| ['] fc-local-8-! 0 41f set-token |
| |
| ['] fc-locals-exit 1 33 set-token |
| ['] fc-locals-b(;) 1 c2 set-token |
| ; |
| fc-set-locals-tokens |