[bigint] Fix typeof.

The bytecode generator has special handling for comparing the result of
the typeof operator against a string literal. This needs to be adapted
for bigints.

R=jkummerow@chromium.org, mythrie@chromium.org

Bug: v8:6791
Change-Id: I42d6c9e9225ce05e19393f10e01ae496ecb70c9c
Reviewed-on: https://chromium-review.googlesource.com/753465
Commit-Queue: Georg Neis <neis@chromium.org>
Reviewed-by: Jakob Kummerow <jkummerow@chromium.org>
Reviewed-by: Mythri Alle <mythria@chromium.org>
Cr-Commit-Position: refs/heads/master@{#49172}
This commit is contained in:
Georg Neis 2017-11-07 10:26:56 +01:00 committed by Commit Bot
parent 7a54652591
commit c961986ec6
11 changed files with 36 additions and 18 deletions

View File

@ -195,6 +195,7 @@ class AstBigInt {
F(arguments, "arguments") \
F(async, "async") \
F(await, "await") \
F(bigint, "bigint") \
F(boolean, "boolean") \
F(constructor, "constructor") \
F(default, "default") \

View File

@ -2476,6 +2476,10 @@ void BytecodeGraphBuilder::VisitTestTypeOf() {
graph()->NewNode(simplified()->ReferenceEqual(), object,
jsgraph()->NullConstant()));
break;
case interpreter::TestTypeOfFlags::LiteralFlag::kBigInt:
// TODO(neis): Implement.
UNIMPLEMENTED();
break;
case interpreter::TestTypeOfFlags::LiteralFlag::kOther:
UNREACHABLE(); // Should never be emitted.
break;

View File

@ -52,6 +52,8 @@ TestTypeOfFlags::LiteralFlag TestTypeOfFlags::GetFlagForLiteral(
return LiteralFlag::kSymbol;
} else if (raw_literal == ast_constants->boolean_string()) {
return LiteralFlag::kBoolean;
} else if (raw_literal == ast_constants->bigint_string()) {
return LiteralFlag::kBigInt;
} else if (raw_literal == ast_constants->undefined_string()) {
return LiteralFlag::kUndefined;
} else if (raw_literal == ast_constants->function_string()) {

View File

@ -54,6 +54,7 @@ class CreateClosureFlags {
V(String, string) \
V(Symbol, symbol) \
V(Boolean, boolean) \
V(BigInt, bigint) \
V(Undefined, undefined) \
V(Function, function) \
V(Object, object) \

View File

@ -2031,6 +2031,12 @@ IGNITION_HANDLER(TestTypeOf, InterpreterAssembler) {
GotoIf(WordEqual(object, TrueConstant()), &if_true);
Branch(WordEqual(object, FalseConstant()), &if_true, &if_false);
}
BIND(&if_bigint);
{
Comment("IfBigInt");
GotoIf(TaggedIsSmi(object), &if_false);
Branch(IsBigInt(object), &if_true, &if_false);
}
BIND(&if_undefined);
{
Comment("IfUndefined");

View File

@ -425,7 +425,7 @@ bytecodes: [
B(TestEqualStrict), R(6), U8(17),
B(JumpIfFalse), U8(61),
B(Ldar), R(8),
B(TestTypeOf), U8(5),
B(TestTypeOf), U8(6),
B(JumpIfFalse), U8(4),
B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(142),

View File

@ -140,7 +140,7 @@ bytecodes: [
B(TestEqualStrict), R(6), U8(21),
B(JumpIfFalse), U8(109),
B(Ldar), R(8),
B(TestTypeOf), U8(5),
B(TestTypeOf), U8(6),
B(JumpIfFalse), U8(4),
B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(142),
@ -429,7 +429,7 @@ bytecodes: [
B(TestEqualStrict), R(6), U8(21),
B(JumpIfFalse), U8(109),
B(Ldar), R(8),
B(TestTypeOf), U8(5),
B(TestTypeOf), U8(6),
B(JumpIfFalse), U8(4),
B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(142),
@ -740,7 +740,7 @@ bytecodes: [
B(TestEqualStrict), R(6), U8(23),
B(JumpIfFalse), U8(109),
B(Ldar), R(8),
B(TestTypeOf), U8(5),
B(TestTypeOf), U8(6),
B(JumpIfFalse), U8(4),
B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(142),
@ -988,7 +988,7 @@ bytecodes: [
B(TestEqualStrict), R(4), U8(22),
B(JumpIfFalse), U8(61),
B(Ldar), R(6),
B(TestTypeOf), U8(5),
B(TestTypeOf), U8(6),
B(JumpIfFalse), U8(4),
B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(142),

View File

@ -83,7 +83,7 @@ bytecodes: [
B(TestEqualStrict), R(4), U8(17),
B(JumpIfFalse), U8(61),
B(Ldar), R(6),
B(TestTypeOf), U8(5),
B(TestTypeOf), U8(6),
B(JumpIfFalse), U8(4),
B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(142),
@ -224,7 +224,7 @@ bytecodes: [
B(TestEqualStrict), R(5), U8(16),
B(JumpIfFalse), U8(61),
B(Ldar), R(7),
B(TestTypeOf), U8(5),
B(TestTypeOf), U8(6),
B(JumpIfFalse), U8(4),
B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(142),
@ -377,7 +377,7 @@ bytecodes: [
B(TestEqualStrict), R(4), U8(19),
B(JumpIfFalse), U8(61),
B(Ldar), R(6),
B(TestTypeOf), U8(5),
B(TestTypeOf), U8(6),
B(JumpIfFalse), U8(4),
B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(142),
@ -520,7 +520,7 @@ bytecodes: [
B(TestEqualStrict), R(3), U8(22),
B(JumpIfFalse), U8(61),
B(Ldar), R(5),
B(TestTypeOf), U8(5),
B(TestTypeOf), U8(6),
B(JumpIfFalse), U8(4),
B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(142),

View File

@ -87,7 +87,7 @@ bytecodes: [
B(TestEqualStrict), R(6), U8(16),
B(JumpIfFalse), U8(61),
B(Ldar), R(8),
B(TestTypeOf), U8(5),
B(TestTypeOf), U8(6),
B(JumpIfFalse), U8(4),
B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(142),
@ -265,7 +265,7 @@ bytecodes: [
B(TestEqualStrict), R(3), U8(20),
B(JumpIfFalse), U8(61),
B(Ldar), R(5),
B(TestTypeOf), U8(5),
B(TestTypeOf), U8(6),
B(JumpIfFalse), U8(4),
B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(142),
@ -419,7 +419,7 @@ bytecodes: [
B(TestEqualStrict), R(4), U8(19),
B(JumpIfFalse), U8(61),
B(Ldar), R(6),
B(TestTypeOf), U8(5),
B(TestTypeOf), U8(6),
B(JumpIfFalse), U8(4),
B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(142),
@ -577,7 +577,7 @@ bytecodes: [
B(TestEqualStrict), R(9), U8(21),
B(JumpIfFalse), U8(61),
B(Ldar), R(11),
B(TestTypeOf), U8(5),
B(TestTypeOf), U8(6),
B(JumpIfFalse), U8(4),
B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(142),
@ -751,7 +751,7 @@ bytecodes: [
B(TestEqualStrict), R(7), U8(16),
B(JumpIfFalse), U8(61),
B(Ldar), R(9),
B(TestTypeOf), U8(5),
B(TestTypeOf), U8(6),
B(JumpIfFalse), U8(4),
B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(142),
@ -950,7 +950,7 @@ bytecodes: [
B(TestEqualStrict), R(6), U8(16),
B(JumpIfFalse), U8(61),
B(Ldar), R(8),
B(TestTypeOf), U8(5),
B(TestTypeOf), U8(6),
B(JumpIfFalse), U8(4),
B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(142),
@ -1113,7 +1113,7 @@ bytecodes: [
B(TestEqualStrict), R(7), U8(16),
B(JumpIfFalse), U8(61),
B(Ldar), R(9),
B(TestTypeOf), U8(5),
B(TestTypeOf), U8(6),
B(JumpIfFalse), U8(4),
B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(142),
@ -1355,7 +1355,7 @@ bytecodes: [
B(TestEqualStrict), R(6), U8(16),
B(JumpIfFalse), U8(61),
B(Ldar), R(8),
B(TestTypeOf), U8(5),
B(TestTypeOf), U8(6),
B(JumpIfFalse), U8(4),
B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(142),

View File

@ -254,7 +254,7 @@ bytecodes: [
B(TestEqualStrict), R(6), U8(17),
B(JumpIfFalse), U8(61),
B(Ldar), R(8),
B(TestTypeOf), U8(5),
B(TestTypeOf), U8(6),
B(JumpIfFalse), U8(4),
B(Jump), U8(18),
B(Wide), B(LdaSmi), I16(142),

View File

@ -90,6 +90,10 @@ const six = BigInt(6);
}{
assertEquals(%Typeof(zero), "bigint");
assertEquals(%Typeof(one), "bigint");
}{
assertTrue(typeof 1n === "bigint");
assertFalse(typeof 1n === "BigInt");
assertFalse(typeof 1 === "bigint");
}{
// TODO(neis): Enable once --no-opt can be removed.
//