diff --git a/ChangeLog b/ChangeLog index 8e2b5b7..7da7408 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,9 @@ +Fri Nov 24 17:01:27 CET 2006 Paolo Molaro + + * Makefile, configure: added configure script and install/dist target. + * coverage.c: updated to not require access to mono internals. + Fri Nov 24 16:25:51 CET 2006 Paolo Molaro * CoverageModel.cs: updated to use Cecil to load assemblies diff --git a/MANIFEST b/MANIFEST index b35da09..d9803fa 100644 --- a/MANIFEST +++ b/MANIFEST @@ -3,6 +3,7 @@ README LICENSE ChangeLog Makefile +configure CoverageItem.cs NamespaceCoverageItem.cs ClassCoverageItem.cs @@ -14,18 +15,12 @@ HtmlExporter.cs MonoCovMain.cs style.xsl trans.gif -gui/qt/MonoCov.cs -gui/qt/CoverageView.cs -gui/qt/SourceWindow.cs -gui/qt/FilterDialog.cs -gui/qt/filterdialog.ui gui/gtk/MonoCov.cs gui/gtk/CoverageView.cs +gui/gtk/SourceWindow.cs gui/gtk/monocov.glade +gui/gtk/monocov.gladep test.cs symbols.cs nunit-console.cs coverage.c -Qt-monocov.dll -qtsharp.diff -corlib-tests.cov diff --git a/Makefile b/Makefile index 069a363..732773f 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ +include config.make PROJECTNAME = monocov GUI = gtk -MONO_ROOT = ../mono LIBS=-r:Mono.Cecil all: monocov.exe libmono-profiler-monocov.so symbols.exe @@ -51,7 +51,14 @@ nunit-console.exe: nunit-console.cs gmcs -r:nunit.framework -r:nunit.core -r:nunit.util -r:Mono.GetOptions nunit-console.cs libmono-profiler-monocov.so: coverage.c - $(CC) -g -I$(MONO_ROOT) `pkg-config --cflags glib-2.0` --shared -fPIC -o $@ $^ + $(CC) -g `pkg-config --cflags glib-2.0` --shared -fPIC -o $@ $^ + +install: all + mkdir -p $(prefix)/lib/monocov + cp Mono.Cecil.dll $(prefix)/lib/monocov + cp monocov.exe $(prefix)/lib/monocov + cp monocov $(prefix)/bin + cp libmono-profiler-monocov.so $(prefix)/lib/monocov test: gmcs -debug test.cs @@ -80,5 +87,16 @@ test-colorizer.exe: test-colorizer.cs SyntaxHighlighter.cs clean: rm -f monocov.exe monocov.exe.mdb symbols.exe symbols.exe.mdb nunit-console.exe libmono-profiler-monocov.so +distclean: + rm -f monocov Mono.Cecil.dll config.make + +dist: + tar -chzf $(PROJECTNAME)-$(VERSION).tar.gz `cat MANIFEST` \ + && DIRNAME=$(PROJECTNAME)-$(VERSION) && rm -rf $$DIRNAME \ + && mkdir $$DIRNAME && mv $(PROJECTNAME)-$(VERSION).tar.gz $$DIRNAME \ + && cd $$DIRNAME && tar -xzf $(PROJECTNAME)-$(VERSION).tar.gz \ + && rm $(PROJECTNAME)-$(VERSION).tar.gz && cd - && tar -cvzf $$DIRNAME.tar.gz $$DIRNAME \ + && rm -rf $$DIRNAME + distrib: tar -cvhzf $(PROJECTNAME).tar.gz `cat MANIFEST` && DIRNAME=$(PROJECTNAME)-`date +%d-%b-%y` && rm -rf $$DIRNAME && mkdir $$DIRNAME && mv $(PROJECTNAME).tar.gz $$DIRNAME && cd $$DIRNAME && tar -xzf $(PROJECTNAME).tar.gz && rm $(PROJECTNAME).tar.gz && cd - && tar -cvzf $$DIRNAME.tar.gz $$DIRNAME && rm -rf $$DIRNAME diff --git a/configure b/configure new file mode 100755 index 0000000..f6a634d --- /dev/null +++ b/configure @@ -0,0 +1,59 @@ +#!/bin/sh + +VERSION=0.1 + +help() +{ + echo "" + echo "Usage is: configure [--prefix=PREFIX]" + echo "" +} + +prefix=/usr/local + +while [ $# -ne 0 ]; do + case $1 in + --help) + help + exit 0 + ;; + --prefix=*) + prefix=`echo $1 | sed 's/--prefix=//'`; + shift + ;; + --prefix) + shift + prefix="$1" + shift + ;; + *) + echo Unknown option: $1 + help + shift + esac +done + +cecilbin=`pkg-config --variable=Libraries mono-cecil` + +if test -z $cecilbin; then + echo "Cecil is not installed." + exit 1 +fi + +# copy Mono.Cecil here +cp $cecilbin . + +echo "prefix=$prefix" > config.make +echo "VERSION=$VERSION" > config.make + +echo "#!/bin/sh" > monocov +echo "exec mono $prefix/lib/monocov/monocov.exe \$@" >> monocov +chmod +x monocov + +echo "" +echo "MonoCov module configured" +echo "" +echo " Prefix: $prefix" +echo "" + +exit 0; diff --git a/coverage.c b/coverage.c index 9183b17..c16d454 100644 --- a/coverage.c +++ b/coverage.c @@ -2,15 +2,13 @@ #include #include #include +#include +#include -#include "mono/metadata/tabledefs.h" -#include "mono/metadata/class.h" -#include "mono/metadata/mono-debug.h" -#include "mono/metadata/debug-helpers.h" -#include "mono/metadata/profiler.h" - -#include "mono/metadata/metadata-internals.h" -#include "mono/metadata/class-internals.h" +#include +#include +#include +#include struct _MonoProfiler { /* Contains the methods for which we have coverage data */ @@ -136,27 +134,34 @@ collect_coverage_for (MonoProfiler *prof, MonoMethod *method) char *fqn; MonoMethodHeader *header; gboolean has_positive, found; + guint32 iflags, flags, code_size; + MonoClass *klass; + MonoImage *image; - if ((method->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL) || - (method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL)) + flags = mono_method_get_flags (method, &iflags); + if ((iflags & 0x1000 /*METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL*/) || + (flags & 0x2000 /*METHOD_ATTRIBUTE_PINVOKE_IMPL*/)) return FALSE; - if (method->wrapper_type != MONO_WRAPPER_NONE) - return FALSE; + //if (method->wrapper_type != MONO_WRAPPER_NONE) + // return FALSE; + klass = mono_method_get_class (method); + image = mono_class_get_image (klass); /* Hacky way of determining the executing assembly */ - if (! prof->outfile_name && (strcmp (method->name, "Main") == 0)) - prof->outfile_name = g_strdup_printf ("%s.cov", method->klass->image->assembly->image->name); + if (! prof->outfile_name && (strcmp (mono_method_get_name (method), "Main") == 0)) { + prof->outfile_name = g_strdup_printf ("%s.cov", mono_image_get_filename (image)); + } /* Check filters */ if (prof->filters) { /* Check already filtered classes first */ - if (g_hash_table_lookup (prof->filtered_classes, method->klass)) + if (g_hash_table_lookup (prof->filtered_classes, klass)) return FALSE; - classname = mono_type_get_name (&method->klass->byval_arg); + classname = mono_type_get_name (mono_class_get_type (klass)); - fqn = g_strdup_printf ("[%s]%s", method->klass->image->assembly_name, classname); + fqn = g_strdup_printf ("[%s]%s", mono_image_get_name (image), classname); // Check positive filters first has_positive = FALSE; @@ -184,7 +189,7 @@ collect_coverage_for (MonoProfiler *prof, MonoMethod *method) // Skip '-' filter = &filter [1]; if (strstr (fqn, filter) != NULL) { - g_hash_table_insert (prof->filtered_classes, method->klass, method->klass); + g_hash_table_insert (prof->filtered_classes, klass, klass); return FALSE; } } @@ -192,19 +197,20 @@ collect_coverage_for (MonoProfiler *prof, MonoMethod *method) g_free (classname); } - header = ((MonoMethodNormal *)method)->header; + header = mono_method_get_header (method); - if (header->code_size > 20000) { + mono_method_header_get_code (header, &code_size, NULL); + if (code_size > 20000) { exit (1); - g_warning ("Unable to instrument method %s:%s since it is too complex.", method->klass->name, method->name); + g_warning ("Unable to instrument method %s:%s since it is too complex.", mono_class_get_name (klass), mono_method_get_name (method)); return FALSE; } g_hash_table_insert (prof->methods, method, method); - g_hash_table_insert (prof->classes, method->klass, method->klass); + g_hash_table_insert (prof->classes, klass, klass); - g_hash_table_insert (prof->assemblies, method->klass->image->assembly, method->klass->image->assembly); + g_hash_table_insert (prof->assemblies, mono_image_get_assembly (image), mono_image_get_assembly (image)); return TRUE; } @@ -242,7 +248,9 @@ output_filters (MonoProfiler *prof, FILE *outfile) static void output_assembly (MonoAssembly *assembly, MonoAssembly *assembly2, FILE *outfile) { - fprintf (outfile, "\t\n", assembly->image->assembly_name, assembly->image->guid, mono_image_get_filename (assembly->image)); + MonoImage *image = mono_assembly_get_image (assembly); + fprintf (outfile, "\t\n", + mono_image_get_name (image), mono_image_get_guid (image), mono_image_get_filename (image)); } static int count; @@ -267,19 +275,23 @@ output_method (MonoMethod *method, gpointer dummy, MonoProfiler *prof) char *classname; char *tmpsig; FILE *outfile; + MonoClass *klass; + MonoImage *image; outfile = prof->outfile; - header = ((MonoMethodNormal *)method)->header; + header = mono_method_get_header (method); - tmpsig = mono_signature_get_desc (method->signature, TRUE); + tmpsig = mono_signature_get_desc (mono_method_signature (method), TRUE); tmpsig = g_markup_escape_text (tmpsig, strlen (tmpsig)); - classname = mono_type_get_name (&method->klass->byval_arg); + klass = mono_method_get_class (method); + classname = mono_type_get_name (mono_class_get_type (klass)); + image = mono_class_get_image (klass); fprintf (outfile, "\t\n", - method->klass->image->assembly_name, - classname, method->name, - tmpsig, method->token); + mono_image_get_name (image), + classname, mono_method_get_name (method), + tmpsig, mono_method_get_token (method)); g_free (tmpsig); fprintf (outfile, "\t\t");