X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fmcs%2Fdriver.cs;h=4db99f7e5fe7ceff533fc010e89ff078d489f9e0;hb=30cddad5fb4c3d290906a6e6c33ecd8b07d8b48c;hp=352974855a45e981caedb7e13aca99b45ab9c797;hpb=f4774442eaf92333012ae8b0a431739b4efe22bf;p=mono.git diff --git a/mcs/mcs/driver.cs b/mcs/mcs/driver.cs index 352974855a4..4db99f7e5fe 100644 --- a/mcs/mcs/driver.cs +++ b/mcs/mcs/driver.cs @@ -44,31 +44,45 @@ namespace Mono.CSharp void tokenize_file (SourceFile sourceFile, ModuleContainer module, ParserSession session) { - Stream input; + Stream input = null; + SeekableStreamReader reader = null; try { - input = File.OpenRead (sourceFile.Name); + if (sourceFile.GetInputStream != null) { + reader = sourceFile.GetInputStream (sourceFile); + if (reader == null) { + throw new FileNotFoundException ("Delegate returned null", sourceFile.Name); + } + } else { + input = File.OpenRead (sourceFile.Name); + } } catch { Report.Error (2001, "Source file `" + sourceFile.Name + "' could not be found"); return; } - using (input){ - SeekableStreamReader reader = new SeekableStreamReader (input, ctx.Settings.Encoding); - var file = new CompilationSourceFile (module, sourceFile); + if (reader == null) { + using (input) { + reader = new SeekableStreamReader (input, ctx.Settings.Encoding); + DoTokenize (sourceFile, module, session, reader); + } + } else { + DoTokenize (sourceFile, module, session, reader); + } + } - Tokenizer lexer = new Tokenizer (reader, file, session); - int token, tokens = 0, errors = 0; + void DoTokenize (SourceFile sourceFile, ModuleContainer module, ParserSession session, SeekableStreamReader reader) { + var file = new CompilationSourceFile (module, sourceFile); - while ((token = lexer.token ()) != Token.EOF){ - tokens++; - if (token == Token.ERROR) - errors++; - } - Console.WriteLine ("Tokenized: " + tokens + " found " + errors + " errors"); + Tokenizer lexer = new Tokenizer (reader, file, session, ctx.Report); + int token, tokens = 0, errors = 0; + + while ((token = lexer.token ()) != Token.EOF) { + tokens++; + if (token == Token.ERROR) + errors++; } - - return; + Console.WriteLine ("Tokenized: " + tokens + " found " + errors + " errors"); } void Parse (ModuleContainer module) @@ -78,9 +92,9 @@ namespace Mono.CSharp Location.Initialize (sources); - var session = new ParserSession () { + var session = new ParserSession { UseJayGlobalArrays = true, - LocatedTokens = new Tokenizer.LocatedToken[15000] + LocatedTokens = new LocatedToken[15000] }; for (int i = 0; i < sources.Count; ++i) { @@ -129,36 +143,50 @@ namespace Mono.CSharp public void Parse (SourceFile file, ModuleContainer module, ParserSession session, Report report) { - Stream input; + Stream input = null; + SeekableStreamReader reader = null; try { - input = File.OpenRead (file.Name); + if (file.GetInputStream != null) { + reader = file.GetInputStream (file); + if (reader == null) { + throw new FileNotFoundException ("Delegate returned null", file.Name); + } + } else { + input = File.OpenRead (file.Name); + } } catch { report.Error (2001, "Source file `{0}' could not be found", file.Name); return; } - // Check 'MZ' header - if (input.ReadByte () == 77 && input.ReadByte () == 90) { + if (reader == null) { + using (input) { + // Check 'MZ' header + if (input.ReadByte () == 77 && input.ReadByte () == 90) { - report.Error (2015, "Source file `{0}' is a binary file and not a text file", file.Name); - input.Close (); - return; - } + report.Error (2015, "Source file `{0}' is a binary file and not a text file", file.Name); + return; + } + + input.Position = 0; + reader = new SeekableStreamReader (input, ctx.Settings.Encoding, session.StreamReaderBuffer); - input.Position = 0; - SeekableStreamReader reader = new SeekableStreamReader (input, ctx.Settings.Encoding, session.StreamReaderBuffer); + DoParse (file, module, session, report, reader); + } + } else { + DoParse (file, module, session, report, reader); + } + } + void DoParse (SourceFile file, ModuleContainer module, ParserSession session, Report report, SeekableStreamReader reader) { Parse (reader, file, module, session, report); if (ctx.Settings.GenerateDebugInfo && report.Errors == 0 && !file.HasChecksum) { - input.Position = 0; + reader.Stream.Position = 0; var checksum = session.GetChecksumAlgorithm (); - file.SetChecksum (checksum.ComputeHash (input)); + file.SetChecksum (checksum.ComputeHash (reader.Stream)); } - - reader.Dispose (); - input.Close (); } public static void Parse (SeekableStreamReader reader, SourceFile sourceFile, ModuleContainer module, ParserSession session, Report report) @@ -201,6 +229,7 @@ namespace Mono.CSharp public static string GetPackageFlags (string packages, Report report) { +#if MONO_FEATURE_PROCESS_START ProcessStartInfo pi = new ProcessStartInfo (); pi.FileName = "pkg-config"; pi.RedirectStandardOutput = true; @@ -239,6 +268,9 @@ namespace Mono.CSharp p.Close (); return pkgout; +#else + throw new NotSupportedException ("Process.Start is not supported on this platform."); +#endif // MONO_FEATURE_PROCESS_START } // @@ -328,6 +360,7 @@ namespace Mono.CSharp tr.Start (TimeReporter.TimerType.CreateTypeTotal); module.CreateContainer (); importer.AddCompiledAssembly (assembly); + references_loader.CompiledAssembly = assembly; tr.Stop (TimeReporter.TimerType.CreateTypeTotal); references_loader.LoadReferences (module); @@ -361,6 +394,9 @@ namespace Mono.CSharp #endif module.InitializePredefinedTypes (); + if (settings.GetResourceStrings != null) + module.LoadGetResourceStrings (settings.GetResourceStrings); + tr.Start (TimeReporter.TimerType.ModuleDefinitionTotal); module.Define (); tr.Stop (TimeReporter.TimerType.ModuleDefinitionTotal);