Skip to content
This repository has been archived by the owner on Aug 24, 2022. It is now read-only.

Support for unsigned comparison #1038

Merged
merged 2 commits into from
Feb 25, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions JSIL/ILBlockTranslator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -566,6 +566,22 @@ protected JSExpression Translate_BinaryOp (ILExpression node, JSBinaryOperator o
var leftType = lhs.GetActualType(TypeSystem);
var rightType = rhs.GetActualType(TypeSystem);

if (node.Code.GetName().Contains(".un"))
{
// We need emulate unsigned comaprison
var leftTypeUnsigned = TypeUtil.GetUnsignedType(leftType, TypeSystem);
if (leftType != leftTypeUnsigned)
{
lhs = JSCastExpression.New(lhs, leftTypeUnsigned, TypeSystem, isCoercion: true);
}

var rightTypeUnsigned = TypeUtil.GetUnsignedType(rightType, TypeSystem);
if (rightType != rightTypeUnsigned)
{
rhs = JSCastExpression.New(rhs, rightTypeUnsigned, TypeSystem, isCoercion: true);
}
}

if (
TypeUtil.IsIntegral(leftType) &&
TypeUtil.IsIntegral(rightType) &&
Expand Down
34 changes: 34 additions & 0 deletions JSIL/TypeUtil.cs
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,40 @@ public static bool IsNumeric (TypeReference type) {
}
}

public static TypeReference GetUnsignedType(TypeReference type, TypeSystem typeSystem)
{
type = DereferenceType(type);

switch (type.MetadataType)
{
case MetadataType.UIntPtr:
case MetadataType.IntPtr:
return typeSystem.UIntPtr;

case MetadataType.SByte:
case MetadataType.Byte:
return typeSystem.Byte;

case MetadataType.Int16:
case MetadataType.UInt16:
return typeSystem.UInt16;

case MetadataType.Int32:
case MetadataType.UInt32:
return typeSystem.UInt32;

case MetadataType.Int64:
case MetadataType.UInt64:
return typeSystem.UInt64;

case MetadataType.Char:
return typeSystem.Char;

default:
return type;
}
}

public static bool? IsSigned (TypeReference type) {
type = DereferenceType(type);

Expand Down
27 changes: 27 additions & 0 deletions Tests/SimpleTestCases/ble.un.il
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
.assembly Hello {}
.assembly extern mscorlib {}

.class public abstract sealed Program
extends [mscorlib]System.Object
{
.method static void Main()
{
.entrypoint
.maxstack 1

ldc.i4 -1
ldc.i4.5
ble.un.s END
ldstr "int32"
call void [mscorlib]System.Console::WriteLine(string)

ldc.i8 -1
ldc.i8 5
ble.un.s END
ldstr "int64"
call void [mscorlib]System.Console::WriteLine(string)

END:
ret
}
}
1 change: 1 addition & 0 deletions Tests/SimpleTests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@
<ItemGroup>
<None Include="app.config" />
<None Include="packages.config" />
<None Include="SimpleTestCases\ble.un.il" />
<None Include="SimpleTestCases\Issue538.cs" />
<None Include="SimpleTestCases\Issue567.cs" />
<None Include="SimpleTestCasesForStubbedBcl\Issue585.cs" />
Expand Down