Yengine: avoid use of Enum.Parse

This commit is contained in:
UbitUmarov
2020-08-31 18:46:10 +01:00
parent 3c3553d5b1
commit a1239d2706
5 changed files with 52 additions and 21 deletions

View File

@@ -1789,8 +1789,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
{
if (m_Scripts.TryGetValue(itemID, out IScriptInstance instance))
{
if (instance != null)
instance.PostEvent(p);
instance?.PostEvent(p);
return true;
}
lock (m_CompileDict)

View File

@@ -373,7 +373,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine
for(lln = m_EventQueue.First; lln != null; lln = lln.Next)
{
evt = lln.Value;
evc = (ScriptEventCode)Enum.Parse(typeof(ScriptEventCode), evt.EventName);
m_eventCodeMap.TryGetValue(evt.EventName, out evc);
evc1 = (int)evc;
evc2 = evc1 - 32;
if((((uint)evc1 < (uint)32) && (((mask1 >> evc1) & 1) != 0)) ||

View File

@@ -582,9 +582,8 @@ namespace OpenSim.Region.ScriptEngine.Yengine
m_EventCounts[i] = 0;
foreach(EventParams evt in m_EventQueue)
{
ScriptEventCode eventCode = (ScriptEventCode)Enum.Parse(typeof(ScriptEventCode),
evt.EventName);
m_EventCounts[(int)eventCode]++;
if(m_eventCodeMap.TryGetValue(evt.EventName, out ScriptEventCode eventCode))
m_EventCounts[(int)eventCode]++;
}
}
@@ -929,9 +928,8 @@ namespace OpenSim.Region.ScriptEngine.Yengine
m_EventCounts[i] = 0;
foreach (EventParams evt in m_EventQueue)
{
ScriptEventCode evtCode = (ScriptEventCode)Enum.Parse(typeof(ScriptEventCode),
evt.EventName);
m_EventCounts[(int)evtCode]++;
if(m_eventCodeMap.TryGetValue(evt.EventName, out ScriptEventCode evtCode))
m_EventCounts[(int)evtCode]++;
}
}

View File

@@ -219,5 +219,45 @@ namespace OpenSim.Region.ScriptEngine.Yengine
// llmineventdelay support
double m_minEventDelay = 0.0;
double m_nextEventTime = 0.0;
private static readonly Dictionary<string, ScriptEventCode> m_eventCodeMap = new Dictionary<string, ScriptEventCode>()
{
{"attach", ScriptEventCode.attach},
{"at_rot_target", ScriptEventCode.at_rot_target},
{"at_target", ScriptEventCode.at_target},
{"collision", ScriptEventCode.collision},
{"collision_end", ScriptEventCode.collision_end},
{"collision_start", ScriptEventCode.collision_start},
{"control", ScriptEventCode.control},
{"dataserver", ScriptEventCode.dataserver},
{"email", ScriptEventCode.email},
{"http_response", ScriptEventCode.http_response},
{"land_collision", ScriptEventCode.land_collision},
{"land_collision_end", ScriptEventCode.land_collision_end},
{"land_collision_start", ScriptEventCode.land_collision_start},
{"listen", ScriptEventCode.listen},
{"money", ScriptEventCode.money},
{"moving_end", ScriptEventCode.moving_end},
{"moving_start", ScriptEventCode.moving_start},
{"not_at_rot_target", ScriptEventCode.not_at_rot_target},
{"not_at_target", ScriptEventCode.not_at_target},
{"remote_data", ScriptEventCode.remote_data},
{"run_time_permissions", ScriptEventCode.run_time_permissions},
{"state_entry", ScriptEventCode.state_entry},
{"state_exit", ScriptEventCode.state_exit},
{"timer", ScriptEventCode.timer},
{"touch", ScriptEventCode.touch},
{"touch_end", ScriptEventCode.touch_end},
{"touch_start", ScriptEventCode.touch_start},
{"transaction_result", ScriptEventCode.transaction_result},
{"object_rez", ScriptEventCode.object_rez},
{"changed", ScriptEventCode.changed},
{"link_message", ScriptEventCode.link_message},
{"no_sensor", ScriptEventCode.no_sensor},
{"on_rez", ScriptEventCode.on_rez},
{"sensor", ScriptEventCode.sensor},
{"http_request", ScriptEventCode.http_request},
{"path_update", ScriptEventCode.path_update}
};
}
}

View File

@@ -63,7 +63,8 @@ namespace OpenSim.Region.ScriptEngine.Yengine
*/
public void PostEvent(EventParams evt)
{
ScriptEventCode evc = (ScriptEventCode)Enum.Parse(typeof(ScriptEventCode), evt.EventName);
if(!m_eventCodeMap.TryGetValue(evt.EventName, out ScriptEventCode evc))
return;
// Put event on end of event queue.
bool startIt = false;
@@ -175,7 +176,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine
for(lln2 = m_EventQueue.First; lln2 != null; lln2 = lln2.Next)
{
EventParams evt2 = lln2.Value;
ScriptEventCode evc2 = (ScriptEventCode)Enum.Parse(typeof(ScriptEventCode), evt2.EventName);
m_eventCodeMap.TryGetValue(evt2.EventName, out ScriptEventCode evc2);
if((evc2 != ScriptEventCode.state_entry) && (evc2 != ScriptEventCode.attach))
break;
}
@@ -239,15 +240,8 @@ namespace OpenSim.Region.ScriptEngine.Yengine
public void CancelEvent(string eventName)
{
ScriptEventCode evc;
try
{
evc = (ScriptEventCode)Enum.Parse(typeof(ScriptEventCode), eventName);
}
catch
{
if (!m_eventCodeMap.TryGetValue(eventName, out ScriptEventCode evc))
return;
}
lock (m_QueueLock)
{
@@ -373,7 +367,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine
if(m_EventQueue.First != null)
{
evt = m_EventQueue.First.Value;
evc = (ScriptEventCode)Enum.Parse(typeof(ScriptEventCode), evt.EventName);
m_eventCodeMap.TryGetValue(evt.EventName, out evc);
if (m_DetachQuantum > 0)
{
if(evc != ScriptEventCode.attach)
@@ -390,7 +384,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine
}
}
m_EventQueue.RemoveFirst();
if((int)evc >= 0)
if(evc >= 0)
m_EventCounts[(int)evc]--;
}