2008-11-06 Jonathan Pobst <monkey@jpobst.com>
[mono.git] / mcs / mcs / TODO
index 37e5387c0e32b9b5057ed56df94c7989202da5dd..1abb0382b7bdc02b935afae54b8f06a9774130fe 100644 (file)
@@ -1,27 +1,54 @@
-Error Reporting:
-----------------
+===========================================
 
-       * Make yyerror show a nice syntax error, instead of the current mess.
+* Value Parameter
 
-Iterators
----------
-       * `yield' is no longer a keyword, it only has special
-         meaning before a return or break keywords.
+       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:
 
-       * Study side effects with assign
-       * Study TemporaryStorage/LocalStorage -> Merge/rename
+       Section 9.3 in the latest spec.
 
-       * Reset should throw not implemented now.
 
-Instance idea
--------------
+Large project:
+--------------
+
+New
+---
+
+       It would be nice to optimize the case of:
+
+               Method (new ValueType ())
 
-       It would be nice to have things that can be "instances" to have an
-       EmitInstance method (this would default to nothing).
+       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.
 
-       The idea is to be able to use efficiently the instance data on stack
-       manipulations, as opposed to the current scheme, where we basically have
-       a few special cases.
+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
 ------------------
@@ -75,106 +102,12 @@ DeclareLocal audit
 
        This is required to fix foreach in iterators.
 
-Large project:
---------------
-
-       Drop FindMembers as our API and instead extract all the data
-       out of a type the first time into our own datastructures, and
-       use that to navigate and search the type instead of the
-       callback based FindMembers.     
-
-       Martin has some some of this work with his TypeHandle code
-       that we could use for this.
-
 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.
 
-The use of DottedName
----------------------
-
-       We could probably use a different system to represent names, like this:
-
-       class Name {
-               string simplename;
-               Name parent;
-       }
-
-       So `System.ComponentModel' becomes:
-
-               x: (System, null)
-               y: (ComponentModel, x)
-
-       The problem is that we would still need to construct the name to pass to
-       GetType.
-
-       This has been now implemented, its called "QualifiedIdentifier"
-
-current_container/current_namespace and the DeclSpace
------------------------------------------------------
-
-       We are storing fully qualified names in the DeclSpace instead of the node,
-       this is because `current_namespace' (Namepsace) is not a DeclSpace like
-       `current_container'.
-
-       The reason for storing the full names today is this:
-
-       namespace X {
-               class Y {
-               }
-       }
-
-       namespace A {
-               class Y {
-               }
-       }
-
-       The problem is that we only use the namespace stack to track the "prefix"
-       for typecontainers, but they are not typecontainers themselves, so we have
-       to use fully qualified names, because both A.X and A.Y would be entered
-       in the toplevel type container.  If we use the short names, there would be
-       a name clash.
-
-       To fix this problem, we have to make namespaces DeclSpaces.
-
-       The full size, contrasted with the size that could be stored is:
-               corlib:
-                       Size of strings held: 368901
-                       Size of strings short: 147863
-
-               System:
-                       Size of strings held: 212677
-                       Size of strings short: 97521
-               
-               System.XML:
-                       Size of strings held: 128055
-                       Size of strings short: 35782
-               
-               System.Data:
-                       Size of strings held: 117896
-                       Size of strings short: 36153
-               
-               System.Web:
-                       Size of strings held: 194527
-                       Size of strings short: 58064
-               
-               System.Windows.Forms:
-                       Size of strings held: 220495
-                       Size of strings short: 64923
-
-       
-TODO:
-
-       1. Create a "partial" emit context for each TypeContainer..
-
-       2. EmitContext should be partially constructed.  No IL Generator.
-
-       interface_type review.
-
-       parameter_array, line 952: `note: must be a single dimension array type'.  Validate this
-
 Dead Code Elimination bugs:
 ---------------------------
 
@@ -184,24 +117,11 @@ Major tasks:
 ------------
        Properties and 17.6.3: Finish it.
 
-       Implement base indexer access.
-
 readonly variables and ref/out
        
 BUGS
 ----
 
-* Check for Final when overriding, if the parent is Final, then we cant
-  allow an override.
-
-* Interface indexers
-
-       I have not figured out why the Microsoft version puts an
-       `instance' attribute, and I am not generating this `instance' attribute.
-
-       Explanation: The reason for the `instance' attribute on
-       indexers is that indexers only apply to instances
-
 * Break/Continue statements
 
        A finally block should reset the InLoop/LoopBegin/LoopEnd, as
@@ -212,13 +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.
-
 *
 > // CSC sets beforefieldinit
 > class X {
@@ -265,31 +178,11 @@ OPTIMIZATIONS
        The only pending problem is that the code that implements Aliases
        is on TypeContainer, and probably should go in DeclSpace.
 
-* Use of local temporary in UnaryMutator
-
-       We should get rid of the Localtemporary there for some cases
-
-       This turns out to be very complex, at least for the post-version,
-       because this case:
-
-               a = i++
-
-       To produce optimal code, it is necessary for UnaryMutator to know 
-       that it is being assigned to a variable (the way the stack is laid
-       out using dup requires the store to happen inside UnaryMutator).
-
 * 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
@@ -328,8 +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.
-