Hello, Commenting code inline:
+ If Info.Compiler.CommandLine.NoVBRuntimeRef AndAlso Info.Compiler.Assembly.IsDefinedHere(Method.DeclaringType) AndAlso Method.IsStatic AndAlso CompareNameOrdinal(Method.Name, "AscW") Then + Dim methodParameters() As ParameterInfo = Method.GetParameters() You might want to use Helper.GetParameters(Info.Compiler, Method), since this will fail if a MethodBuilder is passed in instead of a MethodDescriptor. + + If methodParameters.Length <> 0 AndAlso Helper.CompareType(methodParameters(0).ParameterType, TypeCache.Char) Then To compare types use Helper.CompareType(type1, type2), I have found that comparing type instances at the same time as using Reflection.Emit is very unreliable. + If Arguments.Count <> 0 Then This pushes a Char on the stack: + result = Arguments(0).GenerateCode(Info.Clone(True, False, TypeCache.Char), methodParameters(0)) AndAlso result Always put a 'AndAlso result' after assigning to result, this will ensure that a False result value earlier on won't get lost. I know there is no earlier assignment right now to result, but when the code changes it is very easy to forget this. + Else + Helper.Assert(methodParameters(0).IsOptional) This also pushes a Char on the stack: + Emitter.EmitLoadValue(Info.Clone(TypeCache.Char), methodParameters(0).DefaultValue) + End If If you now push an integer on the stack you'll have the char and the integer there. I suggest using this: Info.Stack.SwitchHead(TypeCache.Char, TypeCache.Integer) + Info.Stack.Push(TypeCache.Integer) + + Return result + End If + End If + > Hi, > > I added a hack to EmitArgumentsAndCallOrCallVirt to support the > previously > discussed functionality. > > I don't know how exactly the stack evaluation in vbnc works and I keep > getting ... reached, but stack is not empty. The stack evaluation is only for debug purposes and is anyway flawed, so you can safely ignore these warnings if the resulting assembly works. > Another missing functionality is that the return value of this replaced > AscW > should be treated as Integer regardless of the return type of the > replaced > AscW function. In order for this to work correctly you would have to insert the hack earlier on in the compiler, probably in the Resolve phase, when during resolution a call to AscW is detected the parse tree is modified to just load the char/integer value on the stack. Error checking would have to be bypassed since it is now allowed in VB to treat a Char value as any other int value (this error isn't reported now anyway though). Having in mind that this is a hack to support a feature of an unsupported commandline option your hack might be just good enough. > Kornél Rolf -- Using M2, Opera's revolutionary e-mail client: http://www.opera.com/m2/ -- No virus found in this outgoing message. Checked by AVG Free Edition. Version: 7.1.405 / Virus Database: 268.11.7/438 - Release Date: 05/09/2006 _______________________________________________ Mono-devel-list mailing list Mono-devel-list@lists.ximian.com http://lists.ximian.com/mailman/listinfo/mono-devel-list