https://bugzilla.novell.com/show_bug.cgi?id=639762
https://bugzilla.novell.com/show_bug.cgi?id=639762#c0 Summary: gmcs crashes Classification: Mono Product: Mono: Compilers Version: 2.6.x Platform: x86-64 OS/Version: UNIX Other Status: NEW Severity: Major Priority: P5 - None Component: C# AssignedTo: [email protected] ReportedBy: [email protected] QAContact: [email protected] Found By: Development Blocker: Yes Description of Problem: crashed while compiling file Steps to reproduce the problem: 1. try compile this: using System; using System.Text; using System.Collections.Generic; //{{{ Tokens public enum ETag : uint { Num = 256, Id, True, False } public class Token { private static uint id = 0; public uint Tag { private set; get; } public uint Id { private set; get; } public Token( uint tag ) { Tag = tag; Id = id++; } public override string ToString() { return String.Format("<ID:{0}|{1}>", Id, Tag); } } public class NumToken : Token { public int Value { private set; get; } public NumToken( int val ) : base( (uint) ETag.Num ) { Value = val; } public override string ToString() { return String.Format("<ID:{0}|NUM,{1}>", Id, Value); } } public class WordToken : Token { public string Lexeme { private set; get; } public WordToken( uint tag, string lexeme ) : base( tag ) { Lexeme = lexeme; } public override string ToString() { return String.Format("<ID:{0}|WORD,{1},{2}>", Id, (ETag)Tag, Lexeme); } public static WordToken True = new WordToken( (uint) ETag.True, "true"); public static WordToken False = new WordToken( (uint) ETag.False, "false"); } //}}} public class EEndOfStream : Exception {} public class Lexer { // helpers private static bool isDigit( int c ) { return c > 47 && c < 58; } private static bool isLetter( int c ) { return ( c > 96 && c < 123 ) || ( c > 64 && c < 91 ); } // current symbol private int peek = ' '; // init symbol table private Dictionary<string,Token> stable = new Dictionary<string,Token> { { WordToken.True.Lexeme, WordToken.True }, { WordToken.False.Lexeme, WordToken.False } }; // public fields public int Line { private set; get; } private static int NextChar(IEnumerator<int> istream) { if ( istream.MoveNext() ) return istream.Current; throw new EEndOfStream(); } public Token Scan(IEnumerator<int> istream) { // skeep spaces bool loop = true; for( ;loop; peek = NextChar(istream) ) { switch (peek) { case ' ': case '\t': break; case '\n': Line += 1; break; default: loop = false; break; } } // parse numbers if ( isDigit(peek) ) { int v = 0; do { v = v * 10 + ( peek - 48 ); peek = NextChar(istream); } while ( isDigit(peek) ); } Token t; // parse lexems if ( isLetter(peek) ) { var sb = new StringBuilder(); do { sb.Append((byte) peek); peek = NextChar(istream); } while ( isLetter(peek) ); var k = sb.ToString(); if ( stable.TryGetValue( k, out t ) ) return t; t = new WordToken((uint)ETag.Id, k); stable[k] = t; return t; } t = new Token((uint)peek); peek = ' '; return t; } public IEnumerable<Token> Tokenize( IEnumerator<int> istream ) { Token t; for(;;) { try { t = Scan(istream); } catch ( EEndOfStream e ) { return false; } yield return t; } } } public static class LexerApp { public static void Main(string[] args) { if ( args.Length == 0 ) { Console.WriteLine("At least one argument expected"); return; } Lexer l = new Lexer(); foreach ( var t in l.Tokenize( args[0].GetEnumerator() ) ) { Console.Write("{0} ", t); } Console.WriteLine(); } } Actual Results: lexer.cs(160,34): warning CS0168: The variable `e' is declared but never used Internal compiler error at lexer.cs(151,31):: exception caught while emitting MethodBuilder [<Tokenize>c__Iterator0::MoveNext] Unhandled Exception: System.ArgumentException: Trying to emit a local from a different ILGenerator. at System.Reflection.Emit.ILGenerator.Emit (OpCode opcode, System.Reflection.Emit.LocalBuilder local) [0x00000] in <filename unknown>:0 at Mono.CSharp.LocalInfo.EmitAssign (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.VariableReference.EmitAssign (Mono.CSharp.EmitContext ec, Mono.CSharp.Expression source, Boolean leave_copy, Boolean prepare_for_load) [0x00000] in <filename unknown>:0 at Mono.CSharp.Catch.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.Statement.Emit (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.TryCatch.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.Statement.Emit (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.Block.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.Block.Emit (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.ExplicitBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.For.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.Statement.Emit (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.Block.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.Block.Emit (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.ExplicitBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.Block.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.Block.Emit (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.Iterator.EmitMoveNext (Mono.CSharp.EmitContext ec, Mono.CSharp.Block original_block) [0x00000] in <filename unknown>:0 at Mono.CSharp.IteratorStatement.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.Statement.Emit (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.Block.DoEmit (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.Block.Emit (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.ExplicitBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.ToplevelBlock.Emit (Mono.CSharp.EmitContext ec) [0x00000] in <filename unknown>:0 at Mono.CSharp.MethodData.Emit (Mono.CSharp.DeclSpace parent) [0x00000] in <filename unknown>:0 at Mono.CSharp.MethodOrOperator.Emit () [0x00000] in <filename unknown>:0 at Mono.CSharp.Method.Emit () [0x00000] in <filename unknown>:0 Expected Results: File should be compiled or error reported How often does this happen? always Additional Information: -- Configure bugmail: https://bugzilla.novell.com/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- You are the QA contact for the bug. You are the assignee for the bug. _______________________________________________ mono-bugs maillist - [email protected] http://lists.ximian.com/mailman/listinfo/mono-bugs
