1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-03-03 15:09:39 +00:00

Remove duplicate GetSquareRoot implementation

This commit is contained in:
Evil Eye 2021-09-19 19:53:38 +02:00
parent d3f5be0950
commit 6d7cb38834
10 changed files with 19 additions and 65 deletions

View file

@ -864,6 +864,9 @@ namespace MWScript
float param = runtime[0].mFloat; float param = runtime[0].mFloat;
runtime.pop(); runtime.pop();
if (param < 0)
throw std::runtime_error("square root of negative number (we aren't that imaginary)");
runtime.push(std::sqrt (param)); runtime.push(std::sqrt (param));
} }
}; };

View file

@ -421,42 +421,26 @@ namespace Compiler
if (mNextOperand) if (mNextOperand)
{ {
if (keyword==Scanner::K_getsquareroot) // check for custom extensions
if (const Extensions *extensions = getContext().getExtensions())
{ {
start(); start();
mTokenLoc = loc; char returnType;
parseArguments ("f", scanner); std::string argumentType;
Generator::squareRoot (mCode); bool hasExplicit = false;
mOperands.push_back ('f');
mNextOperand = false; if (extensions->isFunction (keyword, returnType, argumentType, hasExplicit))
return true;
}
else
{
// check for custom extensions
if (const Extensions *extensions = getContext().getExtensions())
{ {
start(); mTokenLoc = loc;
int optionals = parseArguments (argumentType, scanner);
char returnType; extensions->generateFunctionCode (keyword, mCode, mLiterals, "", optionals);
std::string argumentType; mOperands.push_back (returnType);
bool hasExplicit = false; mNextOperand = false;
return true;
if (extensions->isFunction (keyword, returnType, argumentType, hasExplicit))
{
mTokenLoc = loc;
int optionals = parseArguments (argumentType, scanner);
extensions->generateFunctionCode (keyword, mCode, mLiterals, "", optionals);
mOperands.push_back (returnType);
mNextOperand = false;
return true;
}
} }
} }
} }

View file

@ -104,11 +104,6 @@ namespace
code.push_back (Compiler::Generator::segment5 (17)); code.push_back (Compiler::Generator::segment5 (17));
} }
void opSquareRoot (Compiler::Generator::CodeContainer& code)
{
code.push_back (Compiler::Generator::segment5 (19));
}
void opReturn (Compiler::Generator::CodeContainer& code) void opReturn (Compiler::Generator::CodeContainer& code)
{ {
code.push_back (Compiler::Generator::segment5 (20)); code.push_back (Compiler::Generator::segment5 (20));
@ -452,11 +447,6 @@ namespace Compiler::Generator
} }
} }
void squareRoot (CodeContainer& code)
{
opSquareRoot (code);
}
void exit (CodeContainer& code) void exit (CodeContainer& code)
{ {
opReturn (code); opReturn (code);

View file

@ -74,8 +74,6 @@ namespace Compiler
void convert (CodeContainer& code, char fromType, char toType); void convert (CodeContainer& code, char fromType, char toType);
void squareRoot (CodeContainer& code);
void exit (CodeContainer& code); void exit (CodeContainer& code);
void message (CodeContainer& code, Literals& literals, const std::string& message, void message (CodeContainer& code, Literals& literals, const std::string& message,

View file

@ -265,7 +265,6 @@ namespace Compiler
"return", "return",
"messagebox", "messagebox",
"set", "to", "set", "to",
"getsquareroot",
nullptr nullptr
}; };

View file

@ -205,8 +205,7 @@ namespace Compiler
K_while, K_endwhile, K_while, K_endwhile,
K_return, K_return,
K_messagebox, K_messagebox,
K_set, K_to, K_set, K_to
K_getsquareroot
}; };
enum special enum special

View file

@ -63,7 +63,7 @@ namespace Compiler
keyword==Scanner::K_elseif || keyword==Scanner::K_while || keyword==Scanner::K_elseif || keyword==Scanner::K_while ||
keyword==Scanner::K_endwhile || keyword==Scanner::K_return || keyword==Scanner::K_endwhile || keyword==Scanner::K_return ||
keyword==Scanner::K_messagebox || keyword==Scanner::K_set || keyword==Scanner::K_messagebox || keyword==Scanner::K_set ||
keyword==Scanner::K_to || keyword==Scanner::K_getsquareroot) keyword==Scanner::K_to)
{ {
// pretend this is not a keyword // pretend this is not a keyword
std::string name = loc.mLiteral; std::string name = loc.mLiteral;

View file

@ -77,7 +77,7 @@ op 15: div (integer) stack[1] by stack[0], pop twice, push result
op 16: div (float) stack[1] by stack[0], pop twice, push result op 16: div (float) stack[1] by stack[0], pop twice, push result
op 17: convert stack[1] from integer to float op 17: convert stack[1] from integer to float
op 18: convert stack[1] from float to integer op 18: convert stack[1] from float to integer
op 19: take square root of stack[0] (float) opcode 19 unused
op 20: return op 20: return
op 21: replace stack[0] with local short stack[0] op 21: replace stack[0] with local short stack[0]
op 22: replace stack[0] with local long stack[0] op 22: replace stack[0] with local long stack[0]

View file

@ -59,7 +59,6 @@ namespace Interpreter
interpreter.installSegment5 (14, new OpMulInt<Type_Float>); interpreter.installSegment5 (14, new OpMulInt<Type_Float>);
interpreter.installSegment5 (15, new OpDivInt<Type_Integer>); interpreter.installSegment5 (15, new OpDivInt<Type_Integer>);
interpreter.installSegment5 (16, new OpDivInt<Type_Float>); interpreter.installSegment5 (16, new OpDivInt<Type_Float>);
interpreter.installSegment5 (19, new OpSquareRoot);
interpreter.installSegment5 (26, interpreter.installSegment5 (26,
new OpCompare<Type_Integer, std::equal_to<Type_Integer> >); new OpCompare<Type_Integer, std::equal_to<Type_Integer> >);
interpreter.installSegment5 (27, interpreter.installSegment5 (27,

View file

@ -74,24 +74,6 @@ namespace Interpreter
} }
}; };
class OpSquareRoot : public Opcode0
{
public:
void execute (Runtime& runtime) override
{
Type_Float value = runtime[0].mFloat;
if (value<0)
throw std::runtime_error (
"square root of negative number (we aren't that imaginary)");
value = std::sqrt (value);
runtime[0].mFloat = value;
}
};
template<typename T, typename C> template<typename T, typename C>
class OpCompare : public Opcode0 class OpCompare : public Opcode0
{ {
@ -105,7 +87,7 @@ namespace Interpreter
runtime[0].mInteger = result; runtime[0].mInteger = result;
} }
}; };
} }
#endif #endif