Skip to content

Commit

Permalink
[Truffle] Handle other cases for bit operations on Bignums.
Browse files Browse the repository at this point in the history
  • Loading branch information
eregon committed Oct 2, 2016
1 parent cd637b0 commit 9851022
Showing 1 changed file with 15 additions and 2 deletions.
Expand Up @@ -436,8 +436,8 @@ public Object bitAnd(DynamicObject a, DynamicObject b) {
return fixnumOrBignum(Layouts.BIGNUM.getValue(a).and(Layouts.BIGNUM.getValue(b)));
}

@Specialization(guards = "!isRubyBignum(b)")
public Object bitAnd(VirtualFrame frame, DynamicObject a, DynamicObject b,
@Specialization(guards = { "!isInteger(b)", "!isLong(b)", "!isRubyBignum(b)" })
public Object bitAnd(VirtualFrame frame, DynamicObject a, Object b,
@Cached("new()") SnippetNode snippetNode) {
return snippetNode.execute(frame, "self & bit_coerce(b)[1]", "b", b);
}
Expand All @@ -455,6 +455,12 @@ public Object bitOr(DynamicObject a, long b) {
public Object bitOr(DynamicObject a, DynamicObject b) {
return fixnumOrBignum(Layouts.BIGNUM.getValue(a).or(Layouts.BIGNUM.getValue(b)));
}

@Specialization(guards = { "!isInteger(b)", "!isLong(b)", "!isRubyBignum(b)" })
public Object bitAnd(VirtualFrame frame, DynamicObject a, Object b,
@Cached("new()") SnippetNode snippetNode) {
return snippetNode.execute(frame, "self | bit_coerce(b)[1]", "b", b);
}
}

@CoreMethod(names = "^", required = 1)
Expand All @@ -469,6 +475,13 @@ public Object bitXOr(DynamicObject a, long b) {
public Object bitXOr(DynamicObject a, DynamicObject b) {
return fixnumOrBignum(Layouts.BIGNUM.getValue(a).xor(Layouts.BIGNUM.getValue(b)));
}

@Specialization(guards = { "!isInteger(b)", "!isLong(b)", "!isRubyBignum(b)" })
public Object bitAnd(VirtualFrame frame, DynamicObject a, Object b,
@Cached("new()") SnippetNode snippetNode) {
return snippetNode.execute(frame, "self ^ bit_coerce(b)[1]", "b", b);
}

}

@CoreMethod(names = "<<", required = 1, lowerFixnum = 1)
Expand Down

0 comments on commit 9851022

Please sign in to comment.