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"; public static readonly string OBJECT_CODE_MAGIC = "YObjectCode";
// reserve positive version values for original xmr // 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 CALL_FRAME_MEMUSE = 64;
public static readonly int STRING_LEN_TO_MEMUSE = 2; 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) public TokenKwAndAndAnd(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn)
{ {
binOpConst = TokenRValConstOps.Null; binOpConst = TokenRValConstOps.binConstsLogicAndAnd;
unOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null;
sdtClassOp = false; sdtClassOp = false;
} }
public TokenKwAndAndAnd(Token original) : base(original) public TokenKwAndAndAnd(Token original) : base(original)
{ {
binOpConst = TokenRValConstOps.Null; binOpConst = TokenRValConstOps.binConstsLogicAndAnd;
unOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null;
sdtClassOp = false; 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) public TokenKwOrOrOr(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn)
{ {
binOpConst = TokenRValConstOps.Null; binOpConst = TokenRValConstOps.binConstsLoginOrOr;
unOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null;
sdtClassOp = false; sdtClassOp = false;
} }
public TokenKwOrOrOr(Token original) : base(original) public TokenKwOrOrOr(Token original) : base(original)
{ {
binOpConst = TokenRValConstOps.Null; binOpConst = TokenRValConstOps.binConstsLoginOrOr;
unOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.Null;
sdtClassOp = false; sdtClassOp = false;
} }
@ -1457,8 +1457,8 @@ namespace OpenSim.Region.ScriptEngine.Yengine
} }
public class TokenKwAndAnd: TokenKw 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(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.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; } public TokenKwAndAnd(Token original) : base(original) { binOpConst = TokenRValConstOps.binConstsLogicAndAnd; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public override string ToString() public override string ToString()
{ {
return "&&"; return "&&";
@ -1466,8 +1466,8 @@ namespace OpenSim.Region.ScriptEngine.Yengine
} }
public class TokenKwOrOr: TokenKw 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(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.Null; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; } public TokenKwOrOr(Token original) : base(original) { binOpConst = TokenRValConstOps.binConstsLoginOrOr; unOpConst = TokenRValConstOps.Null; sdtClassOp = true; }
public override string ToString() public override string ToString()
{ {
return "||"; return "||";
@ -1574,8 +1574,8 @@ namespace OpenSim.Region.ScriptEngine.Yengine
} }
public class TokenKwExclam: TokenKw 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(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.Null; sdtClassOp = true; } public TokenKwExclam(Token original) : base(original) { binOpConst = TokenRValConstOps.Null; unOpConst = TokenRValConstOps.unOpExclam; sdtClassOp = true; }
public override string ToString() public override string ToString()
{ {
return "!"; return "!";
@ -2201,8 +2201,10 @@ namespace OpenSim.Region.ScriptEngine.Yengine
double r; double r;
try 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; return (int)left / (int)right;
} }
if ((left is double) && (right is int)) if ((left is double) && (right is int))
@ -2238,9 +2240,11 @@ namespace OpenSim.Region.ScriptEngine.Yengine
double r; double r;
try 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)) if ((left is double) && (right is int))
{ {
@ -2297,98 +2301,30 @@ namespace OpenSim.Region.ScriptEngine.Yengine
{ {
return (int)left & (int)right; 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; return null;
} }
public static object LSh(object left, object right) public static object LSh(object left, object right)
{ {
if((left is int) && (right is int)) if((left is int) && (right is int))
{
return (int)left << (int)right; 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; return null;
} }
public static object Or(object left, object right) public static object Or(object left, object right)
{ {
if((left is int) && (right is int)) if((left is int) && (right is int))
{
return (int)left | (int)right; 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; return null;
} }
public static object RSh(object left, object right) public static object RSh(object left, object right)
{ {
if((left is int) && (right is int)) if((left is int) && (right is int))
{
return (int)left >> (int)right; 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; return null;
} }
public static object Xor(object left, object right) public static object Xor(object left, object right)
{ {
if((left is int) && (right is int)) if((left is int) && (right is int))
{
return (int)left ^ (int)right; 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; return null;
} }
public static object Add(object left, object right) public static object Add(object left, object right)
@ -2570,12 +2506,49 @@ namespace OpenSim.Region.ScriptEngine.Yengine
return null; return null;
return (res != 0) ? 1 : 0; 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. * Various datatypes.
*/ */
public abstract class TokenType: Token public abstract class TokenType: Token
{ {
public TokenType(TokenErrorMessage emsg, string file, int line, int posn) : base(emsg, file, line, posn) { } 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_StackSize = stackSize;
m_StackLeft = stackSize; m_StackLeft = stackSize;
m_HeapSize = heapSize; m_HeapSize = heapSize;
m_heapUsed = 0;
m_CompilerErrors = errors; m_CompilerErrors = errors;
m_StateFileName = GetStateFileName(scriptBasePath, m_ItemID); m_StateFileName = GetStateFileName(scriptBasePath, m_ItemID);