- Added type coercion for action function parameters.

- I add PARAMI, and then I don't even do it right...

SVN r1919 (scripting)
This commit is contained in:
Randy Heit 2009-10-15 22:15:55 +00:00
parent 126c738116
commit 3cbac657d6
4 changed files with 18 additions and 3 deletions

View file

@ -303,7 +303,7 @@ static void FinishThingdef()
VMScriptFunction *func = buildit.MakeFunction(); VMScriptFunction *func = buildit.MakeFunction();
#if 1 #if 1
const char *marks = "======================================================="; const char *marks = "=======================================================";
char label[40]; char label[64];
int labellen = mysnprintf(label, countof(label), "Function %s.States[%d] (*%d)", int labellen = mysnprintf(label, countof(label), "Function %s.States[%d] (*%d)",
tcall->ActorInfo->Class->TypeName.GetChars(), tcall->ActorInfo->Class->TypeName.GetChars(),
tcall->FirstState, tcall->NumStates); tcall->FirstState, tcall->NumStates);

View file

@ -365,7 +365,7 @@ FxExpression *FxParameter::Resolve(FCompileContext& ctx)
static void EmitConstantInt(VMFunctionBuilder *build, int val) static void EmitConstantInt(VMFunctionBuilder *build, int val)
{ {
// If it fits in 24 bits, use PARAMI instead of PARAM. // If it fits in 24 bits, use PARAMI instead of PARAM.
if ((val << 8) >> 8) if (((val << 8) >> 8) == val)
{ {
build->Emit(OP_PARAMI, val); build->Emit(OP_PARAMI, val);
} }

View file

@ -151,6 +151,21 @@ FxExpression *ParseParameter(FScanner &sc, PClass *cls, char type, bool constant
{ {
sc.ScriptError("Default parameter must be constant."); sc.ScriptError("Default parameter must be constant.");
} }
// Do automatic coercion between ints and floats.
if (type == 'x' || type == 'X')
{
if (x->ValueType != VAL_Int)
{
x = new FxIntCast(x);
}
}
else
{
if (x->ValueType != VAL_Float)
{
x = new FxFloatCast(x);
}
}
break; break;
default: default:

View file

@ -217,7 +217,7 @@ void VMDisasm(FILE *out, const VM_UBYTE *code, int codesize, const VMScriptFunct
break; break;
case OP_PARAMI: case OP_PARAMI:
col = printf_wrapper(out, "%d", i + 4 + ABCs(&code[i])); col = printf_wrapper(out, "%d", ABCs(&code[i]));
break; break;
case OP_RET: case OP_RET: