hi.

the following output is from a small test program built with csc but
trapped on mono. mint is segfaulting.

ahem, could someone provide me with a hint on _how_ to debug things like
these? how when are these types of errors triggered?
staring into loader.c and jit.c did not enlighten me much yet..

for the curious, uncomprehensive source code attached.

--snip--
(process:10299): ** WARNING **: Missing method Add in typeref index 93

(process:10299): ** ERROR **: file ../../../../mono/jit/jit.c: line 2508
(mono_analyze_stack): assertion failed: (cm)
aborting...
Trace/breakpoint trap
--snap--

-- 
___________________________________________________________________________
 mailto:[EMAIL PROTECTED]
namespace Test {
        using System;
        using System.CodeDom;
        using System.CodeDom.Compiler;
        using System.Reflection;
        using Microsoft.CSharp;

        public class TestCodeDom3
        {
                static void PopulateImports( object sender, EventArgs args )
                {
                        CodeNamespace ns = (CodeNamespace)sender;
                        
                        CodeNamespaceImportCollection imports = ns.Imports;
                        
                        imports.Add( new CodeNamespaceImport( "System.Collections" ) );
                }

                static void AddArrayTypes( CodeMemberMethod method )
                {
                        CodeTypeReference type;
                        type = new CodeTypeReference( new CodeTypeReference( 
"System.Int32", 3 ), 1 );
                        CodeArrayCreateExpression create = new 
CodeArrayCreateExpression( type );
                        create.Size = 42;
                        create.Initializers.Add( new CodePrimitiveExpression( 1 ) );
                        method.Statements.Add( new CodeVariableDeclarationStatement( 
type, "array1", create ) );

                        type = new CodeTypeReference( "System.Int32", 1 );
                        create = new CodeArrayCreateExpression( type );
                        method.Statements.Add( new CodeVariableDeclarationStatement( 
type, "array2", create ) );
                        
                        CodeTypeReference arrayType;
                        arrayType = new CodeTypeReference( "System.Int32", 2 );
                        type = new CodeTypeReference( arrayType, 1 );
                        create = new CodeArrayCreateExpression( type, 
                                                                new CodeExpression[] { 
                                                                        new 
CodeArrayCreateExpression( arrayType,
                                                                                       
                new CodeExpression[] { 
                                                                                       
                        new CodePrimitiveExpression( 1 )
                                                                                       
                } ),
                                                                        new 
CodeArrayCreateExpression( arrayType,
                                                                                       
                new CodeExpression[] { 
                                                                                       
                        new CodePrimitiveExpression( 2 )
                                                                                       
                } ),
                                                                        new 
CodeArrayCreateExpression( arrayType,
                                                                                       
                new CodeExpression[] { 
                                                                                       
                        new CodePrimitiveExpression( 3 )
                                                                                       
                } ) 
                                                                } );
                        create.Size = 3;
                        method.Statements.Add( new CodeVariableDeclarationStatement( 
type, "array3", create ) );

                        arrayType = new CodeTypeReference( "System.Int32", 2 );
                        type = new CodeTypeReference( arrayType, 1 );
                        create = new CodeArrayCreateExpression( type, 2 );
                        method.Statements.Add( new CodeVariableDeclarationStatement( 
type, "array4", create ) );
                }

                static void AddTryCatch( CodeMemberMethod method )
                {
                        method.Statements.Add( new CodeTryCatchFinallyStatement(
                                new CodeStatement[] {
                                        new CodeAssignStatement( new 
CodeFieldReferenceExpression( new CodeThisReferenceExpression(), "member" ),
                                                new CodeBinaryOperatorExpression( new 
CodeCastExpression( "System.Int64", new CodeVariableReferenceExpression( "param" ) ),
                                                                                   
CodeBinaryOperatorType.Add,
                                                                                   new 
CodePrimitiveExpression( 1 ) ) )
                                },
                                new CodeCatchClause[] {
                                        new CodeCatchClause( "e",
                                                new CodeTypeReference( "Exception" ),
                                                             new 
CodeExpressionStatement( 
                                                                        new 
CodeMethodInvokeExpression( 
                                                                                       
 new CodeTypeReferenceExpression(new CodeTypeReference(typeof(System.Console))),
                                                                                       
 "WriteLine", 
                                                                                       
 new CodePrimitiveExpression("an \"error\" occurred.") ) ) )
                                },
                                new CodeStatement[] {
                                        new CodeCommentStatement( "give up" ) 
                                } ) );
                }

                static void PopulateStatements( object sender, EventArgs args )
                {
                        CodeMemberMethod method = (CodeMemberMethod)sender;

                        AddArrayTypes( method );
                        AddTryCatch( method );
                        
                        method.Statements.Add( new CodeExpressionStatement( new 
CodeArrayIndexerExpression( new CodeBaseReferenceExpression(),
                                                                                       
                     new CodeExpression[] {
                                                                                       
                             new CodePrimitiveExpression( 10 ),
                                                                                       
                             new CodeFieldReferenceExpression( new 
CodeThisReferenceExpression(), "arrayindexer" )
                                                                                       
                     } ) ) );

                        method.Statements.Add( new CodeExpressionStatement( new 
CodeIndexerExpression( new CodeBaseReferenceExpression(),
                                                                                       
                new CodeExpression[] {
                                                                                       
                        new CodePrimitiveExpression( 10 ),
                                                                                       
                        new CodeFieldReferenceExpression( new 
CodeThisReferenceExpression(), "indexer" )
                                                                                       
                } ) ) );
                        method.Statements.Add( new CodeExpressionStatement( new 
CodeSnippetExpression( "this" ) ) );
                        method.Statements.Add( new CodeExpressionStatement( new 
CodeSnippetExpression( "\"this\"" ) ) );
                }

                static void PopulateTypes( object sender, EventArgs args )
                {
                        CodeNamespace ns = (CodeNamespace)sender;
                        
                        CodeTypeDeclaration test = new CodeTypeDeclaration( "Test" );
#if false
                        test.TypeAttributes = 
                                TypeAttributes.Public | 
                                TypeAttributes.Sealed |
                                TypeAttributes.Abstract;
#endif
                        test.IsClass = true;

                        test.BaseTypes.Add( new CodeTypeReference( 
typeof(System.Array) ) );
                        test.BaseTypes.Add( new CodeTypeReference( 
typeof(System.Collections.ICollection) ) );
                        test.BaseTypes.Add( new CodeTypeReference( 
"System.Collections.IEnumerable" ) );

                        CodeMemberMethod method = new CodeMemberMethod();

                        method.Name = "GetEnumerator";
                        method.Parameters.Add( new CodeParameterDeclarationExpression( 
new CodeTypeReference( typeof(System.Collections.ICollection) ), "collection" ) );
                        method.Parameters.Add( new CodeParameterDeclarationExpression( 
"System.Int32", "value" ) );
                        CodeArrayCreateExpression array = new 
CodeArrayCreateExpression( new CodeTypeReference( "System.Int32", 2 ) );
#if false
                        array.Initializers.Add( new CodePrimitiveExpression( 1 ) );
                        array.Initializers.Add( new CodePrimitiveExpression( 2 ) );
                        array.Initializers.Add( new CodePrimitiveExpression( 3 ) );
#endif
                        method.Statements.Add( array );
                        method.Statements.Add( new CodeConditionStatement( new 
CodePrimitiveExpression( true ),
                                                                           new 
CodeStatement[] { new CodeAssignStatement( new CodeVariableReferenceExpression( "a" ), 
new CodePrimitiveExpression( 10 ) ) },
                                                                           new 
CodeStatement[] { new CodeAssignStatement( new CodeVariableReferenceExpression( "b" ), 
new CodePrimitiveExpression( "hello" ) ) } ) );
                        method.PrivateImplementationType = new CodeTypeReference( 
"IEnumerable" );

                        method.Attributes = MemberAttributes.Final | 
MemberAttributes.Static | MemberAttributes.Public;

                        method.CustomAttributes.Add( new CodeAttributeDeclaration( 
"Flags" ) );
                        method.CustomAttributes.Add( new CodeAttributeDeclaration( 
"Serializable" ) );
                        method.CustomAttributes.Add( new CodeAttributeDeclaration( 
"SomeOtherAttribute", 
                                                                                   new 
CodeAttributeArgument( "name", 
                                                                                       
                       new CodeSnippetExpression( "value" ) ) ) );
                        test.Members.Add( method );

                        method = new CodeMemberMethod();
                        method.PopulateStatements += new EventHandler( 
PopulateStatements );
                        method.Name = "MoveNext";
                        method.Attributes = MemberAttributes.Family;
                        method.CustomAttributes.Add( new CodeAttributeDeclaration( 
"System.ComponentModel.ReadOnly", new CodeAttributeArgument( new 
CodeSnippetExpression( "true" ) ) ) );
                        test.Members.Add( method );

                        ns.Types.Add( test );
                }
                
                static ICodeGenerator GetCodeGenerator()
                {
                        CSharpCodeProvider provider =
                                new Microsoft.CSharp.CSharpCodeProvider();
                        ICodeGenerator codegen = provider.CreateGenerator();
                        
                        return codegen;
                }

                static void GenCode( CodeCompileUnit unit )
                {
                        ICodeGenerator codegen = GetCodeGenerator();
                        IndentedTextWriter writer =
                                new IndentedTextWriter( System.Console.Out );
                        codegen.GenerateCodeFromCompileUnit( unit, writer, null );
                }

                static void Main( string[] argv )
                {
                        CodeCompileUnit unit = new CodeCompileUnit();

                        CodeNamespaceCollection namespaces = unit.Namespaces;

                        CodeNamespace ns;
                        ns = new CodeNamespace( "System" );
                        namespaces.Add( ns );
                        ns.PopulateImports += new EventHandler( PopulateImports );

                        ns = new CodeNamespace( "CodeDom.Test" );
                        namespaces.Add( ns );
                        ns.Comments.Add( new CodeCommentStatement( "This program is 
complete rubbish and only used for Testing System.CodeDom " +
                                                                   "and 
System.CodeDom.Compiler implementatations.", true ) );
                        ns.PopulateImports += new EventHandler( PopulateImports );
                        ns.PopulateTypes += new EventHandler( PopulateTypes );
                        
                        GenCode( unit );
                }
        }
}

Reply via email to