2008-06-20 Marek Safar <marek.safar@gmail.com>
[mono.git] / mcs / mcs / TODO
index 3ba5a205382a30085b6ad872fcfa90fe2021be94..741e63d2ab8cd6201491913c3bda9e15d599fee2 100644 (file)
-TODO:
+Iterators
+=========
 
 
-       1. Create a "partial" emit context for each TypeContainer..
 
 
-       2. EmitContext should be partially constructed.  No IL Generator.
+       Ok, solved part of the problem, but not the second.
 
 
-       interface_type review.
+       Apparently there are 2 scopes in test-iter-05.cs that
+       are referenced, but when we call "ComputeMethodHost" in
+       iterators.cs:854 this information is not yet available.
 
 
-       parameter_array, line 952: `note: must be a single dimension array type'.  Validate this
+===========================================
 
 
-Dead Code Elimination bugs:
+* Value Parameter
+
+       I believe that `Value Parameter' might have been introduced
+       after C# 1.0, also notice than in the treatment of Value Parameter
+       the parameters are defined in four categories:
+
+       Section 9.3 in the latest spec.
+
+
+Large project:
+--------------
+
+New
+---
+
+       It would be nice to optimize the case of:
+
+               Method (new ValueType ())
+
+       So that no temporary is created, and we only use a newobj call
+       that remains on the stack, as opposed to ldloca, initobj, ldloc
+       call.
+
+NEW NOTES:
+----------
+
+       ImplicitStandardConversionExists and ImplicitStandardConversion
+       should always be the same, but there are a few diverging lines that
+       must be studied:
+
+                       if (expr_type == target_type && !(expr is NullLiteral))
+                               return expr;
+
+       vs:
+
+                       if (expr_type == target_type)
+                               return true;
+
+****************************************************************************************
+* 
+*   The information on the rest of this file is mostly outdated, and its kept here for
+*   historical reasons
+*
+****************************************************************************************
+Error Reporting:
+----------------
+
+       * Make yyerror show a nice syntax error, instead of the current mess.
+
+Iterators
+---------
+       * Reset should throw not implemented now.
+
+Optimization ideas
+------------------
+
+       Currently when we build a type cache, it contains private members,
+       internal members, and internal protected members;   We should trim
+       these out, as it shows up on the profile.
+
+       We create too many Arraylists;  When we know the size, we should create
+       an array;
+
+       During parsing we use arraylists to accumulate data, like this:
+
+               thing:
+               
+               thing_list
+                       : thing { $$ =new ArrayList (); $$.Add ($1); }
+                       | thing_list thing { ArrayList a = $1; a.Add ($2); $$ = a; }
+
+       We probably could start using "Pairs" there:
+
+               thing_list
+                       : thing { $$ = new Pair ($1, null); }
+                       | thing_list thing { Pair p = $1; $$ = new Pair ($2, $1); }
+
+
+EmitContext.ResolveTypeTree
 ---------------------------
 
 ---------------------------
 
-       I should also resolve all the children expressions in Switch, Fixed, Using.
+       We should investigate its usage.  The problem is that by default
+       this will be set when calling FindType, that triggers a more expensive
+       lookup.
 
 
-Major tasks:
-------------
+       I believe we should pass the current EmitContext (which has this turned off
+       by default) to ResolveType/REsolveTypeExpr and then have the routines that
+       need ResolveType to pass null as the emit context.
 
 
-       Pinned and volatile require type modifiers that can not be encoded
-       with Reflection.Emit.
+DeclareLocal audit
+------------------
 
 
-       Properties and 17.6.3: Finish it.
+       DeclareLocal is used in various statements.  The audit should be done
+       in two steps:
 
 
-       Implement base indexer access.
+               * Identify all the declare locals.
 
 
-readonly variables and ref/out
-       
-BUGS
-----
+               * Identify its uses.
 
 
-* We suck at reporting what turns out to be error -6.  Use the standard error message
-  instead.
+               * Find if we can make wrapper functions for all of them.
 
 
-* Explicit indexer implementation is missing.
+       Then we can move DeclareLocal into a helper class.
 
 
-* Check for Final when overriding, if the parent is Final, then we cant
-  allow an override.
+       This is required to fix foreach in iterators.
+
+Ideas:
+------
+
+       Instead of the hack that *knows* about System.Object not having any children classes,
+       we should just make it simple for a probe to know that there is no need for it.
+
+Dead Code Elimination bugs:
+---------------------------
 
 
-* Interface indexers
+       I should also resolve all the children expressions in Switch, Fixed, Using.
 
 
-       I have not figured out why the Microsoft version puts an
-       `instance' attribute, and I am not generating this `instance' attribute.
+Major tasks:
+------------
+       Properties and 17.6.3: Finish it.
 
 
-       Explanation: The reason for the `instance' attribute on
-       indexers is that indexers only apply to instances
+readonly variables and ref/out
+       
+BUGS
+----
 
 * Break/Continue statements
 
 
 * Break/Continue statements
 
@@ -61,14 +153,6 @@ BUGS
        Method registration should only be used to register methodbuilders,
        we need an alternate method of checking for duplicates.
 
        Method registration should only be used to register methodbuilders,
        we need an alternate method of checking for duplicates.
 
-* We need to catch:
-
-       extern string Property {
-               get { } 
-       }
-
-       The get there should only have a semicolon
-       
 *
 > // CSC sets beforefieldinit
 > class X {
 *
 > // CSC sets beforefieldinit
 > class X {
@@ -81,25 +165,8 @@ BUGS
 PENDING TASKS
 -------------
 
 PENDING TASKS
 -------------
 
-* IMprove error handling here:
-
-       public static Process ()
-
-       THat assumes that it is a constructor, check if its the same name
-       as the class, if not report a different error than the one we use now.
-
 * Merge test 89 and test-34
 
 * Merge test 89 and test-34
 
-* Revisit
-
-       Primary-expression, as it has now been split into 
-       non-array-creation-expression and array-creation-expression.
-               
-* Static flow analysis
-
-       Required to warn about reachability of code and definite
-       assignemt as well as missing returns on functions.
-
 * Code cleanup
 
        The information when registering a method in InternalParameters
 * Code cleanup
 
        The information when registering a method in InternalParameters
@@ -109,23 +176,11 @@ PENDING TASKS
 
        Handle modreq from public apis.
 
 
        Handle modreq from public apis.
 
-* Emit `pinned' for pinned local variables.
-
-       Both `modreq' and pinned will require special hacks in the compiler.
-
-* Make sure that we are pinning the right variable
-
-* Maybe track event usage?  Currently I am not tracking these, although they
-  are fields.
-
 * Merge tree.cs, rootcontext.cs
 
 OPTIMIZATIONS
 -------------
 
 * Merge tree.cs, rootcontext.cs
 
 OPTIMIZATIONS
 -------------
 
-* There is too much unshared code between MemberAccess.Resolve and SimpleName
-  resolve.  
 * User Defined Conversions is doing way too many calls to do union sets that are not needed
 
 * Add test case for destructors
 * User Defined Conversions is doing way too many calls to do union sets that are not needed
 
 * Add test case for destructors
@@ -144,42 +199,11 @@ OPTIMIZATIONS
        The only pending problem is that the code that implements Aliases
        is on TypeContainer, and probably should go in DeclSpace.
 
        The only pending problem is that the code that implements Aliases
        is on TypeContainer, and probably should go in DeclSpace.
 
-* Casts need to trigger a name resolution against types only.
-
-       currently we use a secret hand shake, probably we should use
-       a differen path, and only expressions (memberaccess, simplename)
-       would participate in this protocol.
-
-* Use of local temporary in UnaryMutator
-
-       We should get rid of the Localtemporary there for some cases
-
-* Emitcontext
-
-       Do we really need to instanciate this variable all the time?
-
-       It could be static for all we care, and just use it for making
-       sure that there are no recursive invocations on it.
-
-* ConvertImplicit
-
-       Currently ConvertImplicit will not catch things like:
-
-       - IntLiteral in a float context to generate a -FloatLiteral.
-       Instead it will perform an integer load followed by a conversion.
-
 * Tests
 
        Write tests for the various reference conversions.  We have
        test for all the numeric conversions.
 
 * Tests
 
        Write tests for the various reference conversions.  We have
        test for all the numeric conversions.
 
-* Optimizations
-
-       In Indexers and Properties, probably support an EmitWithDup
-       That emits the code to call Get and then leaves a this pointer
-       in the stack, so that later a Store can be emitted using that
-       this pointer (consider Property++ or Indexer++)
-
 * Optimizations: variable allocation.
 
        When local variables of a type are required, we should request
 * Optimizations: variable allocation.
 
        When local variables of a type are required, we should request
@@ -188,19 +212,11 @@ OPTIMIZATIONS
 
 * Add a cache for the various GetArrayMethod operations.
 
 
 * Add a cache for the various GetArrayMethod operations.
 
-* TypeManager.FindMembers:
-
-       Instead of having hundreds of builder_to_blah hash table, have
-       a single one that maps a TypeBuilder `t' to a set of classes
-       that implement an interface that supports FindMembers.
-
 * MakeUnionSet Callers
 
        If the types are the same, there is no need to compute the unionset,
        we can just use the list from one of the types.
 
 * MakeUnionSet Callers
 
        If the types are the same, there is no need to compute the unionset,
        we can just use the list from one of the types.
 
-* Factor all the FindMembers in all the FindMembers providers.
-
 * Factor the lookup code for class declarations an interfaces
   (interface.cs:GetInterfaceByName)
 
 * Factor the lookup code for class declarations an interfaces
   (interface.cs:GetInterfaceByName)
 
@@ -226,26 +242,14 @@ RECOMMENDATIONS
        Notice how numbering of the arguments changes as the
        { oob_stack.Push (lexer.Location) } takes a "slot"  in the productions.
 
        Notice how numbering of the arguments changes as the
        { oob_stack.Push (lexer.Location) } takes a "slot"  in the productions.
 
-* local_variable_declaration
-
-       Not sure that this grammar is correct, we might have to
-       resolve this during semantic analysis.
-
-* Idea
-
-       MethodGroupExpr
 
 
-       These guys should only appear as part of an Invocation, so we
-       probably can afford to have a special callback:
+* Anonymous Methods
+===================
 
 
-               Expression.ResolveAllowMemberGroups
+In EmitAnonymousHelperClasses we set the "NeedThis" parameter of all
+the roots, but this is not necessary.  We should track the
+"HaveCapturedFields" on a per-ScopeInfo basis, and only set the
+HaveCapturedFields on the proper roots, instead of all the roots.
 
 
-       This is only called by Invocation (or anyone that consumes 
-       MethodGroupExprs)
 
 
-       And the regular DoResolve and DoResolveLValue do emit the error
-       654 `Method referenced without argument list'.  
 
 
-       Otherwise, a resolution will return a MethodGroupExpr which is
-       not guaranteed to have set its `Expression.Type' to a non-null
-       value.