Hey Martin, This changes the runtime behavior in a fundamental way. Please don't cowboy code and provide tests for that.
On Fri, Feb 26, 2010 at 2:33 PM, Martin Baulig < mono-patches-l...@lists.ximian.com> wrote: > Author: martin > Date: 2010-02-26 12:33:31 -0500 (Fri, 26 Feb 2010) > New Revision: 152558 > > Modified: > trunk/mono/mono/metadata/ChangeLog > trunk/mono/mono/metadata/class-internals.h > trunk/mono/mono/metadata/object.c > Log: > Set `vtable->init_aborted' if we hit a `ThreadAbortException' in the class > .cctor. > 2010-02-26 Martin Baulig <mar...@ximian.com> > > * class-internals.h (MonoVTable): Added `init_aborted'. > > * object.c > (mono_runtime_class_init_full): Set `vtable->init_aborted' in > addition to `vtable->init_failed' if we hit a `ThreadAbortException' > while running the class .cctor and reset `init_failed' next time > we're called. > > Modified: trunk/mono/mono/metadata/ChangeLog > =================================================================== > --- trunk/mono/mono/metadata/ChangeLog 2010-02-26 17:33:21 UTC (rev > 152557) > +++ trunk/mono/mono/metadata/ChangeLog 2010-02-26 17:33:31 UTC (rev > 152558) > @@ -1,5 +1,15 @@ > 2010-02-26 Martin Baulig <mar...@ximian.com> > > + * class-internals.h (MonoVTable): Added `init_aborted'. > + > + * object.c > + (mono_runtime_class_init_full): Set `vtable->init_aborted' in > + addition to `vtable->init_failed' if we hit a > `ThreadAbortException' > + while running the class .cctor and reset `init_failed' next time > + we're called. > + > +2010-02-26 Martin Baulig <mar...@ximian.com> > + > * mono-debug.h > (MONO_DEBUGGER_MINOR_VERSION): Bump to 5. > > > Modified: trunk/mono/mono/metadata/class-internals.h > =================================================================== > --- trunk/mono/mono/metadata/class-internals.h 2010-02-26 17:33:21 UTC > (rev 152557) > +++ trunk/mono/mono/metadata/class-internals.h 2010-02-26 17:33:31 UTC > (rev 152558) > @@ -438,6 +438,7 @@ > guint remote : 1; /* class is remotely activated */ > guint initialized : 1; /* cctor has been run */ > guint init_failed : 1; /* cctor execution failed */ > + guint init_aborted : 1; /* cctor execution aborted */ > guint32 imt_collisions_bitmap; > MonoRuntimeGenericContext *runtime_generic_context; > /* do not add any fields after vtable, the structure is dynamically > extended */ > > Modified: trunk/mono/mono/metadata/object.c > =================================================================== > --- trunk/mono/mono/metadata/object.c 2010-02-26 17:33:21 UTC (rev > 152557) > +++ trunk/mono/mono/metadata/object.c 2010-02-26 17:33:31 UTC (rev > 152558) > @@ -285,6 +285,17 @@ > mono_type_initialization_unlock (); > return NULL; > } > + if (vtable->init_aborted) { > + /* > + * The current thread was aborting while running > the .cctor the last time, > + * so let's try again. > + * > + * The Mono Debugger calls Thread.Abort() on the > current thread to abort a > + * method call (after an expression evaluation > timeout, for instance). > + */ > + vtable->init_aborted = 0; > + vtable->init_failed = 0; > + } > if (vtable->init_failed) { > mono_type_initialization_unlock (); > > @@ -364,6 +375,20 @@ > exc_to_throw = > mono_get_exception_type_initialization (full_name, exc); > g_free (full_name); > > + if (exc) { > + MonoClass *exc_klass = > exc->object.vtable->klass; > + > + if (exc_klass->image == > mono_defaults.corlib && > + !strcmp (exc_klass->name_space, > "System.Threading") && > + !strcmp (exc_klass->name, > "ThreadAbortException")) { > + /* > + * Set `init_aborted' in > addition to `init_failed' if the > + * current thread was > aborted while running the .cctor. > + */ > + vtable->init_aborted = 1; > + } > + } > + > /* > * Store the exception object so it could be > thrown on subsequent > * accesses. > > _______________________________________________ > Mono-patches maillist - mono-patc...@lists.ximian.com > http://lists.ximian.com/mailman/listinfo/mono-patches >
_______________________________________________ Mono-devel-list mailing list Mono-devel-list@lists.ximian.com http://lists.ximian.com/mailman/listinfo/mono-devel-list