2001-10-17 Ravi Pratap <ravi@ximian.com>
[mono.git] / mcs / mcs / ChangeLog
index ae16af8fcdd799b3d81e37c3a9bd6e90ba79ca39..bd716c34ca94b9dfc470f51c74bc53c1bac30ac9 100755 (executable)
@@ -1,3 +1,706 @@
+2001-10-17  Ravi Pratap  <ravi@ximian.com>
+
+       * expression.cs (New::DoResolve): Implement delegate creation fully
+       and according to the spec.
+
+       (New::DoEmit): Update to handle delegates differently.
+
+       (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
+       because of which we were printing out arguments in reverse order !
+
+       * delegate.cs (VerifyMethod): Implement to check if the given method
+       matches the delegate.
+
+       (FullDelegateDesc): Implement.
+
+       (VerifyApplicability): Implement.
+
+       * expression.cs (Invocation::DoResolve): Update to accordingly handle
+       delegate invocations too.
+
+       (Invocation::Emit): Ditto.
+
+       * ../errors/cs1593.cs : Added.
+
+       * ../errors/cs1594.cs : Added.
+
+       * delegate.cs (InstanceExpression, TargetMethod): New properties.
+
+2001-10-16  Ravi Pratap  <ravi@ximian.com>
+
+       * typemanager.cs (intptr_type): Core type for System.IntPtr
+
+       (InitCoreTypes): Update for the same.
+
+       (iasyncresult_type, asynccallback_type): Ditto.
+
+       * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
+       correct.
+
+       * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
+       too.
+
+       * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
+       the builders for the 4 members of a delegate type :-)
+
+       (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
+       type.
+
+       * expression.cs (New::DoResolve): Implement guts for delegate creation.
+
+       * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
+
+2001-10-15  Miguel de Icaza  <miguel@ximian.com>
+
+       * statement.cs (Break::Emit): Implement.   
+       (Continue::Emit): Implement.
+
+       (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
+       (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
+       (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
+       (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
+       end loop
+       
+       * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
+       properties that track the label for the current loop (begin of the
+       loop and end of the loop).
+
+2001-10-15  Ravi Pratap  <ravi@ximian.com>
+
+       * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
+       use of emitting anything at all.
+
+       * class.cs, rootcontext.cs : Get rid of calls to the same.
+
+       * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
+
+       (Populate): Define the constructor correctly and set the implementation
+       attributes.
+
+       * typemanager.cs (delegate_types): New hashtable to hold delegates that
+       have been defined.
+
+       (AddDelegateType): Implement.
+
+       (IsDelegateType): Implement helper method.
+
+       * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
+
+       * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
+       and accordingly handle it.
+
+       * delegate.cs (Populate): Take TypeContainer argument.
+       Implement bits to define the Invoke method. However, I still haven't figured out
+       how to take care of the native int bit :-(
+
+       * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
+       Qualify the name of the delegate, not its return type !
+
+       * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
+       conversion.
+
+       (StandardConversionExists): Checking for array types turns out to be recursive.
+
+       (ConvertReferenceExplicit): Implement array conversion.
+
+       (ExplicitReferenceConversionExists): New method to determine precisely that :-)
+       
+2001-10-12  Ravi Pratap  <ravi@ximian.com>
+
+       * cs-parser.jay (delegate_declaration): Store the fully qualified
+       name as it is a type declaration.
+
+       * delegate.cs (ReturnType, Name): Rename members to these. Make them 
+       readonly.
+
+       (DefineDelegate): Renamed from Define. Does the same thing essentially,
+       as TypeContainer::DefineType.
+
+       (Populate): Method in which all the definition of the various methods (Invoke)
+       etc is done.
+
+       (Emit): Emit any code, if necessary. I am not sure about this really, but let's
+       see.
+       
+       (CloseDelegate): Finally creates the delegate.
+
+       * class.cs (TypeContainer::DefineType): Update to define delegates.
+       (Populate, Emit and CloseType): Do the same thing here too.
+
+       * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
+       delegates in all these operations.
+
+2001-10-14  Miguel de Icaza  <miguel@ximian.com>
+
+       * expression.cs: LocalTemporary: a new expression used to
+       reference a temporary that has been created.
+
+       * assign.cs: Handle PropertyAccess back here, so that we can
+       provide the proper semantic access to properties.
+
+       * expression.cs (Expression::ConvertReferenceExplicit): Implement
+       a few more explicit conversions. 
+
+       * modifiers.cs: `NEW' modifier maps to HideBySig.
+
+       * expression.cs (PropertyExpr): Make this into an
+       ExpressionStatement, and support the EmitStatement code path. 
+
+       Perform get/set error checking, clean up the interface.
+
+       * assign.cs: recognize PropertyExprs as targets, and if so, turn
+       them into toplevel access objects.
+
+2001-10-12  Miguel de Icaza  <miguel@ximian.com>
+
+       * expression.cs: PropertyExpr::PropertyExpr: use work around the
+       SRE.
+
+       * typemanager.cs: Keep track here of our PropertyBuilders again to
+       work around lameness in SRE.
+
+2001-10-11  Miguel de Icaza  <miguel@ximian.com>
+
+       * expression.cs (LValue::LValueResolve): New method in the
+       interface, used to perform a second resolution pass for LValues. 
+       
+       (This::DoResolve): Catch the use of this in static methods.
+
+       (This::LValueResolve): Implement.
+
+       (This::Store): Remove warning, assigning to `this' in structures
+       is 
+
+       (Invocation::Emit): Deal with invocation of
+       methods on value types.  We need to pass the address to structure
+       methods rather than the object itself.  (The equivalent code to
+       emit "this" for structures leaves the entire structure on the
+       stack instead of a pointer to it). 
+
+       (ParameterReference::DoResolve): Compute the real index for the
+       argument based on whether the method takes or not a `this' pointer
+       (ie, the method is static).
+
+       * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
+       value types returned from functions when we need to invoke a
+       method on the sturcture.
+       
+
+2001-10-11  Ravi Pratap  <ravi@ximian.com>
+
+       * class.cs (TypeContainer::DefineType): Method to actually do the business of
+       defining the type in the Modulebuilder or Typebuilder. This is to take
+       care of nested types which need to be defined on the TypeBuilder using
+       DefineNestedMethod.
+
+       (TypeContainer::GetClassBases): Implement. Essentially the code from the 
+       methods in RootContext, only ported to be part of TypeContainer.
+
+       (TypeContainer::GetInterfaceOrClass): Ditto.
+
+       (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
+
+       * interface.cs (Interface::DefineInterface): New method. Does exactly
+       what RootContext.CreateInterface did earlier, only it takes care of nested types 
+       too.
+
+       (Interface::GetInterfaces): Move from RootContext here and port.
+
+       (Interface::GetInterfaceByName): Same here.
+
+       * rootcontext.cs (ResolveTree): Re-write.
+
+       (PopulateTypes): Re-write.
+
+       * class.cs (TypeContainer::Populate): Populate nested types too.
+       (TypeContainer::Emit): Emit nested members too.
+
+       * typemanager.cs (AddUserType): Do not make use of the FullName property,
+       instead just use the name argument passed in as it is already fully
+       qualified.
+
+       (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
+       to TypeContainer mapping to see if a type is user-defined.
+
+       * class.cs (TypeContainer::CloseType): Implement. 
+
+       (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
+       the default constructor.
+       
+       (TypeContainer::Populate): Fix minor bug which led to creating default constructors
+       twice.
+
+       (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
+
+       * interface.cs (CloseType): Create the type here.
+       
+       * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
+       the hierarchy.
+
+       Remove all the methods which are now in TypeContainer.
+
+2001-10-10  Ravi Pratap  <ravi@ximian.com>
+
+       * delegate.cs (Define): Re-write bits to define the delegate
+       correctly.
+
+2001-10-10  Miguel de Icaza  <miguel@ximian.com>
+
+       * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
+
+       * expression.cs (ImplicitReferenceConversion): handle null as well
+       as a source to convert to any reference type.
+
+       * statement.cs (Return): Perform any implicit conversions to
+       expected return type.  
+
+       Validate use of return statement.  
+
+       * codegen.cs (EmitContext): Pass the expected return type here.
+
+       * class.cs (Method, Constructor, Property): Pass expected return
+       type to EmitContext.
+
+2001-10-09  Miguel de Icaza  <miguel@ximian.com>
+
+       * expression.cs: Make DoResolve take an EmitContext instead of a
+       TypeContainer.
+
+       Replaced `l' and `location' for `loc', for consistency.
+       
+       (Error, Warning): Remove unneeded Tc argument.
+
+       * assign.cs, literal.cs, constant.cs: Update to new calling
+       convention. 
+       
+       * codegen.cs: EmitContext now contains a flag indicating whether
+       code is being generated in a static method or not.
+
+       * cs-parser.jay: DecomposeQI, new function that replaces the old
+       QualifiedIdentifier.  Now we always decompose the assembled
+       strings from qualified_identifier productions into a group of
+       memberaccesses.
+
+2001-10-08  Miguel de Icaza  <miguel@ximian.com>
+
+       * rootcontext.cs: Deal with field-less struct types correctly now
+       by passing the size option to Define Type.
+
+       * class.cs: Removed hack that created one static field. 
+
+2001-10-07  Miguel de Icaza  <miguel@ximian.com>
+
+       * statement.cs: Moved most of the code generation here. 
+
+2001-10-09  Ravi Pratap  <ravi@ximian.com>
+
+       * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
+       seem very right.
+
+       (ElementAccess): Remove useless bits for now - keep checks as the spec
+       says.
+
+2001-10-08  Ravi Pratap  <ravi@ximian.com>
+
+       * expression.cs (ElementAccess::DoResolve): Remove my crap code
+       and start performing checks according to the spec.
+
+2001-10-07  Ravi Pratap  <ravi@ximian.com>
+
+       * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
+       rank_specifiers instead.
+
+       (rank_specifiers): Change the order in which the rank specifiers are stored
+
+       (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
+
+       * expression.cs (ElementAccess): Implement the LValue interface too.
+       
+2001-10-06  Ravi Pratap  <ravi@ximian.com>
+       
+       * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
+       except that user defined conversions are not included.
+
+       (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
+       perform the conversion of the return type, if necessary.
+
+       (New::DoResolve): Check whether we are creating an array or an object
+       and accordingly do the needful.
+
+       (New::Emit): Same here.
+
+       (New::DoResolve): Implement guts of array creation.
+
+       (New::FormLookupType): Helper function.
+
+2001-10-07  Miguel de Icaza  <miguel@ximian.com>
+
+       * codegen.cs: Removed most of the code generation here, and move the
+       corresponding code generation bits to the statement classes. 
+
+       Added support for try/catch/finalize and throw.
+       
+       * cs-parser.jay: Added support for try/catch/finalize.
+
+       * class.cs: Catch static methods having the flags override,
+       virtual or abstract.
+
+       * expression.cs (UserCast): This user cast was not really doing
+       what it was supposed to do.  Which is to be born in fully resolved
+       state.  Parts of the resolution were being performed at Emit time! 
+
+       Fixed this code.
+
+2001-10-05  Miguel de Icaza  <miguel@ximian.com>
+
+       * expression.cs: Implicity convert the result from UserCast.
+
+2001-10-05  Ravi Pratap  <ravi@ximian.com>
+
+       * expression.cs (Expression::FindMostEncompassingType): Fix bug which
+       prevented it from working correctly. 
+
+       (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
+       merely ConvertImplicit.
+
+2001-10-05  Miguel de Icaza  <miguel@ximian.com>
+
+       * typemanager.cs: Make the LookupTypeContainer function static,
+       and not per-instance.  
+
+       * class.cs: Make static FindMembers (the one that takes a Type
+       argument). 
+
+       * codegen.cs: Add EmitForeach here.
+
+       * cs-parser.jay: Make foreach a toplevel object instead of the
+       inline expansion, as we need to perform semantic analysis on it. 
+
+2001-10-05  Ravi Pratap  <ravi@ximian.com>
+
+       * expression.cs (Expression::ImplicitUserConversion): Rename to
+       UserDefinedConversion.
+
+       (Expression::UserDefinedConversion): Take an extra argument specifying 
+       whether we look for explicit user conversions too.
+
+       (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
+
+       (UserDefinedConversion): Incorporate support for user defined explicit conversions.
+
+       (ExplicitUserConversion): Make it a call to UserDefinedConversion
+       with the appropriate arguments.
+
+       * cs-parser.jay (cast_expression): Record location too.
+
+       * expression.cs (Cast): Record location info.
+
+       (Expression::ConvertExplicit): Take location argument.
+
+       (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
+       to determine if we are doing explicit conversions.
+
+       (UserCast::Emit): Update accordingly.
+
+       (Expression::ConvertExplicit): Report an error if everything fails.
+
+       * ../errors/cs0030.cs : Add.
+
+2001-10-04  Miguel de Icaza  <miguel@ximian.com>
+
+       * modifiers.cs: If the ABSTRACT keyword is present, also set the
+       virtual and newslot bits. 
+
+       * class.cs (TypeContainer::RegisterRequiredImplementations):
+       Record methods we need.
+
+       (TypeContainer::MakeKey): Helper function to make keys for
+       MethodBases, since the Methodbase key is useless.
+
+       (TypeContainer::Populate): Call RegisterRequiredImplementations
+       before defining the methods.   
+
+       Create a mapping for method_builders_to_methods ahead of time
+       instead of inside a tight loop.
+
+       (::RequireMethods):  Accept an object as the data to set into the
+       hashtable so we can report interface vs abstract method mismatch.
+
+2001-10-03  Miguel de Icaza  <miguel@ximian.com>
+
+       * report.cs: Make all of it static.
+
+       * rootcontext.cs: Drop object_type and value_type computations, as
+       we have those in the TypeManager anyways.
+
+       Drop report instance variable too, now it is a global.
+
+       * driver.cs: Use try/catch on command line handling.
+
+       Add --probe option to debug the error reporting system with a test
+       suite. 
+
+       * report.cs: Add support for exiting program when a probe
+       condition is reached.
+
+2001-10-03  Ravi Pratap  <ravi@ximian.com>
+
+       * expression.cs (Binary::DoNumericPromotions): Fix the case when
+       we do a forcible conversion regardless of type, to check if 
+       ForceConversion returns a null.
+
+       (Binary::error19): Use location to report error.
+
+       (Unary::error23): Use location here too.
+
+       * ../errors/cs0019.cs : Check in.
+
+       * ../errors/cs0023.cs : Check in.
+
+       * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
+       case of a non-null MethodInfo object with a length of 0 !
+
+       (Binary::ResolveOperator): Flag error if overload resolution fails to find
+       an applicable member - according to the spec :-)
+       Also fix logic to find members in base types.
+
+       (Unary::ResolveOperator): Same here.
+
+       (Unary::report23): Change name to error23 and make first argument a TypeContainer
+       as I was getting thoroughly confused between this and error19 :-)
+       
+       * expression.cs (Expression::ImplicitUserConversion): Re-write fully
+       (::FindMostEncompassedType): Implement.
+       (::FindMostEncompassingType): Implement.
+       (::StandardConversionExists): Implement.
+
+       (UserImplicitCast): Re-vamp. We now need info about most specific
+       source and target types so that we can do the necessary conversions.
+
+       (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
+       mathematical union with no duplicates.
+
+2001-10-03  Miguel de Icaza  <miguel@ximian.com>
+
+       * rootcontext.cs (RootContext::PopulateTypes): Populate containers
+       in order from base classes to child classes, so that we can in
+       child classes look up in our parent for method names and
+       attributes (required for handling abstract, virtual, new, override
+       constructs: we need to instrospect our base class, and if we dont
+       populate the classes in order, the introspection might be
+       incorrect.  For example, a method could query its parent before
+       the parent has any methods and would determine that the parent has
+       no abstract methods (while it could have had them)).
+
+       (RootContext::CreateType): Record the order in which we define the
+       classes.
+
+2001-10-02  Miguel de Icaza  <miguel@ximian.com>
+
+       * class.cs (TypeContainer::Populate): Also method definitions can
+       fail now, keep track of this.
+
+       (TypeContainer::FindMembers): Implement support for
+       DeclaredOnly/noDeclaredOnly flag.
+
+       (Constructor::Emit) Return the ConstructorBuilder.
+
+       (Method::Emit) Return the MethodBuilder. 
+       Check for abstract or virtual methods to be public.
+
+       * rootcontext.cs (RootContext::CreateType): Register all the
+       abstract methods required for the class to be complete and the
+       interface methods that must be implemented. 
+
+       * cs-parser.jay: Report error 501 (method requires body if it is
+       not marked abstract or extern).
+
+       * expression.cs (TypeOf::Emit): Implement.
+
+       * typemanager.cs: runtime_handle_type, new global type.
+
+       * class.cs (Property::Emit): Generate code for properties.
+
+2001-10-02  Ravi Pratap  <ravi@ximian.com>
+
+       * expression.cs (Unary::ResolveOperator): Find operators on base type
+       too - we now conform exactly to the spec.
+
+       (Binary::ResolveOperator): Same here.
+
+       * class.cs (Operator::Define): Fix minor quirk in the tests.
+
+       * ../errors/cs0215.cs : Added.
+
+       * ../errors/cs0556.cs : Added.
+
+       * ../errors/cs0555.cs : Added.
+
+2001-10-01  Miguel de Icaza  <miguel@ximian.com>
+
+       * cs-tokenizer.cs: Reimplemented Location to be a struct with a
+       single integer which is really efficient
+
+2001-10-01  Ravi Pratap  <ravi@ximian.com>
+
+       *  expression.cs (Expression::ImplicitUserConversion): Use location
+        even in the case when we are examining True operators.
+        * class.cs (Operator::Define): Perform extensive checks to conform
+        with the rules for operator overloading in the spec.
+
+       * expression.cs (Expression::ImplicitReferenceConversion): Implement
+       some of the other conversions mentioned in the spec.
+
+       * typemanager.cs (array_type): New static member for the System.Array built-in
+       type.
+
+       (cloneable_interface): For System.ICloneable interface.
+
+       * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
+       we start resolving the tree and populating types.
+
+       * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
+2001-10-01  Miguel de Icaza  <miguel@ximian.com>
+
+       * expression.cs (Expression::ExprClassFromMemberInfo,
+       Expression::Literalize): Create literal expressions from
+       FieldInfos which are literals.
+
+       (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
+       type casts, because they were wrong.  The test suite in tests
+       caught these ones.
+
+       (ImplicitNumericConversion): ushort to ulong requires a widening
+       cast. 
+
+       Int32 constant to long requires widening cast as well.
+
+       * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
+       for integers because the type on the stack is not i4.
+
+2001-09-30  Miguel de Icaza  <miguel@ximian.com>
+
+       * expression.cs (report118): require location argument. 
+
+       * parameter.cs: Do not dereference potential null value.
+
+       * class.cs: Catch methods that lack the `new' keyword when
+       overriding a name.  Report warnings when `new' is used without
+       anything being there to override.
+
+       * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
+
+       * class.cs: Only add constructor to hashtable if it is non-null
+       (as now constructors can fail on define).
+
+       (TypeManager, Class, Struct): Take location arguments.
+
+       Catch field instance initialization in structs as errors.
+
+       accepting_filter: a new filter for FindMembers that is static so
+       that we dont create an instance per invocation.
+
+       (Constructor::Define): Catch errors where a struct constructor is
+       parameterless 
+
+       * cs-parser.jay: Pass location information for various new
+       constructs. 
+       
+       * delegate.cs (Delegate): take a location argument.
+
+       * driver.cs: Do not call EmitCode if there were problesm in the
+       Definition of the types, as many Builders wont be there. 
+
+       * decl.cs (Decl::Decl): Require a location argument.
+
+       * cs-tokenizer.cs: Handle properly hex constants that can not fit
+       into integers, and find the most appropiate integer for it.
+
+       * literal.cs: Implement ULongLiteral.
+
+       * rootcontext.cs: Provide better information about the location of
+       failure when CreateType fails.
+       
+2001-09-29  Miguel de Icaza  <miguel@ximian.com>
+
+       * rootcontext.cs (RootContext::PopulateTypes): Populates structs
+       as well.
+
+       * expression.cs (Binary::CheckShiftArguments): Add missing type
+       computation.
+       (Binary::ResolveOperator): Add type to the logical and and logical
+       or, Bitwise And/Or and Exclusive Or code paths, it was missing
+       before.
+
+       (Binary::DoNumericPromotions): In the case where either argument
+       is ulong (and most signed types combined with ulong cause an
+       error) perform implicit integer constant conversions as well.
+
+2001-09-28  Miguel de Icaza  <miguel@ximian.com>
+
+       * expression.cs (UserImplicitCast): Method should always be
+       non-null. 
+       (Invocation::BetterConversion): Simplified test for IntLiteral.
+
+       (Expression::ImplicitNumericConversion): Split this routine out.
+       Put the code that performs implicit constant integer conversions
+       here. 
+
+       (Expression::Resolve): Become a wrapper around DoResolve so we can
+       check eclass and type being set after resolve.
+
+       (Invocation::Badness): Remove this dead function
+
+       (Binary::ResolveOperator): Do not compute the expensive argumnets
+       unless we have a union for it.
+
+       (Probe::Emit): Is needs to do an isinst and then
+       compare against null.
+
+       (::CanConvert): Added Location argument.  If the Location argument
+       is null (Location.Null), then we do not report errors.  This is
+       used by the `probe' mechanism of the Explicit conversion.  We do
+       not want to generate an error for something that the user
+       explicitly requested to be casted.  But the pipeline for an
+       explicit cast first tests for potential implicit casts.
+
+       So for now, if the Location is null, it means `Probe only' to
+       avoid adding another argument.   Might have to revise this
+       strategy later.
+
+       (ClassCast): New class used to type cast objects into arbitrary
+       classes (used in Explicit Reference Conversions).
+
+       Implement `as' as well.
+
+       Reverted all the patches from Ravi below: they were broken:
+
+               * The use of `level' as a mechanism to stop recursive
+                 invocations is wrong.  That was there just to catch the
+                 bug with a strack trace but not as a way of addressing
+                 the problem.
+
+                 To fix the problem we have to *understand* what is going
+                 on and the interactions and come up with a plan, not
+                 just get things going.
+
+               * The use of the type conversion cache that I proposed
+                 last night had an open topic: How does this work across
+                 protection domains.  A user defined conversion might not
+                 be public in the location where we are applying the
+                 conversion, a different conversion might be selected
+                 (ie, private A->B (better) but public B->A (worse),
+                 inside A, A->B applies, but outside it, B->A will
+                 apply).
+
+               * On top of that (ie, even if the above is solved),
+                 conversions in a cache need to be abstract.  Ie, `To
+                 convert from an Int to a Short use an OpcodeCast', not
+                 `To convert from an Int to a Short use the OpcodeCast on
+                 the variable 5' (which is what this patch was doing).
+       
 2001-09-28  Ravi Pratap  <ravi@ximian.com>
 
        * expression.cs (Invocation::ConversionExists): Re-write to use