X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fmcs%2FTODO;h=1abb0382b7bdc02b935afae54b8f06a9774130fe;hb=ab39e8acac105fa0db88514f259341c9f0201b22;hp=3ba5a205382a30085b6ad872fcfa90fe2021be94;hpb=cd51bc0dcb5040776225ee4e088dd61db64a0351;p=mono.git diff --git a/mcs/mcs/TODO b/mcs/mcs/TODO index 3ba5a205382..1abb0382b7b 100644 --- a/mcs/mcs/TODO +++ b/mcs/mcs/TODO @@ -1,48 +1,126 @@ -TODO: +=========================================== - 1. Create a "partial" emit context for each TypeContainer.. +* Value Parameter - 2. EmitContext should be partially constructed. No IL Generator. + 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: - interface_type review. + Section 9.3 in the latest spec. - parameter_array, line 952: `note: must be a single dimension array type'. Validate this -Dead Code Elimination bugs: +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. + +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. + + * Find if we can make wrapper functions for all of them. -* We suck at reporting what turns out to be error -6. Use the standard error message - instead. + Then we can move DeclareLocal into a helper class. -* Explicit indexer implementation is missing. + This is required to fix foreach in iterators. -* Check for Final when overriding, if the parent is Final, then we cant - allow an override. +Ideas: +------ -* Interface indexers + 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. - I have not figured out why the Microsoft version puts an - `instance' attribute, and I am not generating this `instance' attribute. +Dead Code Elimination bugs: +--------------------------- - Explanation: The reason for the `instance' attribute on - indexers is that indexers only apply to instances + 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 @@ -54,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 { @@ -81,25 +144,8 @@ BUGS 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 -* 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 @@ -109,23 +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 ------------- -* 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 @@ -144,42 +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. - -* 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 @@ -188,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) @@ -226,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.