X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fmcs%2FTODO;h=1abb0382b7bdc02b935afae54b8f06a9774130fe;hb=21dd2b0200d091c43fce9e1941e8ab5e111f3651;hp=20161362dd501e5abd32b8b8ce69ed179eb315e0;hpb=d3f71bab8af09a8a6c64c1fcbf8bd655f61b3158;p=mono.git diff --git a/mcs/mcs/TODO b/mcs/mcs/TODO index 20161362dd5..1abb0382b7b 100644 --- a/mcs/mcs/TODO +++ b/mcs/mcs/TODO @@ -1,51 +1,126 @@ -Dead Code Elimination bugs: ---------------------------- +=========================================== - I should also resolve all the children expressions in Switch, Fixed, Using. +* Value Parameter -Major tasks: ------------- + 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: - Pinned and volatile require type modifiers that can not be encoded - with Reflection.Emit. + Section 9.3 in the latest spec. - Properties and 17.6.3: Finish it. - Implement base indexer access. +Large project: +-------------- -readonly variables and ref/out +New +--- -BUGS ----- + 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. -* Check for Final when overriding, if the parent is Final, then we cant - allow an override. +NEW NOTES: +---------- -* Interface indexers + ImplicitStandardConversionExists and ImplicitStandardConversion + should always be the same, but there are a few diverging lines that + must be studied: - I have not figured out why the Microsoft version puts an - `instance' attribute, and I am not generating this `instance' attribute. + if (expr_type == target_type && !(expr is NullLiteral)) + return expr; - Explanation: The reason for the `instance' attribute on - indexers is that indexers only apply to instances + vs: -* Arrays + if (expr_type == target_type) + return true; - We need to make sure at *compile time* that the arguments in - the expression list of an array creation are always positive. +**************************************************************************************** +* +* 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. -* Indexer bugs: +Optimization ideas +------------------ - the following wont work: + 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. - x [0] = x [1] = N + 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 +--------------------------- - if x has indexers, the value of x [N] set is set to void. This needs to be - fixed. + We should investigate its usage. The problem is that by default + this will be set when calling FindType, that triggers a more expensive + lookup. -* Array declarations + 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. - Multi-dim arrays are declared as [,] instead of [0..,0..] +DeclareLocal audit +------------------ + + DeclareLocal is used in various statements. The audit should be done + in two steps: + + * Identify all the declare locals. + + * Identify its uses. + + * Find if we can make wrapper functions for all of them. + + Then we can move DeclareLocal into a helper class. + + 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: +--------------------------- + + I should also resolve all the children expressions in Switch, Fixed, Using. + +Major tasks: +------------ + Properties and 17.6.3: Finish it. + +readonly variables and ref/out + +BUGS +---- * Break/Continue statements @@ -57,21 +132,6 @@ BUGS They should transfer control to the finally block if inside a try/catch block. -* Method Registration and error CS111 - - The way we use the method registration to signal 111 is wrong. - - 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 { @@ -86,16 +146,6 @@ PENDING TASKS * 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 @@ -105,25 +155,11 @@ PENDING TASKS 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 ------------- -* Implement loop inversion for `For' as well. - -* 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 @@ -142,47 +178,11 @@ OPTIMIZATIONS 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. - -* Use of EmitBranchable - - Currently I use brfalse/brtrue in the code for statements, instead of - using the EmitBranchable function that lives in Binary - -* 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. -* 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 @@ -191,19 +191,11 @@ OPTIMIZATIONS * 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. -* Factor all the FindMembers in all the FindMembers providers. - * Factor the lookup code for class declarations an interfaces (interface.cs:GetInterfaceByName) @@ -229,26 +221,3 @@ RECOMMENDATIONS 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: - - Expression.ResolveAllowMemberGroups - - 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.