SEND Instruction - craterdog-archives/js-bali-virtual-machine GitHub Wiki

The SEND Instruction

The SEND instruction causes the virtual processor to create a new task context for a message with optional arguments being send to a target component. The new context is either added to the top of the context stack if the target component is currently on the component stack; or placed in the task bag to be handled by a separate task if the target component is a document referenced by a citation that is on top of the component stack. The modifier specifies whether or not the target component is a document and whether or not there is a list of arguments residing on the component stack.

The operand contains an index value in the range 1..2047 of the message to be sent.

SEND message TO COMPONENT

The SEND instruction with the TO COMPONENT modifier sends the message identified by the message operand to the component that is currently on top of the component stack. The bytecode for this instruction has the form:

[11100xxx][xxxxxxxx] where xxxxxxxxxxx is the index of the message to be sent

The following pseudo-code defines this instruction:

component = task.components.pop()
message = context.messages.get(context.operand)
context.address = context.address + 1
task.contexts.push(context)
context = Context(component, message)

Example Context Before Execution

SEND TO COMPONENT - Before

Example Context After Execution

SEND TO COMPONENT - After

SEND message TO COMPONENT WITH ARGUMENTS

The SEND instruction with the TO COMPONENT WITH ARGUMENTS modifier sends the message identified by the message operand to the component that is currently on top of the component passing the list of arguments that is the next component on the component stack. The bytecode for this instruction has the form:

[11101xxx][xxxxxxxx] where xxxxxxxxxxx is the index of the message to be sent

The following pseudo-code defines this instruction:

arguments = task.components.pop()
component = task.components.pop()
message = context.messages.get(context.operand)
context.address = context.address + 1
task.contexts.push(context)
context = Context(component, message, arguments)

Example Context Before Execution

SEND TO COMPONENT WITH ARGUMENTS- Before

Example Context After Execution

SEND TO COMPONENT WITH ARGUMENTS- After

SEND message TO DOCUMENT

The SEND instruction with the TO DOCUMENT modifier sends the message identified by the message operand to the commited document that is named by the component that is currently on top of the component stack. The message will be processed by a different virtual processor. The bytecode for this instruction has the form:

[11110xxx][xxxxxxxx] where xxxxxxxxxxx is the index of the message to be sent

The following pseudo-code defines this instruction:

target = task.components.pop()
message = context.messages.get(context.operand)
document = repository.retrieveDocument(target)
task.tokens = task.tokens / 2
child = Task(task.account, task.tokens)
child.contexts.push(Context(document, message))
repository.postMessage('/bali/vm/tasks/v1', child)
task.components.push(child.tag)
context.address = context.address + 1

Example Context Before Execution

SEND TO DOCUMENT - Before

Example Context After Execution

SEND TO DOCUMENT - After

SEND message TO DOCUMENT WITH ARGUMENTS

The SEND instruction with the TO DOCUMENT WITH ARGUMENTS modifier sends the message identified by the message operand to the committed document that is named by the component that is currently on top of the component passing the list of arguments that is the next component on the component stack. The message will be processed by a different virtual processor. The bytecode for this instruction has the form:

[11111xxx][xxxxxxxx] where xxxxxxxxxxx is the index of the message to be sent

The following pseudo-code defines this instruction:

arguments = task.components.pop()
target = task.components.pop()
message = context.messages.get(context.operand)
document = repository.retrieveDocument(target)
task.tokens = task.tokens / 2
child = Task(task.account, task.tokens)
child.contexts.push(Context(document, message, arguments))
repository.postMessage('/bali/vm/tasks/v1', child)
task.components.push(child.tag)
context.address = context.address + 1

Example Context Before Execution

SEND TO DOCUMENT WITH ARGUMENTS - Before

Example Context After Execution

SEND TO DOCUMENT WITH ARGUMENTS - After