static void execInput(Register result, Input input) { switch (inpGetType(input)) { case INPUT_REG: execRegisterExp(result, inpGetReg(input)); break; case INPUT_CONST: execConstant(result, inpGetConst(input)); break; case INPUT_LABEL: execLabel(result, inpGetLabel(input)); break; default: printf("execInput: unknown input type\n"); break; } }
static void execAssign(Inst inst) { Source src = insGetAssignSource(inst); Register target = rexGetReg(insGetAssignTarget(inst)); switch (srcGetType(src)) { case SRC_REG: regCopy(target, rexGetReg(srcGetReg(src))); break; case SRC_CONST: execConstant(target, srcGetConst(src)); break; case SRC_OP: execOperationExp(target, srcGetOp(src)); break; case SRC_LABEL: execLabel(target, srcGetLabel(src)); break; } rsAdvancePc(); }
TypePtr execFactor(void) { TypePtr resultTypePtr = nullptr; switch (codeToken) { case TKN_IDENTIFIER: { SymTableNodePtr idPtr = getCodeSymTableNodePtr(); if (idPtr->defn.key == DFN_FUNCTION) { SymTableNodePtr thisRoutineIdPtr = CurRoutineIdPtr; resultTypePtr = execRoutineCall(idPtr, false); CurRoutineIdPtr = thisRoutineIdPtr; } else if (idPtr->defn.key == DFN_CONST) resultTypePtr = execConstant(idPtr); else resultTypePtr = execVariable(idPtr, USE_EXPR); } break; case TKN_NUMBER: { SymTableNodePtr numberPtr = getCodeSymTableNodePtr(); if (numberPtr->typePtr == IntegerTypePtr) { pushInteger(numberPtr->defn.info.constant.value.integer); resultTypePtr = IntegerTypePtr; } else { pushReal(numberPtr->defn.info.constant.value.real); resultTypePtr = RealTypePtr; } getCodeToken(); } break; case TKN_STRING: { SymTableNodePtr nodePtr = getCodeSymTableNodePtr(); int32_t length = strlen(nodePtr->name); if (length > 1) { //----------------------------------------------------------------------- // Remember, the double quotes are on the back and front of the // string... pushAddress(nodePtr->info); resultTypePtr = nodePtr->typePtr; } else { //---------------------------------------------- // Just push the one character in this string... pushByte(nodePtr->name[0]); resultTypePtr = CharTypePtr; } getCodeToken(); } break; case TKN_NOT: getCodeToken(); resultTypePtr = execFactor(); //-------------------------------------- // Following flips 1 to 0, and 0 to 1... tos->integer = 1 - tos->integer; break; case TKN_LPAREN: getCodeToken(); resultTypePtr = execExpression(); getCodeToken(); break; } return (resultTypePtr); }