00cceed479137417f47c07b0386658771d8dac9c
[mono.git] / mcs / mcs / ChangeLog
1 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
2
3         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
4         we reach an EmptyStatement.
5
6         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
7         is also fine.
8
9         * expression.cs (Binary.ResolveOperator): Check error result in
10         two places.
11
12         use brtrue/brfalse directly and avoid compares to null.
13
14 2002-08-02  Martin Baulig  <martin@gnome.org>
15
16         * class.cs (TypeContainer.Define): Define all nested interfaces here.
17         Fixes bug #28407, added test-155.cs.
18
19 2002-08-01  Martin Baulig  <martin@gnome.org>
20
21         * class.cs (Event.EmitDefaultMethod): Make this work with static
22         events.  Fixes #28311, added verify-3.cs.
23
24 2002-08-01  Martin Baulig  <martin@gnome.org>
25
26         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
27         `is_disposable' fields.
28         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
29         `hm.is_disposable' if we're using the collection pattern.
30         (Foreach.EmitCollectionForeach): Use the correct type for the
31         enumerator's local variable, only emit the try/finally block if
32         necessary (fixes #27713).
33
34 2002-08-01  Martin Baulig  <martin@gnome.org>
35
36         * ecore.cs (Expression.report118): Renamed to Error118 and made
37         it public static.
38
39         * statement.cs (Throw.Resolve): Check whether the expression is of
40         the correct type (CS0118) and whether the type derives from
41         System.Exception (CS0155).
42         (Catch.Resolve): New method.  Do the type lookup here and check
43         whether it derives from System.Exception (CS0155).
44         (Catch.CatchType, Catch.IsGeneral): New public properties.
45
46         * typemanager.cs (TypeManager.exception_type): Added.
47
48 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
49
50         * driver.cs: Updated About function.
51
52 2002-07-31  Martin Baulig  <martin@gnome.org>
53
54         Implemented Control Flow Analysis.
55
56         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
57         (EmitContext.CurrentBranching): Added.
58         (EmitContext.StartFlowBranching): Added.
59         (EmitContext.EndFlowBranching): Added.
60         (EmitContext.KillFlowBranching): Added.
61         (EmitContext.IsVariableAssigned): Added.
62         (EmitContext.SetVariableAssigned): Added.
63         (EmitContext.IsParameterAssigned): Added.
64         (EmitContext.SetParameterAssigned): Added.
65         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
66         Added control flow analysis stuff here.
67
68         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
69         resolve the expression as lvalue.
70         (LocalVariableReference.DoResolve): Check whether the variable has
71         already been assigned.
72         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
73         the parameter as assigned here.
74         (ParameterReference.DoResolve): Check whether the parameter has already
75         been assigned.
76         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
77         expression as lvalue.
78
79         * statement.cs (FlowBranching): New class for the flow analysis code.
80         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
81         (LabeledStatement.IsDefined): New public property.
82         (LabeledStatement.AddUsageVector): New public method to tell flow
83         analyis that the label may be reached via a forward jump.
84         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
85         flow analysis.
86         (VariableInfo.Number): New public field.  This is used by flow analysis
87         to number all locals of a block.
88         (Block.CountVariables): New public property.  This is the number of
89         local variables in this block (including the locals from all parent
90         blocks).
91         (Block.EmitMeta): Number all the variables.
92
93         * statement.cs: Added flow analysis support to all classes.
94
95 2002-07-31  Martin Baulig  <martin@gnome.org>
96
97         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
98         To get debugging messages, compile mcs with /define:MCS_DEBUG and
99         then use this argument.
100
101         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
102
103         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
104         use this to specify /define options.
105
106 2002-07-29  Martin Baulig  <martin@gnome.org>
107
108         * statement.cs (Fixed): Moved all code that does variable lookups
109         and resolvings from Emit to Resolve.
110
111         * statement.cs (For): Moved all code that does variable lookups
112         and resolvings from Emit to Resolve.
113
114         * statement.cs (Using): Moved all code that does variable lookups
115         and resolvings from Emit to Resolve.
116
117 2002-07-29  Martin Baulig  <martin@gnome.org>
118
119         * attribute.cs (Attribute.Resolve): Explicitly catch a
120         System.NullReferenceException when creating the
121         CustromAttributeBuilder and report a different warning message.
122
123 2002-07-29  Martin Baulig  <martin@gnome.org>
124
125         * support.cs (ParameterData.ParameterName): Added method to
126         get the name of a parameter.
127
128         * typemanager.cs (TypeManager.IsValueType): New public method.
129
130 2002-07-29  Martin Baulig  <martin@gnome.org>
131
132         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
133         is a flag which specifies that it's either ref or out.
134         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
135         the out parameter to `out Parameter.Modifier mod', also set the
136         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
137
138         * support.cs (InternalParameters.ParameterModifier): Distinguish
139         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
140         Parameter.Modifier.ISBYREF flag if it's either ref or out.
141
142         * expression.cs (Argument.GetParameterModifier): Distinguish
143         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
144         Parameter.Modifier.ISBYREF flag if it's either ref or out.
145
146 2002-07-29  Martin Baulig  <martin@gnome.org>
147
148         * expression.cs (ParameterReference.ParameterReference): Added
149         `Location loc' argument to the constructor.
150
151         * cs-parser.jay: Pass location to ParameterReference.
152
153 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
154
155         * statement.cs (Try): Initialize the location.
156
157         * cs-parser.jay: pass location to Try.
158
159         * expression.cs (Unary.Reduce): Change the prototype to return
160         whether a constant fold could be performed or not.  The result is
161         returned in an out parameters.  In the case of Indirection and
162         AddressOf, we want to perform the full tests.
163
164 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
165
166         * statement.cs (Statement.Emit): Flag dead code.
167
168 2002-07-27  Andrew Birkett  <andy@nobugs.org>
169
170         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
171
172 2002-07-27  Martin Baulig  <martin@gnome.org>
173
174         * class.cs (MethodData.Define): Put back call to
175         TypeManager.AddMethod(), accidentally commented this out.
176
177         * report.cs (Debug): New public method to print debugging information,
178         this is `[Conditional ("DEBUG")]'.
179
180 2002-07-26  Martin Baulig  <martin@gnome.org>
181
182         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
183         (switch_statement): Push the current_block to the switch_stack and
184         pop it again when we're done with the switch.
185         (switch_section): The new block is a child of the current_block.
186         Fixes bug #24007, added test-152.cs.
187
188 2002-07-27  Martin Baulig  <martin@gnome.org>
189
190         * expression.cs (Invocation.EmitArguments): When calling a varargs
191         function with only its fixed arguments, we need to pass an empty
192         array.
193
194 2002-07-27  Martin Baulig  <martin@gnome.org>
195
196         Mono 0.13 has been released.
197
198 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
199
200         * driver.cs: Rename --resource to --linkres, because that is what
201         we do currently, we dont support --resource yet.
202
203         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
204
205 2002-07-25  Martin Baulig  <martin@gnome.org>
206
207         * class.cs (MethodData): New public class.  This is a `method builder'
208         class for a method or one accessor of a Property/Indexer/Event.
209         (MethodData.GetMethodFlags): Moved here from MemberBase.
210         (MethodData.ApplyAttributes): Likewise.
211         (MethodData.ApplyObsoleteAttribute): Likewise.
212         (MethodData.ApplyConditionalAttribute): Likewise.
213         (MethodData.ApplyDllImportAttribute): Likewise.
214         (MethodData.CheckAbstractAndExternal): Likewise.
215         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
216         (MethodData.Emit): Formerly known as Method.Emit().
217         (MemberBase): Moved everything which was specific to a single
218         accessor/method to MethodData.
219         (Method): Create a new MethodData and call Define() and Emit() on it.
220         (Property, Indexer, Event): Create a new MethodData objects for each
221         accessor and call Define() and Emit() on them.
222
223 2002-07-25  Martin Baulig  <martin@gnome.org>
224
225         Made MethodCore derive from MemberBase to reuse the code from there.
226         MemberBase now also checks for attributes.
227
228         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
229         (MemberBase.GetMethodFlags): Moved here from class Method and marked
230         as virtual.
231         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
232         `CallingConventions cc' and `Attributes opt_attrs' arguments.
233         (MemberBase.ApplyAttributes): New virtual method; applies the
234         attributes to a method or accessor.
235         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
236         (MemberBase.ApplyConditionalAttribute): Likewise.
237         (MemberBase.ApplyDllImportAttribute): Likewise.
238         (MemberBase.CheckAbstractAndExternal): Likewise.
239         (MethodCore.ParameterTypes): This is now a property instead of a
240         method, it's initialized from DoDefineParameters().
241         (MethodCore.ParameterInfo): Removed the set accessor.
242         (MethodCore.DoDefineParameters): New protected virtual method to
243         initialize ParameterTypes and ParameterInfo.
244         (Method.GetReturnType): We can now simply return the MemberType.
245         (Method.GetMethodFlags): Override the MemberBase version and add
246         the conditional flags.
247         (Method.CheckBase): Moved some code from Define() here, call
248         DoDefineParameters() here.
249         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
250         here to avoid some larger code duplication.
251         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
252         ensure that abstract and external accessors don't declare a body.
253
254         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
255         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
256         lookup in the attribute's parent classes, so we need to abort as soon
257         as we found the first match.
258         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
259         the attribute has no arguments.
260
261         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
262         of a Method.
263
264 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
265
266         * cs-parser.jay: reverted previous patch.
267
268 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
269
270         * cs-parser.jay: fixed bug #22119.
271
272 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
273
274         * attribute.cs: fixed compilation. The error was:
275         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
276         be assigned to before control leaves the current method."
277         [FIXME:  Filed as bug #28186: MCS must report this error.]
278
279 2002-07-25  Martin Baulig  <martin@gnome.org>
280
281         * attribute.cs (Attribute.Conditional_GetConditionName): New static
282         method to pull the condition name ouf of a Conditional attribute.
283         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
284         the obsolete message and error flag out of an Obsolete attribute.
285
286         * class.cs (Method.GetMethodFlags): New public method to get the
287         TypeManager.MethodFlags for this method.
288         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
289         private methods.
290         (Method.Define): Get and apply the Obsolete and Conditional attributes;
291         if we're overriding a virtual function, set the new private variable
292         `parent_method'; call the new TypeManager.AddMethod().
293
294         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
295         the MethodBuilder and the Method in a PtrHashtable.
296         (TypeManager.builder_to_method): Added for this purpose.
297         (TypeManager.MethodFlags): Added IsObsoleteError.
298         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
299         Obsolete and Conditional arguments in MethodBuilders.  If we discover
300         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
301         the message from the attribute.
302
303 2002-07-24  Martin Baulig  <martin@gnome.org>
304
305         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
306         preprocessor directives, ensure that the argument to #define/#undef is
307         exactly one identifier and that it's actually an identifier.
308
309         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
310         did not work ....
311
312 2002-07-24  Martin Baulig  <martin@gnome.org>
313
314         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
315         initialize it to TypeManager.object_type in the constructor.
316         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
317         of the `hm.get_current' method if we're using the collection pattern.
318         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
319         for the explicit conversion to make it work when we're using the collection
320         pattern and the `Current' property has a different return type than `object'.
321         Fixes #27713.
322
323 2002-07-24  Martin Baulig  <martin@gnome.org>
324
325         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
326         does not match, but don't report any errors.  This method is called in
327         order for all methods in a MethodGroupExpr until a matching method is
328         found, so we don't want to bail out if the first method doesn't match.
329         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
330         matches, report the 123.  Fixes #28070.
331
332 2002-07-24  Martin Baulig  <martin@gnome.org>
333
334         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
335         TypeManager.TypeToCoreType() to the top of the method so the
336         following equality checks will work.  Fixes #28107.
337
338 2002-07-24  Martin Baulig  <martin@gnome.org>
339
340         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
341         operand is of type uint, and the other operand is of type sbyte,
342         short or int, the operands are converted to type long." -
343         Actually do what this comment already told us.  Fixes bug #28106,
344         added test-150.cs.
345
346 2002-07-24  Martin Baulig  <martin@gnome.org>
347
348         * class.cs (MethodBase): New abstract class.  This is now a base
349         class for Property, Indexer and Event to avoid some code duplication
350         in their Define() and DefineMethods() methods.
351         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
352         generic methods for Define() and DefineMethods().
353         (FieldBase): Derive from MemberBase, not MemberCore.
354         (Property): Derive from MemberBase, not MemberCore.
355         (Property.DefineMethod): Moved all the code from this method to the
356         new MethodBase.DefineAccessor(), just call it with appropriate
357         argumetnts.
358         (Property.Define): Call the new Property.DoDefine(), this does some
359         sanity checks and we don't need to duplicate the code everywhere.
360         (Event): Derive from MemberBase, not MemberCore.
361         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
362         accessors, this will also make them work with interface events.
363         (Indexer): Derive from MemberBase, not MemberCore.
364         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
365         (Indexer.Define): Use the new MethodBase functions.
366
367         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
368         argument to the constructor.
369         (Interface.FindMembers): Added support for interface events.
370         (Interface.PopluateEvent): Implemented.
371
372         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
373
374 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
375
376         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
377         but this is required to check for a method name being the same as
378         the containing class.  
379
380         Handle this now.
381
382 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
383
384         * interface.cs: initialize variable.
385
386 2002-07-23  Martin Baulig  <martin@gnome.org>
387
388         Implemented the IndexerName attribute in interfaces.
389
390         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
391         name if this is an explicit interface implementation.
392         (Indexer.InterfaceIndexerName): New public variable.  If we're
393         implementing an interface indexer, this is the IndexerName in that
394         interface.  Otherwise, it's the IndexerName.
395         (Indexer.DefineMethod): If we're implementing interface indexer,
396         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
397         and Pending.ImplementIndexer methods.
398         (Indexer.Define): Also define the PropertyBuilder if we're
399         implementing an interface indexer and this is neither an explicit
400         interface implementation nor do the IndexerName match the one in
401         the interface.
402
403         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
404         If a method is defined here, then we always need to create a proxy
405         for it.  This is used when implementing interface indexers.
406         (Pending.IsInterfaceIndexer): New public method.
407         (Pending.ImplementIndexer): New public method.
408         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
409         This is used when implementing interface indexers to define a proxy
410         if necessary.
411         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
412         define a proxy if necessary.
413
414         * interface.cs (Interface.IndexerName): New public variable.
415         (Interface.PopulateIndexer): Set the IndexerName.
416         (Interface.DefineIndexers): New private method.  Populate all the
417         indexers and make sure their IndexerNames match.
418
419         * typemanager.cs (IndexerPropertyName): Added support for interface
420         indexers.
421
422 2002-07-22  Martin Baulig  <martin@gnome.org>
423
424         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
425         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
426         ret if HasReturnLabel.
427         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
428         variables.
429
430         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
431         and set the ec.LoopBeginTryCatchLevel.
432         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
433         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
434         the current ec.TryCatchLevel, the branch goes out of an exception
435         block.  In this case, we need to use Leave and not Br.
436
437 2002-07-22  Martin Baulig  <martin@gnome.org>
438
439         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
440         block unless the block does not always return or it is contained in
441         another try { ... } catch { ... } block.  Fixes bug #26506.
442         Added verify-1.cs to the test suite.
443
444 2002-07-22  Martin Baulig  <martin@gnome.org>
445
446         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
447         then we do not always return.  Fixes bug #24985.
448
449 2002-07-22  Martin Baulig  <martin@gnome.org>
450
451         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
452         lookup on a per-class level; ie. walk up the class hierarchy until we
453         found at least one applicable method, then choose the best among them.
454         Fixes bug #24463 and test-29.cs.
455
456 2002-07-22  Martin Baulig  <martin@gnome.org>
457
458         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
459         return types of the methods.  The return type is not part of the
460         signature and we must not check it to make the `new' modifier work.
461         Fixes bug #27999, also added test-147.cs.
462         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
463
464         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
465         on the method's return type.
466
467 2002-07-21  Martin Baulig  <martin@gnome.org>
468
469         * assign.cs: Make this work if the rightmost source is a constant and
470         we need to do an implicit type conversion.  Also adding a few more tests
471         to test-38.cs which should have caught this.
472
473         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
474         target in the makefile for this.  The makefile.gnu is primarily intended
475         for end-users who don't want to debug the compiler.
476
477 2002-07-21  Martin Baulig  <martin@gnome.org>
478
479         * assign.cs: Improved the Assign class so it can now handle embedded
480         assignments (X = Y = Z = something).  As a side-effect this'll now also
481         consume less local variables.  test-38.cs now passes with MCS, added
482         a few new test cases to that test.
483
484 2002-07-20  Martin Baulig  <martin@gnome.org>
485
486         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
487         instructions.  Fixes bug #27977, also added test-146.cs.
488
489 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
490
491         * cs-tokenizer.cs: fixed getHex ().
492
493 2002-07-19  Martin Baulig  <martin@gnome.org>
494
495         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
496         not Type.GetType() to lookup the array type.  This is needed when
497         we're constructing an array of a user-defined type.
498         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
499         single-dimensional arrays, but also for single-dimensial arrays of
500         type decimal.
501
502 2002-07-19  Martin Baulig  <martin@gnome.org>
503
504         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
505         this function is called, it's not allowed to share LocalBuilders
506         among ILGenerators.
507
508 2002-07-19  Martin Baulig  <martin@gnome.org>
509
510         * expression.cs (Argument.Resolve): Report an error 118 when trying
511         to pass a type as argument.
512
513 2002-07-18  Martin Baulig  <martin@gnome.org>
514
515         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
516         Conv_R_Un for the signed `long' type.
517
518 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
519
520         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
521         `expr' for the temporary result, as that will fail if we do
522         multiple resolves on the same expression.
523
524 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
525
526         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
527         ec.TypeContainer for looking up aliases. 
528
529         * class.cs (TypeContainer): Remove LookupAlias from here.
530
531         * decl.cs (DeclSpace); Move here.
532
533 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
534
535         * class.cs (FindMembers): Only call filter if the constructor
536         bulider is not null.
537
538         Also handle delegates in `NestedTypes' now.  Now we will perform
539         type lookups using the standard resolution process.  This also
540         fixes a bug.
541
542         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
543         This uses Expressions (the limited kind that can be parsed by the
544         tree) instead of strings.
545
546         * expression.cs (ComposedCast.ToString): Implement, used to flag
547         errors since now we have to render expressions.
548
549         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
550         FormArrayType. 
551
552         * ecore.cs (SimpleName.ToString): ditto.
553
554         * cs-parser.jay: Instead of using strings to assemble types, use
555         Expressions to assemble the type (using SimpleName, ComposedCast,
556         MemberAccess).  This should fix the type lookups in declarations,
557         because we were using a different code path for this.
558
559         * statement.cs (Block.Resolve): Continue processing statements
560         even when there is an error.
561
562 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
563
564         * class.cs (Event.Define): Also remove the `remove' method from
565         the list of pending items.
566
567         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
568         generate more compact code. 
569
570 2002-07-17  Martin Baulig  <martin@gnome.org>
571
572         * const.cs (Const.LookupConstantValue): Add support for constant
573         `unchecked' and `checked' expressions.
574         Also adding test case test-140.cs for this.
575
576 2002-07-17  Martin Baulig  <martin@gnome.org>
577
578         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
579         check whether mi.ReturnType implements the IEnumerator interface; the
580         `==' and the IsAssignableFrom() will fail in this situation.
581
582 2002-07-16  Ravi Pratap  <ravi@ximian.com>
583
584         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
585         here too.
586
587 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
588
589         * expression.cs: fixed bug #27811.
590
591 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
592
593         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
594         Molaro: when we are a ref, the value already contains a pointer
595         value, do not take the address of it.
596
597 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
598         * removed mb-parser.jay and mb-tokenizer.cs
599
600 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
601
602         * expression.cs: check against the building corlib void type.
603
604 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
605
606         * ecore.cs: fix for valuetype static readonly fields: when 
607         initializing them, we need their address, not the address of a copy.
608
609 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
610
611         * typemanager.cs: register also enum_type in corlib.
612
613 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
614
615         * class.cs: allow calling this (but not base) initializers in structs.
616
617 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
618
619         * ecore.cs: make sure we compare against the building base types
620         in GetTypeSize ().
621
622 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
623
624         * typemanager.cs: fix TypeToCoreType() to handle void and object
625         (corlib gets no more typerefs after this change).
626
627 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
628
629         * expression.cs (ArrayCreation.EmitArrayArguments): use
630         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
631
632         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
633         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
634         array indexes, the runtime actually forbids them.
635
636         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
637         for array arguments here.
638
639         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
640         instead of the default for ValueTypes.
641
642         (New.DoEmit): Use IsValueType instead of
643         IsSubclassOf (value_type)
644         (New.DoResolve): ditto.
645         (Invocation.EmitCall): ditto.
646
647         * assign.cs (Assign): ditto.
648
649         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
650         Statements *are* currently doing part of their resolution during
651         Emit.  
652
653         Expressions do always resolve during resolve, but statements are
654         only required to propagate resolution to their children.
655
656 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
657
658         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
659
660         (LoadAssembly): Do not add the dll if it is already specified
661         
662         (MainDriver): Add the System directory to the link path at the end,
663         after all the other -L arguments. 
664
665         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
666         wrong opcode for loading bytes and bools (ldelem.i1 instead of
667         ldelem.u1) and using the opposite for sbytes.
668
669         This fixes Digger, and we can finally run it.
670
671         * driver.cs (UnixParseOption): Move the option parsing here.  
672         (CSCParseOption): Implement CSC-like parsing of options.
673
674         We now support both modes of operation, the old Unix way, and the
675         new CSC-like way.  This should help those who wanted to make cross
676         platform makefiles.
677
678         The only thing broken is that /r:, /reference: and /lib: are not
679         implemented, because I want to make those have the same semantics
680         as the CSC compiler has, and kill once and for all the confussion
681         around this.   Will be doing this tomorrow.
682
683         * statement.cs (Unsafe.Resolve): The state is checked during
684         resolve, not emit, so we have to set the flags for IsUnsfe here.
685
686 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
687
688         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
689         not catch the Error_ObjectRefRequired in SimpleName (as it is
690         possible to have a class/instance variable name that later gets
691         deambiguated), we have to check this here.      
692
693 2002-07-10  Ravi Pratap  <ravi@ximian.com>
694
695         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
696         make static and put into Expression.
697
698         (Event.Define): Register the private field of the event with the 
699         TypeManager so that GetFieldFromEvent can get at it.
700
701         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
702         keep track of the private field associated with an event which
703         has no accessors.
704
705         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
706         private field.
707
708         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
709         
710 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
711
712         * expression.cs (Binary.EmitBranchable): this routine emits the
713         Binary expression in a branchable context.  This basically means:
714         we need to branch somewhere, not just get the value on the stack.
715
716         This works together with Statement.EmitBoolExpression.
717
718         * statement.cs (Statement.EmitBoolExpression): Use
719         EmitBranchable. 
720
721 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
722
723         * statement.cs (For): Reduce the number of jumps in loops.
724
725         (For): Implement loop inversion for the For statement.
726
727         (Break): We can be breaking out of a Try/Catch controlled section
728         (foreach might have an implicit try/catch clause), so we need to
729         use Leave instead of Br.
730
731         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
732         now).  If the instace expression supports IMemoryLocation, we use
733         the AddressOf method from the IMemoryLocation to extract the
734         address instead of emitting the instance.
735
736         This showed up with `This', as we were emitting the instance
737         always (Emit) instead of the Address of This.  Particularly
738         interesting when This is a value type, as we dont want the Emit
739         effect (which was to load the object).
740         
741 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
742
743         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
744
745         * statement.cs (Checked): Set the CheckedState during the resolve
746         process too, as the ConvCast operations track the checked state on
747         the resolve process, and not emit.
748
749         * cs-parser.jay (namespace_member_declaration): Flag that we have
750         found a declaration when we do.  This is used to flag error 1529
751
752         * driver.cs: Report ok when we display the help only.
753
754 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
755
756         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
757
758 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
759
760         * cs-tokenizer.cs (define): We also have to track locally the
761         defines.  AllDefines is just used for the Conditional Attribute,
762         but we also need the local defines for the current source code. 
763
764 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
765
766         * statement.cs (While, For, Do): These loops can exit through a
767         Break statement, use this information to tell whether the
768         statement is the last piece of code.
769
770         (Break): Flag that we break.
771
772         * codegen.cs (EmitContexts): New `Breaks' state variable.
773
774 2002-07-03  Martin Baulig  <martin@gnome.org>
775
776         * class.cs (TypeContainer.MethodModifiersValid): Allow override
777         modifiers in method declarations in structs.  Otherwise, you won't
778         be able to override things like Object.Equals().
779
780 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
781
782         * class.cs (Method, Property, Indexer): Do not allow the public
783         modifier to be used in explicit interface implementations.
784
785         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
786         override modifiers in method declarations in structs
787
788 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
789
790         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
791         integer or real overflow, report an error
792
793 2002-07-02  Martin Baulig  <martin@gnome.org>
794
795         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
796         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
797         to tell the runtime about our newly created System.Object and
798         System.ValueType types.
799
800 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
801
802         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
803         struct instead of Ldarg/Starg.
804
805 2002-07-02  Martin Baulig  <martin@gnome.org>
806
807         * expression.cs (Indirection.Indirection): Call
808         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
809
810 2002-07-02  Martin Baulig  <martin@gnome.org>
811
812         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
813         ValueType, call TypeManager.TypeToCoreType() on it.
814         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
815         the OpCodes.Newarr argument.
816
817 2002-07-02  Martin Baulig  <martin@gnome.org>
818
819         * expression.cs (Invocation.EmitCall): When compiling corlib,
820         replace all calls to the system's System.Array type to calls to
821         the newly created one.
822
823         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
824         System.Array methods.
825         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
826         from the system's System.Array type which must be replaced.
827
828 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
829
830         * typemanager.cs: load unverifiable_code_ctor so we can build
831         corlib using the correct type. Avoid using GetTypeCode() with
832         TypeBuilders.
833         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
834         TypeManager.object_type to allow building corlib.
835
836 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
837
838         * ecore.cs: handle System.Enum separately in LoadFromPtr().
839
840 2002-07-01  Martin Baulig  <martin@gnome.org>
841
842         * class.cs: Make the last change actually work, we need to check
843         whether `ifaces != null' to avoid a crash.
844
845 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
846
847         * class.cs: when we build structs without fields that implement
848         interfaces, we need to add the interfaces separately, since there is
849         no API to both set the size and add the interfaces at type creation
850         time.
851
852 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
853
854         * expression.cs: the dimension arguments to the array constructors
855         need to be converted if they are a long.
856
857 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
858
859         * class.cs: don't emit ldarg.0 if there is no parent constructor
860         (fixes showstopper for corlib).
861
862 2002-06-29  Martin Baulig  <martin@gnome.org>
863
864         MCS now compiles corlib on GNU/Linux :-)
865
866         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
867         ie. check for MethodImplOptions.InternalCall.
868
869         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
870         and TypeManager.attribute_type are null, so we must explicitly check
871         whether parent is not null to find out whether it's an attribute type.
872         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
873         and SetBuilder, not only if the property is neither abstract nor external.
874         This is necessary to set the MethodImplOptions on the accessor methods.
875         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
876         SetBuilder, see Property.Emit().
877
878         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
879         populate "System.Object", "System.ValueType" and "System.Attribute" since
880         they've already been populated from BootCorlib_PopulateCoreTypes().
881
882 2002-06-29  Martin Baulig  <martin@gnome.org>
883
884         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
885         is the NullLiteral, we also need to make sure that target_type is not
886         an enum type.   
887
888 2002-06-29  Martin Baulig  <martin@gnome.org>
889
890         * rootcontext.cs (RootContext.ResolveCore): We must initialize
891         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
892         before calling BootstrapCorlib_ResolveDelegate ().
893
894 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
895
896         * statement.cs: fixed build-breaker. All tests passed ok.
897
898 2002-06-27  Martin Baulig  <martin@gnome.org>
899
900         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
901         for System.Decimal when compiling corlib.
902
903 2002-06-27  Martin Baulig  <martin@gnome.org>
904
905         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
906         switch blocks which contain nothing but a default clause.
907
908 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
909
910        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
911
912 2002-06-27  Martin Baulig  <martin@gnome.org>
913
914         * ecore.cs (PropertyExpr.PropertyExpr): Call
915         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
916
917         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
918         is already a TypeBuilder.
919
920 2002-06-27  Martin Baulig  <martin@gnome.org>
921
922         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
923         `target_type == TypeManager.array_type', not IsAssignableFrom() in
924         the "from an array-type to System.Array" case.  This makes it work
925         when compiling corlib.
926
927 2002-06-27  Martin Baulig  <martin@gnome.org>
928
929         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
930         non-static PropertyExpr, set its InstanceExpression.  This makes
931         the `ICollection.Count' property work in System/Array.cs.
932
933 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
934
935         * driver.cs: Made error handling more consistent.  Errors now
936         tracked by Report class, so many methods which used to return int
937         now return void.  Main() now prints success/failure and 
938         errors/warnings message.
939
940         Renamed '--probe' compiler argument to '--expect-error'.  Removed
941         the magic number return values (123 and 124).  Now, if the
942         expected error occurs, the compiler exits with success (exit value
943         0).  If the compilation completes without seeing that particular
944         error, the compiler exits with failure (exit value 1).  The
945         makefile in mcs/errors has been changed to handle the new behaviour.
946
947         * report.cs: Made 'expected error' number a property and renamed
948         it from 'Probe' to 'ExpectedError'.
949
950         * genericparser.cs: Removed error handling support, since it is
951         now all done by Report class.
952
953         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
954         class, so parse() no longer returns an int.
955
956         * namespace.cs: Use Report.Error instead of GenericParser.error
957
958 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
959
960         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
961         TypeContainer.AddOperator): At the front of the list put the
962         explicit implementations, so they get resolved/defined first. 
963
964 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
965
966         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
967         interface type is implemented by this TypeContainer.  Used during
968         explicit interface implementation.
969
970         (Property.Define, Indexer.Define, Method.Define): Validate that
971         the given interface in the explicit implementation is one of the
972         base classes for the containing type.
973
974         Also if we are explicitly implementing an interface, but there is
975         no match in the pending implementation table, report an error.
976
977         (Property.Define): Only define the property if we are
978         not explicitly implementing a property from an interface.  Use the
979         correct name also for those properties (the same CSC uses,
980         although that is really not needed).
981         
982         (Property.Emit): Do not emit attributes for explicitly implemented
983         properties, as there is no TypeBuilder.
984
985         (Indexer.Emit): ditto.
986
987         Hiding then means that we do not really *implement* a pending
988         implementation, which makes code fail.
989
990 2002-06-22  Martin Baulig  <martin@gnome.org>
991
992         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
993         the return value of Object.GetType().  [FIXME: we need to do this whenever
994         we get a type back from the reflection library].
995
996 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
997
998         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
999
1000 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
1001
1002         * attribute.cs: Return null if we can not look up the type.
1003
1004         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
1005         the interface types found.
1006
1007         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
1008         interface types found.
1009
1010         * typemanager.cs (GetInterfaces): Make this routine returns alll
1011         the interfaces and work around the lame differences between
1012         System.Type and System.Reflection.Emit.TypeBuilder in the results
1013         result for GetInterfaces.
1014         
1015         (ExpandInterfaces): Given an array of interface types, expand and
1016         eliminate repeated ocurrences of an interface.  This expands in
1017         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
1018         be IA, IB, IC.
1019         
1020 2002-06-21  Martin Baulig  <martin@gnome.org>
1021
1022         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
1023         on System.Enum.
1024
1025 2002-06-21  Martin Baulig  <martin@gnome.org>
1026
1027         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
1028         and called with one of the core types, return the corresponding typebuilder for
1029         that type.
1030
1031         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
1032         element type.
1033
1034 2002-06-21  Martin Baulig  <martin@gnome.org>
1035
1036         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
1037         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
1038         (Expression.ConvertReferenceExplicit): Likewise.
1039
1040         * expression.cs (ElementAccess.DoResolve): Likewise.
1041         (ElementAccess.DoResolveLValue): Likewise.
1042
1043 2002-06-10  Martin Baulig  <martin@gnome.org>
1044
1045         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
1046         add the "value" parameter to the parameter list.
1047
1048         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
1049         to our caller.
1050
1051 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
1052
1053         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
1054         the argument to an int, uint, long or ulong, per the spec.  Also
1055         catch negative constants in array creation.
1056
1057 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
1058
1059         * class.cs: do not allow the same interface to appear twice in
1060         the definition list.
1061
1062 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
1063
1064         * ecore.cs: don't use ldlen with System.Array.
1065
1066 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
1067
1068         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
1069
1070 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
1071
1072         * modifiers.cs: produce correct field attributes for protected
1073         internal. Easy fix so miguel can work on ther harder stuff:-)
1074
1075 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
1076
1077         * pending.cs: New file.  Move the code from class.cs here.
1078         Support clearning the pending flag for all methods (when not doing
1079         explicit interface implementation).
1080
1081 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
1082
1083         * rootcontext.cs: added a couple more types needed to bootstrap.
1084
1085 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
1086
1087         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
1088         constructor in the type, instead of any constructor in the type
1089         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
1090         a bug in the Mono runtime when applying the params attribute). 
1091
1092 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
1093         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
1094
1095 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
1096
1097         * expression.cs (Unary.ResolveOperator): Use TypeManager
1098         to resolve the type.
1099         
1100 2002-06-13  Ravi Pratap  <ravi@ximian.com>
1101
1102         * cs-parser.jay (enum_member_declaration): Pass in the attributes
1103         attached.
1104
1105         * enum.cs (AddEnumMember): Add support to store the attributes associated 
1106         with each member too.
1107
1108         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
1109         field builders too - this takes care of the enum member case.
1110
1111 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
1112
1113         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
1114         address-of operator on both value types and pointers.
1115         
1116 2002-06-10  Martin Baulig  <martin@gnome.org>
1117
1118         * interface.cs (Interface.PopulateIndexer): Add the indexer's
1119         PropertyBuilder to the `property_builders' list.
1120
1121         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
1122         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
1123         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
1124         find any indexers which are inherited from an interface.
1125
1126 2002-06-09  Martin Baulig  <martin@gnome.org>
1127
1128         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
1129         the same type as the constant if necessary.  There's also a test-130.cs
1130         for this.
1131
1132         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
1133
1134         * typemanager.cs (TypeManager.ChangeType): Previously known as
1135         Enum.ChangeEnumType().
1136
1137 2002-06-09  Martin Baulig  <martin@gnome.org>
1138
1139         * expression.cs (Cast.TryReduce): Added support for consts.
1140
1141 2002-06-08  Ravi Pratap  <ravi@ximian.com>
1142
1143         * class.cs (Accessor): Hold attributes information so we can pass
1144         it along.
1145
1146         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
1147         Modify to pass in attributes attached to the methods.
1148
1149         (add_accessor_declaration, remove_accessor_declaration): Ditto.
1150
1151         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
1152         to handle the Accessor kind :-)
1153
1154         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
1155         
1156 2002-06-08  Martin Baulig  <martin@gnome.org>
1157
1158         * expression.cs (Unary.TryReduceNegative): Added support for
1159         ULongConstants.
1160
1161 2002-06-08  Martin Baulig  <martin@gnome.org>
1162
1163         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
1164         name can't be found in the `defined_names' - the caller will do a
1165         MemberLookup in this case and thus find methods in System.Enum
1166         such as Enum.IsDefined().
1167
1168 2002-06-08  Martin Baulig  <martin@gnome.org>
1169
1170         * enum.cs (Enum.ChangeEnumType): This is a custom version of
1171         Convert.ChangeType() which works with TypeBuilder created types.
1172         (Enum.LookupEnumValue, Enum.Define): Use it here.
1173
1174         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
1175         `TypeBuilder.BaseType != null' check.
1176         (TypeContainer.FindMembers): Only lookup parent members if we
1177         actually have a parent.
1178         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
1179         (ConstructorInitializer.Resolve): Likewise.
1180
1181         * interface.cs (Interface.FindMembers): Added
1182         `TypeBuilder.BaseType != null' check.
1183
1184         * rootcontext.cs (RootContext.ResolveCore): Added
1185         "System.Runtime.CompilerServices.IndexerNameAttribute" to
1186         classes_second_stage.
1187
1188         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
1189         debug_type and trace_type when compiling with --nostdlib.       
1190
1191 2002-06-07  Martin Baulig  <martin@gnome.org>
1192
1193         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
1194         (AddField): Set it to true when adding a non-static field.
1195         (DefineType): Use `have_nonstatic_fields' to find out whether we
1196         have non-static fields, not `Fields != null'.
1197
1198 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
1199
1200         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
1201         dereferencing a null on the static-field code path)
1202
1203 2002-05-30  Martin Baulig  <martin@gnome.org>
1204
1205         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
1206         to take command line arguments.  Use reflection to call the new
1207         custom `Initialize' function on the symbol writer and pass it the
1208         command line arguments.
1209
1210         * driver.cs (--debug-args): New command line argument to pass command
1211         line arguments to the symbol writer.
1212
1213 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
1214
1215         * assign.cs (DoResolve): Forgot to do the implicit conversion to
1216         the target type for indexers and properties.  Thanks to Joe for
1217         catching this.
1218
1219 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
1220
1221         * typemanager.cs (MethodFlags): returns the method flags
1222         (Obsolete/ShouldIgnore) that control warning emission and whether
1223         the invocation should be made, or ignored. 
1224
1225         * expression.cs (Invocation.Emit): Remove previous hack, we should
1226         not do this on matching a base type, we should do this based on an attribute
1227
1228         Only emit calls to System.Diagnostics.Debug and
1229         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
1230         on the command line.
1231
1232         * rootcontext.cs: Global settings for tracing and debugging.
1233
1234         * cs-tokenizer.cs (define): New utility function to track
1235         defines.   Set the global settings for TRACE and DEBUG if found.
1236
1237 2002-05-25  Ravi Pratap  <ravi@ximian.com>
1238
1239         * interface.cs (Populate*): Pass in the TypeContainer as well as
1240         the DeclSpace as parameters so that we can create EmitContexts and
1241         then use that to apply attributes etc.
1242
1243         (PopulateMethod, PopulateEvent, PopulateProperty)
1244         (PopulateIndexer): Apply attributes everywhere.
1245
1246         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
1247         etc.
1248
1249         (ApplyAttributes): Update accordingly.
1250
1251         We now apply interface attributes for all members too.
1252
1253 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
1254
1255         * class.cs (Indexer.Define); Correctly check if we are explicit
1256         implementation (instead of checking the Name for a ".", we
1257         directly look up if the InterfaceType was specified).
1258
1259         Delay the creation of the PropertyBuilder.
1260
1261         Only create the PropertyBuilder if we are not an explicit
1262         interface implementation.   This means that explicit interface
1263         implementation members do not participate in regular function
1264         lookups, and hence fixes another major ambiguity problem in
1265         overload resolution (that was the visible effect).
1266
1267         (DefineMethod): Return whether we are doing an interface
1268         implementation. 
1269         
1270         * typemanager.cs: Temporary hack until we get attributes in
1271         interfaces (Ravi is working on that) and we get IndexerName
1272         support in interfaces.
1273
1274         * interface.cs: Register the indexers as properties.
1275
1276         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
1277         warning, I have verified that this is a bug in the .NET runtime
1278         (JavaScript suffers of the same problem).
1279
1280         * typemanager.cs (MemberLookup): When looking up members for
1281         interfaces, the parent of an interface is the implicit
1282         System.Object (so we succeed in searches of Object methods in an
1283         interface method invocation.  Example:  IEnumerable x;  x.ToString
1284         ()) 
1285
1286 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
1287
1288         * class.cs (Event): Events should also register if they do
1289         implement the methods that an interface requires.
1290
1291         * typemanager.cs (MemberLookup); use the new GetInterfaces
1292         method. 
1293
1294         (GetInterfaces): The code used to lookup interfaces for a type is
1295         used in more than one place, factor it here. 
1296
1297         * driver.cs: Track the errors at the bottom of the file, we kept
1298         on going.
1299
1300         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
1301         instance if the method we are calling is static!
1302
1303 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
1304
1305         * attribute.cs (ApplyAttributes): Make this function filter out
1306         the IndexerName attribute (as that attribute in reality is never
1307         applied) and return the string constant for the IndexerName
1308         attribute. 
1309
1310         * class.cs (TypeContainer.Emit): Validate that all the indexers
1311         have the same IndexerName attribute, and if so, set the
1312         DefaultName attribute on the class. 
1313
1314         * typemanager.cs: The return value might contain other stuff (not
1315         only methods).  For instance, consider a method with an "Item"
1316         property and an Item method.
1317
1318         * class.cs: If there is a problem with the parameter types,
1319         return. 
1320
1321 2002-05-24  Ravi Pratap  <ravi@ximian.com>
1322
1323         * ecore.cs (ImplicitConversionExists): Wrapper function which also
1324         looks at user defined conversion after making a call to 
1325         StandardConversionExists - we need this for overload resolution.
1326
1327         * expression.cs : Update accordingly the various method calls.
1328
1329         This fixes 2 bugs filed against implicit user defined conversions 
1330
1331 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
1332
1333         * statement.cs: Track the result of the assignment.
1334
1335 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
1336
1337         * expression.cs (MemberAccess): Improved error reporting for
1338         inaccessible members.
1339
1340 2002-05-22  Martin Baulig  <martin@gnome.org>
1341
1342         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
1343         itself with debugging support.
1344
1345 2002-05-22  Martin Baulig  <martin@gnome.org>
1346
1347         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
1348         Removed, this isn't needed anymore.
1349
1350 2002-05-20  Martin Baulig  <martin@gnome.org>
1351
1352         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
1353         be underlying type for an enum.
1354
1355 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
1356
1357         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
1358         that splits out the loading of just the core types.
1359
1360         * rootcontext.cs (ResolveCore): Split the struct resolution in
1361         two, so we can load the enumeration underlying types before any
1362         enums are used.
1363
1364         * expression.cs (Is): Bandaid until we fix properly Switch (see
1365         bug #24985 for details).
1366
1367         * typemanager.cs (ImplementsInterface): The hashtable will contain
1368         a null if there are no interfaces implemented.
1369
1370 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
1371
1372         * cs-parser.jay (indexer_declarator): It is fine to have array
1373         parameters
1374
1375 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
1376
1377         * typemanager.cs: (RegisterBuilder): New function used to register
1378         TypeBuilders that implement interfaces.  Since
1379         TypeBuilder.GetInterfaces (as usual) does not work with lame
1380         Reflection.Emit. 
1381         (AddUserType): register interfaces.
1382
1383         (ImplementsInterface): Use the builder_to_ifaces hash if we are
1384         dealing with TypeBuilder.  Also, arrays are showing up as
1385         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
1386         methods can not be invoked on them!
1387
1388         * ecore.cs (ExplicitReferenceConversionExists): Made public.
1389         (ImplicitReferenceConversionExists): Split out from
1390         StandardConversionExists. 
1391
1392         * expression.cs (As): We were only implementing one of the three
1393         cases for the as operator.  We now implement them all.
1394         (Is): Implement the various other cases for Is as well.
1395
1396         * typemanager.cs (CACHE): New define used to control if we want or
1397         not the FindMembers cache.  Seems to have a negative impact on
1398         performance currently
1399
1400         (MemberLookup): Nested types have full acess to
1401         enclosing type members
1402
1403         Remove code that coped with instance/static returns for events, we
1404         now catch this in RealFindMembers.
1405
1406         (RealFindMembers): only perform static lookup if the instance
1407         lookup did not return a type or an event.  
1408
1409 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
1410
1411         * assign.cs (CompoundAssign): We pass more semantic information
1412         now to Compound Assignments than we did before: now we have all
1413         the information at hand, and now we resolve the target *before* we
1414         do the expression expansion, which allows the "CacheValue" method
1415         to have the effect we intended (before, a [x] += 1 would generate
1416         two differen ArrayAccess expressions from the ElementAccess,
1417         during the resolution process).
1418
1419         (CompoundAssign.DoResolve): Resolve target and original_source here.
1420
1421 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
1422
1423         * expression.cs (ArrayAccess): dropped debugging information. 
1424
1425         * typemanager.cs: Small bug fix: I was always returning i_members,
1426         instead of one of i_members or s_members (depending on which had
1427         the content).
1428
1429         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
1430         method is invoked before any code generation takes place, and it
1431         is a mechanism to inform that the expression will be invoked more
1432         than once, and that the method should use temporary values to
1433         avoid having side effects
1434
1435         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
1436         
1437         * ecore.cs (Expression.CacheTemporaries): Provide empty default
1438         implementation.
1439
1440         * expression.cs (Indirection, ArrayAccess): Add support for
1441         CacheTemporaries in these two bad boys. 
1442
1443         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
1444         ldobj or ldind_ref.  
1445         (StoreFromPtr): Handle stobj as well.
1446
1447         * expression.cs (UnaryMutator): Share more code.
1448         
1449         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
1450         down: I was not tracking the Filter function as well, which
1451         was affecting the results of the cache.
1452
1453 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
1454
1455         * attribute.cs: Remove the hack to handle the CharSet property on
1456         StructLayouts. 
1457
1458 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
1459
1460         * attribute.cs (DoResolve): More uglyness, we now only try to
1461         resolve the attribute partially, to extract the CharSet
1462         information (only if we are a StructLayout attribute).  Otherwise 
1463
1464         (GetExtraTypeInfo): Add some code to conditionally kill in the
1465         future this.   I am more and more convinced that the .NET
1466         framework has special code to handle the attribute setting on
1467         certain elements.
1468
1469         * expression.cs (IsParamsMethodApplicable): Revert my previous
1470         foreach change here, it was wrong.
1471
1472 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
1473
1474         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
1475         (pp_expr): do not abort on unknown input, just return.
1476         (eval): abort if there are pending chars.
1477
1478         * attribute.cs (Attribute.Resolve): Positional parameters are
1479         optional.  Deal with that case.
1480
1481         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
1482         the Ansi/Unicode/Auto information for the type.
1483
1484         (TypeContainer.DefineType): instantiate the EmitContext here, as
1485         we will be using it during the type definition (to resolve
1486         attributes) and during the emit phase.
1487
1488         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
1489         to pull type information out of the attributes
1490
1491         (Attribute.Resolve): track the constructor builder, and allow for
1492         multiple invocations (structs and classes will use this).
1493
1494         * ecore.cs (MemberLookupFinal): new version with all the
1495         parameters customizable.
1496
1497         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
1498         constructors.  Return if the result value is null (as the error
1499         would have been flagged already by MemberLookupFinal)
1500
1501         Do not allow instances of abstract classes or interfaces to be
1502         created.
1503         
1504         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
1505         We have to compare the assembly property here when dealing with
1506         FamANDAssem and Assembly access modifiers, because we might be
1507         creating an assembly from *modules* (that means that we are not
1508         getting TypeBuilders for types defined in other modules that are
1509         part of this assembly).
1510
1511         (Method.Emit): If the method is marked abstract and has a body,
1512         emit an error. 
1513
1514         (TypeContainer.DefineMembers): If both the defined member and the
1515         parent name match are methods, then do not emit any warnings: let
1516         the Method.Define routine take care of flagging warnings.  But if
1517         there is a mismatch (method overrides something else, or method is
1518         overriwritten by something, then emit warning).
1519
1520         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
1521         set to null, this means `do not check for the return type on the
1522         signature'. 
1523
1524         (Method.Define): set the return type for the method signature to
1525         null, so that we get methods with the same name and parameters and
1526         different return types.  This is used to flag warning 114 (you are
1527         hiding a method, and you probably want to use the new/override
1528         keywords instead).
1529
1530         * typemanager.cs (MemberLookup): Implemented proper access
1531         control, closing a long standing set of bug reports.  The problem
1532         was that the Framework only has two bits: Public and NonPublic,
1533         and NonPublic includes private and protected methods, but we need
1534         to enforce the FamANDAssem, FamOrAssem and Family. 
1535
1536 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
1537
1538         * statement.cs (GotoCase): Return true: Ammounts to giving up
1539         knowledge on whether we return or not, and letting the other case
1540         be responsible for it.
1541
1542 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
1543
1544         * driver.cs: Do not load directories for each file processed, only
1545         do it if there is a pattern.
1546
1547         * ecore.cs: Report readonly assigns here as well, as we might have
1548         been resolved only by MemberAccess.
1549
1550         (SimpleName.SimpleNameResolve): Also be useful for LValue
1551         resolution.   We need this to propagate assign to local readonly variables
1552
1553         * typemanager.cs: Use a ptrhashtable for the criteria, because we
1554         do not want to reuse potential criteria memory.
1555
1556         * class.cs (MyEventBuilder): Set reflected_type;
1557
1558         * ecore.cs (Constantify): Added support for constifying bools.
1559
1560         (RootContext.LookupType): Added a cache for values looked up in
1561         the declaration space.
1562
1563         * typemanager.cs (FindMembers): Now is a front-end to
1564         RealFindMembers, and provides a two-level hashtable-based cache to
1565         the request.  
1566
1567         15% performance improvement: from 22.5 to 19.2 seconds.
1568
1569         * expression.cs (IsParamsMethodApplicable): use foreach.
1570         (Invocation.DoResolve): ditto.
1571         (New.DoResolve): ditto.
1572         (ArrayCreation.DoResolve): ditto.
1573
1574         * ecore.cs (FindMostEncompassingType): use foreach.
1575
1576         * delegate.cs (NewDelegate.DoResolve): Use foreach
1577
1578         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
1579         (RemoveMethods): use foreach.
1580
1581         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
1582         nested foreach statements instead of for, and also break out of
1583         the inner loop once a match is found.
1584         
1585         (Invocation.OverloadResolve): Use foreach, simplify the code. 
1586
1587 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
1588
1589         * cfold.cs (BinaryFold): During an enumeration evaluation context,
1590         we actually unwrap the expression to allow for extra information
1591         to be extracted. 
1592
1593         * expression.cs: Use Shr_Un on unsigned operations. 
1594
1595 2002-05-08  Ravi Pratap  <ravi@ximian.com>
1596
1597         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
1598         applicable operators was not being considered correctly. This closes
1599         the bug Miguel reported.
1600
1601 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
1602
1603         * attribute.cs: check that the type derives from System.Attribute
1604         and report the correct error in that case (moved the duplicate code to
1605         its own method, too).
1606
1607 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
1608
1609         * attribute.cs: lookup attribute type name as the spec says: first the
1610         bare attribute name and then name + "Attribute" (nant compiles with
1611         mcs after this fix).
1612
1613 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
1614
1615         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
1616         Because of the way we parse things, we should try to see if a
1617         UIntConstant can fit in an integer.
1618
1619 2002-05-07  Ravi Pratap  <ravi@ximian.com>
1620
1621         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
1622         when we are in an explicit context.
1623
1624         (ConvertReferenceExplicit): When converting from Iface type S to Class
1625         T make sure the rules are implemented as an OR.
1626
1627         * parameter.cs (ParameterType): Make it a property for now although the
1628         purpose really isn't anything immediate.
1629         
1630         * expression.cs (Is*Applicable): Do better checking on the parameter type
1631         of a ref/out parameter. The ones from the system assemblies are already 
1632         marked with the correct type so we don't need to do any correction.
1633
1634         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
1635         the object type is standard too so include that.
1636
1637 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
1638
1639         * ecore.cs (StandardConversionExists): Augment with missing code:
1640         deal with IntConstant, LongConstants and Enumerations.
1641
1642         * assign.cs: Report the error, instead of failing silently
1643
1644         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
1645         typecontainer that they are declared, because the
1646         typecontainer/namespace will have the list of using clauses that
1647         need to be applied.
1648
1649         Assembly Attributes were escaping the normal registration
1650         mechanism. 
1651
1652         (EmitCode): Apply attributes within an EmitContext that represents
1653         the container they were declared on.
1654         
1655         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
1656
1657 2002-05-06  Ravi Pratap  <ravi@ximian.com>
1658
1659         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
1660         Revamp completely - make much cleaner as we now operate only
1661         on a set of Types.
1662
1663         (FindMostSpecificSource, FindMostSpecificTarget): New methods
1664         to implement the logic detailed in the spec more correctly.
1665
1666         (UserDefinedConversion): Update accordingly.
1667
1668 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
1669
1670         * statement.cs: Return flow analysis information up.
1671
1672         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
1673         and the default.
1674
1675         (token): Do not consume an extra character before calling
1676         decimal_digits.
1677
1678 2002-05-06  Piers Haken <piersh@friskit.com>
1679
1680         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
1681
1682 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
1683
1684         * class.cs (Constructor.Emit): Set the IsStatic flag in the
1685         EmitContext during the instance constructor initializer
1686         resolution, to stop access to instance variables.
1687
1688         This is mandated by the spec, last paragraph of the `constructor
1689         initializers' section. 
1690
1691 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
1692
1693         * cs-parser.jay, class.cs (Accessor): new class used to represent
1694         an accessor (get or set).  In the past we used `null' to represent
1695         a missing accessor.  But this is ambiguous because there was no
1696         way to tell in abstract indexers/properties if one of them was
1697         specified.
1698
1699         Now there is a way of addressing that.
1700
1701         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
1702         instead of FindMembers.
1703
1704         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
1705         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
1706
1707         * attribute.cs: Treat indexers and properties as the same in terms
1708         of applying attributes
1709
1710         * ecore.cs (FindMostEncompassedType): Use statically initialized
1711         EmptyExpressions()s like we do elsewhere to avoid creating useless
1712         objects (and we take this out of the tight loop).
1713
1714         (GetConversionOperators): Move the code to extract the actual
1715         operators to a separate routine to clean things up.
1716
1717 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
1718
1719         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
1720         events are always registered FieldBuilders.
1721         
1722         * class.cs (FieldBase): New class shared by Fields 
1723
1724         * delegate.cs: If we are a toplevel delegate, use our full name.
1725         If we are a nested delegate, then only use our tail name.
1726
1727 2002-05-02  Ravi Pratap  <ravi@ximian.com>
1728
1729         * expression.cs (IsApplicable): Ensure that we add the "&" to
1730         ref/out types before comparing it with the type of the argument.
1731
1732         (IsParamsMethodApplicable): Ditto.
1733
1734         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
1735         silly me ;-)
1736
1737         * delegate.cs : Handle the case when we have more than one applicable
1738         method. Flag an error only when we finish checking all.
1739
1740 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
1741
1742         * expression.cs: Add support for boolean static initializers.
1743
1744 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
1745
1746         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
1747
1748         * parameter.cs (ComputeParameterTypes,
1749         ComputeAndDefineParameterTypes): Better error handling: now we
1750         clear the `types' cache if we fail during any of the type lookups.
1751         We also return the status code correctly to our caller
1752
1753         * delegate.cs: If we fail to define a delegate, abort the extra
1754         steps. 
1755
1756         * expression.cs (Binary.ResolveOperator): for
1757         operator==(object,object) and operator !=(object, object) we also
1758         have to verify that there is an implicit conversion from one to
1759         the other.
1760
1761         (ArrayAccess.DoResolve): Array Access can operate on
1762         non-variables. 
1763
1764 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
1765
1766         * assign.cs (CompoundAssign): A new class used as a "flag" that
1767         the assignment actually is happening as part of a compound
1768         assignment operator.
1769
1770         During compound assignment, a few new rules exist to enable things
1771         like:
1772
1773         byte b |= 1 + 2
1774
1775         From the spec:
1776         
1777         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
1778         to the type of x) if y is implicitly convertible to the type of x,
1779         and the operator is a builtin operator and the return type of the
1780         operator is explicitly convertible to the type of x. 
1781
1782         * rootcontext.cs: Reset warning level to 2.  4 catches various
1783         "interesting" features in mcs, we must clean this up at some
1784         point, but currently am trying to kill other bugs ;-)
1785
1786         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
1787         in container classes as well.  
1788
1789         * expression.cs (Binary.ResolveOperator): Handle string case
1790         before anything else (as operator overloading does emit an error
1791         before doing anything else).
1792
1793         This code could go away when we move to a table driven model, but
1794         i could not come up with a good plan last night.
1795         
1796 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
1797
1798         * typemanager.cs (CSharpName): reimplementation using regex.
1799         * class.cs: added null check for fields in Emit
1800         * rootcontext.cs: set warninglevel to 4
1801
1802 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
1803
1804         * typemanager.cs (CSharpName): reimplemented with Lupus
1805         suggestion.
1806
1807 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
1808
1809         * statement.cs (If): correclty implement Resolve, because we were
1810         not catching sem errors in there.  The same process is needed
1811         everywhere else. 
1812         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
1813         
1814
1815         (Statement.Warning_DeadCodeFound): Factorize code.
1816         (While): Report dead code here too.
1817
1818         (Statement): Added Resolve virtual method to allow
1819         for resolution split from the emit code.
1820
1821 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
1822
1823         * statement.cs (EmitBoolExpression): No longer try to resolve the
1824         expression here.    
1825         (MakeBoolean): New utility function that resolve, implicitly
1826         converts to boolean and tags the expression. 
1827         
1828
1829         (If, Do): Implement dead code elimination.
1830         (While): Implement loop inversion
1831
1832         (Do, While, For, If): Resolve the expression prior to calling our
1833         code generation.
1834
1835 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
1836
1837         * class.cs:
1838           - added method Report28 (warning: program has more than one entry point)
1839           - added method IsEntryPoint, implements paragraph 10.1 of the spec
1840           - modified method Method.Define, the part at the end of the method
1841
1842         * rootcontext.cs: added static public Location EntryPointLocation;
1843           
1844         * ../errors/cs0028.cs : Add test case for the above warning.              
1845
1846         * typemanager.cs:
1847           - modified method CSharpName to allow arrays of primitive type to
1848             be printed nicely (e.g. instead of System.Int32[][] it now prints
1849             int[][])
1850           - added method CSharpSignature: returns the signature of a method
1851             in string format to be used in reporting errors, warnings, etc.
1852
1853         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
1854         with String.Empty.
1855         
1856 2002-04-26  Ravi Pratap  <ravi@ximian.com>
1857
1858         * delegate.cs (Define): Fix extremely silly bug where I was
1859         setting the type of the 'object' parameter of the BeginInvoke
1860         method to System.IAsyncResult instead of System.Object ;-)
1861
1862 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
1863
1864         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
1865         here. 
1866
1867         (Constructor.Emit): return if we fail to initialize the
1868         constructor.  Another door closed!  
1869
1870         * expression.cs (New.DoResolve): Improve error message (from -6 to
1871         1501).  Use DeclaredOnly lookup to find the exact constructor.
1872
1873         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
1874         loop.  This is useful.
1875
1876         * cs-parser.jay: Adjust the default parameters so that destructors
1877         have the proper signature.
1878
1879 2002-04-26  Martin Baulig  <martin@gnome.org>
1880
1881         * driver.cs (LoadAssembly): If `assembly' contains any characters
1882         which are only valid in path names and not in assembly names
1883         (currently slash, backslash and point), use Assembly.LoadFrom ()
1884         instead of Assembly.Load () on the `assembly' (before iteration
1885         over the link_paths).
1886
1887 2002-04-26  Martin Baulig  <martin@gnome.org>
1888
1889         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
1890
1891 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
1892
1893         * class.cs (Property): use the new typemanager.MemberLookup
1894
1895         (TypeContainer.MemberLookup): Implement using the
1896         TypeManager.MemberLookup now. 
1897         
1898         * typemanager.cs: Make MemberLookup a function of the TypeManager,
1899         and return MemberInfos, so that these can be used without an
1900         EmitContext (what we had before).
1901
1902 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
1903
1904         * expression.cs: Fix the case where the argument to params if the
1905         type of the params.  I omitted handling this before.   Fixed
1906
1907 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
1908
1909         * driver.cs: Call BootCorlib_PopulateCoreType
1910
1911         * class.cs (Property.CheckBase): Check for properties only, not
1912         for all members. 
1913
1914         * interface.cs: Temporary hack: try/catch around the
1915         CustomAttributeBuilder, because I am getting an exception that I
1916         do not understand.
1917
1918         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
1919         types whose definitions are required to be there (attributes are
1920         defined before standard types).
1921
1922         Compute definitions as we boot the various types, as they are used
1923         immediately (value_type class will need object_type, but if we do
1924         not initialize object_type, we will pass a null, which will let
1925         the runtime pick the System.Object from the existing corlib, which
1926         is not what we want).
1927
1928 2002-04-22  Patrik Torstensson <totte@labs2.com>
1929
1930         * cs-tokenizer.cs: fixed a number of trim() issues.
1931
1932 2002-04-22  Ravi Pratap  <ravi@ximian.com>
1933
1934         * expression.cs (Argument.Type): Ensure that we return the correct
1935         type when we have out or ref parameters [in which case we 
1936         append a "&"].
1937         
1938 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
1939
1940         * class.cs (Property, Indexer): Allow extern modifier in there. 
1941
1942         * typemanager.cs (InitBaseTypes): Initializes object_type and
1943         value_type, since those will be used early on during the bootstrap
1944         process to compile corlib.
1945
1946         (InitCoreTypes): Move code from here to InitBaseTypes.
1947
1948 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
1949
1950         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
1951         single-dimension arrays as using the ldlen opcode.  
1952
1953         Daniel Lewis discovered this optimization.  
1954
1955         * typemanager.cs: Add signature for System.Array::get_Length
1956
1957 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
1958
1959         * statement.cs: report the error when the foreach does not apply to an
1960         array nor a collection.
1961
1962 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
1963
1964         * expression.cs: Add implicit conversions to the operator ~.
1965
1966         * constant.cs (DecimalConstant.Emit): Emit decimal value.
1967
1968         * typemanager.cs: Locate the decimal constructor.
1969
1970 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
1971
1972         * attribute.cs: use the new property of TypeOf.
1973         * expression.cs: added 'get' property around typearg.
1974
1975         These changes fix a build breaker reported by NickD. Is this the
1976         correct way to fix?  If not, please, revert my changes and make it
1977         work :-).
1978
1979 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
1980
1981         * attribute.cs: Add support for typeof in attribute invocations.
1982         I am not sure that this is right though.
1983
1984 2002-04-14  Duncan Mak  <duncan@ximian.com>
1985
1986         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
1987         Binary.Operator.Division case.
1988
1989 2002-04-13  Ravi Pratap  <ravi@ximian.com>
1990
1991         * class.cs (DefineType): Ensure that we do a proper check on
1992         attribute types and also register it with the TypeManager.
1993
1994         (TypeContainer.Targets): The default for attribute types is
1995         AttributeTargets.All.
1996         
1997         * attribute.cs (ApplyAttributes): Registering the attribute type
1998         is done elsewhere, not when we discover we have a Usage attribute.
1999
2000 2002-04-12  Ravi Pratap  <ravi@ximian.com>
2001
2002         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
2003         and get rid of is_delegate parameter.
2004
2005         * everywhere : update.
2006         
2007 2002-04-12  Ravi Pratap  <ravi@ximian.com>
2008
2009         * cs-parser.jay (compilation_unit): Revamp completely to use
2010         some new ideas that I got from Rhys' grammar to solve the problems
2011         with assembly level attributes.
2012
2013         (outer_declaration): New grammar production.
2014
2015         (attribute_sections): Add.
2016
2017         (opt_attributes): Base on attribute_sections
2018
2019         (namespace_declaration): Allow opt_attributes to tackle the case
2020         when we have assembly level attributes - we are clever in this
2021         regard now ;-)
2022
2023         * attribute.cs (ApplyAttributes): Do not worry about assembly 
2024         attributes in the non-global context.
2025
2026         * rootcontext.cs (AddGlobalAttributes): Go back to using this
2027         instead of SetGlobalAttributes.
2028
2029         * class.cs, rootcontext.cs : Ensure we define and generate 
2030         attribute types before anything else.
2031
2032         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
2033         and flag the new error -20 for the case when the attribute type
2034         does not have valid targets specified. csc does not catch this.
2035
2036         * ../errors/errors.txt : update for error # -20
2037
2038 2002-04-11  Ravi Pratap  <ravi@ximian.com>
2039
2040         * support.cs (InternalParameters.ParameterModifier): Do some null
2041         checking and return sane values.
2042
2043         * class.cs (Method.Define): If we are a PInvoke method, ensure
2044         that we are static and extern. Report error # 601
2045
2046         * ../errors/cs0601.cs : Add test case for the above error.
2047
2048 2002-04-07  Ravi Pratap  <ravi@ximian.com>
2049
2050         * rootcontext.cs (attribute_types): We need to keep type of
2051         all attribute types separately and emit code for them first.
2052
2053         (RegisterAttribute) : Implement.
2054
2055         * class.cs (DefineType): Check if the current Type is a custom
2056         attribute type and register it accordingly.
2057
2058         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
2059         adding the first attribute twice and rename to
2060
2061         (SetGlobalAttributes): this.
2062
2063         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
2064         lookups.
2065
2066         * attribute.cs (ApplyAttributes): Take an additional argument telling us
2067         if we are processing global arguments. Hmm, I am unsure of this.
2068
2069 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
2070
2071         * expression.cs: added static array of strings to avoid calling
2072         Enum.ToString () for Operator in Binary. Significant recover of
2073         performance.
2074
2075 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
2076
2077         * class.cs (FindMembers): Allow the Builders of the various
2078         members to be null.  If they are skip them.  This only happens
2079         during the PInvoke declaration.
2080
2081 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
2082
2083         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
2084         failure, so we do not keep going afterwards.
2085
2086         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
2087         wanted to pass `false' as the `is_delegate' argument.  If this is
2088         the case, why not use delegate_type == null to mean `is_delegate =
2089         false' and anything else as is_delegate = true.
2090
2091 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
2092
2093         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
2094         code for the section, not the beginning of the tests.
2095
2096 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
2097
2098         * cfold.cs: Handle operator + (Enum x, Underlying x) 
2099
2100         * expression.cs (Binary): same.  Warn about errors where we have
2101         Enum/Enum in operator + as well.
2102
2103 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
2104
2105         * statement.cs:
2106                 - added support for switch(bool)
2107                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
2108                 - add TableSwitchEmit() to handle table-based switch statements
2109
2110 2002-04-05  Ravi Pratap  <ravi@ximian.com>
2111
2112         * expression.cs (Invocation.OverloadResolve): Factor out code which
2113         does parameter compatibility checking with arguments so that we can 
2114         re-use the code even from Delegate.VerifyApplicability
2115
2116         (VerifyArgumentsCompat): Move above code here.
2117
2118         * delegate.cs (VerifyApplicability): Get rid of duplicate code
2119         and instead make a call to the above method.
2120
2121 2002-03-31  Ravi Pratap  <ravi@ximian.com>
2122
2123         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
2124         We use it to keep track of classes which are attribute types.
2125
2126 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
2127
2128         * delegate.cs (Delegate.Define): Correctly define the types in the
2129         presence of fixed and array parameters.
2130
2131         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
2132         doing FindMembers.
2133
2134         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
2135         include NonPublic after the first iteration.
2136
2137         * class.cs (Indexer.CheckBase): Only check if both parents are
2138         non-null. 
2139         
2140         * cs-parser.jay (accessor_body): If empty, set to null.
2141
2142         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
2143         same code path here to resolve constants names that we did have in
2144         MemberAccess.DoResolve.  There is too much code duplicated here.
2145
2146 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
2147
2148         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
2149
2150         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
2151         to MakeUnionSet.
2152
2153         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
2154         tokens, numbers and strings.
2155
2156         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
2157         parenthesis.
2158
2159         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
2160         asyncronous parameters and the regular parameters.  
2161
2162         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
2163         specify the target directory.
2164
2165         * expression.cs: (This.DoResolve): Simplify
2166         (As.Emit): Optimize, do not generate IsInst if the expression is
2167         always of the given type.
2168
2169         (Is.DoResolve): Bug fix, we were reporting both always/never for
2170         the is expression.
2171
2172         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
2173         creating too many unnecessary arrays.
2174
2175 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
2176
2177         * class.cs (EmitFieldInitializer): Use Assign expression to assign
2178         fields instead of rolling our own initializer.   Takes care of all
2179         implicit conversions, and drops unnecessary static checks/argument.
2180
2181 2002-03-31  Dick Porter  <dick@ximian.com>
2182
2183         * driver.cs: use the GetDirectories() return values properly, and
2184         use "/" as path separator.
2185
2186 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
2187
2188         * expression.cs (Unary): Optimize - - expr into expr.
2189         (Binary): Optimize a + (-b) into a -b.
2190
2191         * codegen.cs (CodeGen): Made all methods static.
2192
2193 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
2194
2195         * rootcontext.cs: 
2196
2197         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
2198         TypeBuilder property.
2199
2200         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
2201         instead. 
2202
2203         * tree.cs: Removed the various RecordXXXX, and replaced with a
2204         single RecordDecl.  Removed all the accessor methods, and just
2205         left a single access point Type 
2206
2207         * enum.cs: Rename DefineEnum to DefineType.
2208
2209         * decl.cs: New abstract method `DefineType' used to unify the
2210         Defines for Enumerations, Interfaces, TypeContainers and
2211         Delegates.
2212
2213         (FindType): Moved LookupInterfaceOrClass here.  Moved the
2214         LookupBaseClasses method that used to live in class.cs and
2215         interface.cs here, and renamed to FindType.
2216         
2217         * delegate.cs: Implement DefineType.  Take advantage of the
2218         refactored pattern for locating the parent builder without taking
2219         the parent_builder argument (which we know does not work if we are
2220         nested, and triggering a toplevel definition).
2221
2222 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
2223
2224         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
2225         accessibility of a member has changed during override and report
2226         an error if so.
2227
2228         * class.cs (Method.Define, Property.Define): Only complain on
2229         overrides if the method is private, any other accessibility is
2230         fine (and since we just checked the permission is the same, we are
2231         good to go).
2232
2233         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
2234         and elif are processed always.  The other pre-processing
2235         directives are only processed if we are "taking" the path
2236
2237 2002-03-29  Martin Baulig  <martin@gnome.org>
2238
2239         * class.cs (Method.Emit): Only emit symbolic debugging info if the
2240         current location is not Null.
2241
2242         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
2243         a separate method so we can profile it.
2244
2245         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
2246         `span.Seconds' are just seconds, but no minutes or hours.
2247         (MainDriver): Profile the CodeGen.SaveSymbols calls.
2248
2249 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
2250
2251         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
2252         Remove the gratuitous set of Final:
2253
2254                                 // If an interface implementation, then we can set Final.
2255                                 if (((flags & MethodAttributes.Abstract) == 0) &&
2256                                     implementing.DeclaringType.IsInterface)
2257                                         flags |= MethodAttributes.Final;
2258
2259         I do not know what I was smoking when I used that.
2260         
2261
2262         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
2263         step into fixing the name resolution issues for delegates and
2264         unifying the toplevel name resolution.
2265
2266 2002-03-28  Martin Baulig  <martin@gnome.org>
2267
2268         * class.cs (Method.Emit): If we have a symbol writer, call its
2269         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
2270         tell it about the current method.
2271
2272         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
2273         writer that we're going to emit the first byte of IL code for a new
2274         statement (a new source line).
2275         (EmitContext.EmitTopBlock): If we have a symbol writer, call
2276         EmitContext.Mark() before emitting any code.
2277
2278         * location.cs (SymbolDocument): Return null when we're Null.
2279
2280         * statement.cs (Statement): Moved the `Location loc' variable here.
2281         (Statement.EmitBoolExpression): If we have a symbol writer, call
2282         ec.Mark() before emitting any code to tell it that we're at the
2283         beginning of a new statement.
2284         (StatementExpression): Added `Location' argument to the constructor.
2285         (Block): Added public readonly variable `StartLocation' and public
2286         variable `EndLocation'.  The latter is to be set using SetEndLocation().
2287         (Block): Added constructor which takes a start and end location.
2288         (Block.SetEndLocation): New method. This sets the end location.
2289         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
2290         local variables we create.
2291         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
2292         each statement and do also mark the begin and end of the block.
2293
2294         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
2295         tell it the current lexer.Location, use Location.Null for the end of the
2296         block.
2297         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
2298         current block, set its end location using SetEndLocation().
2299         (statement_expression): StatementExpression constructor now takes the
2300         lexer.Location as additional argument.
2301         (for_statement, declare_local_variables): Likewise.
2302         (declare_local_variables): When creating a new implicit block, use the
2303         new Block constructor and pass it the lexer.Location.
2304
2305 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
2306
2307         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
2308         members also on the parent interfaces recursively.
2309
2310 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
2311
2312         * report.cs: Use new formats, since Gonzalo finished the missing
2313         bits. 
2314
2315         * expression.cs (Binary.ResolveOperator): added missing operator|
2316         operator& and operator^ for bool/bool.
2317
2318         * cs-parser.jay: CheckDef now takes a Location argument that is
2319         used to report errors more precisly (instead of reporting the end
2320         of a definition, we try to track something which is a lot closer
2321         to the source of the problem).
2322
2323         * cs-tokenizer.cs: Track global token use, so we can properly flag
2324         the use of #define/#undef after the first token has been seen.
2325
2326         Also, rename the reportXXXX to Error_DescriptiveName
2327
2328         * decl.cs (DeclSpace.IsTopLevel): Move property here from
2329         TypeContainer, so that Enum and Interface can use this too.
2330
2331         * class.cs (TypeContainer.LookupInterfaceOrClass,
2332         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
2333         `builder' argument.  Typically this was used to pass the parent
2334         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
2335         the definition).  
2336
2337         The problem is that a nested class could trigger the definition of
2338         a toplevel class, and the builder would be obviously wrong in that
2339         case. 
2340
2341         So we drop this argument, and we compute dynamically the
2342         TypeBuilder/ModuleBuilder (the correct information was available
2343         to us anyways from DeclSpace.Parent)
2344
2345         * interface.cs (Interface.DefineInterface): Drop builder
2346         parameter cleanup like class.cs
2347
2348         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
2349         like class.cs
2350
2351         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
2352         values. 
2353
2354         (Try.Emit): Propagate the returns value from the statement.
2355
2356         (Return.Emit): Even if we are leavning 
2357
2358         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
2359
2360         * modifiers.cs: Fix the computation of MethodAttributes flags.
2361
2362 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
2363
2364         * driver.cs: allow compilation of files that start with '/'.
2365         Add a default case when checking the argument of --target.
2366
2367 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
2368
2369         * interface.cs: Implement the same search algorithm for types in
2370         the interface code.
2371
2372         * delegate.cs: Do not allow multiple definition.
2373
2374         * Recovered ChangeLog that got accidentally amputated
2375
2376         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
2377
2378         * rootcontext.cs: Load manually enum to allow core classes to
2379         contain enumerations.
2380
2381         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
2382         Update to new static methods in TypeManager.
2383
2384         * typemanager.cs (GetMethod, GetConstructor): Use our
2385         implementation of FindMembers to find the members, since during
2386         corlib compilation, the types are TypeBuilders and GetMethod and
2387         GetConstructor do not work.
2388
2389         Make all methods in TypeManager static.
2390
2391         (InitCodeHelpers): Split the functionality from
2392         the InitCodeTypes function.
2393
2394         * driver.cs: Call InitCodeHelpers after we have populated the
2395         types. 
2396
2397         * cs-parser.jay (delegate_declaration): we did not used to compute
2398         the delegate name correctly for void delegates.
2399
2400 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
2401
2402         * rootcontext.cs (RootContext): Init the interface_resolve_order
2403         and type_container_resolve_order always.
2404
2405         (ResolveCore, BootstrapCorlib_ResolveClass,
2406         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
2407         compiler when compiling with --nostdlib
2408
2409         * class.cs (TypeContainer.DefineType): Check that our parent is
2410         not null.  This test is most important when we are bootstraping
2411         the core types.
2412
2413         * codegen.cs: Split out the symbol writing code.
2414
2415 2002-03-25  Martin Baulig  <martin@gnome.org>
2416
2417         * driver.cs (-g): Made -g an alias for --debug.
2418
2419 2002-03-24  Martin Baulig  <martin@gnome.org>
2420
2421         * codegen.cs (SymbolWriter): New public variable. Returns the
2422         current symbol writer.
2423         (CodeGen): Added `bool want_debugging_support' argument to the
2424          constructor. If true, tell the ModuleBuild that we want debugging
2425         support and ask it for the ISymbolWriter.
2426         (Save): If we have a symbol writer, call it's Close() method after
2427         saving the assembly.
2428
2429         * driver.c (--debug): New command line argument to create a
2430         debugger information file.
2431
2432         * location.cs (SymbolDocument): New public property. Returns an
2433         ISymbolDocumentWriter object for the current source file or null
2434         if we don't have a symbol writer.
2435
2436 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
2437
2438         * driver.cs (LoadAssembly): Correctly return when all the paths
2439         have been tried and not before.
2440
2441         * statement.cs (Switch.Emit): return the actual coverage for this
2442         statement (returns/not-returns)
2443
2444         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
2445         switch of the statement if we are the last switch section.  That
2446         kills two problems: try/catch problems (we used to emit an empty
2447         nop at the end) and switch statements where all branches would
2448         return. 
2449
2450 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
2451
2452         * driver.cs: Add default assemblies (the equivalent to the
2453         Microsoft CSC.RSP file)
2454
2455         * cs-tokenizer.cs: When updating `cols and setting it to zero,
2456         also update tokens_seen and set it to false.
2457
2458         * driver.cs: Implement --recurse for Mike.
2459
2460         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
2461         correctly splitting out the paths.
2462
2463 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
2464
2465         * interface.cs (Interface.PopulateProperty): Instead of using
2466         `parent' as the declaration space for the set parameters, use
2467         `this' 
2468
2469         * support.cs (InternalParameters): InternalParameters constructor
2470         takes a DeclSpace instead of a TypeContainer.
2471
2472         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
2473         types are being initialized, load the address of it before calling
2474         the function.  
2475
2476         (New): Provide a mechanism to disable the generation of local
2477         value type temporaries when the caller will be providing us with
2478         an address to store it.
2479
2480         (ArrayCreation.EmitDynamicInitializers): Use it.
2481
2482 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
2483
2484         * expression.cs (Invocation.EmitArguments): Only probe for array
2485         property if there is more than one argument.  Sorry about that.
2486
2487         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
2488         empty param arrays.
2489         
2490         * class.cs (Method.LabelParameters): Fix incorrect code path that
2491         prevented the `ParamArrayAttribute' from being applied to the
2492         params attribute.
2493
2494 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
2495
2496         * support.cs (ReflectionParameters): Correctly compute whether the
2497         last argument is a params array.  Fixes the problem with
2498         string.Split ('a')
2499
2500         * typemanager.cs: Make the assemblies array always be non-null
2501         (empty, but non-null)
2502
2503         * tree.cs (RecordDecl): New function that abstracts the recording
2504         of names.  This reports error 101, and provides a pointer to the
2505         previous declaration.  Fixes a crash in the compiler.
2506
2507         * cs-parser.jay (constructor_declaration): Update to new grammar,
2508         and provide a constructor_body that can be empty.
2509
2510 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
2511
2512         * driver.cs: Add support for --resources.
2513
2514         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
2515         Make all types for the various array helper methods be integer.
2516
2517         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
2518         CheckState to ConvCast.
2519
2520         (ConvCast): Now it takes a `checked' state argument, to avoid
2521         depending on the emit context for the conversion, and just using
2522         the resolve time setting.
2523
2524         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
2525         instead of Invocation.EmitArguments.  We do not emit the original
2526         arguments, instead we emit those which have been converted to
2527         unsigned int expressions.
2528
2529         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
2530
2531         * codegen.cs: ditto.
2532
2533         * expression.cs (LocalVariableReference): Drop the use of the
2534         Store function that depended on the variable index.
2535
2536         * statement.cs (VariableInfo): Drop the `Idx' property from this
2537         class, as this is not taking into account the indexes for
2538         temporaries tat we generate during the execution, getting the
2539         indexes wrong.
2540
2541         * class.cs: First emit class initializers, then call the parent
2542         constructor. 
2543
2544         * expression.cs (Binary): Fix opcode emision.
2545         (UnaryMutator.EmitCode): Support checked code generation
2546
2547         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
2548         matches for events for both the Static and Instance scans,
2549         pointing to the same element.   Fix that.
2550
2551 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
2552
2553         * rootcontext.cs (ResolveTree): Always set the
2554         interface_resolve_order, because nested interfaces will be calling
2555         into us.
2556
2557         * class.cs (GetInterfaceOrClass): Track the same resolution
2558         process used by TypeManager.LookupType.  This fixes the nested
2559         type lookups in class declarations (separate path from
2560         LookupType). 
2561
2562         (TypeContainer.DefineType): Also define nested interfaces.
2563         (TypeContainer.RegisterOrder): New public function used to
2564         register the order in which child interfaces need to be closed.
2565
2566         Nested interfaces need to be closed after their parents have been
2567         created. 
2568         
2569         * interface.cs (InterfaceAttr): Put all the logic for computing
2570         the interface attribute here. 
2571
2572         (DefineInterface): Register our interface order with the
2573         RootContext or with the TypeContainer depending on the case.
2574
2575 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
2576
2577         * cs-parser.jay: rework foreach statement to work with the new
2578         changes to the policy on SimpleNames.
2579         
2580         * report.cs: support Stacktrace on warnings as well.
2581
2582         * makefile: drop --unsafe and /unsafe from the compile.
2583
2584 2002-03-13  Ravi Pratap  <ravi@ximian.com>
2585
2586         * ecore.cs (StandardConversionExists): Modify to take an Expression
2587         as the first parameter. Ensure we do null -> reference type conversion
2588         checking.
2589
2590         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
2591         temporary Expression objects.
2592
2593 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
2594
2595         * interface.cs: workaround bug in method overloading resolution
2596         (there is already a bugzilla bug for it).
2597
2598 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
2599
2600         We could also solve this problem by having a separate path for
2601         performing type lookups, instead of DoResolve, we could have a
2602         ResolveType entry point, and only participating pieces of the
2603         production (simplename, deref, array) would implement this. 
2604         
2605         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
2606         signal SimpleName to only resolve type names and not attempt to
2607         resolve anything else.
2608
2609         * expression.cs (Cast): Set the flag.
2610
2611         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
2612
2613         * class.cs: Only report 108 if there is no `new' modifier.
2614
2615         * cs-parser.jay: rework foreach statement to work with the new
2616         changes to the policy on SimpleNames.
2617         
2618         * report.cs: support Stacktrace on warnings as well.
2619
2620         * makefile: drop --unsafe and /unsafe from the compile.
2621
2622 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
2623
2624         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
2625         lookups here, instead of doing that at parse time.  This means
2626         that our grammar will not introduce `LocalVariableReferences' as
2627         expressions at this point.  That solves the problem of code like
2628         this:
2629
2630         class X {
2631            static void Main ()
2632            { int X = 1;
2633             { X x = null }}}
2634
2635         This is only half the fix.  The full fix requires parameters to
2636         also be handled in this way.
2637
2638         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
2639         makes the use more obvious of the DeclSpace.  The
2640         ec.TypeContainer.TypeBuilder is now only used to pull the
2641         TypeBuilder for it.
2642
2643         My theory is that I can get rid of the TypeBuilder completely from
2644         the EmitContext, and have typecasts where it is used (from
2645         DeclSpace to where it matters).  
2646
2647         The only pending problem is that the code that implements Aliases
2648         is on TypeContainer, and probably should go in DeclSpace.
2649
2650         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
2651         lookups here, instead of doing that at parse time.  This means
2652         that our grammar will not introduce `LocalVariableReferences' as
2653         expressions at this point.  That solves the problem of code like
2654         this:
2655
2656         class X {
2657            static void Main ()
2658            { int X = 1;
2659             { X x = null }}}
2660
2661         This is only half the fix.  The full fix requires parameters to
2662         also be handled in this way.
2663
2664         * class.cs (Property.DefineMethod): When implementing an interface
2665         method, set newslot, when implementing an abstract method, do not
2666         set the flag (before we tried never setting it, or always setting
2667         it, which is the difference).
2668         (Indexer.DefineMethod): same.
2669         (Method.DefineMethod): same.
2670
2671         * ecore.cs: Only set the status used flag if we get back a Field.
2672
2673         * attribute.cs: Temporary hack, so Paolo can keep working.
2674
2675 2002-03-08  Ravi Pratap  <ravi@ximian.com>
2676
2677         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
2678         the unmanaged type in the case we have a MarshalAs attribute.
2679
2680         (Resolve): Handle the case when we are parsing the special MarshalAs
2681         attribute [we need to store the unmanaged type to use later]
2682         
2683         * typemanager.cs (marshal_as_attr_type): Built in type for the 
2684         MarshalAs Attribute.
2685
2686         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
2687         on parameters and accordingly set the marshalling info.
2688         
2689 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
2690
2691         * class.cs: Optimizing slightly by removing redundant code after
2692         we switched to the `NoTypes' return value.
2693         (Property.DefineMethod): use NoTypes here too.
2694
2695         This fixes the bug I introduced in my last batch of changes.
2696
2697 2002-03-05  Ravi Pratap  <ravi@ximian.com>
2698
2699         * tree.cs (RecordEnum): Add. We now keep track of enums too.
2700
2701         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
2702         Enums since those are types too. 
2703
2704         * cs-parser.jay (enum_declaration): Record enums as we parse them.
2705         
2706         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
2707         thanks to a call during the lookup process.
2708
2709 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
2710
2711         * statement.cs (Foreach): Lots of work to accomodate a particular
2712         kind of foreach statement that I had not kept in mind.  It is
2713         possible to have foreachs on classes that provide a GetEnumerator
2714         method that return objects that implement the "pattern" for using
2715         a foreach, there is no need to support GetEnumerator
2716         specifically. 
2717
2718         This is needed to compile nant.
2719
2720         * decl.cs: Only report 114 if the member is not `Finalize' and if
2721         the warning level is at least 2.
2722
2723         * class.cs: Moved the compare function from Method to
2724         MethodSignature. 
2725
2726         (MethodSignature.InheritableMemberSignatureCompare): Add new
2727         filter function that is used to extract inheritable methods from a
2728         class. 
2729
2730         (Method.Define): Use the new `inheritable_method_signature_filter'
2731         delegate
2732
2733         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
2734         command. 
2735
2736 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
2737
2738         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
2739
2740         * cs-parser.jay: Add opt_semicolon to the interface declaration.
2741
2742         * expression.cs: Pass location information to
2743         ConvertImplicitStandard. 
2744
2745         * class.cs: Added debugging code to track return values from
2746         interfaces. 
2747
2748 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
2749
2750         * expression.cs (Is.DoResolve): If either side of the `is' is an
2751         interface, do not flag the warning.
2752
2753         * ecore.cs (ImplicitReferenceConversion): We need a separate test
2754         for interfaces
2755
2756         * report.cs: Allow for --fatal to be used with --probe.
2757         
2758         * typemanager.cs (NoTypes): Move the definition for the empty Type
2759         array here. 
2760
2761         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
2762         properties. 
2763         (TypeContainer.DefineProxy): New function used to proxy to parent
2764         implementations when implementing interfaces.
2765         (TypeContainer.ParentImplements): used to lookup if our parent
2766         implements a public function that is required by an interface.
2767         (TypeContainer.VerifyPendingMethods): Hook this up.
2768
2769         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
2770         `modules' and `assemblies' arraylists into arrays.  We only grow
2771         these are the very early start up of the program, so this improves
2772         the speedof LookupType (nicely measured).
2773
2774         * expression.cs (MakeByteBlob): Replaced unsafe code with
2775         BitConverter, as suggested by Paolo.
2776
2777         * cfold.cs (ConstantFold.Binary): Special case: perform constant
2778         folding of string concatenation, but if either side is a string,
2779         and the other is not, then return null, and let the runtime use
2780         the concatenation on the string plus the object (using
2781         `Object.ToString'). 
2782
2783 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
2784
2785         Constant Folding has been implemented now.
2786         
2787         * expression.cs (Unary.Reduce): Do not throw an exception, catch
2788         the error instead on types that are not supported in one's
2789         complement. 
2790
2791         * constant.cs (Constant and all children): New set of functions to
2792         perform implict and explicit conversions.
2793         
2794         * ecore.cs (EnumConstant): Implement the new functions to perform
2795         conversion by proxying to the child expression.
2796
2797         * codegen.cs: (ConstantCheckState): Constant evaluation has its
2798         own separate setting that can not be turned off from the command
2799         line using --unchecked or --checked and is only controlled using
2800         the checked/unchecked statements and expressions.  This setting is
2801         used by the constant folder to flag errors.
2802
2803         * expression.cs (CheckedExpr, UncheckedExpr): Set the
2804         ConstantCheckState as well.   
2805
2806         During Resolve, they also have to flag the state, because the
2807         constant folder runs completely in the Resolve phase.
2808
2809         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
2810         well.
2811
2812 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
2813
2814         * cfold.cs: New file, this file contains the constant folder.
2815         
2816         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
2817         argument to track whether we are using the resulting address to
2818         load or store a value and provide better error messages. 
2819
2820         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
2821         new AddressOf arguments.
2822
2823         * statement.cs (Foreach.EmitCollectionForeach): Update
2824
2825         * expression.cs (Argument.Emit): Call AddressOf with proper
2826         arguments to track usage.
2827
2828         (New.DoEmit): Call AddressOf with new arguments.
2829
2830         (Unary.Emit): Adjust AddressOf call.
2831
2832 2002-03-01  Ravi Pratap  <ravi@ximian.com>
2833
2834         * cs-parser.jay (member_access): Change the case for pre-defined types
2835         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
2836         this suggestion.
2837
2838         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
2839         a method body.
2840
2841         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
2842         essentially like methods and apply attributes like MethodImplOptions to them too.
2843
2844         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
2845         not being null.
2846
2847         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
2848         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
2849         is the DeclSpace.
2850
2851         * Update code everywhere accordingly.
2852
2853         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
2854
2855         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
2856
2857 2002-02-28  Ravi Pratap  <ravi@ximian.com>
2858
2859         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
2860         try performing lookups against those instead of jumping straight into using
2861         the 'using' clauses.
2862
2863         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
2864
2865         (LookupType): Perform lookups in implicit parents too.
2866
2867         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
2868         sequence as RootContext.LookupType. 
2869
2870         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
2871         the various cases of namespace lookups into this method.
2872
2873 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
2874
2875         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
2876         in positional arguments)
2877
2878         * class.cs (Operator): Update the AllowedModifiers to contain
2879         extern. 
2880
2881         * cs-parser.jay: Update operator declaration to allow for the
2882         operator body to be empty.
2883
2884         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
2885         values. 
2886
2887 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
2888
2889         * class.cs (Method.Emit): Label parameters.
2890
2891         * driver.cs: Return 1 or 0 as the program exit code.
2892
2893 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
2894
2895         * expression.cs: Special case the `null' object when trying to
2896         auto-compute the type, as anything can be explicitly converted to
2897         that. 
2898
2899         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
2900         spotting this Paolo.
2901
2902         (Expression.ImplicitNumericConversion): Perform comparissions of
2903         the type using the underlying type in the case of an enumeration
2904         rather than using the enumeration type for the compare.
2905
2906         Cope with the underlying == type case, which is not possible to
2907         catch before. 
2908
2909         (Expression.ConvertNumericExplicit): Perform comparissions of
2910         the type using the underlying type in the case of an enumeration
2911         rather than using the enumeration type for the compare.
2912
2913         * driver.cs: If the user does not supply an extension, assume .exe
2914
2915         * cs-parser.jay (if_statement): Rewrote so that we can track the
2916         location for the if statement.
2917
2918         * expression.cs (Binary.ConstantFold): Only concat strings when
2919         the operation is "+", not everything ;-)
2920
2921         * statement.cs (Statement.EmitBoolExpression): Take a location
2922         argument. 
2923         (If, While, Do): Track location.
2924
2925         * expression.cs (Binary.ResolveOperator): In the object + string
2926         case, I was missing a call to ConvertImplicit
2927
2928 2002-02-25  Ravi Pratap  <ravi@ximian.com>
2929
2930         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
2931         Location arguments. Ensure we use RootContext.LookupType to do our work
2932         and not try to do a direct Type.GetType and ModuleBuilder.GetType
2933
2934         * interface.cs (PopulateMethod): Handle the type of the parameter being
2935         null gracefully.
2936
2937         * expression.cs (Invocation.BetterFunction): Handle the case when we 
2938         have a params method with no fixed arguments and a call is made with no
2939         arguments.
2940
2941 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
2942
2943         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
2944         the verbatim-string-literal
2945
2946         * support.cs (InternalParameters.ParameterModifier): handle null
2947         fixed parameters.
2948         (InternalParameters.ParameterType): ditto.
2949
2950         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
2951         duplicating the name of the variable parameter.
2952         (GetParameterByName): Fix bug where we were not looking up array
2953         paramters if they were the only present (thanks Paolo!).
2954         (GetParameterInfo): We only have an empty set of types if both
2955         fixed and array are set to null.
2956         (GetParameterInfo-idx): Handle FixedParameter == null
2957
2958         * cs-parser.jay: Handle the case where there is no catch
2959         statements (missing null test).
2960
2961 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
2962
2963         * driver.cs (MainDriver): Be conservative on our command line
2964         handling.
2965
2966         Catch DirectoryNotFoundException when calling GetFiles.
2967         
2968         (SplitPathAndPattern): Used to split the input specification into
2969         a path and a pattern that we can feed to Directory.GetFiles.
2970
2971 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
2972
2973         * statement.cs (Fixed): Implement the last case of the Fixed
2974         statement (string handling).
2975
2976         * expression.cs (StringPtr): New class used to return a char * to
2977         a string;  Used by the Fixed statement.
2978
2979         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
2980
2981         * expression.cs (Binary.ResolveOperator): Remove redundant
2982         MemberLookup pn parent type.
2983         Optimize union call, we do not need a union if the types are the same.
2984         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
2985         type.
2986
2987         Specialize the use of MemberLookup everywhere, instead of using
2988         the default settings. 
2989
2990         (StackAlloc): Implement stackalloc keyword.
2991
2992         * cs-parser.jay: Add rule to parse stackalloc.
2993         
2994         * driver.cs: Handle /h, /help, /?
2995
2996         * expression.cs (MakeByteBlob): Removed the hacks we had in place
2997         before we supported unsafe code.
2998         
2999         * makefile: add --unsafe to the self compilation of mcs.
3000
3001 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
3002
3003         * expression.cs (PointerArithmetic): New class that is used to
3004         perform pointer arithmetic.
3005         (Binary.Resolve): Handle pointer arithmetic
3006         Handle pointer comparission.
3007         (ArrayPtr): Utility expression class that is used to take the
3008         address of an array.
3009
3010         (ElementAccess): Implement array access for pointers
3011         
3012         * statement.cs (Fixed): Implement fixed statement for arrays, we
3013         are missing one more case before we are done.
3014
3015         * expression.cs (Indirection): Implement EmitAssign and set the
3016         ExprClass to Variable.  This allows pointer dereferences to be
3017         treated as variables, and to have values assigned to them.
3018         
3019         * ecore.cs (Expression.StoreFromPtr): New utility function to
3020         store values dereferencing.
3021
3022 2002-02-20  Ravi Pratap  <ravi@ximian.com>
3023
3024         * expression.cs (Binary.ResolveOperator): Ensure that we are
3025         not trying to operate on a void type - this fixes the reported
3026         bug.
3027
3028         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
3029         the parent implementation is sealed.
3030
3031         * ../errors/cs0239.cs : Add.
3032
3033         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
3034
3035         * typemanager.cs (unverifiable_code_type): Corresponds to 
3036         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
3037         which have unsafe code in them.
3038
3039         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
3040         unsafe context.
3041
3042 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
3043
3044         * cs-tokenizer.cs: Add support for @"litreal strings"
3045
3046         Make tokenizer accept pre-processor directives
3047         on any column (remove the old C-like limitation). 
3048
3049         * rootcontext.cs (EmitCode): Emit any global attributes.
3050         (AddGlobalAttributes): Used to keep track of assembly attributes. 
3051
3052         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
3053
3054         * cs-parser.jay: Add support for global attributes.  
3055
3056 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
3057
3058         * expression.cs (Indirection): New helper class.  Unary will
3059         create Indirection classes to be able to implement the
3060         IMemoryLocation interface on it.
3061
3062 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
3063
3064         * cs-parser.jay (fixed_statement): reference the right statement.
3065
3066         * statement.cs (Fixed.Emit): Finish implementing the fixed
3067         statement for the &x case.
3068
3069 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
3070
3071         * class.cs (Property.Define, Method.Define): Remove newslot when
3072         `implementing'.  
3073
3074         * modifiers.cs: My use of NewSlot when `Abstract' was set was
3075         wrong.  NewSlot should only be used if the `new' keyword is present.
3076
3077         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
3078         locating our system dir.  Sorry about this.
3079
3080 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
3081
3082         * driver.cs (GetSystemDir): Compute correctly the location of our
3083         system assemblies.  I was using the compiler directory instead of
3084         the library directory.
3085
3086 2002-02-13  Ravi Pratap  <ravi@ximian.com>
3087
3088         * expression.cs (BetterFunction): Put back in what Miguel commented out
3089         since it is the correct fix. The problem is elsewhere ;-)
3090
3091         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
3092         parameters of the parms method are themselves compatible or not !
3093
3094         (StandardConversionExists): Fix very dangerous bug where we were forgetting
3095         to check that a class implements an interface before saying that an implicit
3096         conversion was allowed. Use ImplementsInterface to do the checking.
3097
3098 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
3099
3100         * class.cs (Method.Define): Track whether we are an explicit
3101         implementation or not.  And only call DefineMethodOverride if we
3102         are an explicit implementation.
3103
3104         (Property.DefineMethod): Ditto.
3105
3106 2002-02-11  Ravi Pratap  <ravi@ximian.com>
3107
3108         * expression.cs (BetterFunction): Catch hideous bug which was
3109          preventing us from detecting ambiguous calls due to implicit casts i.e
3110         cs0121.
3111
3112 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
3113
3114         * support.cs (Pair): Remove un-needed method.  I figured why I was
3115         getting the error in cs-parser.jay, the variable in a foreach loop
3116         is readonly, and the compiler does not really treat this as a variable.
3117
3118         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
3119         instead of EQUALS in grammar.  
3120
3121         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
3122
3123         * expression.cs (Unary.DoResolve): Check whether the argument is
3124         managed or not.
3125
3126 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
3127
3128         * support.cs: Api for Pair to set a value.  Despite the fact that
3129         the variables are public the MS C# compiler refuses to compile
3130         code that accesses the field if the variable is part of a foreach
3131         statement. 
3132
3133         * statement.cs (Fixed): Begin implementation of the fixed
3134         statement.
3135
3136         (Block.AddVariable): Return the VariableInfo on success and null
3137         on failure instead of true/false. 
3138
3139         * cs-parser.jay (foreach): Catch errors on variables already
3140         defined (we were ignoring this value before) and properly unwind
3141         the block hierarchy
3142
3143         (fixed_statement): grammar for the fixed statement.
3144
3145 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
3146
3147         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
3148         pointer types to be incretemented.
3149
3150         (SizeOf): Implement.
3151
3152         * cs-parser.jay (pointer_member_access): Implement
3153         expr->IDENTIFIER production.
3154
3155         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
3156         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
3157         on safe contexts.
3158
3159         (Unary): Implement indirection.
3160
3161         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
3162         use in non-unsafe context).
3163
3164         (SimpleName.DoResolve): Check for pointers in field access on safe
3165         contexts. 
3166
3167         (Expression.LoadFromPtr): Factor the load-indirect code in this
3168         function.  This was duplicated in UnboxCast and ParameterReference
3169
3170 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
3171
3172         * expression.cs (ComposedCast): report an error if a pointer cast
3173         is used in a safe region.
3174
3175         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
3176         pointer type casts in unsafe context.
3177
3178         * codegen.cs (EmitContext): Set up IsUnsafe.
3179
3180         * cs-parser.jay (non_expression_type): Add productions for pointer
3181         casts. 
3182
3183         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
3184         code.  We should not use force into static mode if the method is
3185         not virtual.  Fixes bug in MIS
3186
3187         * statement.cs (Do.Emit, While.Emit, For.Emit,
3188         Statement.EmitBoolExpression): Add support to Do and While to
3189         propagate infinite loop as `I do return' semantics.
3190
3191         Improve the For case to also test for boolean constants.
3192
3193         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
3194         to the list of attributes we can add.
3195
3196         Remove `EmitContext' argument.
3197
3198         * class.cs (Method.Define): Apply parameter attributes.
3199         (Constructor.Define): Apply parameter attributes.
3200         (MethodCore.LabelParameters): Move here the core of labeling
3201         parameters. 
3202
3203         * support.cs (ReflectionParameters.ParameterModifier,
3204         InternalParameters.ParameterModifier): Use IsByRef on the type and
3205         only return the OUT bit for these parameters instead of in/out/ref
3206         flags.
3207
3208         This is because I miss-understood things.  The ParameterInfo.IsIn
3209         and IsOut represent whether the parameter has the [In] and [Out]
3210         attributes set.  
3211
3212 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
3213
3214         * ecore.cs (FieldExpr.Emit): Release temporaries.
3215
3216         * assign.cs (LocalTemporary.Release): new function.
3217
3218         * codegen.cs (EmitContext.GetTemporaryStorage,
3219         EmitContext.FreeTemporaryStorage): Rework the way we deal with
3220         temporary storage.  Now we can "put back" localbuilders when we
3221         are done with them
3222
3223 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
3224
3225         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
3226         need to make a copy of the variable to generate verifiable code.
3227
3228 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
3229
3230         * driver.cs: Compute dynamically the system directory.
3231
3232         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
3233         Slower, but more generally useful.  Used by the abstract
3234         registering implementation. 
3235
3236         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
3237         the rules for the special rule on Type/instances.  First check if
3238         we have the same name, and if so, try that special static path
3239         rather than the instance path.
3240         
3241 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
3242
3243         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
3244         for, while and if.
3245
3246         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
3247         Enum, ValueType, Delegate or Array for non-corlib compiles.
3248
3249         * cs-tokenizer.cs: Catch long identifiers (645)
3250
3251         * typemanager.cs (IndexerPropetyName): Ravi never tested this
3252         piece of code.
3253
3254         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
3255         fix, we were returning too early, so we were not registering
3256         pending methods from abstract classes.
3257
3258         Do not register pending methods if the class is abstract.
3259
3260         * expression.cs (Conditional.DoResolve): Report circular implicit
3261         conversions when we neecd to compute it for conditional
3262         expressions. 
3263
3264         (Is.DoResolve): If the expression is always of the provided type,
3265         flag warning 183.  If the expression can not ever be of the
3266         provided type flag warning 184.
3267
3268         * class.cs: Catch 169 as well.
3269
3270         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
3271         read. 
3272
3273 2002-01-18  Nick Drochak  <ndrochak@gol.com>
3274
3275         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
3276
3277 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
3278
3279         * interface.cs: (PopulateMethod): Check for pointers being defined
3280         only if the unsafe context is active.
3281         (PopulateProperty): ditto.
3282         (PopulateIndexer): ditto.
3283
3284         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
3285         specified.  If pointers are present, make sure that they are
3286         present in an unsafe context.
3287         (Constructor, Constructor.Define): ditto.
3288         (Field, Field.Define): ditto.
3289         (Property, Property.Define): ditto.
3290         (Event, Event.Define): ditto.
3291
3292         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
3293         hashtable if there are classes or structs defined.
3294
3295         * expression.cs (LocalVariableReference.DoResolve): Simplify this
3296         code, as the constant resolution moved.
3297
3298         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
3299         the metadata, so we can flag error 133. 
3300
3301         * decl.cs (MemberCore.UnsafeOK): New function to test that a
3302         pointer is being declared in an unsafe context.
3303
3304 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
3305
3306         * modifiers.cs (Modifiers.Check): Require a Location argument.
3307         Report error 227 for Unsafe use.
3308
3309         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
3310
3311         * statement.cs (For.Emit): If the test is null, then report that
3312         we do `return', as we wont reach anything afterwards.
3313
3314         (Switch.SwitchGoverningType): Track the expression that matched
3315         the conversion.
3316
3317         * driver.cs: Allow negative numbers as an error code to flag.
3318
3319         * cs-parser.jay: Handle 1551.
3320
3321         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
3322
3323 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
3324
3325         * cs-parser.jay: Report 1518 (type declaration can only contain
3326         class, struct, interface, enum or delegate)
3327
3328         (switch_label): Report 1523 (keywords `case' or `default' must
3329         preced code)
3330
3331         (opt_switch_sections): Report 1522 (empty switch)
3332
3333         * driver.cs: Report 1515 (response file specified multiple times)
3334         Report 1516 (Source file specified multiple times).
3335
3336         * expression.cs (Argument.Resolve): Signal 1510
3337
3338         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
3339         access not allowed in static code)
3340
3341 2002-01-11  Ravi Pratap  <ravi@ximian.com>
3342
3343         * typemanager.cs (IsPointerType): Utility method which we are going
3344         to need a lot.
3345
3346         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
3347         the object type, so we take care of that.
3348
3349         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
3350         
3351         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
3352         added to non-params parameters :-)
3353
3354         * typemanager.cs (CSharpName): Include 'void' type too. 
3355
3356         (void_ptr_type): Include in the set of core types.
3357
3358         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
3359         duplicating code.
3360
3361         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
3362         an unsafe context.
3363
3364         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
3365         completely forgotten about it.
3366
3367 2002-01-10  Ravi Pratap  <ravi@ximian.com>
3368
3369         * cs-parser.jay (pointer_type): Add. This begins our implementation
3370         of parsing rules for unsafe code.
3371
3372         (unsafe_statement): Implement.
3373
3374         (embedded_statement): Modify to include the above.
3375
3376         * statement.cs (Unsafe): Implement new class for unsafe blocks.
3377
3378         * codegen.cs (EmitContext.InUnsafe): Add. This determines
3379         if the current context is an unsafe one.
3380
3381         * cs-parser.jay (local_variable_pointer_type): Since local variable types
3382         are handled differently, we need separate rules for them.
3383
3384         (local_variable_declaration): Update to use local_variable_pointer_type
3385         to allow variable declarations of unmanaged pointer types.
3386
3387         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
3388         in unsafe contexts.
3389
3390         * ../errors/cs0214.cs : Add.
3391
3392 2002-01-16  Nick Drochak  <ndrochak@gol.com>
3393
3394         * makefile: remove 'response' file when cleaning.
3395
3396 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
3397
3398         * cs-parser.jay: Report 1524.
3399
3400 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
3401
3402         * typemanager.cs (RegisterMethod): drop checking if we have
3403         registered this from here
3404
3405 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
3406
3407         * class.cs (Method.EmitDestructor): Implement calling our base
3408         destructor. 
3409
3410         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
3411         value of InFinally.
3412
3413         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
3414         this routine and will wrap the call in a try/catch block.  Deal
3415         with the case.
3416
3417 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
3418
3419         * ecore.cs (Expression.MemberLookup): instead of taking a
3420         parameter `same_type' that was used to tell whether we could
3421         access private members we compute our containing type from the
3422         EmitContext.
3423
3424         (FieldExpr): Added partial support for volatile fields.  This does
3425         not work for volatile fields exposed from assemblies, as I can not
3426         figure out how to extract the modreq from it.
3427
3428         Updated all the source files to use this.
3429
3430         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
3431         because it is referenced by MemberLookup very often. 
3432
3433 2002-01-09  Ravi Pratap  <ravi@ximian.com>
3434
3435         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
3436         TypeBuilder.GetCustomAttributes to retrieve what we need.
3437
3438         Get rid of redundant default_member_attr_type as this is the same as
3439         default_member_type which already exists.
3440
3441         * interface.cs, attribute.cs : Update accordingly.
3442         
3443 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
3444
3445         * typemanager.cs: Enable IndexerPropertyName again.  It does not
3446         work for TYpeBuilders though.  Ravi, can you please fix this?
3447
3448         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
3449
3450         * expression.cs (Argument.Emit): Handle the case of ref objects
3451         being passed to ref functions;  
3452
3453         (ParameterReference.EmitLoad): Loads the content of the pointer
3454         without dereferencing.
3455
3456 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
3457
3458         * cs-tokenizer.cs: Implemented the pre-processing expressions.
3459
3460 2002-01-08  Ravi Pratap  <ravi@ximian.com>
3461
3462         * class.cs (Indexer.DefineMethod): Incorporate the interface
3463         type in the name of the method if we are doing explicit interface
3464         implementation.
3465
3466         * expression.cs (ConversionExists): Remove as it is completely obsolete.
3467
3468         (BetterConversion): Fix extremely trivial bug where we were referring to
3469         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
3470         again !
3471
3472         * ../errors/bug16.cs : Add although we have fixed it.
3473
3474 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
3475
3476         * expression.cs (BaseIndexer): Begin implementation.
3477
3478         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
3479
3480         * cs-parser.jay (indexer_declarator): Use qualified_identifier
3481         production directly to remove a shift/reduce, and implement
3482         explicit interface implementation.
3483
3484         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
3485         after a floating point suffix.
3486
3487         * expression.cs (DoNumericPromotions): Improved the conversion for
3488         uint/uint.  If we have a constant, we avoid doing a typecast to a
3489         larger type.
3490
3491         * class.cs (Indexer): Implement explicit interface implementation
3492         for indexers.
3493         
3494 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
3495
3496         * class.cs: make the default instance constructor public and hidebysig.
3497
3498 2001-01-03  Ravi Pratap  <ravi@ximian.com>
3499
3500         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
3501         so we can call it from elsewhere.
3502
3503         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
3504         we emit it internally if the class has a defined indexer; otherwise the user
3505         emits it by decorating the class definition with the DefaultMemberAttribute.
3506
3507         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
3508         attribute is not used on a type which defines an indexer.
3509
3510         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
3511         character when we skip whitespace.
3512
3513         * ../errors/cs0646.cs : Add.
3514
3515 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
3516
3517         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
3518         again. 
3519
3520         * makefile: Add practical target `mcs3.exe' which builds the third
3521         generation compiler. 
3522
3523         * expression.cs (New): Fix structures constructor calling.
3524
3525         * class.cs (Property, Method, Indexer): Emit Final flag on the
3526         method if we are an interface implementation and we are not
3527         abstract. 
3528
3529         * ecore.cs (PropertyExpr): New public field `IsBase', tells
3530         whether this property is referencing a `base' method.
3531
3532         * expression.cs (Invocation.EmitCall): take an extra argument:
3533         is_base, this is used to determine whether the `call' or
3534         `callvirt' opcode should be used.
3535
3536         
3537         * delegate.cs: update EmitCall.
3538
3539         * class.cs (Method.Define): Set NewSlot for the cases where we are
3540         not implementing an interface method.
3541
3542         (Property.Define): ditto.
3543
3544 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
3545
3546         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
3547         'r'.  Allows mcs to parse itself fully.
3548
3549 2002-01-02  Ravi Pratap  <ravi@ximian.com>
3550
3551         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
3552         of the number of initializers that require the InitializeArray method.
3553
3554         (CheckIndices): Store the Expression in all cases - not the plain value. Also
3555         update the above field where necessary.
3556
3557         (MakeByteBlob): Update accordingly.
3558
3559         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
3560         greater than 2.
3561
3562         (EmitDynamicInitializers): Update in accordance with the new optimization.
3563
3564         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
3565         same OpCode applies.
3566
3567         * cs-parser.jay : Fix some glaring errors I introduced.
3568
3569 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
3570
3571         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
3572         so that we can check for name clashes there too.
3573
3574         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
3575         for interface indexers.
3576
3577         * interfaces.cs (Define): Emit the default member attribute.
3578
3579         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
3580         variable was being referred to while setting the value ;-)
3581
3582 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
3583
3584         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
3585         byte-by-byte information when we know the data is zero.
3586
3587         Make the block always a multiple of 4, because
3588         DefineInitializedData has a bug.
3589
3590         * assign.cs: Fix, we should assign from the temporary, not from
3591         the source. 
3592
3593         * expression.cs (MakeByteBlob): Fix my incorrect code.
3594
3595 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
3596
3597         * typemanager.cs (EnumToUnderlying): This function is used to get
3598         the underlying type from an enumeration, because it does not
3599         always work. 
3600
3601         * constant.cs: Use the I4_S form for values between -128 and 127.
3602
3603         * statement.cs (Block.LookupLabel): Looks up a label.
3604         (Block): Drop support for labeled blocks.
3605
3606         (LabeledStatement): New kind of statement that represents a label
3607         only.
3608
3609         (Goto): Finally implement this bad boy.
3610         
3611         * cs-parser.jay: Update to reflect new mechanism to implement
3612         labels.
3613
3614 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
3615
3616         * codegen.cs (EmitContext.This): a codegen property that keeps the
3617         a single instance of this instead of creating many different this
3618         instances. 
3619
3620         * delegate.cs (Delegate.DoResolve): Update to use the property;
3621
3622         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
3623
3624         * expression.cs (BaseAccess.DoResolve): Ditto.
3625
3626 2001-12-29  Ravi Pratap  <ravi@ximian.com>
3627
3628         * typemanager.cs (methodimpl_attr_type): Add to hold the type
3629         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
3630
3631         (InitCoreTypes): Update accordingly.
3632
3633         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
3634         so we can quickly store the state.
3635
3636         (ApplyAttributes): Set the correct implementation flags
3637         for InternalCall methods.
3638
3639 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
3640
3641         * expression.cs (EmitCall): if a method is not virtual, then do
3642         not use callvirt on it.
3643
3644         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
3645         user defined stuff) requires the use of stobj, which takes an
3646         address on the stack instead of an array and an index.  So emit
3647         the Ldelema operation for it.
3648
3649         (EmitStoreOpcode): Use stobj for valuetypes.
3650
3651         (UnaryMutator.EmitCode): Use the right 1 value depending on
3652         whether we are dealing with int64/uint64, float or doubles.
3653
3654         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
3655         constructors that I implemented last night.
3656
3657         (Constructor.IsDefault): Fix to work properly for static
3658         constructors.
3659
3660         * cs-parser.jay (CheckDef): report method signature errors.
3661         Update error number 103 to be 132.
3662
3663         * decl.cs: New AdditionResult enumeration value: MethodExists.
3664         Although we do this check for methods later on in the semantic
3665         analysis, catching repeated default constructors is so easy that
3666         we catch these here. 
3667         
3668         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
3669         promotions code.
3670
3671         (ParameterReference.EmitAssign, Emit): handle
3672         bools as bytes.
3673
3674         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
3675         (ArrayAccess.EmitStoreOpcode): ditto.
3676
3677         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
3678
3679         * expression.cs (MakeByteBlob): Complete all the missing types
3680         (uint, short, ushort, byte, sbyte)
3681
3682         * class.cs: Only init instance field initializers on instance
3683         constructors. 
3684
3685         Rename `constructors' to instance_constructors. 
3686
3687         (TypeContainer.AddConstructor): Only add constructors to the list
3688         if it is not static.
3689
3690         Make sure that we handle default_static_constructor independently
3691         everywhere where we handle instance_constructors
3692
3693 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
3694
3695         * class.cs: Do not lookup or create a base initializer for a
3696         static constructor.
3697
3698         (ConstructorInitializer.Resolve): use the proper type to lookup
3699         for constructors.
3700
3701         * cs-parser.jay: Report error 1585 (modifiers between type and name).
3702
3703         * enum.cs, interface.cs: Remove CloseType, this is taken care by
3704         in DeclSpace. 
3705
3706         * decl.cs: CloseType is now an virtual method, the default
3707         implementation just closes this type.
3708         
3709 2001-12-28  Ravi Pratap  <ravi@ximian.com>
3710
3711         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
3712         to PreserveSig by default. Also emit HideBySig on such methods.
3713
3714         Basically, set the defaults to standard values.
3715
3716         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
3717         argument, if candidate is better, it can't be worse than the best !
3718
3719         (Invocation): Re-write bits to differentiate between methods being
3720         applicable in their expanded form and their normal form - for params
3721         methods of course.
3722
3723         Get rid of use_standard everywhere as only standard conversions are allowed
3724         in overload resolution. 
3725
3726         More spec conformance.
3727         
3728 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
3729
3730         * driver.cs: Add --timestamp, to see where the compiler spends
3731         most of its time.
3732
3733         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
3734         `this' in static code.
3735
3736         (SimpleName.DoResolve): Implement in terms of a helper function
3737         that allows static-references to be passed upstream to
3738         MemberAccess.
3739
3740         (Expression.ResolveWithSimpleName): Resolve specially simple
3741         names when called by MemberAccess to implement the special
3742         semantics. 
3743
3744         (Expression.ImplicitReferenceConversion): Handle conversions from
3745         Null to reference types before others, as Null's type is
3746         System.Object. 
3747
3748         * expression.cs (Invocation.EmitCall): Handle the special case of
3749         calling methods declared on a reference type from a ValueType
3750         (Base classes System.Object and System.Enum)
3751
3752         (MemberAccess.Resolve): Only perform lookups on Enumerations if
3753         the left hand side is a TypeExpr, not on every enumeration. 
3754
3755         (Binary.Resolve): If types are reference types, then do a cast to
3756         object on operators != and == of both arguments.
3757         
3758         * typemanager.cs (FindMembers): Extract instance and static
3759         members if requested.
3760
3761         * interface.cs (PopulateProperty): Use void_type instead of null
3762         as the return type for the setter method.
3763
3764         (PopulateIndexer): ditto.
3765
3766 2001-12-27  Ravi Pratap  <ravi@ximian.com>
3767
3768         * support.cs (ReflectionParameters): Fix minor bug where we
3769         were examining the wrong parameter for the ParamArray attribute.
3770
3771         Cope with requests for the type of the parameter at position
3772         greater than the params parameter's. We now return the element
3773         type of the params array as that makes more sense.
3774
3775         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
3776         accordingly as we no longer have to extract the element type
3777         ourselves.
3778
3779         (Invocation.OverloadResolve): Update.
3780
3781 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
3782
3783         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
3784         against IEnumerator, test whether the return value is a descendant
3785         of the IEnumerator interface.
3786
3787         * class.cs (Indexer.Define): Use an auxiliary method to implement
3788         the other bits of the method definition.  Begin support for
3789         explicit interface implementation.
3790
3791         (Property.DefineMethod): Use TypeManager.void_type instead of null
3792         for an empty return value.
3793
3794 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
3795
3796         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
3797         dealing with a FieldExpr which is composed of a FieldBuilder, in
3798         the code path we did extract the constant, but we should have
3799         obtained the underlying value to be able to cast it (otherwise we
3800         end up in an infinite loop, this is what Ravi was running into).
3801
3802         (ArrayCreation.UpdateIndices): Arrays might be empty.
3803
3804         (MemberAccess.ResolveMemberAccess): Add support for section
3805         14.5.4.1 that deals with the special case of E.I when E is a type
3806         and something else, that I can be a reference to a static member.
3807
3808         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
3809         handle a particular array type to create byte blobs, it is just
3810         something we dont generate byteblobs for.
3811
3812         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
3813         arguments. 
3814
3815         * location.cs (Push): remove the key from the hashtable that we
3816         are about to add.   This happens for empty files.
3817
3818         * driver.cs: Dispose files after we have parsed them.
3819
3820         (tokenize): new function that only runs the tokenizer on its
3821         input, for speed testing.
3822
3823 2001-12-26  Ravi Pratap  <ravi@ximian.com>
3824
3825         * class.cs (Event.Define): Define the private field only if there
3826         are no accessors defined.
3827
3828         * expression.cs (ResolveMemberAccess): If there is no associated
3829         field with the event, that means we have an event defined with its
3830         own accessors and we should flag error cs0070 since transforming
3831         ourselves into a field is not valid in that case.
3832
3833         * ecore.cs (SimpleName.DoResolve): Same as above.
3834
3835         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
3836         and charset to sane values.
3837
3838 2001-12-25  Ravi Pratap  <ravi@ximian.com>
3839
3840         * assign.cs (DoResolve): Perform check on events only if they 
3841         are being accessed outside the declaring type.
3842
3843         * cs-parser.jay (event_declarations): Update rules to correctly
3844         set the type of the implicit parameter etc.
3845
3846         (add_accessor, remove_accessor): Set current local parameters.
3847
3848         * expression.cs (Binary): For delegate addition and subtraction,
3849         cast the return value from the method into the appropriate delegate
3850         type.
3851
3852 2001-12-24  Ravi Pratap  <ravi@ximian.com>
3853
3854         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
3855         of these as the workaround is unnecessary.
3856
3857         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
3858         delegate data - none of that is needed at all.
3859
3860         Re-write bits to extract the instance expression and the delegate method
3861         correctly.
3862
3863         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
3864         on delegates too.
3865
3866         * attribute.cs (ApplyAttributes): New method to take care of common tasks
3867         of attaching attributes instead of duplicating code everywhere.
3868
3869         * everywhere : Update code to do attribute emission using the above method.
3870
3871 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
3872
3873         * expression.cs (IsParamsMethodApplicable): if there are not
3874         parameters, return immediately.
3875
3876         * ecore.cs: The 0 literal can be implicity converted to an enum
3877         type. 
3878
3879         (SimpleName.DoResolve): First lookup the type, then lookup the
3880         members. 
3881
3882         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
3883         want to get its address.  If the InstanceExpression is not
3884         addressable, store the result in a temporary variable, then get
3885         the address of it.
3886
3887         * codegen.cs: Only display 219 errors on warning level or above. 
3888
3889         * expression.cs (ArrayAccess): Make it implement the
3890         IMemoryLocation interface.
3891
3892         (Binary.DoResolve): handle the operator == (object a, object b)
3893         and operator != (object a, object b) without incurring into a
3894         BoxedCast (because 5 != o should never be performed).
3895
3896         Handle binary enumerator operators.
3897
3898         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
3899         value type, otherwise use Ldelem_ref.
3900
3901         Use precomputed names;
3902
3903         (AddressOf): Implement address of
3904
3905         * cs-parser.jay (labeled_statement): Fix recursive block
3906         addition by reworking the production.
3907
3908         * expression.cs (New.DoEmit): New has a special case:
3909                 
3910                  If we are dealing with a ValueType, we have a few
3911                  situations to deal with:
3912                 
3913                     * The target of New is a ValueType variable, that is
3914                       easy, we just pass this as the variable reference
3915                 
3916                     * The target of New is being passed as an argument,
3917                       to a boxing operation or a function that takes a
3918                       ValueType.
3919                 
3920                       In this case, we need to create a temporary variable
3921                       that is the argument of New.
3922
3923
3924 2001-12-23  Ravi Pratap  <ravi@ximian.com>
3925
3926         * rootcontext.cs (LookupType): Check that current_type is not null before
3927         going about looking at nested types.
3928
3929         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
3930         not implement the IAssignMethod interface any more.
3931
3932         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
3933         where we tranform them into FieldExprs if they are being resolved from within
3934         the declaring type.
3935
3936         * ecore.cs (SimpleName.DoResolve): Do the same here.
3937
3938         * assign.cs (DoResolve, Emit): Clean up code considerably. 
3939
3940         * ../errors/bug10.cs : Add.
3941
3942         * ../errors/cs0070.cs : Add.
3943
3944         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
3945
3946         * assign.cs : Get rid of EventIsLocal everywhere.
3947         
3948 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
3949
3950         * ecore.cs (ConvertIntLiteral): finished the implementation.
3951
3952         * statement.cs (SwitchLabel): Convert the value we are using as a
3953         key before looking up the table.
3954
3955 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
3956
3957         * codegen.cs (EmitTopBlock): Require a Location argument now.
3958
3959         * cs-parser.jay (constructor_declarator): We need to setup
3960         current_local_parameters before we parse the
3961         opt_constructor_initializer, to allow the variables to be bound
3962         to the constructor arguments.
3963
3964         * rootcontext.cs (LookupType): First lookup nested classes in our
3965         class and our parents before we go looking outside our class.
3966
3967         * expression.cs (ConstantFold): Extract/debox the values at the
3968         beginnning. 
3969
3970         * rootcontext.cs (EmitCode): Resolve the constants first before we
3971         resolve the types.  This is not really needed, but it helps debugging.
3972
3973         * statement.cs: report location.
3974         
3975         * cs-parser.jay: pass location to throw statement.
3976
3977         * driver.cs: Small bug fix.
3978
3979         * report.cs: Updated format to be 4-zero filled digits.
3980
3981 2001-12-22  Ravi Pratap  <ravi@ximian.com>
3982
3983         * expression.cs (CheckIndices): Fix minor bug where the wrong
3984         variable was being referred to ;-)
3985
3986         (DoEmit): Do not call EmitStaticInitializers when the 
3987         underlying type is System.Object.
3988
3989 2001-12-21  Ravi Pratap  <ravi@ximian.com>
3990
3991         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
3992         and do the usual workaround for SRE.
3993
3994         * class.cs (MyEventBuilder.EventType): New member to get at the type
3995         of the event, quickly.
3996
3997         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
3998
3999         * assign.cs (Assign.DoResolve): Handle the case when the target
4000         is an EventExpr and perform the necessary checks.
4001
4002         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
4003         interface.
4004
4005         (SimpleName.MemberStaticCheck): Include check for EventExpr.
4006
4007         (EventExpr): Set the type in the constructor itself since we 
4008         are meant to be born fully resolved.
4009
4010         (EventExpr.Define): Revert code I wrote earlier.
4011                 
4012         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
4013         instance expression is null. The instance expression is a This in that case
4014         or a null, depending on whether it is a static method or not.
4015
4016         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
4017         refers to more than one method.
4018
4019         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
4020         and accordingly flag errors.
4021
4022 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
4023
4024         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
4025
4026 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
4027
4028         * location.cs (ToString): Provide useful rutine.
4029
4030 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
4031
4032         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
4033         objects, return the actual integral boxed.
4034
4035         * statement.cs (SwitchLabel): define an ILLabel for each
4036         SwitchLabel. 
4037         
4038         (Switch.CheckSwitch): If the value is a Literal, extract
4039         the underlying literal.
4040         
4041         Also in the unused hashtable we had, add the SwitchLabel so we can
4042         quickly look this value up.
4043
4044         * constant.cs: Implement a bunch of new constants.  Rewrite
4045         Literal based on this.  Made changes everywhere to adapt to this.
4046         
4047         * expression.cs (Expression.MakeByteBlob): Optimize routine by
4048         dereferencing array only once, and also copes with enumrations.
4049
4050         bytes are two bytes wide, not one.
4051
4052         (Cast): Perform constant conversions.
4053         
4054         * ecore.cs (TryImplicitIntConversion): Return literals instead of
4055         wrappers to the literals here.
4056
4057         * expression.cs (DoNumericPromotions): long literals can converted
4058         to ulong implicity (this is taken care of elsewhere, but I was
4059         missing this spot).
4060
4061         * ecore.cs (Expression.Literalize): Make the return type Literal,
4062         to improve type checking.
4063
4064         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
4065
4066 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
4067
4068         * literal.cs: Revert code from ravi that checked the bounds.  The
4069         bounds are sane by the definition of the type itself. 
4070
4071         * typemanager.cs: Fix implementation of ImplementsInterface.  We
4072         need to actually look up in our parent hierarchy for interfaces
4073         implemented. 
4074
4075         * const.cs: Use the underlying type for enumerations
4076
4077         * delegate.cs: Compute the basename for the delegate creation,
4078         that should fix the delegate test case, and restore the correct
4079         Type Lookup semantics in rootcontext
4080
4081         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
4082         referencing a nested type with the Reflection API is using the "+"
4083         sign. 
4084
4085         * cs-parser.jay: Do not require EOF token at the end.
4086
4087 2001-12-20  Ravi Pratap  <ravi@ximian.com>
4088
4089         * rootcontext.cs (LookupType): Concatenate type names with
4090         a '.' instead of a '+' The test suite passes again.
4091
4092         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
4093         field of the enumeration.
4094
4095         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
4096         the case when the member is an EventExpr.
4097
4098         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
4099         static has an associated instance expression.
4100
4101         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
4102
4103         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
4104
4105         * class.cs (Event.Define): Register event and perform appropriate checks
4106         for error #111.
4107
4108         We define the Add and Remove methods even if the use provides none because
4109         in that case, we provide default implementations ourselves.
4110
4111         Define a private field of the type of the event. This is done by the CSC compiler
4112         and we should be doing it too ;-)
4113
4114         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
4115         More methods we use in code we generate.
4116
4117         (multicast_delegate_type, delegate_type): Two separate types since the distinction
4118         is important.
4119
4120         (InitCoreTypes): Update accordingly for the above.
4121
4122         * class.cs (Event.Emit): Generate code for default accessors that we provide
4123
4124         (EmitDefaultMethod): Do the job in the above.
4125
4126         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
4127         appropriate place.
4128
4129 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
4130
4131         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
4132         builders even if we were missing one.
4133
4134         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
4135         pass the Basename as our class name instead of the Name.  The
4136         basename will be correctly composed for us.
4137
4138         * parameter.cs (Paramters): Now takes a Location argument.
4139
4140         * decl.cs (DeclSpace.LookupType): Removed convenience function and
4141         make all the code call directly LookupType in RootContext and take
4142         this chance to pass the Location information everywhere.
4143
4144         * Everywhere: pass Location information.
4145
4146 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
4147
4148         * class.cs (Constructor.Define): Updated way of detecting the
4149         length of the parameters.
4150
4151         (TypeContainer.DefineType): Use basename as the type name for
4152         nested types.
4153
4154         (TypeContainer.Define): Do not recursively define types here, as
4155         definition is taken care in order by the RootContext.
4156
4157         * tree.cs: Keep track of namespaces in a per-file basis.
4158
4159         * parameter.cs (Parameter.ComputeSignature): Update to use
4160         DeclSpace. 
4161
4162         (Parameters.GetSignature): ditto.
4163
4164         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
4165         instead of a TypeContainer.
4166
4167         (Interface.SemanticAnalysis): Use `this' instead of our parent to
4168         resolve names.  Because we need to be resolve in our context, not
4169         our parents.
4170         
4171         * driver.cs: Implement response files.
4172
4173         * class.cs (TypeContainer.DefineType): If we are defined, do not
4174         redefine ourselves.
4175         
4176         (Event.Emit): Emit the code for add/remove handlers.
4177         (Event.Define): Save the MethodBuilders for add/remove.
4178
4179         * typemanager.cs: Use pair here too.
4180
4181         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
4182         DictionaryEntry requires the first argument to be non-null.  
4183         
4184         (enum_declaration): Compute full name for registering the
4185         enumeration.
4186         
4187         (delegate_declaration): Instead of using
4188         formal_parameter_list, use opt_formal_parameter_list as the list
4189         can be empty.
4190
4191         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
4192         (EventParsing): New property that controls whether `add' and
4193         `remove' are returned as tokens or identifiers (for events);
4194
4195 2001-12-19  Ravi Pratap  <ravi@ximian.com>
4196
4197         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
4198         use MyEventBuilder only and let it wrap the real builder for us.
4199
4200         (MyEventBuilder): Revamp constructor etc.
4201
4202         Implement all operations that we perform on EventBuilder in precisely the same
4203         way here too.
4204
4205         (FindMembers): Update to use the EventBuilder member.
4206
4207         (Event.Emit): Update accordingly.
4208
4209 2001-12-18  Ravi Pratap  <ravi@ximian.com>
4210
4211         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
4212         by calling the appropriate methods.
4213
4214         (GetCustomAttributes): Make stubs as they cannot possibly do anything
4215         useful.
4216
4217         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
4218
4219 2001-12-17  Ravi Pratap  <ravi@ximian.com>
4220
4221         * delegate.cs (Delegate.Populate): Check that the return type
4222         and various parameters types are indeed accessible.
4223
4224         * class.cs (Constructor.Define): Same here.
4225
4226         (Field.Define): Ditto.
4227
4228         (Event.Define): Ditto.
4229
4230         (Operator.Define): Check that the underlying Method defined itself
4231         correctly - so it's MethodBuilder should not be null.
4232
4233         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
4234         expression happens to be null.
4235
4236         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
4237         members but as of now we don't seem to be able to do anything really useful with it.
4238
4239         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
4240         not the EventBuilder.
4241
4242 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
4243
4244         * cs-tokenizer.cs: Add support for defines.
4245         Add support for #if, #elif, #else, #endif
4246         
4247         (eval_var): evaluates a variable.
4248         (eval): stubbed for evaluating functions.
4249
4250         * cs-parser.jay: Pass the defines information
4251
4252         * driver.cs: Add --define command line option.
4253
4254         * decl.cs: Move MemberCore here.
4255
4256         Make it the base class for DeclSpace.  This allows us to catch and
4257         report 108 and 109 for everything now.
4258
4259         * class.cs (TypeContainer.Define): Extract all the members
4260         before populating and emit the warning 108 (new keyword required
4261         to override) instead of having each member implement this.
4262
4263         (MemberCore.Define): New abstract method, we will be using this in
4264         the warning reporting engine in Populate.
4265         
4266         (Operator.Define): Adjust to new MemberCore protocol. 
4267
4268         * const.cs (Const): This does not derive from Expression, it is a
4269         temporary object we use to create fields, it is a MemberCore. 
4270
4271         * class.cs (Method.Define): Allow the entry point to be in a
4272         specific class.
4273
4274         * driver.cs: Rewrite the argument handler to clean it up a bit.
4275
4276         * rootcontext.cs: Made it just an auxiliary namespace feature by
4277         making everything static.
4278
4279         * driver.cs: Adapt code to use RootContext type name instead of
4280         instance variable.
4281
4282         * delegate.cs: Remove RootContext argument.
4283
4284         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
4285         argument. 
4286
4287         * class.cs (Event.Define): The lookup can fail.
4288         
4289         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
4290
4291         * expression.cs: Resolve the this instance before invoking the code.
4292
4293 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
4294
4295         * cs-parser.jay: Add a production in element_access that allows
4296         the thing to become a "type" reference.  This way we can parse
4297         things like "(string [])" as a type.
4298
4299         Note that this still does not handle the more complex rules of
4300         casts. 
4301         
4302
4303         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
4304
4305         * ecore.cs: (CopyNewMethods): new utility function used to
4306         assemble the list of methods from running FindMembers.
4307
4308         (MemberLookup): Rework FindMembers so that 
4309
4310 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
4311
4312         * class.cs (TypeContainer): Remove Delegates who fail to be
4313         defined.
4314
4315         * delegate.cs (Populate): Verify that we dont get null return
4316         values.   TODO: Check for AsAccessible.
4317
4318         * cs-parser.jay: Use basename to emit error 574 (destructor should
4319         have the same name as container class), not the full name.
4320
4321         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
4322         possible representation.  
4323
4324         Also implements integer type suffixes U and L.
4325
4326 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
4327
4328         * expression.cs (ArrayCreation.DoResolve): We need to do the
4329         argument resolution *always*.
4330
4331         * decl.cs: Make this hold the namespace.  Hold the root context as
4332         well.
4333         (LookupType): Move here.
4334
4335         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
4336
4337         * location.cs (Row, Name): Fixed the code, it was always returning
4338         references to the first file.
4339
4340         * interface.cs: Register properties defined through interfaces.
4341
4342         * driver.cs: Add support for globbing on the command line
4343
4344         * class.cs (Field): Make it derive from MemberCore as well.
4345         (Event): ditto.
4346
4347 2001-12-15  Ravi Pratap  <ravi@ximian.com>
4348
4349         * class.cs (Event::Define): Check that the type of the event is a delegate
4350         type else flag error #66.
4351
4352         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
4353         same.
4354
4355         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
4356         values of EntryPoint, CharSet etc etc.
4357
4358         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
4359
4360         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
4361         be null and we should ignore this. I am not sure if this is really clean. Apparently,
4362         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
4363         which needs this to do its work.
4364
4365         * ../errors/cs0066.cs : Add.
4366
4367 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
4368
4369         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
4370         helper functions.
4371
4372         * class.cs: (MethodSignature.MethodSignature): Removed hack that
4373         clears out the parameters field.
4374         (MemberSignatureCompare): Cleanup
4375
4376         (MemberCore): New base class used to share code between MethodCore
4377         and Property.
4378
4379         (RegisterRequiredImplementations) BindingFlags.Public requires
4380         either BindingFlags.Instace or Static.  Use instance here.
4381
4382         (Property): Refactored code to cope better with the full spec.
4383
4384         * parameter.cs (GetParameterInfo): Return an empty array instead
4385         of null on error.
4386
4387         * class.cs (Property): Abstract or extern properties have no bodies.
4388
4389         * parameter.cs (GetParameterInfo): return a zero-sized array.
4390
4391         * class.cs (TypeContainer.MethodModifiersValid): Move all the
4392         method modifier validation to the typecontainer so we can reuse
4393         this on properties.
4394
4395         (MethodCore.ParameterTypes): return an empty sized array of types.
4396
4397         (Property.Define): Test property modifier validity.
4398
4399         Add tests for sealed/override too.
4400
4401         (Method.Emit): abstract or extern methods have no bodies.
4402
4403 2001-12-14  Ravi Pratap  <ravi@ximian.com>
4404
4405         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
4406         thing.
4407
4408         (Method::Define, ::Emit): Modify accordingly.
4409
4410         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
4411
4412         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
4413
4414         * makefile: Pass in /unsafe.
4415
4416 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
4417
4418         * class.cs (MakeKey): Kill routine.
4419         
4420         * class.cs (TypeContainer.Define): Correctly define explicit
4421         method implementations (they require the full interface name plus
4422         the method name).
4423
4424         * typemanager.cs: Deply the PtrHashtable here and stop using the
4425         lame keys.  Things work so much better.
4426
4427         This of course broke everyone who depended on `RegisterMethod' to
4428         do the `test for existance' test.  This has to be done elsewhere.
4429
4430         * support.cs (PtrHashtable): A hashtable that avoid comparing with
4431         the object stupid Equals method (because, that like fails all over
4432         the place).  We still do not use it.
4433
4434         * class.cs (TypeContainer.SetRequiredInterface,
4435         TypeContainer.RequireMethods): Killed these two routines and moved
4436         all the functionality to RegisterRequiredImplementations.
4437
4438         (TypeContainer.RegisterRequiredImplementations): This routine now
4439         registers all the implementations required in an array for the
4440         interfaces and abstract methods.  We use an array of structures
4441         which can be computed ahead of time to reduce memory usage and we
4442         also assume that lookups are cheap as most classes will not
4443         implement too many interfaces.
4444
4445         We also avoid creating too many MethodSignatures.
4446
4447         (TypeContainer.IsInterfaceMethod): Update and optionally does not
4448         clear the "pending" bit if we find that there are problems with
4449         the declaration.
4450
4451         (TypeContainer.VerifyPendingMethods): Update to report errors of
4452         methods that look like implementations but are not.
4453
4454         (TypeContainer.Define): Add support for explicit interface method
4455         implementation. 
4456         
4457 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
4458
4459         * typemanager.cs: Keep track of the parameters here instead of
4460         being a feature of the TypeContainer.
4461
4462         * class.cs: Drop the registration of parameters here, as
4463         InterfaceMethods are also interface declarations.
4464
4465         * delegate.cs: Register methods with the TypeManager not only with
4466         the TypeContainer.  This code was buggy.
4467
4468         * interface.cs: Full registation here.
4469
4470 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
4471
4472         * expression.cs: Remove reducer for binary expressions, it can not
4473         be done this way.
4474
4475         * const.cs: Put here the code that used to go into constant.cs
4476
4477         * constant.cs: Put here the code for constants, this is a new base
4478         class for Literals.
4479
4480         * literal.cs: Make Literal derive from Constant.
4481
4482 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
4483
4484         * statement.cs (Return.Emit): Report error 157 if the user
4485         attempts to return from a finally block.
4486
4487         (Return.Emit): Instead of emitting a return, jump to the end of
4488         the function.
4489
4490         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
4491         LocalBuilder to store the result of the function.  ReturnLabel is
4492         the target where we jump.
4493         
4494
4495 2001-12-09  Radek Doulik  <rodo@ximian.com>
4496
4497         * cs-parser.jay: remember alias in current namespace
4498
4499         * ecore.cs (SimpleName::DoResolve): use aliases for types or
4500         namespaces
4501
4502         * class.cs (LookupAlias): lookup alias in my_namespace
4503
4504         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
4505         aliases hashtable
4506         (LookupAlias): lookup alias in this and if needed in parent
4507         namespaces
4508
4509 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
4510
4511         * support.cs: 
4512
4513         * rootcontext.cs: (ModuleBuilder) Made static, first step into
4514         making things static.  I need this to avoid passing the
4515         TypeContainer when calling ParameterType.
4516
4517         * support.cs (InternalParameters.ParameterType): Remove ugly hack
4518         that did string manipulation to compute the type and then call
4519         GetType.  Use Parameter.ParameterType instead.
4520
4521         * cs-tokenizer.cs: Consume the suffix for floating values.
4522
4523         * expression.cs (ParameterReference): figure out whether this is a
4524         reference parameter or not.  Kill an extra variable by computing
4525         the arg_idx during emission.
4526
4527         * parameter.cs (Parameters.GetParameterInfo): New overloaded
4528         function that returns whether a parameter is an out/ref value or not.
4529
4530         (Parameter.ParameterType): The type of the parameter (base,
4531         without ref/out applied).
4532         
4533         (Parameter.Resolve): Perform resolution here.
4534         (Parameter.ExternalType): The full type (with ref/out applied).
4535
4536         * statement.cs (Using.Emit, Using.EmitExpression): Implement
4537         support for expressions on the using statement.
4538
4539 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
4540
4541         * statement.cs (Using.EmitLocalVariableDecls): Split the
4542         localvariable handling of the using statement.
4543
4544         (Block.EmitMeta): Keep track of variable count across blocks.  We
4545         were reusing slots on separate branches of blocks.
4546
4547         (Try.Emit): Emit the general code block, we were not emitting it. 
4548
4549         Check the type of the declaration to be an IDisposable or
4550         something that can be implicity converted to it. 
4551
4552         Emit conversions if required.
4553
4554         * ecore.cs (EmptyExpression): New utility class.
4555         (Expression.ImplicitConversionExists): New utility function.
4556
4557 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
4558
4559         * statement.cs (Using): Implement.
4560
4561         * expression.cs (LocalVariableReference): Support read only variables.
4562
4563         * statement.cs: Remove the explicit emit for the Leave opcode.
4564         (VariableInfo): Add a readonly field.
4565
4566 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
4567
4568         * ecore.cs (ConvCast): new class used to encapsulate the various
4569         explicit integer conversions that works in both checked and
4570         unchecked contexts.
4571
4572         (Expression.ConvertNumericExplicit): Use new ConvCast class to
4573         properly generate the overflow opcodes.
4574
4575 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
4576
4577         * statement.cs: The correct type for the EmptyExpression is the
4578         element_type, not the variable type.  Ravi pointed this out.
4579
4580 2001-12-04  Ravi Pratap  <ravi@ximian.com>
4581
4582         * class.cs (Method::Define): Handle PInvoke methods specially
4583         by using DefinePInvokeMethod instead of the usual one.
4584
4585         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
4586         above to do the task of extracting information and defining the method.
4587         
4588 2001-12-04  Ravi Pratap  <ravi@ximian.com>
4589
4590         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
4591         of the condition for string type.
4592
4593         (Emit): Move that here. 
4594
4595         (ArrayCreation::CheckIndices): Keep string literals in their expression
4596         form.
4597
4598         (EmitDynamicInitializers): Handle strings appropriately.
4599
4600 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
4601
4602         * codegen.cs (EmitContext): Replace multiple variables with a
4603         single pointer to the current Switch statement.
4604
4605         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
4606         EmitContext.
4607
4608 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
4609
4610         * statement.cs 
4611
4612         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
4613         default'.
4614         
4615         (Foreach.Emit): Foreach on arrays was not setting
4616         up the loop variables (for break/continue).
4617
4618         (GotoCase): Semi-implented.
4619         
4620 2001-12-03  Ravi Pratap  <ravi@ximian.com>
4621
4622         * attribute.cs (CheckAttribute): Handle system attributes by using
4623         Attribute.GetAttributes to examine information we need.
4624
4625         (GetValidPlaces): Same here.
4626
4627         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
4628
4629         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
4630
4631         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
4632
4633         (Method::Define): Set appropriate flags if we have a DllImport attribute.
4634
4635         (Method::Emit): Handle the case when we are a PInvoke method.
4636
4637 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
4638
4639         * expression.cs: Use ResolveWithSimpleName on compound names.
4640
4641 2001-12-02  Ravi Pratap  <ravi@ximian.com>
4642
4643         * constant.cs (EmitConstant): Make sure we resolve the associated expression
4644         before trying to reduce it.
4645
4646         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
4647
4648         * constant.cs (LookupConstantValue): Implement.
4649
4650         (EmitConstant): Use the above in emitting the constant.
4651
4652         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
4653         that are user-defined by doing a LookupConstantValue on them.
4654
4655         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
4656         too, like above.
4657
4658 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
4659
4660         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
4661
4662         (BaseAccess.DoResolve): Implement.
4663
4664         (MemberAccess.DoResolve): Split this routine into a
4665         ResolveMemberAccess routine that can be used independently
4666
4667 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
4668
4669         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
4670         As that share bits of the implementation.  Is returns a boolean,
4671         while As returns the Type that is being probed.
4672
4673 2001-12-01  Ravi Pratap  <ravi@ximian.com>
4674
4675         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
4676         instead of a Literal - much easier.
4677
4678         (EnumInTransit): Remove - utterly useless :-)
4679
4680         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
4681
4682         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
4683
4684         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
4685         chain when we have no associated expression.
4686
4687 2001-11-30  Ravi Pratap  <ravi@ximian.com>
4688
4689         * constant.cs (Define): Use Location while reporting the errror.
4690
4691         Also emit a warning when 'new' is used and there is no inherited
4692         member to hide.
4693
4694         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
4695         populated.
4696
4697         (LookupEnumValue): Implement to lookup an enum member's value and define it
4698         if necessary.
4699
4700         (Populate): Re-write accordingly to use the above routine.
4701
4702 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
4703
4704         * expression.cs (This): Fix prototype for DoResolveLValue to
4705         override the base class DoResolveLValue.
4706
4707         * cs-parser.cs: Report errors cs574 and cs575 (destructor
4708         declarations) 
4709
4710         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
4711         (we need to load the address of the field here).  This fixes
4712         test-22. 
4713         
4714         (FieldExpr.DoResolveLValue): Call the DoResolve
4715         function to initialize the Instance expression.
4716         
4717         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
4718         correctly the GetEnumerator operation on a value type.
4719
4720         * cs-parser.jay: Add more simple parsing error catches.
4721
4722         * statement.cs (Switch): Add support for string switches.
4723         Handle null specially.
4724
4725         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
4726
4727 2001-11-28  Ravi Pratap  <ravi@ximian.com>
4728
4729         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
4730
4731         (declare_local_constant): New helper function.
4732
4733         * statement.cs (AddConstant): Keep a separate record of constants
4734
4735         (IsConstant): Implement to determine if a variable is a constant.
4736
4737         (GetConstantExpression): Implement.
4738
4739         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
4740
4741         * statement.cs (IsVariableDefined): Re-write.
4742
4743 2001-11-27  Ravi Pratap  <ravi@ximian.com>
4744
4745         * class.cs (TypeContainer::FindMembers): Look for constants
4746         in the case when we are looking for MemberTypes.Field
4747
4748         * expression.cs (MemberAccess::DoResolve): Check that in the
4749         case we are a FieldExpr and a Literal, we are not being accessed
4750         by an instance reference.
4751
4752         * cs-parser.jay (local_constant_declaration): Implement.
4753
4754         (declaration_statement): Implement for constant declarations.
4755
4756 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
4757
4758         * statement.cs (Switch): Catch double defaults.
4759
4760         (Switch): More work on the switch() statement
4761         implementation.  It works for integral values now, need to finish
4762         string support.
4763
4764
4765 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
4766
4767         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
4768         integer literals into other integer literals.  To be used by
4769         switch. 
4770
4771 2001-11-24  Ravi Pratap  <ravi@ximian.com>
4772
4773         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
4774         some memory.
4775
4776         (EmitDynamicInitializers): Cope with the above since we extract data
4777         directly from ArrayData now.
4778
4779         (ExpectInitializers): Keep track of whether initializers are mandatory
4780         or not.
4781
4782         (Bounds): Make it a hashtable to prevent the same dimension being 
4783         recorded for every element in that dimension.
4784
4785         (EmitDynamicInitializers): Fix bug which prevented the Set array method
4786         from being found.
4787
4788         Also fix bug which was causing the indices to be emitted in the reverse
4789         order.
4790
4791 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
4792
4793         * expression.cs (ArrayCreation): Implement the bits that Ravi left
4794         unfinished.  They do not work, because the underlying code is
4795         sloppy.
4796
4797 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
4798
4799         * cs-parser.jay: Remove bogus fixme.
4800
4801         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
4802         on Switch statement.
4803         
4804 2001-11-23  Ravi Pratap  <ravi@ximian.com>
4805
4806         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
4807         the same. 
4808         
4809         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
4810         parameter. Apparently, any expression is allowed. 
4811
4812         (ValidateInitializers): Update accordingly.
4813
4814         (CheckIndices): Fix some tricky bugs thanks to recursion.
4815
4816         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
4817         I was being completely brain-dead.
4818
4819         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
4820         and re-write acordingly.
4821
4822         (DelegateInvocation): Re-write accordingly.
4823
4824         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
4825
4826         (MakeByteBlob): Handle types more correctly.
4827
4828         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
4829         initialization from expressions but it is incomplete because I am a complete
4830         Dodo :-|
4831
4832 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
4833
4834         * statement.cs (If.Emit): Fix a bug that generated incorrect code
4835         on If.  Basically, we have to return `true' (ie, we do return to
4836         our caller) only if both branches of the if return.
4837
4838         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
4839         short-circuit operators, handle them as short circuit operators. 
4840
4841         (Cast.DoResolve): Resolve type.
4842         (Cast.Cast): Take an expression as the target type.
4843
4844         * cs-parser.jay (cast_expression): Remove old hack that only
4845         allowed a limited set of types to be handled.  Now we take a
4846         unary_expression and we resolve to a type during semantic
4847         analysis.
4848
4849         Use the grammar productions from Rhys to handle casts (this is
4850         not complete like Rhys syntax yet, we fail to handle that corner
4851         case that C# has regarding (-x), but we will get there.
4852         
4853 2001-11-22  Ravi Pratap  <ravi@ximian.com>
4854
4855         * class.cs (EmitFieldInitializer): Take care of the case when we have a
4856         field which is an array type.
4857
4858         * cs-parser.jay (declare_local_variables): Support array initialization too.
4859
4860         * typemanager.cs (MakeKey): Implement.
4861
4862         (everywhere): Use the above appropriately.
4863
4864         * cs-parser.jay (for_statement): Update for array initialization while
4865         declaring variables.
4866
4867         * ecore.cs : The error message was correct, it's the variable's names that
4868         were misleading ;-) Make the code more readable.
4869
4870         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
4871         the correct type etc.
4872
4873         (ConvertExplicit): Handle Enum types by examining the underlying type.
4874
4875 2001-11-21  Ravi Pratap  <ravi@ximian.com>
4876
4877         * parameter.cs (GetCallingConvention): Always return
4878         CallingConventions.Standard for now.
4879
4880 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
4881
4882         * expression.cs (Binary.ResolveOperator): Update the values of `l'
4883         and `r' after calling DoNumericPromotions.
4884
4885         * ecore.cs: Fix error message (the types were in the wrong order).
4886
4887         * statement.cs (Foreach.ProbeCollectionType): Need to pass
4888         BindingFlags.Instance as well 
4889
4890         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
4891         implicit int literal conversion in an empty cast so that we
4892         propagate the right type upstream.
4893
4894         (UnboxCast): new class used to unbox value types.
4895         (Expression.ConvertExplicit): Add explicit type conversions done
4896         by unboxing.
4897
4898         (Expression.ImplicitNumericConversion): Oops, forgot to test for
4899         the target type before applying the implicit LongLiterals to ULong
4900         literal cast.
4901
4902 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
4903
4904         * cs-parser.jay (for_statement): Reworked the way For works: now
4905         we declare manually any variables that are introduced in
4906         for_initializer to solve the problem of having out-of-band code
4907         emition (that is what got for broken).
4908
4909         (declaration_statement): Perform the actual variable declaration
4910         that used to be done in local_variable_declaration here.
4911
4912         (local_variable_declaration): Do not declare anything, just pass
4913         the information on a DictionaryEntry
4914
4915 2001-11-20  Ravi Pratap  <ravi@ximian.com>
4916
4917         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
4918         re-write of the logic to now make it recursive.
4919
4920         (UpdateIndices): Re-write accordingly.
4921
4922         Store element data in a separate ArrayData list in the above methods.
4923
4924         (MakeByteBlob): Implement to dump the array data into a byte array.
4925
4926 2001-11-19  Ravi Pratap  <ravi@ximian.com>
4927
4928         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
4929         into CheckIndices.
4930
4931         * constant.cs (Define): Implement.
4932
4933         (EmitConstant): Re-write fully.
4934
4935         Pass in location info.
4936
4937         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
4938         respectively.
4939
4940         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
4941         DictionaryEntry since we need location info too.
4942
4943         (constant_declaration): Update accordingly.
4944
4945         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
4946         code into another method : UpdateIndices.
4947
4948 2001-11-18  Ravi Pratap  <ravi@ximian.com>
4949
4950         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
4951         some type checking etc.
4952
4953 2001-11-17  Ravi Pratap  <ravi@ximian.com>
4954
4955         * expression.cs (ArrayCreation::ValidateInitializers): Implement
4956         bits to provide dimension info if the user skips doing that.
4957
4958         Update second constructor to store the rank correctly.
4959
4960 2001-11-16  Ravi Pratap  <ravi@ximian.com>
4961
4962         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
4963         and try to implement.
4964
4965         * ../errors/cs0150.cs : Add.
4966
4967         * ../errors/cs0178.cs : Add.
4968
4969 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
4970
4971         * statement.cs: Implement foreach on multi-dimensional arrays. 
4972
4973         * parameter.cs (Parameters.GetParameterByName): Also lookup the
4974         name of the params argument.
4975
4976         * expression.cs: Use EmitStoreOpcode to get the right opcode while
4977         initializing the array.
4978
4979         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
4980         we can use this elsewhere.
4981
4982         * statement.cs: Finish implementation of foreach for single
4983         dimension arrays.
4984
4985         * cs-parser.jay: Use an out-of-band stack to pass information
4986         around, I wonder why I need this.
4987
4988         foreach_block: Make the new foreach_block the current_block.
4989
4990         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
4991         function used to return a static Parameters structure.  Used for
4992         empty parameters, as those are created very frequently.
4993
4994         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
4995
4996 2001-11-15  Ravi Pratap  <ravi@ximian.com>
4997
4998         * interface.cs : Default modifier is private, not public. The
4999         make verify test passes again.
5000
5001 2001-11-15  Ravi Pratap  <ravi@ximian.com>
5002
5003         * support.cs (ReflectionParameters): Fix logic to determine
5004         whether the last parameter is a params one. Test 9 passes again.
5005
5006         * delegate.cs (Populate): Register the builders we define with
5007         RegisterParameterForBuilder. Test 19 passes again.
5008
5009         * cs-parser.jay (property_declaration): Reference $6 instead
5010         of $$ to get at the location.
5011
5012         (indexer_declaration): Similar stuff.
5013
5014         (attribute): Ditto.
5015
5016         * class.cs (Property): Register parameters for the Get and Set methods
5017         if they exist. Test 23 passes again.
5018
5019         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
5020         call to EmitArguments as we are sure there aren't any params arguments. 
5021         Test 32 passes again.
5022
5023         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
5024         IndexOutOfRangeException. 
5025
5026         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
5027         Test 33 now passes again.
5028         
5029 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
5030
5031         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
5032         broke a bunch of things.  Will have to come up with a better way
5033         of tracking locations.
5034
5035         * statement.cs: Implemented foreach for single dimension arrays.
5036
5037 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
5038
5039         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
5040         an error.  This removes the lookup from the critical path.
5041
5042         * cs-parser.jay: Removed use of temporary_loc, which is completely
5043         broken. 
5044
5045 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
5046
5047         * support.cs (ReflectionParameters.ParameterModifier): Report
5048         whether the argument is a PARAMS argument or not.
5049
5050         * class.cs: Set the attribute `ParamArrayAttribute' on the
5051         parameter argument.
5052
5053         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
5054         and cons_param_array_attribute (ConstructorInfo for
5055         ParamArrayAttribute)., 
5056
5057         * codegen.cs: Emit the return using the `Return' statement, that
5058         way we can report the error correctly for missing return values. 
5059
5060         * class.cs (Method.Emit): Clean up.
5061
5062         * expression.cs (Argument.Resolve): Take another argument: the
5063         location where this argument is used.  Notice that this is not
5064         part of the "Argument" class as to reduce the size of the
5065         structure (we know the approximate location anyways).
5066
5067         Test if the argument is a variable-reference, if not, then
5068         complain with a 206.
5069
5070         (Argument.Emit): Emit addresses of variables.
5071
5072         (Argument.FullDesc): Simplify.
5073
5074         (Invocation.DoResolve): Update for Argument.Resolve.
5075
5076         (ElementAccess.DoResolve): ditto.
5077
5078         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
5079         method should be virtual, as this method is always virtual.
5080
5081         (NewDelegate.DoResolve): Update for Argument.Resolve.
5082
5083         * class.cs (ConstructorInitializer.DoResolve): ditto.
5084         
5085         * attribute.cs (Attribute.Resolve): ditto.
5086
5087 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
5088
5089         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
5090
5091         * expression.cs (ParameterReference): Drop IStackStorage and implement
5092         IAssignMethod instead. 
5093
5094         (LocalVariableReference): ditto.
5095         
5096         * ecore.cs (FieldExpr): Drop IStackStorage and implement
5097         IAssignMethod instead. 
5098
5099 2001-11-13  Miguel de Icaza <miguel@ximian.com>
5100
5101         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
5102         enumerations that are used in heavily used structures derive from
5103         byte in a laughable and pathetic attempt to reduce memory usage.
5104         This is the kind of pre-optimzations that you should not do at
5105         home without adult supervision.
5106
5107         * expression.cs (UnaryMutator): New class, used to handle ++ and
5108         -- separatedly from the other unary operators.  Cleans up the
5109         code, and kills the ExpressionStatement dependency in Unary.
5110
5111         (Unary): Removed `method' and `Arguments' from this class, making
5112         it smaller, and moving it all to SimpleCall, so I can reuse this
5113         code in other locations and avoid creating a lot of transient data
5114         strucutres when not required.
5115
5116         * cs-parser.jay: Adjust for new changes.
5117
5118 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
5119
5120         * enum.cs (Enum.Populate): If there is a failure during
5121         definition, return
5122
5123         * cs-parser.jay (opt_enum_base): we used to catch type errors
5124         here, but this is really incorrect.  The type error should be
5125         catched during semantic analysis.
5126
5127 2001-12-11  Ravi Pratap  <ravi@ximian.com>
5128
5129         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
5130         current_local_parameters as expected since I, in my stupidity, had forgotten
5131         to do this :-)
5132
5133         * attribute.cs (GetValidPlaces): Fix stupid bug.
5134
5135         * class.cs (Method::Emit): Perform check on applicability of attributes.
5136
5137         (Constructor::Emit): Ditto.
5138
5139         (Field::Emit): Ditto.
5140
5141         (Field.Location): Store location information.
5142
5143         (Property, Event, Indexer, Operator): Ditto.
5144
5145         * cs-parser.jay (field_declaration): Pass in location for each field.
5146
5147         * ../errors/cs0592.cs : Add.
5148
5149 2001-11-12  Ravi Pratap  <ravi@ximian.com>
5150
5151         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
5152
5153         (InitCoreTypes): Update accordingly.
5154
5155         (RegisterAttrType, LookupAttr): Implement.
5156
5157         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
5158         info about the same.
5159
5160         (Resolve): Update to populate the above as necessary.
5161
5162         (Error592): Helper.
5163
5164         (GetValidPlaces): Helper to the above.
5165
5166         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
5167
5168         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
5169
5170 2001-11-12  Ravi Pratap  <ravi@ximian.com>
5171
5172         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
5173
5174         * ../errors/cs0617.cs : Add.
5175
5176 2001-11-11  Ravi Pratap  <ravi@ximian.com>
5177
5178         * enum.cs (Emit): Rename to Populate to be more consistent with what
5179         we expect it to do and when exactly it is called.
5180
5181         * class.cs, rootcontext.cs : Update accordingly.
5182
5183         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
5184         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
5185
5186         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
5187
5188         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
5189         of a fieldinfo using the above, when dealing with a FieldBuilder.
5190
5191 2001-11-10  Ravi Pratap  <ravi@ximian.com>
5192
5193         * ../errors/cs0031.cs : Add.
5194
5195         * ../errors/cs1008.cs : Add.
5196
5197         * ../errrors/cs0543.cs : Add.
5198
5199         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
5200         enum type.
5201
5202         (FindMembers): Implement.
5203
5204         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
5205         enums and delegates too.
5206
5207         (enum_types): Rename to builder_to_enum.
5208
5209         (delegate_types): Rename to builder_to_delegate.
5210
5211         * delegate.cs (FindMembers): Implement.
5212
5213 2001-11-09  Ravi Pratap  <ravi@ximian.com>
5214
5215         * typemanager.cs (IsEnumType): Implement.
5216
5217         * enum.cs (Emit): Re-write parts to account for the underlying type
5218         better and perform checking etc.
5219
5220         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
5221         of the underlying type.
5222
5223         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
5224         value
5225
5226         * enum.cs (error31): Helper to report error #31.
5227
5228         * cs-parser.jay (enum_declaration): Store location of each member too.
5229
5230         * enum.cs (member_to_location): New hashtable. 
5231
5232         (AddEnumMember): Update location hashtable.
5233
5234         (Emit): Use the location of each member while reporting errors.
5235
5236 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
5237
5238         * cs-parser.jay: A for_initializer if is a
5239         local_variable_declaration really ammount to have an implicit
5240         block with the variable declaration and no initializer for for.
5241
5242         * statement.cs (For.Emit): Cope with null initializers.
5243
5244         This fixes the infinite loop on for initializers.
5245
5246 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
5247
5248         * enum.cs: More cleanup.
5249
5250         * ecore.cs: Remove dead code.
5251
5252         * class.cs (Property.Emit): More simplification.
5253         (Event.Emit): ditto.
5254
5255         Reworked to have less levels of indentation.
5256         
5257 2001-11-08  Ravi Pratap  <ravi@ximian.com>
5258
5259         * class.cs (Property): Emit attributes.
5260
5261         (Field): Ditto.
5262         
5263         (Event): Ditto.
5264
5265         (Indexer): Ditto.
5266
5267         (Operator): Ditto.
5268
5269         * enum.cs (Emit): Ditto.
5270
5271         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
5272         Enums too.
5273
5274         * class.cs (Field, Event, etc.): Move attribute generation into the
5275         Emit method everywhere.
5276
5277         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
5278         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
5279         as we had no way of defining nested enums !
5280
5281         * rootcontext.cs : Adjust code accordingly.
5282
5283         * typemanager.cs (AddEnumType): To keep track of enum types separately.
5284
5285 2001-11-07  Ravi Pratap  <ravi@ximian.com>
5286
5287         * expression.cs (EvalConstantExpression): Move into ecore.cs
5288         
5289         * enum.cs (Enum): Rename some members and make them public and readonly
5290         according to our convention.
5291
5292         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
5293         nothing else.
5294
5295         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
5296
5297         (Enum::Emit): Write a simple version for now which doesn't try to compute
5298         expressions. I shall modify this to be more robust in just a while.
5299
5300         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
5301
5302         (TypeContainer::CloseType): Create the Enum types too.
5303
5304         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
5305
5306         * expression.cs (EvalConstantExpression): Get rid of completely.
5307
5308         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
5309         user-defined values and other cases.
5310
5311         (IsValidEnumLiteral): Helper function.
5312
5313         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
5314         out there in the case we had a literal FieldExpr.
5315
5316         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
5317
5318         (Literalize): Revamp a bit to take two arguments.
5319         
5320         (EnumLiteral): New class which derives from Literal to wrap enum literals.
5321         
5322 2001-11-06  Ravi Pratap  <ravi@ximian.com>
5323
5324         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
5325
5326         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
5327
5328         (Resolve): Use the above to ensure we have proper initializers.
5329
5330 2001-11-05  Ravi Pratap  <ravi@ximian.com>
5331
5332         * expression.cs (Expression::EvalConstantExpression): New method to 
5333         evaluate constant expressions.
5334
5335         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
5336
5337 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
5338
5339         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
5340         in an array.
5341
5342         (Binary.ResolveOperator): Handle operator != (object a, object b)
5343         and operator == (object a, object b);
5344
5345         (Binary.DoNumericPromotions): Indicate whether the numeric
5346         promotion was possible.
5347
5348         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
5349         Implement.  
5350
5351         Made the ArrayAccess implement interface IAssignMethod instead of
5352         IStackStore as the order in which arguments are passed reflects
5353         this.
5354
5355         * assign.cs: Instead of using expr.ExprClass to select the way of
5356         assinging, probe for the IStackStore/IAssignMethod interfaces.
5357
5358         * typemanager.cs: Load InitializeArray definition.
5359
5360         * rootcontext.cs (RootContext.MakeStaticData): Used to define
5361         static data that can be used to initialize arrays. 
5362
5363 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
5364
5365         * expression.cs: Handle operator== and operator!= for booleans.
5366
5367         (Conditioal.Reduce): Implement reducer for the ?: operator.
5368
5369         (Conditional.Resolve): Implement dead code elimination.
5370
5371         (Binary.Resolve): Catch string literals and return a new
5372         concatenated string.
5373
5374         (Unary.Reduce): Implement reduction of unary expressions.
5375
5376         * ecore.cs: Split out the expression core handling here.
5377
5378         (Expression.Reduce): New method used to perform constant folding
5379         and CSE.  This is needed to support constant-expressions. 
5380         
5381         * statement.cs (Statement.EmitBoolExpression): Pass true and false
5382         targets, and optimize for !x.
5383
5384 2001-11-04  Ravi Pratap  <ravi@ximian.com>
5385
5386         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
5387         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
5388         set custom atttributes.
5389
5390         * literal.cs (Literal::GetValue): New abstract method to return the actual
5391         value of the literal, cast as an object.
5392
5393         (*Literal): Implement GetValue method.
5394
5395         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
5396         expressions to the arraylist but objects of type Argument.
5397
5398         * class.cs (TypeContainer::Emit): Emit our attributes too.
5399
5400         (Method::Emit, Constructor::Emit): Ditto.
5401
5402         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
5403         to be ignoring earlier.
5404
5405 2001-11-03  Ravi Pratap  <ravi@ximian.com>
5406
5407         * attribute.cs (AttributeSection::Define): Implement to do the business
5408         of constructing a CustomAttributeBuilder.
5409
5410         (Attribute): New trivial class. Increases readability of code.  
5411
5412         * cs-parser.jay : Update accordingly.
5413
5414         (positional_argument_list, named_argument_list, named_argument): New rules
5415
5416         (attribute_arguments): Use the above so that we are more correct.
5417         
5418 2001-11-02  Ravi Pratap  <ravi@ximian.com>
5419         
5420         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
5421         to perform all checks for a method with a params parameter.
5422
5423         (Invocation::OverloadResolve): Update to use the above method and therefore
5424         cope correctly with params method invocations.
5425
5426         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
5427         params too.
5428
5429         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
5430         constructors in our parent too because we can't afford to miss out on 
5431         protected ones ;-)
5432
5433         * attribute.cs (AttributeSection): New name for the class Attribute
5434
5435         Other trivial changes to improve readability.
5436
5437         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
5438         use the new class names.
5439         
5440 2001-11-01  Ravi Pratap  <ravi@ximian.com>
5441
5442         * class.cs (Method::Define): Complete definition for params types too
5443
5444         (Indexer::Define): Ditto.
5445
5446         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
5447         Cope everywhere with a request for info about the array parameter.
5448
5449 2001-11-01  Ravi Pratap  <ravi@ximian.com>
5450
5451         * tree.cs (RecordNamespace): Fix up to check for the correct key.
5452
5453         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
5454         local_variable_type to extract the string corresponding to the type.
5455
5456         (local_variable_type): Fixup the action to use the new helper method.
5457
5458         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
5459         go.
5460
5461         * expression.cs : Clean out code which uses the above.
5462
5463 2001-10-31  Ravi Pratap  <ravi@ximian.com>
5464         
5465         * typemanager.cs (RegisterMethod): Check if we already have an existing key
5466         and bale out if necessary by returning a false.
5467
5468         (RegisterProperty): Ditto.
5469
5470         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
5471         and print out appropriate error messages.
5472
5473         * interface.cs (everywhere): Ditto.
5474
5475         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
5476         location to constructor.
5477
5478         * class.cs (Property, Event, Indexer): Update accordingly.
5479
5480         * ../errors/cs111.cs : Added.
5481
5482         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
5483         of a method, as laid down by the spec.
5484
5485         (Invocation::OverloadResolve): Use the above method.
5486
5487 2001-10-31  Ravi Pratap  <ravi@ximian.com>
5488
5489         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
5490         now take a TypeContainer and a Parameters object.
5491
5492         (ParameterData): Modify return type of ParameterModifier method to be 
5493         Parameter.Modifier and not a string.
5494
5495         (ReflectionParameters, InternalParameters): Update accordingly.
5496
5497         * expression.cs (Argument::GetParameterModifier): Same here.
5498
5499         * support.cs (InternalParameters::ParameterType): Find a better way of determining
5500         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
5501         symbol in it at all so maybe this is only for now.
5502
5503 2001-10-30  Ravi Pratap  <ravi@ximian.com>
5504
5505         * support.cs (InternalParameters): Constructor now takes an extra argument 
5506         which is the actual Parameters class.
5507
5508         (ParameterDesc): Update to provide info on ref/out modifiers.
5509
5510         * class.cs (everywhere): Update call to InternalParameters to pass in
5511         the second argument too.
5512
5513         * support.cs (ParameterData): Add ParameterModifier, which is a method 
5514         to return the modifier info [ref/out etc]
5515
5516         (InternalParameters, ReflectionParameters): Implement the above.
5517
5518         * expression.cs (Argument::ParameterModifier): Similar function to return
5519         info about the argument's modifiers.
5520
5521         (Invocation::OverloadResolve): Update to take into account matching modifiers 
5522         too.
5523
5524         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
5525         a new SetFormalParameters object which we pass to InternalParameters.
5526
5527 2001-10-30  Ravi Pratap  <ravi@ximian.com>
5528
5529         * expression.cs (NewArray): Merge into the ArrayCreation class.
5530
5531 2001-10-29  Ravi Pratap  <ravi@ximian.com>
5532
5533         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
5534         NewUserdefinedArray into one as there wasn't much of a use in having
5535         two separate ones.
5536
5537         * expression.cs (Argument): Change field's name to ArgType from Type.
5538
5539         (Type): New readonly property which returns the proper type, taking into 
5540         account ref/out modifiers.
5541
5542         (everywhere): Adjust code accordingly for the above.
5543
5544         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
5545         whether we are emitting for a ref or out parameter.
5546
5547         * expression.cs (Argument::Emit): Use the above field to set the state.
5548
5549         (LocalVariableReference::Emit): Update to honour the flag and emit the
5550         right stuff.
5551
5552         * parameter.cs (Attributes): Set the correct flags for ref parameters.
5553
5554         * expression.cs (Argument::FullDesc): New function to provide a full desc.
5555
5556         * support.cs (ParameterData): Add method ParameterDesc to the interface.
5557
5558         (ReflectionParameters, InternalParameters): Implement the above method.
5559
5560         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
5561         reporting errors.
5562
5563         (Invocation::FullMethodDesc): Ditto. 
5564
5565 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
5566
5567         * cs-parser.jay: Add extra production for the second form of array
5568         creation. 
5569
5570         * expression.cs (ArrayCreation): Update to reflect the above
5571         change. 
5572
5573         * Small changes to prepare for Array initialization.
5574
5575 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
5576
5577         * typemanager.cs (ImplementsInterface): interface might be null;
5578         Deal with this problem;
5579
5580         Also, we do store negative hits on the cache (null values), so use
5581         this instead of calling t.GetInterfaces on the type everytime.
5582
5583 2001-10-28  Ravi Pratap  <ravi@ximian.com>
5584
5585         * typemanager.cs (IsBuiltinType): New method to help determine the same.
5586
5587         * expression.cs (New::DoResolve): Get rid of array creation code and instead
5588         split functionality out into different classes.
5589
5590         (New::FormArrayType): Move into NewBuiltinArray.
5591
5592         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
5593         quite useless.
5594
5595         (NewBuiltinArray): New class to handle creation of built-in arrays.
5596
5597         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
5598         account creation of one-dimensional arrays.
5599
5600         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
5601
5602         (NewUserdefinedArray::DoResolve): Implement.
5603
5604         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
5605
5606         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
5607         we maintain inside the TypeManager. This is necessary to perform lookups on the
5608         module builder.
5609
5610         (LookupType): Update to perform GetType on the module builders too.     
5611
5612         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
5613
5614         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
5615
5616 2001-10-23  Ravi Pratap  <ravi@ximian.com>
5617
5618         * expression.cs (New::DoResolve): Implement guts of array creation.
5619
5620         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
5621         
5622 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
5623
5624         * expression.cs: Fix bug I introduced lsat night that broke
5625         Delegates. 
5626
5627         (Expression.Resolve): Report a 246 error (can not resolve name)
5628         if we find a SimpleName in the stream.
5629         
5630         (Expression.ResolveLValue): Ditto.
5631         
5632         (Expression.ResolveWithSimpleName): This function is a variant of
5633         ResolveName, this one allows SimpleNames to be returned without a
5634         warning.  The only consumer of SimpleNames is MemberAccess
5635
5636 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
5637
5638         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
5639         might arrive here.  I have my doubts that this is correct.
5640
5641         * statement.cs (Lock): Implement lock statement.
5642
5643         * cs-parser.jay: Small fixes to support `lock' and `using'
5644
5645         * cs-tokenizer.cs: Remove extra space
5646
5647         * driver.cs: New flag --checked, allows to turn on integer math
5648         checking. 
5649
5650         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
5651         Threading.Monitor.Exit 
5652         
5653 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
5654
5655         * expression.cs (IndexerAccess::DoResolveLValue): Set the
5656         Expression Class to be IndexerAccess.
5657
5658         Notice that Indexer::DoResolve sets the eclass to Value.
5659
5660 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
5661
5662         * class.cs (TypeContainer::Emit): Emit code for indexers.
5663
5664         * assign.cs (IAssignMethod): New interface implemented by Indexers
5665         and Properties for handling assignment.
5666
5667         (Assign::Emit): Simplify and reuse code. 
5668         
5669         * expression.cs (IndexerAccess, PropertyExpr): Implement
5670         IAssignMethod, clean up old code. 
5671
5672 2001-10-22  Ravi Pratap  <ravi@ximian.com>
5673
5674         * typemanager.cs (ImplementsInterface): New method to determine if a type
5675         implements a given interface. Provides a nice cache too.
5676
5677         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
5678         method.
5679
5680         (ConvertReferenceExplicit): Ditto.
5681
5682         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
5683         various methods, with correct names etc.
5684
5685         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
5686         Operator.UnaryNegation.
5687
5688         * cs-parser.jay (operator_declarator): Be a little clever in the case where
5689         we have a unary plus or minus operator.
5690
5691         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
5692         UnaryMinus.
5693
5694         * everywhere : update accordingly.
5695
5696         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
5697         respectively.
5698
5699         * class.cs (Method::Define): For the case where we are implementing a method
5700         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
5701         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
5702         
5703 2001-10-21  Ravi Pratap  <ravi@ximian.com>
5704
5705         * interface.cs (FindMembers): Implement to work around S.R.E
5706         lameness.
5707
5708         * typemanager.cs (IsInterfaceType): Implement.
5709
5710         (FindMembers): Update to handle interface types too.
5711
5712         * expression.cs (ImplicitReferenceConversion): Re-write bits which
5713         use IsAssignableFrom as that is not correct - it doesn't work.
5714
5715         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
5716         and accordingly override EmitStatement.
5717
5718         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
5719         using the correct logic :-)
5720
5721 2001-10-19  Ravi Pratap  <ravi@ximian.com>
5722
5723         * ../errors/cs-11.cs : Add to demonstrate error -11 
5724
5725 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
5726
5727         * assign.cs (Assign::Resolve): Resolve right hand side first, and
5728         then pass this as a hint to ResolveLValue.
5729         
5730         * expression.cs (FieldExpr): Add Location information
5731
5732         (FieldExpr::LValueResolve): Report assignment to readonly
5733         variable. 
5734         
5735         (Expression::ExprClassFromMemberInfo): Pass location information.
5736
5737         (Expression::ResolveLValue): Add new method that resolves an
5738         LValue. 
5739
5740         (Expression::DoResolveLValue): Default invocation calls
5741         DoResolve. 
5742
5743         (Indexers): New class used to keep track of indexers in a given
5744         Type. 
5745
5746         (IStackStore): Renamed from LValue, as it did not really describe
5747         what this did.  Also ResolveLValue is gone from this interface and
5748         now is part of Expression.
5749
5750         (ElementAccess): Depending on the element access type
5751         
5752         * typemanager.cs: Add `indexer_name_type' as a Core type
5753         (System.Runtime.CompilerServices.IndexerNameAttribute)
5754
5755         * statement.cs (Goto): Take a location.
5756         
5757 2001-10-18  Ravi Pratap  <ravi@ximian.com>
5758
5759         * delegate.cs (Delegate::VerifyDelegate): New method to verify
5760         if two delegates are compatible.
5761
5762         (NewDelegate::DoResolve): Update to take care of the case when
5763         we instantiate a delegate from another delegate.
5764
5765         * typemanager.cs (FindMembers): Don't even try to look up members
5766         of Delegate types for now.
5767
5768 2001-10-18  Ravi Pratap  <ravi@ximian.com>
5769
5770         * delegate.cs (NewDelegate): New class to take care of delegate
5771         instantiation.
5772
5773         * expression.cs (New): Split the delegate related code out into 
5774         the NewDelegate class.
5775
5776         * delegate.cs (DelegateInvocation): New class to handle delegate 
5777         invocation.
5778
5779         * expression.cs (Invocation): Split out delegate related code into
5780         the DelegateInvocation class.
5781
5782 2001-10-17  Ravi Pratap  <ravi@ximian.com>
5783
5784         * expression.cs (New::DoResolve): Implement delegate creation fully
5785         and according to the spec.
5786
5787         (New::DoEmit): Update to handle delegates differently.
5788
5789         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
5790         because of which we were printing out arguments in reverse order !
5791
5792         * delegate.cs (VerifyMethod): Implement to check if the given method
5793         matches the delegate.
5794
5795         (FullDelegateDesc): Implement.
5796
5797         (VerifyApplicability): Implement.
5798
5799         * expression.cs (Invocation::DoResolve): Update to accordingly handle
5800         delegate invocations too.
5801
5802         (Invocation::Emit): Ditto.
5803
5804         * ../errors/cs1593.cs : Added.
5805
5806         * ../errors/cs1594.cs : Added.
5807
5808         * delegate.cs (InstanceExpression, TargetMethod): New properties.
5809
5810 2001-10-16  Ravi Pratap  <ravi@ximian.com>
5811
5812         * typemanager.cs (intptr_type): Core type for System.IntPtr
5813
5814         (InitCoreTypes): Update for the same.
5815
5816         (iasyncresult_type, asynccallback_type): Ditto.
5817
5818         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
5819         correct.
5820
5821         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
5822         too.
5823
5824         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
5825         the builders for the 4 members of a delegate type :-)
5826
5827         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
5828         type.
5829
5830         * expression.cs (New::DoResolve): Implement guts for delegate creation.
5831
5832         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
5833
5834 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
5835
5836         * statement.cs (Break::Emit): Implement.   
5837         (Continue::Emit): Implement.
5838
5839         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
5840         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
5841         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
5842         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
5843         end loop
5844         
5845         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
5846         properties that track the label for the current loop (begin of the
5847         loop and end of the loop).
5848
5849 2001-10-15  Ravi Pratap  <ravi@ximian.com>
5850
5851         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
5852         use of emitting anything at all.
5853
5854         * class.cs, rootcontext.cs : Get rid of calls to the same.
5855
5856         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
5857
5858         (Populate): Define the constructor correctly and set the implementation
5859         attributes.
5860
5861         * typemanager.cs (delegate_types): New hashtable to hold delegates that
5862         have been defined.
5863
5864         (AddDelegateType): Implement.
5865
5866         (IsDelegateType): Implement helper method.
5867
5868         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
5869
5870         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
5871         and accordingly handle it.
5872
5873         * delegate.cs (Populate): Take TypeContainer argument.
5874         Implement bits to define the Invoke method. However, I still haven't figured out
5875         how to take care of the native int bit :-(
5876
5877         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
5878         Qualify the name of the delegate, not its return type !
5879
5880         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
5881         conversion.
5882
5883         (StandardConversionExists): Checking for array types turns out to be recursive.
5884
5885         (ConvertReferenceExplicit): Implement array conversion.
5886
5887         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
5888         
5889 2001-10-12  Ravi Pratap  <ravi@ximian.com>
5890
5891         * cs-parser.jay (delegate_declaration): Store the fully qualified
5892         name as it is a type declaration.
5893
5894         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
5895         readonly.
5896
5897         (DefineDelegate): Renamed from Define. Does the same thing essentially,
5898         as TypeContainer::DefineType.
5899
5900         (Populate): Method in which all the definition of the various methods (Invoke)
5901         etc is done.
5902
5903         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
5904         see.
5905         
5906         (CloseDelegate): Finally creates the delegate.
5907
5908         * class.cs (TypeContainer::DefineType): Update to define delegates.
5909         (Populate, Emit and CloseType): Do the same thing here too.
5910
5911         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
5912         delegates in all these operations.
5913
5914 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
5915
5916         * expression.cs: LocalTemporary: a new expression used to
5917         reference a temporary that has been created.
5918
5919         * assign.cs: Handle PropertyAccess back here, so that we can
5920         provide the proper semantic access to properties.
5921
5922         * expression.cs (Expression::ConvertReferenceExplicit): Implement
5923         a few more explicit conversions. 
5924
5925         * modifiers.cs: `NEW' modifier maps to HideBySig.
5926
5927         * expression.cs (PropertyExpr): Make this into an
5928         ExpressionStatement, and support the EmitStatement code path. 
5929
5930         Perform get/set error checking, clean up the interface.
5931
5932         * assign.cs: recognize PropertyExprs as targets, and if so, turn
5933         them into toplevel access objects.
5934
5935 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
5936
5937         * expression.cs: PropertyExpr::PropertyExpr: use work around the
5938         SRE.
5939
5940         * typemanager.cs: Keep track here of our PropertyBuilders again to
5941         work around lameness in SRE.
5942
5943 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
5944
5945         * expression.cs (LValue::LValueResolve): New method in the
5946         interface, used to perform a second resolution pass for LValues. 
5947         
5948         (This::DoResolve): Catch the use of this in static methods.
5949
5950         (This::LValueResolve): Implement.
5951
5952         (This::Store): Remove warning, assigning to `this' in structures
5953         is 
5954
5955         (Invocation::Emit): Deal with invocation of
5956         methods on value types.  We need to pass the address to structure
5957         methods rather than the object itself.  (The equivalent code to
5958         emit "this" for structures leaves the entire structure on the
5959         stack instead of a pointer to it). 
5960
5961         (ParameterReference::DoResolve): Compute the real index for the
5962         argument based on whether the method takes or not a `this' pointer
5963         (ie, the method is static).
5964
5965         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
5966         value types returned from functions when we need to invoke a
5967         method on the sturcture.
5968         
5969
5970 2001-10-11  Ravi Pratap  <ravi@ximian.com>
5971
5972         * class.cs (TypeContainer::DefineType): Method to actually do the business of
5973         defining the type in the Modulebuilder or Typebuilder. This is to take
5974         care of nested types which need to be defined on the TypeBuilder using
5975         DefineNestedMethod.
5976
5977         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
5978         methods in RootContext, only ported to be part of TypeContainer.
5979
5980         (TypeContainer::GetInterfaceOrClass): Ditto.
5981
5982         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
5983
5984         * interface.cs (Interface::DefineInterface): New method. Does exactly
5985         what RootContext.CreateInterface did earlier, only it takes care of nested types 
5986         too.
5987
5988         (Interface::GetInterfaces): Move from RootContext here and port.
5989
5990         (Interface::GetInterfaceByName): Same here.
5991
5992         * rootcontext.cs (ResolveTree): Re-write.
5993
5994         (PopulateTypes): Re-write.
5995
5996         * class.cs (TypeContainer::Populate): Populate nested types too.
5997         (TypeContainer::Emit): Emit nested members too.
5998
5999         * typemanager.cs (AddUserType): Do not make use of the FullName property,
6000         instead just use the name argument passed in as it is already fully
6001         qualified.
6002
6003         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
6004         to TypeContainer mapping to see if a type is user-defined.
6005
6006         * class.cs (TypeContainer::CloseType): Implement. 
6007
6008         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
6009         the default constructor.
6010         
6011         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
6012         twice.
6013
6014         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
6015
6016         * interface.cs (CloseType): Create the type here.
6017         
6018         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
6019         the hierarchy.
6020
6021         Remove all the methods which are now in TypeContainer.
6022
6023 2001-10-10  Ravi Pratap  <ravi@ximian.com>
6024
6025         * delegate.cs (Define): Re-write bits to define the delegate
6026         correctly.
6027
6028 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
6029
6030         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
6031
6032         * expression.cs (ImplicitReferenceConversion): handle null as well
6033         as a source to convert to any reference type.
6034
6035         * statement.cs (Return): Perform any implicit conversions to
6036         expected return type.  
6037
6038         Validate use of return statement.  
6039
6040         * codegen.cs (EmitContext): Pass the expected return type here.
6041
6042         * class.cs (Method, Constructor, Property): Pass expected return
6043         type to EmitContext.
6044
6045 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
6046
6047         * expression.cs: Make DoResolve take an EmitContext instead of a
6048         TypeContainer.
6049
6050         Replaced `l' and `location' for `loc', for consistency.
6051         
6052         (Error, Warning): Remove unneeded Tc argument.
6053
6054         * assign.cs, literal.cs, constant.cs: Update to new calling
6055         convention. 
6056         
6057         * codegen.cs: EmitContext now contains a flag indicating whether
6058         code is being generated in a static method or not.
6059
6060         * cs-parser.jay: DecomposeQI, new function that replaces the old
6061         QualifiedIdentifier.  Now we always decompose the assembled
6062         strings from qualified_identifier productions into a group of
6063         memberaccesses.
6064
6065 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
6066
6067         * rootcontext.cs: Deal with field-less struct types correctly now
6068         by passing the size option to Define Type.
6069
6070         * class.cs: Removed hack that created one static field. 
6071
6072 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
6073
6074         * statement.cs: Moved most of the code generation here. 
6075
6076 2001-10-09  Ravi Pratap  <ravi@ximian.com>
6077
6078         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
6079         seem very right.
6080
6081         (ElementAccess): Remove useless bits for now - keep checks as the spec
6082         says.
6083
6084 2001-10-08  Ravi Pratap  <ravi@ximian.com>
6085
6086         * expression.cs (ElementAccess::DoResolve): Remove my crap code
6087         and start performing checks according to the spec.
6088
6089 2001-10-07  Ravi Pratap  <ravi@ximian.com>
6090
6091         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
6092         rank_specifiers instead.
6093
6094         (rank_specifiers): Change the order in which the rank specifiers are stored
6095
6096         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
6097
6098         * expression.cs (ElementAccess): Implement the LValue interface too.
6099         
6100 2001-10-06  Ravi Pratap  <ravi@ximian.com>
6101         
6102         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
6103         except that user defined conversions are not included.
6104
6105         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
6106         perform the conversion of the return type, if necessary.
6107
6108         (New::DoResolve): Check whether we are creating an array or an object
6109         and accordingly do the needful.
6110
6111         (New::Emit): Same here.
6112
6113         (New::DoResolve): Implement guts of array creation.
6114
6115         (New::FormLookupType): Helper function.
6116
6117 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
6118
6119         * codegen.cs: Removed most of the code generation here, and move the
6120         corresponding code generation bits to the statement classes. 
6121
6122         Added support for try/catch/finalize and throw.
6123         
6124         * cs-parser.jay: Added support for try/catch/finalize.
6125
6126         * class.cs: Catch static methods having the flags override,
6127         virtual or abstract.
6128
6129         * expression.cs (UserCast): This user cast was not really doing
6130         what it was supposed to do.  Which is to be born in fully resolved
6131         state.  Parts of the resolution were being performed at Emit time! 
6132
6133         Fixed this code.
6134
6135 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
6136
6137         * expression.cs: Implicity convert the result from UserCast.
6138
6139 2001-10-05  Ravi Pratap  <ravi@ximian.com>
6140
6141         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
6142         prevented it from working correctly. 
6143
6144         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
6145         merely ConvertImplicit.
6146
6147 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
6148
6149         * typemanager.cs: Make the LookupTypeContainer function static,
6150         and not per-instance.  
6151
6152         * class.cs: Make static FindMembers (the one that takes a Type
6153         argument). 
6154
6155         * codegen.cs: Add EmitForeach here.
6156
6157         * cs-parser.jay: Make foreach a toplevel object instead of the
6158         inline expansion, as we need to perform semantic analysis on it. 
6159
6160 2001-10-05  Ravi Pratap  <ravi@ximian.com>
6161
6162         * expression.cs (Expression::ImplicitUserConversion): Rename to
6163         UserDefinedConversion.
6164
6165         (Expression::UserDefinedConversion): Take an extra argument specifying 
6166         whether we look for explicit user conversions too.
6167
6168         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
6169
6170         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
6171
6172         (ExplicitUserConversion): Make it a call to UserDefinedConversion
6173         with the appropriate arguments.
6174
6175         * cs-parser.jay (cast_expression): Record location too.
6176
6177         * expression.cs (Cast): Record location info.
6178
6179         (Expression::ConvertExplicit): Take location argument.
6180
6181         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
6182         to determine if we are doing explicit conversions.
6183
6184         (UserCast::Emit): Update accordingly.
6185
6186         (Expression::ConvertExplicit): Report an error if everything fails.
6187
6188         * ../errors/cs0030.cs : Add.
6189
6190 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
6191
6192         * modifiers.cs: If the ABSTRACT keyword is present, also set the
6193         virtual and newslot bits. 
6194
6195         * class.cs (TypeContainer::RegisterRequiredImplementations):
6196         Record methods we need.
6197
6198         (TypeContainer::MakeKey): Helper function to make keys for
6199         MethodBases, since the Methodbase key is useless.
6200
6201         (TypeContainer::Populate): Call RegisterRequiredImplementations
6202         before defining the methods.   
6203
6204         Create a mapping for method_builders_to_methods ahead of time
6205         instead of inside a tight loop.
6206
6207         (::RequireMethods):  Accept an object as the data to set into the
6208         hashtable so we can report interface vs abstract method mismatch.
6209
6210 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
6211
6212         * report.cs: Make all of it static.
6213
6214         * rootcontext.cs: Drop object_type and value_type computations, as
6215         we have those in the TypeManager anyways.
6216
6217         Drop report instance variable too, now it is a global.
6218
6219         * driver.cs: Use try/catch on command line handling.
6220
6221         Add --probe option to debug the error reporting system with a test
6222         suite. 
6223
6224         * report.cs: Add support for exiting program when a probe
6225         condition is reached.
6226
6227 2001-10-03  Ravi Pratap  <ravi@ximian.com>
6228
6229         * expression.cs (Binary::DoNumericPromotions): Fix the case when
6230         we do a forcible conversion regardless of type, to check if 
6231         ForceConversion returns a null.
6232
6233         (Binary::error19): Use location to report error.
6234
6235         (Unary::error23): Use location here too.
6236
6237         * ../errors/cs0019.cs : Check in.
6238
6239         * ../errors/cs0023.cs : Check in.
6240
6241         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
6242         case of a non-null MethodInfo object with a length of 0 !
6243
6244         (Binary::ResolveOperator): Flag error if overload resolution fails to find
6245         an applicable member - according to the spec :-)
6246         Also fix logic to find members in base types.
6247
6248         (Unary::ResolveOperator): Same here.
6249
6250         (Unary::report23): Change name to error23 and make first argument a TypeContainer
6251         as I was getting thoroughly confused between this and error19 :-)
6252         
6253         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
6254         (::FindMostEncompassedType): Implement.
6255         (::FindMostEncompassingType): Implement.
6256         (::StandardConversionExists): Implement.
6257
6258         (UserImplicitCast): Re-vamp. We now need info about most specific
6259         source and target types so that we can do the necessary conversions.
6260
6261         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
6262         mathematical union with no duplicates.
6263
6264 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
6265
6266         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
6267         in order from base classes to child classes, so that we can in
6268         child classes look up in our parent for method names and
6269         attributes (required for handling abstract, virtual, new, override
6270         constructs: we need to instrospect our base class, and if we dont
6271         populate the classes in order, the introspection might be
6272         incorrect.  For example, a method could query its parent before
6273         the parent has any methods and would determine that the parent has
6274         no abstract methods (while it could have had them)).
6275
6276         (RootContext::CreateType): Record the order in which we define the
6277         classes.
6278
6279 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
6280
6281         * class.cs (TypeContainer::Populate): Also method definitions can
6282         fail now, keep track of this.
6283
6284         (TypeContainer::FindMembers): Implement support for
6285         DeclaredOnly/noDeclaredOnly flag.
6286
6287         (Constructor::Emit) Return the ConstructorBuilder.
6288
6289         (Method::Emit) Return the MethodBuilder. 
6290         Check for abstract or virtual methods to be public.
6291
6292         * rootcontext.cs (RootContext::CreateType): Register all the
6293         abstract methods required for the class to be complete and the
6294         interface methods that must be implemented. 
6295
6296         * cs-parser.jay: Report error 501 (method requires body if it is
6297         not marked abstract or extern).
6298
6299         * expression.cs (TypeOf::Emit): Implement.
6300
6301         * typemanager.cs: runtime_handle_type, new global type.
6302
6303         * class.cs (Property::Emit): Generate code for properties.
6304
6305 2001-10-02  Ravi Pratap  <ravi@ximian.com>
6306
6307         * expression.cs (Unary::ResolveOperator): Find operators on base type
6308         too - we now conform exactly to the spec.
6309
6310         (Binary::ResolveOperator): Same here.
6311
6312         * class.cs (Operator::Define): Fix minor quirk in the tests.
6313
6314         * ../errors/cs0215.cs : Added.
6315
6316         * ../errors/cs0556.cs : Added.
6317
6318         * ../errors/cs0555.cs : Added.
6319
6320 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
6321
6322         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
6323         single integer which is really efficient
6324
6325 2001-10-01  Ravi Pratap  <ravi@ximian.com>
6326
6327         *  expression.cs (Expression::ImplicitUserConversion): Use location
6328         even in the case when we are examining True operators.
6329  
6330         * class.cs (Operator::Define): Perform extensive checks to conform
6331         with the rules for operator overloading in the spec.
6332
6333         * expression.cs (Expression::ImplicitReferenceConversion): Implement
6334         some of the other conversions mentioned in the spec.
6335
6336         * typemanager.cs (array_type): New static member for the System.Array built-in
6337         type.
6338
6339         (cloneable_interface): For System.ICloneable interface.
6340
6341         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
6342         we start resolving the tree and populating types.
6343
6344         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
6345  
6346 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
6347
6348         * expression.cs (Expression::ExprClassFromMemberInfo,
6349         Expression::Literalize): Create literal expressions from
6350         FieldInfos which are literals.
6351
6352         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
6353         type casts, because they were wrong.  The test suite in tests
6354         caught these ones.
6355
6356         (ImplicitNumericConversion): ushort to ulong requires a widening
6357         cast. 
6358
6359         Int32 constant to long requires widening cast as well.
6360
6361         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
6362         for integers because the type on the stack is not i4.
6363
6364 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
6365
6366         * expression.cs (report118): require location argument. 
6367
6368         * parameter.cs: Do not dereference potential null value.
6369
6370         * class.cs: Catch methods that lack the `new' keyword when
6371         overriding a name.  Report warnings when `new' is used without
6372         anything being there to override.
6373
6374         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
6375
6376         * class.cs: Only add constructor to hashtable if it is non-null
6377         (as now constructors can fail on define).
6378
6379         (TypeManager, Class, Struct): Take location arguments.
6380
6381         Catch field instance initialization in structs as errors.
6382
6383         accepting_filter: a new filter for FindMembers that is static so
6384         that we dont create an instance per invocation.
6385
6386         (Constructor::Define): Catch errors where a struct constructor is
6387         parameterless 
6388
6389         * cs-parser.jay: Pass location information for various new
6390         constructs. 
6391         
6392         * delegate.cs (Delegate): take a location argument.
6393
6394         * driver.cs: Do not call EmitCode if there were problesm in the
6395         Definition of the types, as many Builders wont be there. 
6396
6397         * decl.cs (Decl::Decl): Require a location argument.
6398
6399         * cs-tokenizer.cs: Handle properly hex constants that can not fit
6400         into integers, and find the most appropiate integer for it.
6401
6402         * literal.cs: Implement ULongLiteral.
6403
6404         * rootcontext.cs: Provide better information about the location of
6405         failure when CreateType fails.
6406         
6407 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
6408
6409         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
6410         as well.
6411
6412         * expression.cs (Binary::CheckShiftArguments): Add missing type
6413         computation.
6414         (Binary::ResolveOperator): Add type to the logical and and logical
6415         or, Bitwise And/Or and Exclusive Or code paths, it was missing
6416         before.
6417
6418         (Binary::DoNumericPromotions): In the case where either argument
6419         is ulong (and most signed types combined with ulong cause an
6420         error) perform implicit integer constant conversions as well.
6421
6422 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
6423
6424         * expression.cs (UserImplicitCast): Method should always be
6425         non-null. 
6426         (Invocation::BetterConversion): Simplified test for IntLiteral.
6427
6428         (Expression::ImplicitNumericConversion): Split this routine out.
6429         Put the code that performs implicit constant integer conversions
6430         here. 
6431
6432         (Expression::Resolve): Become a wrapper around DoResolve so we can
6433         check eclass and type being set after resolve.
6434
6435         (Invocation::Badness): Remove this dead function
6436
6437         (Binary::ResolveOperator): Do not compute the expensive argumnets
6438         unless we have a union for it.
6439
6440         (Probe::Emit): Is needs to do an isinst and then
6441         compare against null.
6442
6443         (::CanConvert): Added Location argument.  If the Location argument
6444         is null (Location.Null), then we do not report errors.  This is
6445         used by the `probe' mechanism of the Explicit conversion.  We do
6446         not want to generate an error for something that the user
6447         explicitly requested to be casted.  But the pipeline for an
6448         explicit cast first tests for potential implicit casts.
6449
6450         So for now, if the Location is null, it means `Probe only' to
6451         avoid adding another argument.   Might have to revise this
6452         strategy later.
6453
6454         (ClassCast): New class used to type cast objects into arbitrary
6455         classes (used in Explicit Reference Conversions).
6456
6457         Implement `as' as well.
6458
6459         Reverted all the patches from Ravi below: they were broken:
6460
6461                 * The use of `level' as a mechanism to stop recursive
6462                   invocations is wrong.  That was there just to catch the
6463                   bug with a strack trace but not as a way of addressing
6464                   the problem.
6465
6466                   To fix the problem we have to *understand* what is going
6467                   on and the interactions and come up with a plan, not
6468                   just get things going.
6469
6470                 * The use of the type conversion cache that I proposed
6471                   last night had an open topic: How does this work across
6472                   protection domains.  A user defined conversion might not
6473                   be public in the location where we are applying the
6474                   conversion, a different conversion might be selected
6475                   (ie, private A->B (better) but public B->A (worse),
6476                   inside A, A->B applies, but outside it, B->A will
6477                   apply).
6478
6479                 * On top of that (ie, even if the above is solved),
6480                   conversions in a cache need to be abstract.  Ie, `To
6481                   convert from an Int to a Short use an OpcodeCast', not
6482                   `To convert from an Int to a Short use the OpcodeCast on
6483                   the variable 5' (which is what this patch was doing).
6484         
6485 2001-09-28  Ravi Pratap  <ravi@ximian.com>
6486
6487         * expression.cs (Invocation::ConversionExists): Re-write to use
6488         the conversion cache
6489         
6490         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
6491         cache all conversions done, not just user-defined ones.
6492
6493         (Invocation::BetterConversion): The real culprit. Use ConversionExists
6494         to determine if a conversion exists instead of acutually trying to 
6495         perform the conversion. It's faster too.
6496
6497         (Expression::ConvertExplicit): Modify to use ConversionExists to check
6498         and only then attempt the implicit conversion.
6499
6500 2001-09-28  Ravi Pratap  <ravi@ximian.com>
6501
6502         * expression.cs (ConvertImplicit): Use a cache for conversions
6503         already found. Check level of recursion and bail out if necessary.
6504         
6505 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
6506
6507         * typemanager.cs (string_concat_string_string, string_concat_object_object):
6508         Export standard methods that we expect for string operations.
6509         
6510         * statement.cs (Block::UsageWarning): Track usage of variables and
6511         report the errors for not used variables.
6512
6513         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
6514         operator. 
6515
6516 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
6517
6518         * codegen.cs: remove unnneded code 
6519
6520         * expression.cs: Removed BuiltinTypeAccess class
6521
6522         Fix the order in which implicit conversions are
6523         done.  
6524
6525         The previous fixed dropped support for boxed conversions (adding a
6526         test to the test suite now)
6527
6528         (UserImplicitCast::CanConvert): Remove test for source being null,
6529         that code is broken.  We should not feed a null to begin with, if
6530         we do, then we should track the bug where the problem originates
6531         and not try to cover it up here.
6532
6533         Return a resolved expression of type UserImplicitCast on success
6534         rather than true/false.  Ravi: this is what I was talking about,
6535         the pattern is to use a static method as a "constructor" for
6536         objects. 
6537
6538         Also, do not create arguments until the very last minute,
6539         otherwise we always create the arguments even for lookups that
6540         will never be performed. 
6541
6542         (UserImplicitCast::Resolve): Eliminate, objects of type
6543         UserImplicitCast are born in a fully resolved state. 
6544         
6545         * typemanager.cs (InitCoreTypes): Init also value_type
6546         (System.ValueType). 
6547
6548         * expression.cs (Cast::Resolve): First resolve the child expression.
6549
6550         (LValue): Add new method AddressOf to be used by
6551         the `&' operator.  
6552
6553         Change the argument of Store to take an EmitContext instead of an
6554         ILGenerator, because things like FieldExpr need to be able to call
6555         their children expression to generate the instance code. 
6556
6557         (Expression::Error, Expression::Warning): Sugar functions for
6558         reporting errors.
6559
6560         (Expression::MemberLookup): Accept a TypeContainer instead of a
6561         Report as the first argument.
6562
6563         (Expression::ResolvePrimary): Killed.  I still want to improve
6564         this as currently the code is just not right.
6565
6566         (Expression::ResolveMemberAccess): Simplify, but it is still
6567         wrong. 
6568
6569         (Unary::Resolve): Catch errors in AddressOf operators.
6570
6571         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
6572         index to a byte for the short-version, or the compiler will choose
6573         the wrong Emit call, which generates the wrong data.
6574
6575         (ParameterReference::Emit, ::Store): same.
6576
6577         (FieldExpr::AddressOf): Implement.
6578         
6579         * typemanager.cs: TypeManager: made public variable instead of
6580         property.
6581         
6582         * driver.cs: document --fatal.
6583
6584         * report.cs (ErrorMessage, WarningMessage): new names for the old
6585         Error and Warning classes.
6586
6587         * cs-parser.jay (member_access): Turn built-in access to types
6588         into a normal simplename
6589
6590 2001-09-27  Ravi Pratap  <ravi@ximian.com>
6591
6592         * expression.cs (Invocation::BetterConversion): Fix to cope
6593         with q being null, since this was introducing a bug.
6594
6595         * expression.cs (ConvertImplicit): Do built-in conversions first.
6596
6597 2001-09-27  Ravi Pratap  <ravi@ximian.com>
6598
6599         * expression.cs (UserImplicitCast::Resolve): Fix bug.
6600
6601 2001-09-27  Ravi Pratap  <ravi@ximian.com>
6602
6603         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
6604         I had introduced long ago (what's new ?).
6605
6606         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
6607         the work of all the checking. 
6608         (ConvertImplicit): Call CanConvert and only then create object if necessary.
6609         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
6610
6611         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
6612         that is the right way. 
6613
6614         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
6615         overloading resolution. Use everywhere instead of cutting and pasting code.
6616
6617         (Binary::ResolveOperator): Use MakeUnionSet.
6618
6619         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
6620         we have to convert to bool types. Not complete yet.
6621         
6622 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
6623
6624         * typemanager.cs (TypeManager::CSharpName): support ushort.
6625
6626         * expression.cs (Expression::TryImplicitIntConversion): Attempts
6627         to provide an expression that performsn an implicit constant int
6628         conversion (section 6.1.6).
6629         (Expression::ConvertImplicitRequired): Reworked to include
6630         implicit constant expression conversions.
6631
6632         (Expression::ConvertNumericExplicit): Finished.
6633
6634         (Invocation::Emit): If InstanceExpression is null, then it means
6635         that we perform a call on this.
6636         
6637 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
6638
6639         * expression.cs (Unary::Emit): Remove some dead code.
6640         (Probe): Implement Resolve and Emit for `is'.
6641         (Expression::ConvertImplicitRequired): Attempt to do constant
6642         expression conversions here.  Maybe should be moved to
6643         ConvertImplicit, but I am not sure.
6644         (Expression::ImplicitLongConstantConversionPossible,
6645         Expression::ImplicitIntConstantConversionPossible): New functions
6646         that tell whether is it possible to apply an implicit constant
6647         expression conversion.
6648
6649         (ConvertNumericExplicit): Started work on explicit numeric
6650         conversions.
6651
6652         * cs-parser.jay: Update operator constants.
6653
6654         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
6655         (Parameters::GetSignature): Hook up VerifyArgs here.
6656         (Parameters::VerifyArgs): Verifies that no two arguments have the
6657         same name. 
6658
6659         * class.cs (Operator): Update the operator names to reflect the
6660         ones that the spec expects (as we are just stringizing the
6661         operator names).
6662         
6663         * expression.cs (Unary::ResolveOperator): Fix bug: Use
6664         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
6665         previous usage did only work for our methods.
6666         (Expression::ConvertImplicit): Handle decimal implicit numeric
6667         conversions as well.
6668         (Expression::InternalTypeConstructor): Used to invoke constructors
6669         on internal types for default promotions.
6670
6671         (Unary::Emit): Implement special handling for the pre/post
6672         increment/decrement for overloaded operators, as they need to have
6673         the same semantics as the other operators.
6674
6675         (Binary::ResolveOperator): ditto.
6676         (Invocation::ConversionExists): ditto.
6677         (UserImplicitCast::Resolve): ditto.
6678         
6679 2001-09-26  Ravi Pratap  <ravi@ximian.com>
6680
6681         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
6682         operator, return after emitting body. Regression tests pass again !
6683
6684         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
6685         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
6686         (Invocation::OverloadResolve): Ditto.
6687         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
6688
6689         * everywhere : update calls to the above methods accordingly.
6690
6691 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
6692
6693         * assign.cs (Assign): Make it inherit from ExpressionStatement.
6694
6695         * expression.cs (ExpressionStatement): New base class used for
6696         expressions that can appear in statements, so that we can provide
6697         an alternate path to generate expression that do not leave a value
6698         on the stack.
6699
6700         (Expression::Emit, and all the derivatives): We no longer return
6701         whether a value is left on the stack or not.  Every expression
6702         after being emitted leaves a single value on the stack.
6703
6704         * codegen.cs (EmitContext::EmitStatementExpression): Use the
6705         facilties of ExpressionStatement if possible.
6706
6707         * cs-parser.jay: Update statement_expression.
6708
6709 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
6710
6711         * driver.cs: Change the wording of message
6712
6713 2001-09-25  Ravi Pratap  <ravi@ximian.com>
6714
6715         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
6716         the type of the expression to the return type of the method if
6717         we have an overloaded operator match ! The regression tests pass again !
6718         (Unary::ResolveOperator): Ditto.
6719
6720         * expression.cs (Invocation::ConversionExists): Correct the member lookup
6721         to find "op_Implicit", not "implicit" ;-)
6722         (UserImplicitCast): New class to take care of user-defined implicit conversions.
6723         (ConvertImplicit, ForceConversion): Take TypeContainer argument
6724
6725         * everywhere : Correct calls to the above accordingly.
6726
6727         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
6728         (ConvertImplicit): Do user-defined conversion if it exists.
6729
6730 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
6731
6732         * assign.cs: track location.
6733         (Resolve): Use implicit conversions on assignment.
6734
6735         * literal.cs: Oops.  Not good, Emit of short access values should
6736         pass (Bytes) or the wrong argument will be selected.
6737
6738         * expression.cs (Unary::Emit): Emit code for -expr.
6739         
6740         (Unary::ResolveOperator): Handle `Substract' for non-constants
6741         (substract from zero from the non-constants).
6742         Deal with Doubles as well. 
6743         
6744         (Expression::ConvertImplicitRequired): New routine that reports an
6745         error if no implicit conversion exists. 
6746
6747         (Invocation::OverloadResolve): Store the converted implicit
6748         expressions if we make them
6749         
6750 2001-09-24  Ravi Pratap  <ravi@ximian.com>
6751
6752         * class.cs (ConstructorInitializer): Take a Location argument.
6753         (ConstructorBaseInitializer): Same here.
6754         (ConstructorThisInitializer): Same here.
6755
6756         * cs-parser.jay : Update all calls accordingly.
6757
6758         * expression.cs (Unary, Binary, New): Take location argument.
6759         Update accordingly everywhere.
6760
6761         * cs-parser.jay : Update all calls to the above to take a location
6762         argument.
6763
6764         * class.cs : Ditto.
6765
6766 2001-09-24  Ravi Pratap  <ravi@ximian.com>
6767
6768         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
6769         (Invocation::BetterConversion): Same here
6770         (Invocation::ConversionExists): Ditto.
6771
6772         (Invocation::ConversionExists): Implement.
6773
6774 2001-09-22  Ravi Pratap  <ravi@ximian.com>
6775
6776         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
6777         Also take an additional TypeContainer argument.
6778
6779         * All over : Pass in TypeContainer as argument to OverloadResolve.
6780
6781         * typemanager.cs (CSharpName): Update to check for the string type and return
6782         that too.
6783
6784         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
6785         a given method.
6786         
6787 2001-09-21  Ravi Pratap  <ravi@ximian.com>
6788
6789         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
6790         (Invocation::BetterFunction): Implement.
6791         (Invocation::BetterConversion): Implement.
6792         (Invocation::ConversionExists): Skeleton, no implementation yet.
6793
6794         Okay, things work fine !
6795
6796 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
6797
6798         * typemanager.cs: declare and load enum_type, delegate_type and
6799         void_type. 
6800
6801         * expression.cs (Expression::Emit): Now emit returns a value that
6802         tells whether a value is left on the stack or not.  This strategy
6803         might be reveted tomorrow with a mechanism that would address
6804         multiple assignments.
6805         (Expression::report118): Utility routine to report mismatches on
6806         the ExprClass.
6807
6808         (Unary::Report23): Report impossible type/operator combination
6809         utility function.
6810
6811         (Unary::IsIncrementableNumber): Whether the type can be
6812         incremented or decremented with add.
6813         (Unary::ResolveOperator): Also allow enumerations to be bitwise
6814         complemented. 
6815         (Unary::ResolveOperator): Implement ++, !, ~,
6816
6817         (Invocation::Emit): Deal with new Emit convetion.
6818         
6819         * All Expression derivatives: Updated their Emit method to return
6820         whether they leave values on the stack or not.
6821         
6822         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
6823         stack for expressions that are statements. 
6824
6825 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
6826
6827         * expression.cs (LValue): New interface.  Must be implemented by
6828         LValue objects.
6829         (LocalVariableReference, ParameterReference, FieldExpr): Implement
6830         LValue interface.
6831         
6832         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
6833         interface for generating code, simplifies the code.
6834
6835 2001-09-20  Ravi Pratap  <ravi@ximian.com>
6836
6837         * expression.cs (everywhere): Comment out return statements in ::Resolve
6838         methods to avoid the warnings.
6839
6840 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
6841
6842         * driver.cs (parse): Report error 2001 if we can not open the
6843         source file.
6844
6845         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
6846         not resolve it.
6847
6848         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
6849         object. 
6850
6851         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
6852         otherwise nested blocks end up with the same index.
6853
6854         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
6855
6856         * expression.cs:  Instead of having FIXMEs in the Resolve
6857         functions, throw exceptions so it is obvious that we are facing a
6858         bug. 
6859
6860         * cs-parser.jay (invocation_expression): Pass Location information.
6861
6862         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
6863         Use a basename for those routines because .NET does not like paths
6864         on them. 
6865
6866         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
6867         already defined.
6868
6869 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
6870
6871         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
6872         are loading the correct data types (throws an exception if not).
6873         (TypeManager::InitCoreTypes): Use CoreLookupType
6874
6875         * expression.cs (Unary::ResolveOperator): return the child
6876         expression for expressions which are just +expr.
6877         (Unary::ResolveOperator): Return negative literals for -LITERAL
6878         expressions (otherwise they are Unary {Literal}).
6879         (Invocation::Badness): Take into account `Implicit constant
6880         expression conversions'.
6881
6882         * literal.cs (LongLiteral): Implement long literal class.
6883         (IntLiteral): export the `Value' of the intliteral. 
6884
6885 2001-09-19  Ravi Pratap  <ravi@ximian.com>
6886
6887         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
6888
6889         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
6890         instead of 'Operator'
6891
6892         * expression.cs (Binary::ResolveOperator): Update accordingly.
6893         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
6894         and 'Minus'
6895
6896         * cs-parser.jay (unary_expression): Update to use the new names.
6897
6898         * gen-treedump.cs (GetUnary): Same here.
6899
6900         * expression.cs (Unary::Resolve): Implement.
6901         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
6902         operators are found instead of making noise ;-)
6903         (Unary::ResolveOperator): New method to do precisely the same thing which
6904         Binary::ResolveOperator does for Binary expressions.
6905         (Unary.method, .Arguments): Add.
6906         (Unary::OperName): Implement.   
6907         (Unary::ForceConversion): Copy and Paste !
6908
6909         * class.cs (Operator::Define): Fix a small bug for the case when we have 
6910         a unary operator.
6911
6912         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
6913         for the inbuilt operators. Only overloading works for now ;-)
6914
6915 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
6916
6917         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
6918         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
6919
6920         * expression.cs (This::Emit): Implement. 
6921         (This::Resolve): Implement.
6922         (TypeOf:Resolve): Implement.
6923         (Expression::ResolveSimpleName): Add an implicit this to instance
6924         field references. 
6925         (MemberAccess::Resolve): Deal with Parameters and Fields. 
6926         Bind instance variable to Field expressions.
6927         (FieldExpr::Instance): New field used to track the expression that
6928         represents the object instance.
6929         (FieldExpr::Resolve): Track potential errors from MemberLookup not
6930         binding 
6931         (FieldExpr::Emit): Implement.
6932
6933         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
6934         the last instruction contains a return opcode to avoid generating
6935         the last `ret' instruction (this generates correct code, and it is
6936         nice to pass the peverify output).
6937
6938         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
6939         initializer for static and instance variables.
6940         (Constructor::Emit): Allow initializer to be null in the case of
6941         static constructors.  Only emit initializer for instance
6942         constructors. 
6943
6944         (TypeContainer::FindMembers): Return a null array if there are no
6945         matches.
6946
6947         Also fix the code for the MemberTypes.Method branch, as it was not
6948         scanning that for operators (or tried to access null variables before).
6949
6950         * assign.cs (Assign::Emit): Handle instance and static fields. 
6951
6952         * TODO: Updated.
6953
6954         * driver.cs: Stop compilation if there are parse errors.
6955
6956         * cs-parser.jay (constructor_declaration): Provide default base
6957         initializer for non-static constructors.
6958         (constructor_declarator): Do not provide a default base
6959         initializers if none was specified.
6960         Catch the fact that constructors should not have parameters.
6961
6962         * class.cs: Do not emit parent class initializers for static
6963         constructors, that should be flagged as an error.
6964
6965 2001-09-18  Ravi Pratap  <ravi@ximian.com>
6966
6967         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
6968         Move back code into TypeContainer::Populate.
6969
6970 2001-09-18  Ravi Pratap  <ravi@ximian.com>
6971
6972         * class.cs (TypeContainer::AddConstructor): Fix the check to
6973         compare against Name, not Basename. 
6974         (Operator::OpType): Change Plus and Minus to Add and Subtract.
6975
6976         * cs-parser.jay : Update accordingly.
6977
6978         * class.cs (TypeContainer::FindMembers): For the case where we are searching
6979         for methods, don't forget to look into the operators too.
6980         (RegisterMethodBuilder): Helper method to take care of this for
6981         methods, constructors and operators.
6982         (Operator::Define): Completely revamp.
6983         (Operator.OperatorMethod, MethodName): New fields.
6984         (TypeContainer::Populate): Move the registering of builders into
6985         RegisterMethodBuilder.
6986         (Operator::Emit): Re-write.
6987
6988         * expression.cs (Binary::Emit): Comment out code path to emit method
6989         invocation stuff for the case when we have a user defined operator. I am
6990         just not able to get it right !
6991         
6992 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
6993
6994         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
6995         argument. 
6996
6997         (Expression::MemberLookup): Provide a version that allows to
6998         specify the MemberTypes and BindingFlags. 
6999
7000         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
7001         so it was not fetching variable information from outer blocks.
7002
7003         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
7004         Beforefieldinit as it was buggy.
7005
7006         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
7007         that Ravi put here.  
7008
7009         * class.cs (Constructor::Emit): Only emit if block is not null.
7010         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
7011         deal with this by semantically definining it as if the user had
7012         done it.
7013
7014         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
7015         constructors as we now "emit" them at a higher level.
7016
7017         (TypeContainer::DefineDefaultConstructor): Used to define the
7018         default constructors if none was provided.
7019
7020         (ConstructorInitializer): Add methods Resolve and Emit. 
7021         
7022         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
7023
7024 2001-09-17  Ravi Pratap  <ravi@ximian.com>
7025
7026         * class.cs (TypeContainer::EmitDefaultConstructor): Register
7027         the default constructor builder with our hashtable for methodbuilders
7028         to methodcores.
7029
7030         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
7031         and argument_count is 0 in which case we have a match.
7032         (Binary::ResolveOperator): More null checking and miscellaneous coding
7033         style cleanup.
7034
7035 2001-09-17  Ravi Pratap  <ravi@ximian.com>
7036
7037         * rootcontext.cs (IsNameSpace): Compare against null.
7038
7039         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
7040
7041         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
7042         and Unary::Operator.
7043
7044         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
7045         accordingly.
7046
7047         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
7048         we have overloaded operators.
7049         (Binary::ResolveOperator): Implement the part which does the operator overload
7050         resolution.
7051
7052         * class.cs (Operator::Emit): Implement.
7053         (TypeContainer::Emit): Emit the operators we have too.
7054
7055         * expression.cs (Binary::Emit): Update to emit the appropriate code for
7056         the case when we have a user-defined operator.
7057         
7058 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
7059
7060         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
7061
7062 2001-09-16  Ravi Pratap  <ravi@ximian.com>
7063
7064         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
7065         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
7066         (Constructor::Emit): Implement.
7067         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
7068         if we have no work to do. 
7069         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
7070         Emit method.
7071
7072         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
7073         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
7074
7075         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
7076         of parent.parent.
7077
7078 2001-09-15  Ravi Pratap  <ravi@ximian.com>
7079
7080         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
7081         in the source.
7082         (Tree::RecordNamespace): Method to do what the name says ;-)
7083         (Tree::Namespaces): Property to get at the namespaces hashtable.
7084
7085         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
7086         keep track.
7087
7088         * rootcontext.cs (IsNamespace): Fixed it :-)
7089
7090 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
7091
7092         * class.cs (TypeContainer::FindMembers): Add support for
7093         constructors. 
7094         (MethodCore): New class that encapsulates both the shared aspects
7095         of a Constructor and a Method.  
7096         (Method, Constructor): Factored pieces into MethodCore.
7097
7098         * driver.cs: Added --fatal which makes errors throw exceptions.
7099         Load System assembly as well as part of the standard library.
7100
7101         * report.cs: Allow throwing exceptions on errors for debugging.
7102
7103         * modifiers.cs: Do not use `parent', instead use the real type
7104         container to evaluate permission settings.
7105
7106         * class.cs: Put Ravi's patch back in.  He is right, and we will
7107         have to cope with the
7108
7109 2001-09-14  Ravi Pratap  <ravi@ximian.com>
7110
7111         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
7112         FamORAssem, not FamANDAssem.
7113         
7114 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
7115
7116         * driver.cs: Added --parse option that only parses its input files
7117         and terminates.
7118
7119         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
7120         incorrect.  IsTopLevel is not used to tell whether an object is
7121         root_types or not (that can be achieved by testing this ==
7122         root_types).  But to see if this is a top-level *class* (not
7123         necessarly our "toplevel" container). 
7124
7125 2001-09-14  Ravi Pratap  <ravi@ximian.com>
7126
7127         * enum.cs (Enum::Define): Modify to call the Lookup method on the
7128         parent instead of a direct call to GetType.
7129
7130 2001-09-14  Ravi Pratap  <ravi@ximian.com>
7131
7132         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
7133         Modifiers.TypeAttr. This should just be a call to that method.
7134
7135         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
7136         object so that we can determine if we are top-level or not.
7137
7138         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
7139         TypeContainer too.
7140
7141         * enum.cs (Enum::Define): Ditto.
7142
7143         * modifiers.cs (FieldAttr): Re-write.
7144
7145         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
7146         (TypeContainer::HaveStaticConstructor): New property to provide access
7147         to precisely that info.
7148
7149         * modifiers.cs (MethodAttr): Re-write.
7150         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
7151
7152         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
7153         of top-level types as claimed.
7154         
7155 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
7156
7157         * expression.cs (MemberLookup): Fruitless attempt to lookup
7158         constructors.  Maybe I need to emit default constructors?  That
7159         might be it (currently .NET emits this for me automatically).
7160         (Invocation::OverloadResolve): Cope with Arguments == null.
7161         (Invocation::EmitArguments): new function, shared by the new
7162         constructor and us.
7163         (Invocation::Emit): Handle static and instance methods.  Emit
7164         proper call instruction for virtual or non-virtual invocations.
7165         (New::Emit): Implement.
7166         (New::Resolve): Implement.
7167         (MemberAccess:Resolve): Implement.
7168         (MethodGroupExpr::InstanceExpression): used conforming to the spec
7169         to track instances.
7170         (FieldExpr::Resolve): Set type.
7171
7172         * support.cs: Handle empty arguments.
7173                 
7174         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
7175         SimpleLookup): Auxiliary routines to help parse a qualifier
7176         identifier.  
7177
7178         Update qualifier_identifier rule.
7179
7180         * codegen.cs: Removed debugging messages.
7181
7182         * class.cs: Make this a global thing, this acts just as a "key" to
7183         objects that we might have around.
7184
7185         (Populate): Only initialize method_builders_to_methods once.
7186
7187         * expression.cs (PropertyExpr): Initialize type from the
7188         PropertyType. 
7189
7190         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
7191         Resolve pattern.  Attempt to implicitly convert value to boolean.
7192         Emit code.
7193
7194         * expression.cs: Set the type for the int32/int32 argument case.
7195         (Binary::ResolveOperator): Set the return type to boolean for
7196         comparission operators
7197
7198         * typemanager.cs: Remove debugging print code.
7199
7200         (Invocation::Resolve): resolve type.
7201
7202         * class.cs: Allocate a MemberInfo of the correct size, as the code
7203         elsewhere depends on the test to reflect the correct contents.
7204
7205         (Method::) Keep track of parameters, due to System.Reflection holes
7206
7207         (TypeContainer::Populate): Keep track of MethodBuilders to Method
7208         mapping here.
7209
7210         (TypeContainer::FindMembers): Use ArrayList and then copy an array
7211         of the exact size and return that.
7212
7213         (Class::LookupMethodByBuilder): New function that maps
7214         MethodBuilders to its methods.  Required to locate the information
7215         on methods because System.Reflection bit us again.
7216
7217         * support.cs: New file, contains an interface ParameterData and
7218         two implementations: ReflectionParameters and InternalParameters
7219         used to access Parameter information.  We will need to grow this
7220         as required.
7221
7222         * expression.cs (Invocation::GetParameterData): implement a cache
7223         and a wrapper around the ParameterData creation for methods. 
7224         (Invocation::OverloadResolve): Use new code.
7225
7226 2001-09-13  Ravi Pratap  <ravi@ximian.com>
7227
7228         * class.cs (TypeContainer::EmitField): Remove and move into 
7229         (Field::Define): here and modify accordingly.
7230         (Field.FieldBuilder): New member.
7231         (TypeContainer::Populate): Update accordingly.
7232         (TypeContainer::FindMembers): Implement.
7233
7234 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
7235
7236         * statement.cs: (VariableInfo::VariableType): New field to be
7237         initialized with the full type once it is resolved. 
7238
7239 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
7240
7241         * parameter.cs (GetParameterInfo): Use a type cache to compute
7242         things only once, and to reuse this information
7243
7244         * expression.cs (LocalVariableReference::Emit): Implement.
7245         (OpcodeCast::Emit): fix.
7246
7247         (ParameterReference::Resolve): Implement.
7248         (ParameterReference::Emit): Implement.
7249
7250         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
7251         that are expressions need to stay as Expressions.
7252
7253         * typemanager.cs (CSharpName): Returns the C# name of a type if
7254         possible. 
7255
7256         * expression.cs (Expression::ConvertImplicit): New function that
7257         implements implicit type conversions.
7258
7259         (Expression::ImplicitReferenceConversion): Implements implicit
7260         reference conversions.
7261
7262         (EmptyCast): New type for transparent casts.
7263
7264         (OpcodeCast): New type for casts of types that are performed with
7265         a sequence of bytecodes.
7266         
7267         (BoxedCast): New type used for casting value types into reference
7268         types.  Emits a box opcode.
7269
7270         (Binary::DoNumericPromotions): Implements numeric promotions of
7271         and computation of the Binary::Type.
7272
7273         (Binary::EmitBranchable): Optimization.
7274
7275         (Binary::Emit): Implement code emission for expressions.
7276         
7277         * typemanager.cs (TypeManager): Added two new core types: sbyte
7278         and byte.
7279
7280 2001-09-12  Ravi Pratap  <ravi@ximian.com>
7281
7282         * class.cs (TypeContainer::FindMembers): Method which does exactly
7283         what Type.FindMembers does, only we don't have to use reflection. No
7284         implementation yet.
7285
7286         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
7287         typecontainer objects as we need to get at them.
7288         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
7289
7290         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
7291         typecontainer object.
7292
7293         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
7294         of just a Report object.
7295
7296 2001-09-11  Ravi Pratap  <ravi@ximian.com>
7297
7298         * class.cs (Event::Define): Go back to using the prefixes "add_" and
7299         "remove_"
7300         (TypeContainer::Populate): Now define the delegates of the type too.
7301         (TypeContainer.Delegates): Property to access the list of delegates defined
7302         in the type.
7303
7304         * delegates.cs (Delegate::Define): Implement partially.
7305
7306         * modifiers.cs (TypeAttr): Handle more flags.
7307
7308 2001-09-11  Ravi Pratap  <ravi@ximian.com>
7309
7310         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
7311         and not <=
7312         (Operator::Define): Re-write logic to get types by using the LookupType method
7313         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
7314         (Indexer::Define): Ditto.
7315         (Event::Define): Ditto.
7316         (Property::Define): Ditto.
7317         
7318 2001-09-10  Ravi Pratap  <ravi@ximian.com>
7319
7320         * class.cs (TypeContainer::Populate): Now define operators too. 
7321         (TypeContainer.Operators): New property to access the list of operators
7322         in a type.
7323         (Operator.OperatorMethodBuilder): New member to hold the method builder
7324         for the operator we are defining.
7325         (Operator::Define): Implement.
7326
7327 2001-09-10  Ravi Pratap  <ravi@ximian.com>
7328
7329         * class.cs (Event::Define): Make the prefixes of the accessor methods
7330         addOn_ and removeOn_ 
7331
7332         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
7333         of the location being passed in too. Ideally, this should go later since all
7334         error reporting should be done through the Report object.
7335
7336         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
7337         (Populate): Iterate thru the indexers we have and define them too.
7338         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
7339         for the get and set accessors.
7340         (Indexer::Define): Implement.
7341         
7342 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
7343
7344         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
7345         my previous implementation, did not work.
7346
7347         * typemanager.cs: Add a couple of missing types (the longs).
7348
7349         * literal.cs: Use TypeManager.bool_type instead of getting it.
7350
7351         * expression.cs (EventExpr): New kind of expressions.
7352         (Expressio::ExprClassFromMemberInfo): finish
7353
7354 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
7355
7356         * assign.cs: Emit stores to static fields differently.
7357
7358 2001-09-08  Ravi Pratap  <ravi@ximian.com>
7359
7360         * Merge in changes and adjust code to tackle conflicts. Backed out my
7361         code in Assign::Resolve ;-) 
7362
7363 2001-09-08  Ravi Pratap  <ravi@ximian.com>
7364
7365         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
7366         instead Report.Error and also pass in the location.
7367         (CSharpParser::Lexer): New readonly property to return the reference
7368         to the Tokenizer object.
7369         (declare_local_variables): Use Report.Error with location instead of plain 
7370         old error.
7371         (CheckDef): Ditto.
7372
7373         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
7374         (Operator.CheckBinaryOperator): Ditto.
7375
7376         * cs-parser.jay (operator_declarator): Update accordingly.
7377
7378         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
7379         (CheckBinaryOperator): Same here.
7380
7381         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
7382         on the name without any prefixes of namespace names etc. This is because we
7383         already might have something already fully qualified like 
7384         'System.Console.WriteLine'
7385
7386         * assign.cs (Resolve): Begin implementation. Stuck ;-)
7387
7388 2001-09-07  Ravi Pratap  <ravi@ximian.com>
7389
7390         * cs-tokenizer.cs (location): Return a string which also contains
7391         the file name.
7392
7393         * expression.cs (ElementAccess): New class for expressions of the
7394         type 'element access.'
7395         (BaseAccess): New class for expressions of the type 'base access.'
7396         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
7397         respectively.
7398         
7399         * cs-parser.jay (element_access): Implement action.
7400         (base_access): Implement actions.
7401         (checked_expression, unchecked_expression): Implement.
7402
7403         * cs-parser.jay (local_variable_type): Correct and implement.
7404         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
7405
7406         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
7407
7408         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
7409         name and the specifiers.
7410
7411         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
7412         
7413         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
7414         making them all public ;-)
7415
7416         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
7417         class anyways.
7418         
7419 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
7420
7421         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
7422         PropertyExprs.
7423         (FieldExpr, PropertyExprs): New resolved expressions.
7424         (SimpleName::MemberStaticCheck): Perform static checks for access
7425         to non-static fields on static methods. Maybe this should be
7426         generalized for MemberAccesses. 
7427         (SimpleName::ResolveSimpleName): More work on simple name
7428         resolution. 
7429
7430         * cs-parser.jay (primary_expression/qualified_identifier): track
7431         the parameter index.
7432
7433         * codegen.cs (CodeGen::Save): Catch save exception, report error.
7434         (EmitContext::EmitBoolExpression): Chain to expression generation
7435         instead of temporary hack.
7436         (::EmitStatementExpression): Put generic expression code generation.
7437
7438         * assign.cs (Assign::Emit): Implement variable assignments to
7439         local variables, parameters and fields.
7440
7441 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
7442
7443         * statement.cs (Block::GetVariableInfo): New method, returns the
7444         VariableInfo for a variable name in a block.
7445         (Block::GetVariableType): Implement in terms of GetVariableInfo
7446
7447         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
7448         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
7449
7450 2001-09-06  Ravi Pratap  <ravi@ximian.com>
7451
7452         * cs-parser.jay (operator_declaration): Continue on my quest : update
7453         to take attributes argument.
7454         (event_declaration): Ditto.
7455         (enum_declaration): Ditto.
7456         (indexer_declaration): Ditto.
7457         
7458         * class.cs (Operator::Operator): Update constructor accordingly.
7459         (Event::Event): Ditto.
7460
7461         * delegate.cs (Delegate::Delegate): Same here.
7462
7463         * enum.cs (Enum::Enum): Same here.
7464         
7465 2001-09-05  Ravi Pratap  <ravi@ximian.com>
7466
7467         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
7468
7469         * ../tests/cs0658.cs : New file to demonstrate error 0658.
7470
7471         * attribute.cs (Attributes): New class to encapsulate all attributes which were
7472         being passed around as an arraylist.
7473         (Attributes::AddAttribute): Method to add attribute sections.
7474
7475         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
7476         (struct_declaration): Update accordingly.
7477         (constant_declaration): Update.
7478         (field_declaration): Update.
7479         (method_header): Update.
7480         (fixed_parameter): Update.
7481         (parameter_array): Ditto.
7482         (property_declaration): Ditto.
7483         (destructor_declaration): Ditto.
7484         
7485         * class.cs (Struct::Struct): Update constructors accordingly.
7486         (Class::Class): Ditto.
7487         (Field::Field): Ditto.
7488         (Method::Method): Ditto.
7489         (Property::Property): Ditto.
7490         (TypeContainer::OptAttribute): update property's return type.
7491         
7492         * interface.cs (Interface.opt_attributes): New member.
7493         (Interface::Interface): Update to take the extra Attributes argument.
7494
7495         * parameter.cs (Parameter::Parameter): Ditto.
7496
7497         * constant.cs (Constant::Constant): Ditto.
7498
7499         * interface.cs (InterfaceMemberBase): New OptAttributes field.
7500         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
7501         the attributes as a parameter.
7502         (InterfaceProperty): Update constructor call.
7503         (InterfaceEvent): Ditto.
7504         (InterfaceMethod): Ditto.
7505         (InterfaceIndexer): Ditto.
7506
7507         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
7508         pass the attributes too.
7509         (interface_event_declaration): Ditto.
7510         (interface_property_declaration): Ditto.
7511         (interface_method_declaration): Ditto.
7512         (interface_declaration): Ditto.
7513
7514 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
7515
7516         * class.cs (Method::Define): Track the "static Main" definition to
7517         create an entry point. 
7518
7519         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
7520         EntryPoint if we find it. 
7521
7522         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
7523         (EmitContext::ig): Make this variable public.
7524
7525         * driver.cs: Make the default output file be the first file name
7526         with the .exe extension.  
7527
7528         Detect empty compilations
7529
7530         Handle various kinds of output targets.  Handle --target and
7531         rename -t to --dumper.
7532
7533         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
7534         methods inherited from Expression return now an Expression.  This
7535         will is used during the tree rewriting as we resolve them during
7536         semantic analysis.
7537
7538         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
7539         the spec.  Missing entirely is the information about
7540         accessability of elements of it.
7541
7542         (Expression::ExprClassFromMemberInfo): New constructor for
7543         Expressions that creates a fully initialized Expression based on
7544         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
7545         a Type.
7546
7547         (Invocation::Resolve): Begin implementing resolution of invocations.
7548         
7549         * literal.cs (StringLiteral):  Implement Emit.
7550
7551 2001-09-05  Ravi Pratap  <ravi@ximian.com>
7552
7553         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
7554         member.
7555         
7556 2001-09-04  Ravi Pratap  <ravi@ximian.com>
7557
7558         * cs-parser.jay (attribute_arguments): Implement actions.
7559         (attribute): Fix bug in production. Implement action.
7560         (attribute_list): Implement.
7561         (attribute_target): Implement.
7562         (attribute_target_specifier, opt_target_specifier): Implement
7563         (CheckAttributeTarget): New method to check if the attribute target
7564         is valid.
7565         (attribute_section): Implement.
7566         (opt_attributes): Implement.
7567
7568         * attribute.cs : New file to handle attributes.
7569         (Attribute): Class to hold attribute info.
7570
7571         * cs-parser.jay (opt_attribute_target_specifier): Remove production
7572         (attribute_section): Modify production to use 2 different rules to 
7573         achieve the same thing. 1 s/r conflict down !
7574         Clean out commented, useless, non-reducing dimension_separator rules.
7575         
7576         * class.cs (TypeContainer.attributes): New member to hold list
7577         of attributes for a type.
7578         (Struct::Struct): Modify to take one more argument, the attribute list.
7579         (Class::Class): Ditto.
7580         (Field::Field): Ditto.
7581         (Method::Method): Ditto.
7582         (Property::Property): Ditto.
7583         
7584         * cs-parser.jay (struct_declaration): Update constructor call to
7585         pass in the attributes too.
7586         (class_declaration): Ditto.
7587         (constant_declaration): Ditto.
7588         (field_declaration): Ditto.
7589         (method_header): Ditto.
7590         (fixed_parameter): Ditto.
7591         (parameter_array): Ditto.
7592         (property_declaration): Ditto.
7593
7594         * constant.cs (Constant::Constant): Update constructor similarly.
7595         Use System.Collections.
7596
7597         * parameter.cs (Parameter::Parameter): Update as above.
7598
7599 2001-09-02  Ravi Pratap  <ravi@ximian.com>
7600
7601         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
7602         (TypeContainer.delegates): New member to hold list of delegates.
7603
7604         * cs-parser.jay (delegate_declaration): Implement the action correctly 
7605         this time as I seem to be on crack ;-)
7606
7607 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
7608
7609         * rootcontext.cs (RootContext::IsNamespace): new function, used to
7610         tell whether an identifier represents a namespace.
7611
7612         * expression.cs (NamespaceExpr): A namespace expression, used only
7613         temporarly during expression resolution.
7614         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
7615         utility functions to resolve names on expressions.
7616
7617 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
7618
7619         * codegen.cs: Add hook for StatementExpressions. 
7620
7621         * class.cs: Fix inverted test for static flag in methods.
7622
7623 2001-09-02  Ravi Pratap  <ravi@ximian.com>
7624
7625         * class.cs (Operator::CheckUnaryOperator): Correct error number used
7626         to make it coincide with MS' number.
7627         (Operator::CheckBinaryOperator): Ditto.
7628
7629         * ../errors/errors.txt : Remove error numbers added earlier.
7630
7631         * ../errors/cs1019.cs : Test case for error # 1019
7632
7633         * ../errros/cs1020.cs : Test case for error # 1020
7634
7635         * cs-parser.jay : Clean out commented cruft.
7636         (dimension_separators, dimension_separator): Comment out. Ostensibly not
7637         used anywhere - non-reducing rule.
7638         (namespace_declarations): Non-reducing rule - comment out.
7639
7640         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
7641         with TypeContainer::AddEnum.
7642
7643         * delegate.cs : New file for delegate handling classes.
7644         (Delegate): Class for declaring delegates.
7645
7646         * makefile : Update.
7647
7648         * cs-parser.jay (delegate_declaration): Implement.
7649
7650 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
7651
7652         * class.cs (Event::Define): Implement.
7653         (Event.EventBuilder): New member.
7654
7655         * class.cs (TypeContainer::Populate): Update to define all enums and events
7656         we have.
7657         (Events): New property for the events arraylist we hold. Shouldn't we move to using
7658         readonly fields for all these cases ?
7659
7660 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
7661
7662         * class.cs (Property): Revamp to use the convention of making fields readonly.
7663         Accordingly modify code elsewhere.
7664
7665         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
7666         the Define method of the Property class.
7667
7668         * class.cs : Clean up applied patch and update references to variables etc. Fix 
7669         trivial bug.
7670         (TypeContainer::Populate): Update to define all the properties we have. Also
7671         define all enumerations.
7672
7673         * enum.cs (Define): Implement.
7674         
7675 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
7676
7677         * cs-parser.jay (overloadable_operator): The semantic value is an
7678         enum of the Operator class.
7679         (operator_declarator): Implement actions.
7680         (operator_declaration): Implement.
7681
7682         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
7683         validity of definitions.
7684         (Operator::CheckBinaryOperator): Static method to check for binary operators
7685         (TypeContainer::AddOperator): New method to add an operator to a type.
7686
7687         * cs-parser.jay (indexer_declaration): Added line to actually call the
7688         AddIndexer method so it gets added ;-)
7689
7690         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
7691         already taken care of by the MS compiler ?  
7692
7693 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
7694
7695         * class.cs (Operator): New class for operator declarations.
7696         (Operator::OpType): Enum for the various operators.
7697
7698 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
7699
7700         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
7701         ostensibly handle this in semantic analysis.
7702
7703         * cs-parser.jay (general_catch_clause): Comment out
7704         (specific_catch_clauses, specific_catch_clause): Ditto.
7705         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
7706         (catch_args, opt_catch_args): New productions.
7707         (catch_clause): Rewrite to use the new productions above
7708         (catch_clauses): Modify accordingly.
7709         (opt_catch_clauses): New production to use in try_statement
7710         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
7711         and re-write the code in the actions to extract the specific and
7712         general catch clauses by being a little smart ;-)
7713
7714         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
7715         Hooray, try and catch statements parse fine !
7716         
7717 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
7718
7719         * statement.cs (Block::GetVariableType): Fix logic to extract the type
7720         string from the hashtable of variables.
7721
7722         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
7723         I end up making that mistake ;-)
7724         (catch_clauses): Fixed gross error which made Key and Value of the 
7725         DictionaryEntry the same : $1 !!
7726
7727 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
7728
7729         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
7730
7731         * cs-parser.jay (event_declaration): Correct to remove the semicolon
7732         when the add and remove accessors are specified. 
7733
7734 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
7735
7736         * cs-parser.jay (IndexerDeclaration): New helper class to hold
7737         information about indexer_declarator.
7738         (indexer_declarator): Implement actions.
7739         (parsing_indexer): New local boolean used to keep track of whether
7740         we are parsing indexers or properties. This is necessary because 
7741         implicit_parameters come into picture even for the get accessor in the 
7742         case of an indexer.
7743         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
7744
7745         * class.cs (Indexer): New class for indexer declarations.
7746         (TypeContainer::AddIndexer): New method to add an indexer to a type.
7747         (TypeContainer::indexers): New member to hold list of indexers for the
7748         type.
7749
7750 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
7751
7752         * cs-parser.jay (add_accessor_declaration): Implement action.
7753         (remove_accessor_declaration): Implement action.
7754         (event_accessors_declaration): Implement
7755         (variable_declarators): swap statements for first rule - trivial.
7756
7757         * class.cs (Event): New class to hold information about event
7758         declarations.
7759         (TypeContainer::AddEvent): New method to add an event to a type
7760         (TypeContainer::events): New member to hold list of events.
7761
7762         * cs-parser.jay (event_declaration): Implement actions.
7763
7764 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
7765
7766         * cs-parser.jay (dim_separators): Implement. Make it a string
7767         concatenating all the commas together, just as they appear.
7768         (opt_dim_separators): Modify accordingly
7769         (rank_specifiers): Update accordingly. Basically do the same
7770         thing - instead, collect the brackets here.
7771         (opt_rank_sepcifiers): Modify accordingly.
7772         (array_type): Modify to actually return the complete type string
7773         instead of ignoring the rank_specifiers.
7774         (expression_list): Implement to collect the expressions
7775         (variable_initializer): Implement. We make it a list of expressions
7776         essentially so that we can handle the array_initializer case neatly too.
7777         (variable_initializer_list): Implement.
7778         (array_initializer): Make it a list of variable_initializers
7779         (opt_array_initializer): Modify accordingly.
7780
7781         * expression.cs (New::NType): Add enumeration to help us
7782         keep track of whether we have an object/delegate creation
7783         or an array creation.
7784         (New:NewType, New::Rank, New::Indices, New::Initializers): New
7785         members to hold data about array creation.
7786         (New:New): Modify to update NewType
7787         (New:New): New Overloaded contructor for the array creation
7788         case.
7789
7790         * cs-parser.jay (array_creation_expression): Implement to call
7791         the overloaded New constructor.
7792         
7793 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
7794
7795         * class.cs (TypeContainer::Constructors): Return member
7796         constructors instead of returning null.
7797
7798 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
7799
7800         * typemanager.cs (InitCoreTypes): Initialize the various core
7801         types after we have populated the type manager with the user
7802         defined types (this distinction will be important later while
7803         compiling corlib.dll)
7804
7805         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
7806         on Expression Classification.  Now all expressions have a method
7807         `Resolve' and a method `Emit'.
7808
7809         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
7810         generation from working.     Also add some temporary debugging
7811         code. 
7812         
7813 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
7814
7815         * codegen.cs: Lots of code generation pieces.  This is only the
7816         beginning, will continue tomorrow with more touches of polish.  We
7817         handle the fundamentals of if, while, do, for, return.  Others are
7818         trickier and I need to start working on invocations soon.
7819         
7820         * gen-treedump.cs: Bug fix, use s.Increment here instead of
7821         s.InitStatement. 
7822
7823         * codegen.cs (EmitContext): New struct, used during code
7824         emission to keep a context.   Most of the code generation will be
7825         here. 
7826
7827         * cs-parser.jay: Add embedded blocks to the list of statements of
7828         this block.  So code generation proceeds in a top down fashion.
7829
7830 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
7831
7832         * statement.cs: Add support for multiple child blocks.
7833
7834 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
7835
7836         * codegen.cs (EmitCode): New function, will emit the code for a
7837         Block of code given a TypeContainer and its ILGenerator. 
7838
7839         * statement.cs (Block): Standard public readonly optimization.
7840         (Block::Block constructors): Link children. 
7841         (Block::Child): Child Linker.
7842         (Block::EmitVariables): Emits IL variable declarations.
7843
7844         * class.cs: Drop support for MethodGroups here, delay until
7845         Semantic Analysis.
7846         (Method::): Applied the same simplification that I did before, and
7847         move from Properties to public readonly fields.
7848         (Method::ParameterTypes): Returns the parameter types for the
7849         function, and implements a cache that will be useful later when I
7850         do error checking and the semantic analysis on the methods is
7851         performed.
7852         (Constructor::GetCallingConvention): Renamed from CallingConvetion
7853         and made a method, optional argument tells whether this is a class
7854         or a structure to apply the `has-this' bit.
7855         (Method::GetCallingConvention): Implement, returns the calling
7856         convention. 
7857         (Method::Define): Defines the type, a second pass is performed
7858         later to populate the methods.
7859
7860         (Constructor::ParameterTypes): implement a cache similar to the
7861         one on Method::ParameterTypes, useful later when we do semantic
7862         analysis. 
7863
7864         (TypeContainer::EmitMethod):  New method.  Emits methods.
7865
7866         * expression.cs: Removed MethodGroup class from here.
7867         
7868         * parameter.cs (Parameters::GetCallingConvention): new method.
7869
7870 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
7871
7872         * class.cs (TypeContainer::Populate): Drop RootContext from the
7873         argument. 
7874
7875         (Constructor::CallingConvention): Returns the calling convention.
7876         (Constructor::ParameterTypes): Returns the constructor parameter
7877         types. 
7878         
7879         (TypeContainer::AddConstructor): Keep track of default constructor
7880         and the default static constructor.
7881
7882         (Constructor::) Another class that starts using `public readonly'
7883         instead of properties. 
7884
7885         (Constructor::IsDefault): Whether this is a default constructor. 
7886
7887         (Field::) use readonly public fields instead of properties also.
7888
7889         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
7890         track of static constructors;  If none is used, turn on
7891         BeforeFieldInit in the TypeAttributes. 
7892
7893         * cs-parser.jay (opt_argument_list): now the return can be null
7894         for the cases where there are no arguments. 
7895
7896         (constructor_declarator): If there is no implicit `base' or
7897         `this', then invoke the default parent constructor. 
7898         
7899         * modifiers.cs (MethodAttr): New static function maps a set of
7900         modifiers flags into a MethodAttributes enum
7901         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
7902         MethodAttr, TypeAttr to represent the various mappings where the
7903         modifiers are used.
7904         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
7905
7906 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
7907
7908         * parameter.cs (GetParameterInfo): Fix bug where there would be no
7909         method arguments.
7910
7911         * interface.cs (PopulateIndexer): Implemented the code generator
7912         for interface indexers.
7913
7914 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
7915
7916         * interface.cs (InterfaceMemberBase): Now we track the new status
7917         here.  
7918
7919         (PopulateProperty): Implement property population.  Woohoo!  Got
7920         Methods and Properties going today. 
7921
7922         Removed all the properties for interfaces, and replaced them with
7923         `public readonly' fields. 
7924
7925 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
7926
7927         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
7928         initialize their hashtables/arraylists only when they are needed
7929         instead of doing this always.
7930
7931         * parameter.cs: Handle refs and out parameters.
7932
7933         * cs-parser.jay: Use an ArrayList to construct the arguments
7934         instead of the ParameterCollection, and then cast that to a
7935         Parameter[] array.
7936
7937         * parameter.cs: Drop the use of ParameterCollection and use
7938         instead arrays of Parameters.
7939
7940         (GetParameterInfo): Use the Type, not the Name when resolving
7941         types. 
7942
7943 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
7944
7945         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
7946         and instead use public readonly fields.
7947
7948         * class.cs: Put back walking code for type containers.
7949
7950 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
7951
7952         * class.cs (MakeConstant): Code to define constants.
7953
7954         * rootcontext.cs (LookupType): New function.  Used to locate types 
7955
7956         
7957 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
7958
7959         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
7960         this System.Reflection code is.  Kudos to Microsoft
7961         
7962         * typemanager.cs: Implement a type cache and avoid loading all
7963         types at boot time.  Wrap in LookupType the internals.  This made
7964         the compiler so much faster.  Wow.  I rule!
7965         
7966         * driver.cs: Make sure we always load mscorlib first (for
7967         debugging purposes, nothing really important).
7968
7969         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
7970         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
7971
7972         * rootcontext.cs: Lookup types on their namespace;  Lookup types
7973         on namespaces that have been imported using the `using' keyword.
7974
7975         * class.cs (TypeContainer::TypeAttr): Virtualize.
7976         (Class::TypeAttr): Return attributes suitable for this bad boy.
7977         (Struct::TypeAttr): ditto.
7978         Handle nested classes.
7979         (TypeContainer::) Remove all the type visiting code, it is now
7980         replaced with the rootcontext.cs code
7981
7982         * rootcontext.cs (GetClassBases): Added support for structs. 
7983
7984 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
7985
7986         * interface.cs, statement.cs, class.cs, parameter.cs,
7987         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
7988         Drop use of TypeRefs, and use strings instead.
7989
7990 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
7991
7992         * rootcontext.cs: 
7993
7994         * class.cs (Struct::Struct): set the SEALED flags after
7995         checking the modifiers.
7996         (TypeContainer::TypeAttr): new property, returns the
7997         TypeAttributes for a class.  
7998
7999         * cs-parser.jay (type_list): Oops, list production was creating a
8000         new list of base types.
8001
8002         * rootcontext.cs (StdLib): New property.
8003         (GetInterfaceTypeByName): returns an interface by type name, and
8004         encapsulates error handling here.
8005         (GetInterfaces): simplified.
8006         (ResolveTree): Encapsulated all the tree resolution here.
8007         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
8008         types. 
8009         
8010         * driver.cs: Add support for --nostdlib, to avoid loading the
8011         default assemblies.
8012         (Main): Do not put tree resolution here. 
8013
8014         * rootcontext.cs: Beginning of the class resolution.
8015
8016 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
8017
8018         * rootcontext.cs: Provide better error reporting. 
8019
8020         * cs-parser.jay (interface_base): set our $$ to be interfaces.
8021
8022         * rootcontext.cs (CreateInterface): Handle the case where there
8023         are no parent interfaces.
8024         
8025         (CloseTypes): Routine to flush types at the end.
8026         (CreateInterface): Track types.
8027         (GetInterfaces): Returns an array of Types from the list of
8028         defined interfaces.
8029
8030         * typemanager.c (AddUserType): Mechanism to track user types (puts
8031         the type on the global type hash, and allows us to close it at the
8032         end). 
8033         
8034 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
8035
8036         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
8037         RecordInterface instead.
8038
8039         * cs-parser.jay: Updated to reflect changes above.
8040
8041         * decl.cs (Definition): Keep track of the TypeBuilder type that
8042         represents this type here.  Not sure we will use it in the long
8043         run, but wont hurt for now.
8044
8045         * driver.cs: Smaller changes to accomodate the new code.
8046
8047         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
8048         when done. 
8049
8050         * rootcontext.cs (CreateInterface):  New method, used to create
8051         the System.TypeBuilder type for interfaces.
8052         (ResolveInterfaces): new entry point to resolve the interface
8053         hierarchy. 
8054         (CodeGen): Property, used to keep track of the code generator.
8055
8056 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
8057
8058         * cs-parser.jay: Add a second production for delegate_declaration
8059         with `VOID'.
8060
8061         (enum_body): Put an opt_comma here instead of putting it on
8062         enum_body or enum_member_declarations so we can handle trailing
8063         commas on enumeration members.  Gets rid of a shift/reduce.
8064         
8065         (type_list): Need a COMMA in the middle.
8066
8067         (indexer_declaration): Tell tokenizer to recognize get/set
8068
8069         * Remove old targets.
8070
8071         * Re-add the parser target.
8072
8073 2001-07-13  Simon Cozens <simon@simon-cozens.org>
8074
8075         * cs-parser.jay: Add precendence rules for a number of operators
8076         ot reduce the number of shift/reduce conflicts in the grammar.
8077         
8078 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
8079
8080         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
8081         and put it here.
8082
8083         Get rid of old crufty code.
8084
8085         * rootcontext.cs: Use this to keep track of the parsed
8086         representation and the defined types available to the program. 
8087
8088         * gen-treedump.cs: adjust for new convention.
8089
8090         * type.cs: Split out the type manager, and the assembly builder
8091         from here. 
8092
8093         * typemanager.cs: the type manager will live here now.
8094
8095         * cil-codegen.cs: And the code generator here. 
8096
8097 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
8098
8099         * makefile: Fixed up for easy making.
8100
8101 2001-07-13  Simon Cozens <simon@simon-cozens.org>
8102
8103         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
8104         the 
8105
8106         (unary_expression): Expand pre_increment_expression and
8107         post_decrement_expression to reduce a shift/reduce.
8108
8109 2001-07-11  Simon Cozens
8110
8111         * cs-tokenizer.cs: Hex numbers should begin with a 0.
8112
8113         Improve allow_keyword_as_indent name.
8114
8115 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
8116
8117         * Adjustments for Beta2. 
8118
8119 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
8120
8121         * decl.cs: Added `Define' abstract method.
8122         (InTransit): new property, used to catch recursive definitions. 
8123
8124         * interface.cs: Implement `Define'. 
8125
8126         * modifiers.cs: Map Modifiers.constants to
8127         System.Reflection.TypeAttribute flags.
8128
8129         * class.cs: Keep track of types and user-defined types.
8130         (BuilderInit): New method for creating an assembly
8131         (ResolveType): New function to launch the resolution process, only
8132         used by interfaces for now.
8133
8134         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
8135         that are inserted into the name space. 
8136
8137 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
8138
8139         * ARGH.  I have screwed up my tree so many times due to the use of
8140         rsync rather than using CVS.  Going to fix this at once. 
8141
8142         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
8143         load types.
8144
8145 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
8146
8147         * Experiment successful: Use System.Type rather that our own
8148         version of Type.  
8149
8150 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
8151
8152         * cs-parser.jay: Removed nsAliases from here.
8153
8154         Use new namespaces, handle `using XXX;' 
8155
8156         * namespace.cs: Reimplemented namespace handling, use a recursive
8157         definition of the class.  Now we can keep track of using clauses
8158         and catch invalid using clauses.
8159
8160 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
8161
8162         * gen-treedump.cs: Adapted for all the renaming.
8163
8164         * expression.cs (Expression): this class now has a Type property
8165         which returns an expression Type.
8166
8167         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
8168         `Type', as this has a different meaning now in the base
8169
8170 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
8171
8172         * interface.cs, class.cs: Removed from all the sources the
8173         references to signature computation, as we can not do method
8174         signature computation during the parsing time, as we are not
8175         trying to solve at that point distinguishing:
8176
8177         class X {
8178                 void a (Blah x) {}
8179                 void a (NS.Blah x) {}
8180         }
8181
8182         Which depending on the context might be valid or not, as we do not
8183         know if Blah is the same thing as NS.Blah at that point.
8184
8185         * Redid everything so the code uses TypeRefs now instead of
8186         Types.  TypeRefs are just temporary type placeholders, that need
8187         to be resolved.  They initially have a pointer to a string and the
8188         current scope in which they are used.  This is used later by the
8189         compiler to resolve the reference to an actual Type. 
8190
8191         * DeclSpace is no longer a CIR.Type, and neither are
8192         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
8193         are all DeclSpaces, but no Types. 
8194
8195         * type.cs (TypeRefManager): This implements the TypeRef manager,
8196         which keeps track of all the types that need to be resolved after
8197         the parsing has finished. 
8198
8199 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
8200
8201         * ARGH.  We are going to have to store `foreach' as a class rather
8202         than resolving it, as we need to verify error 1579 after name
8203         resolution.   *OR* we could keep a flag that says `This request to
8204         IEnumerator comes from a foreach statement' which we can then use
8205         to generate the error.
8206
8207 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
8208
8209         * class.cs (TypeContainer.AddMethod): we now add methods to the
8210         MethodGroup instead of the method hashtable.  
8211
8212         * expression.cs: Add MethodGroup abstraction, which gets us one
8213         step closer to the specification in the way we handle method
8214         declarations.  
8215
8216         * cs-parser.jay (primary_expression): qualified_identifier now
8217         tried to match up an identifier to a local variable reference or
8218         to a parameter reference.
8219
8220         current_local_parameters is now a parser global variable that
8221         points to the current parameters for the block, used during name
8222         lookup.
8223
8224         (property_declaration): Now creates an implicit `value' argument to
8225         the set accessor.
8226
8227 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
8228
8229         * parameter.cs: Do not use `param' arguments as part of the
8230         signature, per the spec.
8231
8232 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
8233
8234         * decl.cs: Base class for classes, structs and interfaces.  This
8235         is the "Declaration Space" 
8236
8237         * cs-parser.jay: Use CheckDef for checking declaration errors
8238         instead of having one on each function.
8239
8240         * class.cs: Factor out some code for handling error handling in
8241         accordance to the "Declarations" section in the "Basic Concepts"
8242         chapter in the ECMA C# spec.
8243
8244         * interface.cs: Make all interface member classes derive from
8245         InterfaceMemberBase.
8246
8247 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
8248
8249         * Many things: all interfaces are parsed and generated in
8250         gen-treedump.  Support for member variables, constructors,
8251         destructors, properties, constants is there.
8252
8253         Beginning of the IL backend, but very little done, just there for
8254         testing purposes. 
8255
8256 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
8257
8258         * cs-parser.jay: Fix labeled statement.
8259
8260         * cs-tokenizer.cs (escape): Escape " and ' always.
8261         ref_line, ref_name: keep track of the line/filename as instructed
8262         by #line by the compiler.
8263         Parse #line.
8264
8265 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
8266
8267         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
8268         to match the values in System.CodeDOM.
8269
8270         Divid renamed to Divide.
8271
8272         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
8273         statements. 
8274         (Statements.set): remove.
8275
8276         * System.CodeDOM/CodeCatchClause.cs: always have a valid
8277         statements. 
8278
8279         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
8280         falseStatements always have valid values. 
8281
8282         * cs-parser.jay: Use System.CodeDOM now.
8283