PRT_VALUE *P_FUN__SENDRELIABLE_IMPL(PRT_MACHINEINST *context, PRT_UINT32 funIndex, PRT_VALUE *value) { PRT_VALUE* target = PrtTupleGet(value, 0); while (PRT_FALSE == PrtDistSend(target, PrtTupleGet(value, 1), PrtTupleGet(value, 2))); return PrtMkNullValue(); }
void PrtPushNewFrame( _Inout_ PRT_MACHINEINST_PRIV *context, _In_ PRT_UINT32 funIndex, _In_ PRT_VALUE *parameters ) { PRT_UINT16 length = context->funStack.length; PrtAssert(length < PRT_MAX_FUNSTACK_DEPTH, "Fun stack overflow"); context->funStack.length = length + 1; context->funStack.funs[length].funIndex = funIndex; PRT_FUNDECL *funDecl = &(context->process->program->machines[context->instanceOf].funs[funIndex]); PRT_VALUE **locals = NULL; if (funDecl->maxNumLocals == 0) { PrtAssert(parameters == NULL && funDecl->localsNmdTupType == NULL, "Incorrect maxNumLocals value"); } else { locals = PrtCalloc(funDecl->maxNumLocals, sizeof(PRT_VALUE *)); for (PRT_UINT32 i = 0; i < funDecl->maxNumLocals; i++) { locals[i] = NULL; } PRT_UINT32 count = 0; if (parameters != NULL) { PRT_UINT32 size = parameters->valueUnion.tuple->size; for (PRT_UINT32 i = 0; i < size; i++) { locals[count] = PrtTupleGet(parameters, i); count++; } PrtFreeValue(parameters); } if (funDecl->localsNmdTupType != NULL) { PRT_UINT32 size = funDecl->localsNmdTupType->typeUnion.nmTuple->arity; for (PRT_UINT32 i = 0; i < size; i++) { PRT_TYPE *indexType = funDecl->localsNmdTupType->typeUnion.nmTuple->fieldTypes[i]; locals[count] = PrtMkDefaultValue(indexType); count++; } } } context->funStack.funs[length].locals = locals; context->funStack.funs[length].freeLocals = PRT_TRUE; context->funStack.funs[length].returnTo = 0xFFFF; context->funStack.funs[length].rcase = NULL; }
PRT_VALUE *P_FUN__SEND_IMPL(PRT_MACHINEINST *context, PRT_UINT32 funIndex, PRT_VALUE *value) { PRT_VALUE* target = PrtTupleGet(value, 0); PrtDistSend(target, PrtTupleGet(value, 1), PrtTupleGet(value, 2)); return PrtMkBoolValue(PRT_TRUE); }