Allow using functions in non-conditional expressions (bug #3725)

pull/541/head
Capostrophic 6 years ago
parent 53d704fec8
commit 3d64a46df2

@ -7,6 +7,7 @@
Bug #3109: SetPos/Position handles actors differently Bug #3109: SetPos/Position handles actors differently
Bug #3282: Unintended behaviour when assigning F3 and Windows keys Bug #3282: Unintended behaviour when assigning F3 and Windows keys
Bug #3623: Display scaling breaks mouse recognition Bug #3623: Display scaling breaks mouse recognition
Bug #3725: Using script function in a non-conditional expression breaks script compilation
Bug #3733: Normal maps are inverted on mirrored UVs Bug #3733: Normal maps are inverted on mirrored UVs
Bug #3765: DisableTeleporting makes Mark/Recall/Intervention effects undetectable Bug #3765: DisableTeleporting makes Mark/Recall/Intervention effects undetectable
Bug #3778: [Mod] Improved Thrown Weapon Projectiles - weapons have wrong transformation during throw animation Bug #3778: [Mod] Improved Thrown Weapon Projectiles - weapons have wrong transformation during throw animation

@ -323,12 +323,17 @@ namespace Compiler
} }
} }
if (mAllowExpression)
{
if (keyword==Scanner::K_getdisabled || keyword==Scanner::K_getdistance) if (keyword==Scanner::K_getdisabled || keyword==Scanner::K_getdistance)
{
if (mAllowExpression)
{ {
scanner.putbackKeyword (keyword, loc); scanner.putbackKeyword (keyword, loc);
parseExpression (scanner, loc); parseExpression (scanner, loc);
}
else
{
getErrorHandler().warning ("Unexpected naked expression", loc);
}
mState = EndState; mState = EndState;
return true; return true;
} }
@ -338,24 +343,33 @@ namespace Compiler
char returnType; char returnType;
std::string argumentType; std::string argumentType;
bool hasExplicit = !mExplicit.empty(); bool hasExplicit = mState==ExplicitState;
if (extensions->isFunction (keyword, returnType, argumentType, hasExplicit)) if (extensions->isFunction (keyword, returnType, argumentType, hasExplicit))
{ {
if (!hasExplicit && !mExplicit.empty()) if (!hasExplicit && mState==ExplicitState)
{ {
getErrorHandler().warning ("Stray explicit reference", loc); getErrorHandler().warning ("Stray explicit reference", loc);
mExplicit.clear(); mExplicit.clear();
} }
if (mAllowExpression)
{
scanner.putbackKeyword (keyword, loc); scanner.putbackKeyword (keyword, loc);
parseExpression (scanner, loc); parseExpression (scanner, loc);
}
else
{
std::vector<Interpreter::Type_Code> code;
int optionals = mExprParser.parseArguments (argumentType, scanner, code, keyword);
mCode.insert(mCode.end(), code.begin(), code.end());
extensions->generateFunctionCode (keyword, mCode, mLiterals, mExplicit, optionals);
}
mState = EndState; mState = EndState;
return true; return true;
} }
} }
} }
}
if (mState==ExplicitState) if (mState==ExplicitState)
{ {

Loading…
Cancel
Save