}
Type* input_type = NodeProperties::GetBounds(input).upper;
if (input_type->Is(Type::Number())) {
- // JSToNumber(number) => x
+ // JSToNumber(x:number) => x
return Changed(input);
}
if (input_type->Is(Type::Undefined())) {
// JSToNumber(null) => #0
return ReplaceWith(jsgraph()->ZeroConstant());
}
- // TODO(turbofan): js-typed-lowering of ToNumber(boolean)
- // TODO(turbofan): js-typed-lowering of ToNumber(string)
+ // TODO(turbofan): js-typed-lowering of ToNumber(x:boolean)
+ // TODO(turbofan): js-typed-lowering of ToNumber(x:string)
return NoChange();
}
}
Type* input_type = NodeProperties::GetBounds(input).upper;
if (input_type->Is(Type::String())) {
- return Changed(input); // JSToString(string) => x
+ return Changed(input); // JSToString(x:string) => x
}
if (input_type->Is(Type::Undefined())) {
return ReplaceWith(jsgraph()->HeapConstant(
return ReplaceWith(jsgraph()->HeapConstant(
graph()->zone()->isolate()->factory()->null_string()));
}
- // TODO(turbofan): js-typed-lowering of ToString(boolean)
- // TODO(turbofan): js-typed-lowering of ToString(number)
+ // TODO(turbofan): js-typed-lowering of ToString(x:boolean)
+ // TODO(turbofan): js-typed-lowering of ToString(x:number)
return NoChange();
}
}
Type* input_type = NodeProperties::GetBounds(input).upper;
if (input_type->Is(Type::Boolean())) {
- return Changed(input); // JSToBoolean(boolean) => x
+ return Changed(input); // JSToBoolean(x:boolean) => x
}
if (input_type->Is(Type::Undefined())) {
// JSToBoolean(undefined) => #false
return ReplaceWith(jsgraph()->FalseConstant());
}
if (input_type->Is(Type::DetectableReceiver())) {
- // JSToBoolean(detectable) => #true
+ // JSToBoolean(x:detectable) => #true
return ReplaceWith(jsgraph()->TrueConstant());
}
if (input_type->Is(Type::Undetectable())) {
- // JSToBoolean(undetectable) => #false
+ // JSToBoolean(x:undetectable) => #false
return ReplaceWith(jsgraph()->FalseConstant());
}
- if (input_type->Is(Type::Number())) {
- // JSToBoolean(number) => BooleanNot(NumberEqual(x, #0))
+ if (input_type->Is(Type::OrderedNumber())) {
+ // JSToBoolean(x:ordered-number) => BooleanNot(NumberEqual(x, #0))
Node* cmp = graph()->NewNode(simplified()->NumberEqual(), input,
jsgraph()->ZeroConstant());
Node* inv = graph()->NewNode(simplified()->BooleanNot(), cmp);
Reduction result = ReduceJSToBooleanInput(node->InputAt(0));
Node* value;
if (result.Changed()) {
- // JSUnaryNot(x) => BooleanNot(x)
+ // JSUnaryNot(x:boolean) => BooleanNot(x)
value =
graph()->NewNode(simplified()->BooleanNot(), result.replacement());
NodeProperties::ReplaceWithValue(node, value);
V(Signed32, kSignedSmall | kOtherUnsigned31 | kOtherSigned32) \
V(Unsigned32, kUnsignedSmall | kOtherUnsigned31 | kOtherUnsigned32) \
V(Integral32, kSigned32 | kUnsigned32) \
- V(Number, kIntegral32 | kMinusZero | kNaN | kOtherNumber) \
+ V(OrderedNumber, kIntegral32 | kMinusZero | kOtherNumber) \
+ V(Number, kOrderedNumber | kNaN) \
V(String, kInternalizedString | kOtherString) \
V(UniqueName, kSymbol | kInternalizedString) \
V(Name, kSymbol | kString) \
CHECK_EQ(IrOpcode::kParameter, r->opcode());
}
- { // ToBoolean(number)
- Node* r = R.ReduceUnop(op, Type::Number());
+ { // ToBoolean(ordered-number)
+ Node* r = R.ReduceUnop(op, Type::OrderedNumber());
CHECK_EQ(IrOpcode::kBooleanNot, r->opcode());
Node* i = r->InputAt(0);
CHECK_EQ(IrOpcode::kNumberEqual, i->opcode());
- // ToBoolean(number) => BooleanNot(NumberEqual(x, #0))
+ // ToBoolean(x:ordered-number) => BooleanNot(NumberEqual(x, #0))
}
{ // ToBoolean(string)
JSTypedLoweringTester R;
Type* types[] = {Type::Null(), Type::Undefined(),
- Type::Boolean(), Type::Number(),
+ Type::Boolean(), Type::OrderedNumber(),
Type::DetectableObject(), Type::Undetectable()};
for (size_t i = 0; i < arraysize(types); i++) {
if (types[i]->Is(Type::Boolean())) {
CHECK_EQ(n, r);
- } else if (types[i]->Is(Type::Number())) {
+ } else if (types[i]->Is(Type::OrderedNumber())) {
CHECK_EQ(IrOpcode::kBooleanNot, r->opcode());
} else {
CHECK_EQ(IrOpcode::kHeapConstant, r->opcode());
# TODO(turbofan): Large switch statements crash.
'js1_5/Regress/regress-398085-01': [PASS, NO_VARIANTS],
- # TODO(mstarzinger): Typed lowering screws up ToBoolean somehow.
- 'ecma/TypeConversion/9.2': [PASS, NO_VARIANTS],
-
##################### SKIPPED TESTS #####################
# This test checks that we behave properly in an out-of-memory
'exception-with-handler-inside-eval-with-dynamic-scope': [PASS, NO_VARIANTS],
# TODO(turbofan): We run out of stack earlier on 64-bit for now.
'fast/js/deep-recursion-test': [PASS, NO_VARIANTS],
- # TODO(mstarzinger): Typed lowering screws up ToBoolean somehow.
- 'convert-nan-to-bool': [PASS, NO_VARIANTS],
# TODO(mstarzinger): Causes crash in generated code, needs investigation.
'dfg-arguments-osr-exit': [PASS, NO_VARIANTS],
'dfg-arguments-osr-exit-multiple-blocks': [PASS, NO_VARIANTS],