Merge V8 5.3.332.45. DO NOT MERGE
Test: Manual
FPIIM-449
Change-Id: Id3254828b068abdea3cb10442e0172a8c9a98e03
(cherry picked from commit 13e2dadd00298019ed862f2b2fc5068bba730bcf)
diff --git a/test/cctest/interpreter/test-interpreter-intrinsics.cc b/test/cctest/interpreter/test-interpreter-intrinsics.cc
index e4cf809..b8fce7a 100644
--- a/test/cctest/interpreter/test-interpreter-intrinsics.cc
+++ b/test/cctest/interpreter/test-interpreter-intrinsics.cc
@@ -29,7 +29,7 @@
builder.CallRuntime(function_id_, builder.Parameter(0), sizeof...(args))
.Return();
InterpreterTester tester(isolate_, builder.ToBytecodeArray());
- auto callable = tester.GetCallable<Handle<Object>>();
+ auto callable = tester.GetCallable<A...>();
return callable(args...).ToHandleChecked();
}
@@ -91,6 +91,189 @@
CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.NewObject("42")));
}
+TEST(IsJSProxy) {
+ HandleAndZoneScope handles;
+
+ InvokeIntrinsicHelper helper(handles.main_isolate(), handles.main_zone(),
+ Runtime::kInlineIsJSProxy);
+ Factory* factory = handles.main_isolate()->factory();
+
+ CHECK_EQ(*factory->false_value(),
+ *helper.Invoke(helper.NewObject("new Date()")));
+ CHECK_EQ(*factory->false_value(),
+ *helper.Invoke(helper.NewObject("(function() {})")));
+ CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.NewObject("([1])")));
+ CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.NewObject("({})")));
+ CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.NewObject("(/x/)")));
+ CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.Undefined()));
+ CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.Null()));
+ CHECK_EQ(*factory->false_value(),
+ *helper.Invoke(helper.NewObject("'string'")));
+ CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.NewObject("42")));
+ CHECK_EQ(*factory->true_value(),
+ *helper.Invoke(helper.NewObject("new Proxy({},{})")));
+}
+
+TEST(IsRegExp) {
+ HandleAndZoneScope handles;
+
+ InvokeIntrinsicHelper helper(handles.main_isolate(), handles.main_zone(),
+ Runtime::kInlineIsRegExp);
+ Factory* factory = handles.main_isolate()->factory();
+
+ CHECK_EQ(*factory->false_value(),
+ *helper.Invoke(helper.NewObject("new Date()")));
+ CHECK_EQ(*factory->false_value(),
+ *helper.Invoke(helper.NewObject("(function() {})")));
+ CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.NewObject("([1])")));
+ CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.NewObject("({})")));
+ CHECK_EQ(*factory->true_value(), *helper.Invoke(helper.NewObject("(/x/)")));
+ CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.Undefined()));
+ CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.Null()));
+ CHECK_EQ(*factory->false_value(),
+ *helper.Invoke(helper.NewObject("'string'")));
+ CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.NewObject("42")));
+}
+
+TEST(IsTypedArray) {
+ HandleAndZoneScope handles;
+
+ InvokeIntrinsicHelper helper(handles.main_isolate(), handles.main_zone(),
+ Runtime::kInlineIsTypedArray);
+ Factory* factory = handles.main_isolate()->factory();
+
+ CHECK_EQ(*factory->false_value(),
+ *helper.Invoke(helper.NewObject("new Date()")));
+ CHECK_EQ(*factory->false_value(),
+ *helper.Invoke(helper.NewObject("(function() {})")));
+ CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.NewObject("([1])")));
+ CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.NewObject("({})")));
+ CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.NewObject("(/x/)")));
+ CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.Undefined()));
+ CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.Null()));
+ CHECK_EQ(*factory->false_value(),
+ *helper.Invoke(helper.NewObject("'string'")));
+ CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.NewObject("42")));
+
+ CHECK_EQ(
+ *factory->true_value(),
+ *helper.Invoke(helper.NewObject("new Uint8Array(new ArrayBuffer(1));")));
+ CHECK_EQ(
+ *factory->true_value(),
+ *helper.Invoke(helper.NewObject("new Uint16Array(new ArrayBuffer(2));")));
+ CHECK_EQ(
+ *factory->true_value(),
+ *helper.Invoke(helper.NewObject("new Int32Array(new ArrayBuffer(4));")));
+}
+
+TEST(IsSmi) {
+ HandleAndZoneScope handles;
+
+ InvokeIntrinsicHelper helper(handles.main_isolate(), handles.main_zone(),
+ Runtime::kInlineIsSmi);
+ Factory* factory = handles.main_isolate()->factory();
+
+ CHECK_EQ(*factory->false_value(),
+ *helper.Invoke(helper.NewObject("new Date()")));
+ CHECK_EQ(*factory->false_value(),
+ *helper.Invoke(helper.NewObject("(function() {})")));
+ CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.NewObject("([1])")));
+ CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.NewObject("({})")));
+ CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.NewObject("(/x/)")));
+ CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.Undefined()));
+ CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.Null()));
+ CHECK_EQ(*factory->false_value(),
+ *helper.Invoke(helper.NewObject("'string'")));
+ CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.NewObject("42.2")));
+ CHECK_EQ(*factory->false_value(),
+ *helper.Invoke(helper.NewObject("4294967297")));
+ CHECK_EQ(*factory->true_value(), *helper.Invoke(helper.NewObject("42")));
+}
+
+TEST(Call) {
+ HandleAndZoneScope handles;
+ Isolate* isolate = handles.main_isolate();
+ Factory* factory = isolate->factory();
+ InvokeIntrinsicHelper helper(isolate, handles.main_zone(),
+ Runtime::kInlineCall);
+
+ CHECK_EQ(Smi::FromInt(20),
+ *helper.Invoke(helper.NewObject("(function() { return this.x; })"),
+ helper.NewObject("({ x: 20 })")));
+ CHECK_EQ(Smi::FromInt(50),
+ *helper.Invoke(helper.NewObject("(function(arg1) { return arg1; })"),
+ factory->undefined_value(),
+ handle(Smi::FromInt(50), isolate)));
+ CHECK_EQ(
+ Smi::FromInt(20),
+ *helper.Invoke(
+ helper.NewObject("(function(a, b, c) { return a + b + c; })"),
+ factory->undefined_value(), handle(Smi::FromInt(10), isolate),
+ handle(Smi::FromInt(7), isolate), handle(Smi::FromInt(3), isolate)));
+}
+
+TEST(IntrinsicAsStubCall) {
+ HandleAndZoneScope handles;
+ Isolate* isolate = handles.main_isolate();
+ Factory* factory = isolate->factory();
+ InvokeIntrinsicHelper to_number_helper(isolate, handles.main_zone(),
+ Runtime::kInlineToNumber);
+ CHECK_EQ(Smi::FromInt(46),
+ *to_number_helper.Invoke(to_number_helper.NewObject("'46'")));
+
+ InvokeIntrinsicHelper to_integer_helper(isolate, handles.main_zone(),
+ Runtime::kInlineToInteger);
+ CHECK_EQ(Smi::FromInt(502),
+ *to_integer_helper.Invoke(to_integer_helper.NewObject("502.67")));
+
+ InvokeIntrinsicHelper math_pow_helper(isolate, handles.main_zone(),
+ Runtime::kInlineMathPow);
+ CHECK(math_pow_helper
+ .Invoke(math_pow_helper.NewObject("3"),
+ math_pow_helper.NewObject("7"))
+ ->SameValue(Smi::FromInt(2187)));
+
+ InvokeIntrinsicHelper has_property_helper(isolate, handles.main_zone(),
+ Runtime::kInlineHasProperty);
+ CHECK_EQ(*factory->true_value(),
+ *has_property_helper.Invoke(
+ has_property_helper.NewObject("'x'"),
+ has_property_helper.NewObject("({ x: 20 })")));
+ CHECK_EQ(*factory->false_value(),
+ *has_property_helper.Invoke(
+ has_property_helper.NewObject("'y'"),
+ has_property_helper.NewObject("({ x: 20 })")));
+
+ InvokeIntrinsicHelper sub_string_helper(isolate, handles.main_zone(),
+ Runtime::kInlineSubString);
+ CHECK(sub_string_helper
+ .Invoke(sub_string_helper.NewObject("'foobar'"),
+ sub_string_helper.NewObject("3"),
+ sub_string_helper.NewObject("6"))
+ ->SameValue(*sub_string_helper.NewObject("'bar'")));
+}
+
+TEST(ValueOf) {
+ HandleAndZoneScope handles;
+ Isolate* isolate = handles.main_isolate();
+ Factory* factory = isolate->factory();
+ InvokeIntrinsicHelper helper(handles.main_isolate(), handles.main_zone(),
+ Runtime::kInlineValueOf);
+
+ CHECK_EQ(Smi::FromInt(1234), *helper.Invoke(helper.NewObject("1234")));
+ CHECK_EQ(Smi::FromInt(5678),
+ *helper.Invoke(helper.NewObject("new Object(5678)")));
+
+ CHECK_EQ(*factory->true_value(), *helper.Invoke(helper.NewObject("true")));
+ CHECK_EQ(*factory->false_value(),
+ *helper.Invoke(helper.NewObject("new Object(false)")));
+
+ CHECK(helper.Invoke(helper.NewObject("'foobar'"))
+ ->SameValue(*helper.NewObject("'foobar'")));
+ CHECK(helper.Invoke(helper.NewObject("new Object('foobar')"))
+ ->SameValue(*helper.NewObject("'foobar'")));
+}
+
} // namespace interpreter
} // namespace internal
} // namespace v8