blob: e4cf809ad74efbcf852d2d840f7bd09151cacfa9 [file] [log] [blame]
Ben Murdochda12d292016-06-02 14:46:10 +01001// Copyright 2015 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "src/v8.h"
6
7#include "src/interpreter/interpreter-intrinsics.h"
8#include "test/cctest/interpreter/interpreter-tester.h"
9
10namespace v8 {
11namespace internal {
12namespace interpreter {
13
14namespace {
15
16class InvokeIntrinsicHelper {
17 public:
18 InvokeIntrinsicHelper(Isolate* isolate, Zone* zone,
19 Runtime::FunctionId function_id)
20 : isolate_(isolate),
21 zone_(zone),
22 factory_(isolate->factory()),
23 function_id_(function_id) {}
24
25 template <class... A>
26 Handle<Object> Invoke(A... args) {
27 CHECK(IntrinsicsHelper::IsSupported(function_id_));
28 BytecodeArrayBuilder builder(isolate_, zone_, sizeof...(args), 0, 0);
29 builder.CallRuntime(function_id_, builder.Parameter(0), sizeof...(args))
30 .Return();
31 InterpreterTester tester(isolate_, builder.ToBytecodeArray());
32 auto callable = tester.GetCallable<Handle<Object>>();
33 return callable(args...).ToHandleChecked();
34 }
35
36 Handle<Object> NewObject(const char* script) {
37 return v8::Utils::OpenHandle(*CompileRun(script));
38 }
39
40 Handle<Object> Undefined() { return factory_->undefined_value(); }
41 Handle<Object> Null() { return factory_->null_value(); }
42
43 private:
44 Isolate* isolate_;
45 Zone* zone_;
46 Factory* factory_;
47 Runtime::FunctionId function_id_;
48};
49
50} // namespace
51
52TEST(IsJSReceiver) {
53 HandleAndZoneScope handles;
54
55 InvokeIntrinsicHelper helper(handles.main_isolate(), handles.main_zone(),
56 Runtime::kInlineIsJSReceiver);
57 Factory* factory = handles.main_isolate()->factory();
58
59 CHECK_EQ(*factory->true_value(),
60 *helper.Invoke(helper.NewObject("new Date()")));
61 CHECK_EQ(*factory->true_value(),
62 *helper.Invoke(helper.NewObject("(function() {})")));
63 CHECK_EQ(*factory->true_value(), *helper.Invoke(helper.NewObject("([1])")));
64 CHECK_EQ(*factory->true_value(), *helper.Invoke(helper.NewObject("({})")));
65 CHECK_EQ(*factory->true_value(), *helper.Invoke(helper.NewObject("(/x/)")));
66 CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.Undefined()));
67 CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.Null()));
68 CHECK_EQ(*factory->false_value(),
69 *helper.Invoke(helper.NewObject("'string'")));
70 CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.NewObject("42")));
71}
72
73TEST(IsArray) {
74 HandleAndZoneScope handles;
75
76 InvokeIntrinsicHelper helper(handles.main_isolate(), handles.main_zone(),
77 Runtime::kInlineIsArray);
78 Factory* factory = handles.main_isolate()->factory();
79
80 CHECK_EQ(*factory->false_value(),
81 *helper.Invoke(helper.NewObject("new Date()")));
82 CHECK_EQ(*factory->false_value(),
83 *helper.Invoke(helper.NewObject("(function() {})")));
84 CHECK_EQ(*factory->true_value(), *helper.Invoke(helper.NewObject("([1])")));
85 CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.NewObject("({})")));
86 CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.NewObject("(/x/)")));
87 CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.Undefined()));
88 CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.Null()));
89 CHECK_EQ(*factory->false_value(),
90 *helper.Invoke(helper.NewObject("'string'")));
91 CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.NewObject("42")));
92}
93
94} // namespace interpreter
95} // namespace internal
96} // namespace v8