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:
parent
d3f5be0950
commit
6d7cb38834
10 changed files with 19 additions and 65 deletions
|
@ -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));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -265,7 +265,6 @@ namespace Compiler
|
||||||
"return",
|
"return",
|
||||||
"messagebox",
|
"messagebox",
|
||||||
"set", "to",
|
"set", "to",
|
||||||
"getsquareroot",
|
|
||||||
nullptr
|
nullptr
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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]
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue