Go to the first, previous, next, last section, table of contents.


assembleTag

Function: assembleTag { label asm -> }
file: job.t
package: muf
status: alpha

The assembleTag prim supports implementation of non-local goto operations -- those which jump from one function to an enclosing function, much like the C longjmp() library function.

The assembleTag prim deposits an instruction which at runtime will pop a tag from the job's data stack and push a JOB_STACKFRAME_TAG stackframe onto the job's loop stack, containing the popped tag together with the given label: As long as that stackframe exists, any goto of that tag will result in a transfer of control to the given label.

You may mark the end of the tag's scope by popping the JOB_STACKFRAME_TAG stackframe using the popTagframe primitive.

For technical reasons relating to support for the CommonLisp standard, any sequence of one or more JOB_STACKFRAME_TAG stackframes pushed on the loopstack should be topped off with a JOB_STACKFRAME_TAGTOP frame: These can be pushed and popped using pushTagtopframe and popTagtopframe.

Here is an example which hand-compiles

:   xx 
    withTag qqq do{  ( Establish nonlocal goto target  )
       'qqq goto      ( Do nonlocal goto to 'tag' label )
       "Hi mom!"      ( This will get jumped over.      )
    qqq               ( Specify tag label location.     )
       "Hi dad!"      ( This will get executed.         )
    }                 ( End of tag scope.               )
;
stack:
makeAssembler --> *asm*
stack:
*asm* reset
stack:
*asm* assembleLabelGet --> *label* ( Allocate label )
stack:
'qqq *asm* assembleConstant ( Code to push tag on stack )
stack:
*label* *asm* assembleTag ( Code to push tagframe on stack )
stack:
#'pushTagtopframe *asm* assembleCall ( Code to push tagtopframe on stack )
stack:
'qqq *asm* assembleConstant ( Code to again push tag on stack )
stack:
#'goto *asm* assembleCall ( Code to do nonlocal goto )
stack:
"Hi mom!" *asm* assembleConstant ( Code to get jumped over )
stack:
*label* *asm* assembleLabel ( Label location )
stack:
"Hi dad!" *asm* assembleConstant ( Code to get executed )
stack:
#'popTagtopframe *asm* assembleCall ( Code to pop tagtopframe from stack )
stack:
#'popTagframe *asm* assembleCall ( Code to end tag scope )
stack:
nil -1 makeFunction *asm* finishAssembly --> #'xx ( Compile fn 'xx' )
stack:
xx ( Invoke function )
stack: "Hi dad!"


Go to the first, previous, next, last section, table of contents.