Yengine: more on constants operations reduction

0.9.1.1
UbitUmarov 2019-11-18 19:07:03 +00:00
parent bf0697d5f4
commit 730a35eedc
3 changed files with 60 additions and 86 deletions

View File

@ -66,7 +66,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine
{
public static readonly string OBJECT_CODE_MAGIC = "YObjectCode";
// reserve positive version values for original xmr
public static int COMPILED_VERSION_VALUE = -3; // decremented when compiler or object file changes
public static int COMPILED_VERSION_VALUE = -4; // decremented when compiler or object file changes
public static readonly int CALL_FRAME_MEMUSE = 64;
public static readonly int STRING_LEN_TO_MEMUSE = 2;

View File

@ -1339,13 +1339,13 @@ namespace OpenSim.Region.ScriptEngine.Yengine
{
public TokenKwAndAndAnd(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn)
{
binOpConst = TokenRValConstOps.Null;
binOpConst = TokenRValConstOps.binConstsLogicAndAnd;
unOpConst = TokenRValConstOps.Null;
sdtClassOp = false;
}
public TokenKwAndAndAnd(Token original) : base(original)
{
binOpConst = TokenRValConstOps.Null;
binOpConst = TokenRValConstOps.binConstsLogicAndAnd;
unOpConst = TokenRValConstOps.Null;
sdtClassOp = false;
}
@ -1358,13 +1358,13 @@ namespace OpenSim.Region.ScriptEngine.Yengine
{
public TokenKwOrOrOr(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn)
{
binOpConst = TokenRValConstOps.Null;
binOpConst = TokenRValConstOps.binConstsLoginOrOr;
unOpConst = TokenRValConstOps.Null;
sdtClassOp = false;
}
public TokenKwOrOrOr(Token original) : base(original)
{
binOpConst = TokenRValConstOps.Null;
binOpConst = TokenRValConstOps.binConstsLoginOrOr;
unOpConst = TokenRValConstOps.Null;
sdtClassOp = false;
}
@ -1457,8 +1457,8 @@ namespace OpenSim.Region.ScriptEngine.Yengine
}
public class TokenKwAndAnd: TokenKw
{
public TokenKwAndAnd(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwAndAnd(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwAndAnd(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.binConstsLogicAndAnd; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwAndAnd(Token original) : base(original) { binOpConst = TokenRValConstOps.binConstsLogicAndAnd; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public override string ToString()
{
return "&&";
@ -1466,8 +1466,8 @@ namespace OpenSim.Region.ScriptEngine.Yengine
}
public class TokenKwOrOr: TokenKw
{
public TokenKwOrOr(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwOrOr(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwOrOr(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.binConstsLoginOrOr; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwOrOr(Token original) : base(original) { binOpConst = TokenRValConstOps.binConstsLoginOrOr; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public override string ToString()
{
return "||";
@ -1574,8 +1574,8 @@ namespace OpenSim.Region.ScriptEngine.Yengine
}
public class TokenKwExclam: TokenKw
{
public TokenKwExclam(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwExclam(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public TokenKwExclam(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.unOpExclam; sdtClassOp = true; }
public TokenKwExclam(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.unOpExclam; sdtClassOp = true; }
public override string ToString()
{
return "!";
@ -2201,8 +2201,10 @@ namespace OpenSim.Region.ScriptEngine.Yengine
double r;
try
{
if ((left is int) && (right is int))
if ((left is int li) && (right is int ri))
{
if(li == -2147483648 && ri == -1)
return -2147483648;
return (int)left / (int)right;
}
if ((left is double) && (right is int))
@ -2238,9 +2240,11 @@ namespace OpenSim.Region.ScriptEngine.Yengine
double r;
try
{
if ((left is int) && (right is int))
if ((left is int li) && (right is int ri))
{
return (int)left % (int)right;
if (li == -2147483648 && ri == -1)
return 0;
return li % ri;
}
if ((left is double) && (right is int))
{
@ -2297,98 +2301,30 @@ namespace OpenSim.Region.ScriptEngine.Yengine
{
return (int)left & (int)right;
}
if((left is int) && (right is double))
{
return (int)left & (int)(double)right;
}
if((left is double) && (right is int))
{
return (int)(double)left & (int)right;
}
if((left is double) && (right is double))
{
return (int)(double)left & (int)(double)right;
}
return null;
}
public static object LSh(object left, object right)
{
if((left is int) && (right is int))
{
return (int)left << (int)right;
}
if((left is int) && (right is double))
{
return (int)left << (int)(double)right;
}
if((left is double) && (right is int))
{
return (int)(double)left << (int)right;
}
if((left is double) && (right is double))
{
return (int)(double)left << (int)(double)right;
}
return null;
}
public static object Or(object left, object right)
{
if((left is int) && (right is int))
{
return (int)left | (int)right;
}
if((left is int) && (right is double))
{
return (int)left | (int)(double)right;
}
if((left is double) && (right is int))
{
return (int)(double)left | (int)right;
}
if((left is double) && (right is double))
{
return (int)(double)left | (int)(double)right;
}
return null;
}
public static object RSh(object left, object right)
{
if((left is int) && (right is int))
{
return (int)left >> (int)right;
}
if((left is int) && (right is double))
{
return (int)left >> (int)(double)right;
}
if((left is double) && (right is int))
{
return (int)(double)left >> (int)right;
}
if((left is double) && (right is double))
{
return (int)(double)left >> (int)(double)right;
}
return null;
}
public static object Xor(object left, object right)
{
if((left is int) && (right is int))
{
return (int)left ^ (int)right;
}
if((left is int) && (right is double))
{
return (int)left ^ (int)(double)right;
}
if((left is double) && (right is int))
{
return (int)(double)left ^ (int)right;
}
if((left is double) && (right is double))
{
return (int)(double)left ^ (int)(double)right;
}
return null;
}
public static object Add(object left, object right)
@ -2570,12 +2506,49 @@ namespace OpenSim.Region.ScriptEngine.Yengine
return null;
return (res != 0) ? 1 : 0;
}
public static object binConstsLogicAndAnd(object left, object right)
{
if ((left is int li) && (right is int ri))
{
if (li == 0)
return 0;
if (ri == 0)
return 0;
return 1;
}
return null;
}
public static object binConstsLoginOrOr(object left, object right)
{
if ((left is int li) && (right is int ri))
{
if (li != 0)
return 1;
if (ri != 0)
return 1;
return 0;
}
return null;
}
public static object unOpExclam(object left)
{
if ((left is int li))
{
if (li == 0)
return 1;
return 0;
}
return null;
}
}
/*
* Various datatypes.
*/
public abstract class TokenType: Token
/*
* Various datatypes.
*/
public abstract class TokenType: Token
{
public TokenType(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { }

View File

@ -86,6 +86,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine
m_StackSize = stackSize;
m_StackLeft = stackSize;
m_HeapSize = heapSize;
m_heapUsed = 0;
m_CompilerErrors = errors;
m_StateFileName = GetStateFileName(scriptBasePath, m_ItemID);