ScriptEngine successfully compiles script, we are now even further than LSO was.

Also added C# script support.
afrisby
Tedd Hansen 2007-08-12 19:04:07 +00:00
parent 75c5bdbef9
commit ed1208d043
3 changed files with 35 additions and 10 deletions

View File

@ -20,8 +20,25 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL
// Output assembly name
string OutFile = Path.GetFileNameWithoutExtension(LSOFileName) + ".dll";
Common.SendToDebug("Reading source code into memory");
// TODO: Add error handling
string CS_Code = LSL_Converter.Convert(File.ReadAllText(LSOFileName));
string CS_Code;
switch (System.IO.Path.GetExtension(LSOFileName).ToLower())
{
case ".txt":
case ".lsl":
Common.SendToDebug("Source code is LSL, converting to CS");
CS_Code = LSL_Converter.Convert(File.ReadAllText(LSOFileName));
break;
case ".cs":
Common.SendToDebug("Source code is CS");
CS_Code = File.ReadAllText(LSOFileName);
break;
default:
throw new Exception("Unknown script type.");
}
Common.SendToDebug("Compiling");
// Do actual compile
System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();

View File

@ -162,7 +162,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL
// void dataserver(key query_id, string data) {
//cache = Regex.Replace(cache, @"([^a-zA-Z_]\s*)((?!if|switch|for)[a-zA-Z_]+\s*\([^\)]*\)[^{]*{)", "$1" + "<STATE>" + "$2", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline);
//Console.WriteLine("Replacing using statename: " + current_statename);
cache = Regex.Replace(cache, @"^(\s*)((?!if|switch|for)[a-zA-Z0-9_]*\s*\([^\)]*\)[^;]*\{)", @"$1" + current_statename + "_$2", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline);
cache = Regex.Replace(cache, @"^(\s*)((?!(if|switch|for)[^a-zA-Z0-9_])[a-zA-Z0-9_]*\s*\([^\)]*\)[^;]*\{)", @"$1" + current_statename + "_$2", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline);
}
ret += cache;
@ -195,7 +195,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL
}
// Add "void" in front of functions that needs it
Script = Regex.Replace(Script, @"^(\s*)((?!if|switch|for)[a-zA-Z0-9_]*\s*\([^\)]*\)[^;]*\{)", @"$1void $2", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline);
Script = Regex.Replace(Script, @"^(\s*)((?!(if|switch|for)[^a-zA-Z0-9_])[a-zA-Z0-9_]*\s*\([^\)]*\)[^;]*\{)", @"$1void $2", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline);
// Replace <x,y,z> and <x,y,z,r>
Script = Regex.Replace(Script, @"<([^,>]*,[^,>]*,[^,>]*,[^,>]*)>", @"new Axiom.Math.Quaternion($1)", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline);

View File

@ -114,15 +114,23 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
FileName = ScriptID;
// * Does script need compile? Send it to LSL compiler first. (TODO: Use (and clean) compiler cache)
if (FileName.ToLower().EndsWith(".lsl"))
Common.SendToDebug("ScriptManager Script extension: " + System.IO.Path.GetExtension(FileName).ToLower());
switch (System.IO.Path.GetExtension(FileName).ToLower())
{
Common.SendToDebug("ScriptManager Script is LSL, compiling to .Net Assembly");
// Create a new instance of the compiler (currently we don't want reuse)
OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.Compiler LSLCompiler = new OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.Compiler();
// Compile
FileName = LSLCompiler.Compile(FileName);
case ".txt":
case ".lsl":
case ".cs":
Common.SendToDebug("ScriptManager Script is CS/LSL, compiling to .Net Assembly");
// Create a new instance of the compiler (currently we don't want reuse)
OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.Compiler LSLCompiler = new OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.Compiler();
// Compile
FileName = LSLCompiler.Compile(FileName);
break;
default:
throw new Exception("Unknown script type.");
}
Common.SendToDebug("Compilation done");
// * Insert yield into code
FileName = ProcessYield(FileName);
@ -197,7 +205,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
Type t;
//try
//{
t = a.GetType("LSL_ScriptObject", true);
t = a.GetType("SecondLife.Script", true);
//}
//catch (Exception e)
//{