Skip to content

Commit

Permalink
Comparison of object to null was crashing due to a bug in enum compar…
Browse files Browse the repository at this point in the history
…ison template. Fixes issue #17.
  • Loading branch information
ssimek committed Aug 22, 2010
1 parent 37f117f commit 41070b5
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 0 deletions.
68 changes: 68 additions & 0 deletions Examples/Bugs/X17_IsNull.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
/*
* Copyright (c) 2010, Stefan Simek
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
*/

// Google Code Issue 17: Operand.EQ(null) doesn't work
// Reported by qwertie256, Aug 18, 2010

using System;
using System.Collections.Generic;
using System.Text;

namespace TriAxis.RunSharp.Examples.Bugs
{
static class X17_IsNull
{
public static void GenIsNull(AssemblyGen ag)
{
TypeGen Test = ag.Class("Test");
{
CodeGen g = Test.Static.Method(typeof(void), "Main");
{
Operand a = g.Local(typeof(object), "notnull");
Operand b = g.Local(typeof(object), null);

g.If(a == null);
{
g.WriteLine("a is null");
}
g.Else();
{
g.WriteLine("a is not null");
}
g.End();

g.If(b == null);
{
g.WriteLine("b is null");
}
g.Else();
{
g.WriteLine("b is not null");
}
g.End();
}
}
}
}
}
1 change: 1 addition & 0 deletions Examples/Examples.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
<Compile Include="A2_Attributes.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Bugs\X17_IsNull.cs" />
<Compile Include="Bugs\X14_StaticConstructor.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
Expand Down
3 changes: 3 additions & 0 deletions RunSharp/Operator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,9 @@ private CmpOp()

static IMemberInfo[] CmpEnumSpecific(Operand[] args)
{
if ((object)args[0] == null || (object)args[1] == null) // if any of the operands is null, it can't be an enum
return stdNone;

Type t1 = args[0].Type, t2 = args[1].Type;

if (t1 != t2 || t1 == null || !t1.IsEnum) // if both types are not the same enum, no operator can be valid
Expand Down

0 comments on commit 41070b5

Please sign in to comment.