Beispiel #1
0
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;
    }
}
Beispiel #2
0
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);
}