From 730a35eedc9057948f2c1e1d32012ccb509ab3c5 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Mon, 18 Nov 2019 19:07:03 +0000 Subject: [PATCH] Yengine: more on constants operations reduction --- .../ScriptEngine/YEngine/MMRScriptCodeGen.cs | 2 +- .../ScriptEngine/YEngine/MMRScriptTokenize.cs | 143 +++++++----------- .../ScriptEngine/YEngine/XMRInstCtor.cs | 1 + 3 files changed, 60 insertions(+), 86 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/YEngine/MMRScriptCodeGen.cs b/OpenSim/Region/ScriptEngine/YEngine/MMRScriptCodeGen.cs index e29a51504c..35711c166f 100644 --- a/OpenSim/Region/ScriptEngine/YEngine/MMRScriptCodeGen.cs +++ b/OpenSim/Region/ScriptEngine/YEngine/MMRScriptCodeGen.cs @@ -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; diff --git a/OpenSim/Region/ScriptEngine/YEngine/MMRScriptTokenize.cs b/OpenSim/Region/ScriptEngine/YEngine/MMRScriptTokenize.cs index 0a79f1acfc..f1e3424d6a 100644 --- a/OpenSim/Region/ScriptEngine/YEngine/MMRScriptTokenize.cs +++ b/OpenSim/Region/ScriptEngine/YEngine/MMRScriptTokenize.cs @@ -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) { } diff --git a/OpenSim/Region/ScriptEngine/YEngine/XMRInstCtor.cs b/OpenSim/Region/ScriptEngine/YEngine/XMRInstCtor.cs index 7e13ae4962..3acaef8a9b 100644 --- a/OpenSim/Region/ScriptEngine/YEngine/XMRInstCtor.cs +++ b/OpenSim/Region/ScriptEngine/YEngine/XMRInstCtor.cs @@ -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);