From 41070b570290c5cd6b09b1df3cd16c4352bf0360 Mon Sep 17 00:00:00 2001 From: Stefan Simek Date: Sun, 22 Aug 2010 23:39:32 +0200 Subject: [PATCH] Comparison of object to null was crashing due to a bug in enum comparison template. Fixes issue #17. --- Examples/Bugs/X17_IsNull.cs | 68 +++++++++++++++++++++++++++++++++++++ Examples/Examples.csproj | 1 + RunSharp/Operator.cs | 3 ++ 3 files changed, 72 insertions(+) create mode 100644 Examples/Bugs/X17_IsNull.cs diff --git a/Examples/Bugs/X17_IsNull.cs b/Examples/Bugs/X17_IsNull.cs new file mode 100644 index 0000000..9270bdf --- /dev/null +++ b/Examples/Bugs/X17_IsNull.cs @@ -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(); + } + } + } + } +} diff --git a/Examples/Examples.csproj b/Examples/Examples.csproj index 1f5ec8c..c922fd3 100644 --- a/Examples/Examples.csproj +++ b/Examples/Examples.csproj @@ -51,6 +51,7 @@ Code + diff --git a/RunSharp/Operator.cs b/RunSharp/Operator.cs index 72fdbc4..e0f50fc 100644 --- a/RunSharp/Operator.cs +++ b/RunSharp/Operator.cs @@ -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