OLD | NEW |
---|---|
(Empty) | |
1 // 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 "test/cctest/interpreter/interpreter-tester.h" | |
8 | |
9 namespace v8 { | |
10 namespace internal { | |
11 namespace interpreter { | |
12 | |
13 namespace { | |
14 | |
15 class InvokeIntrinsicHelper { | |
16 public: | |
17 InvokeIntrinsicHelper(Isolate* isolate, Zone* zone, | |
18 Runtime::FunctionId function_id) | |
19 : isolate_(isolate), | |
20 zone_(zone), | |
21 factory_(isolate->factory()), | |
22 function_id_(function_id) {} | |
23 | |
24 template <class... A> | |
25 Handle<Object> Invoke(A... args) { | |
26 BytecodeArrayBuilder builder(isolate_, zone_, sizeof...(args), 0, 0); | |
rmcilroy
2016/03/10 17:09:35
Maybe add a DCHECK here that IntrinsicsHelper::IsS
epertoso
2016/03/14 09:58:40
I think CHECK makes more sense, especially for peo
rmcilroy
2016/03/14 10:14:42
Sure, SGTM, thanks.
| |
27 builder.CallRuntime(function_id_, builder.Parameter(0), sizeof...(args)) | |
28 .Return(); | |
29 InterpreterTester tester(isolate_, builder.ToBytecodeArray()); | |
30 auto callable = tester.GetCallable<Handle<Object>>(); | |
31 return callable(args...).ToHandleChecked(); | |
32 } | |
33 | |
34 Handle<Object> NewObject(const char* script) { | |
35 return v8::Utils::OpenHandle(*CompileRun(script)); | |
36 } | |
37 | |
38 Handle<Object> Undefined() { return factory_->undefined_value(); } | |
39 Handle<Object> Null() { return factory_->null_value(); } | |
40 | |
41 private: | |
42 Isolate* isolate_; | |
43 Zone* zone_; | |
44 Factory* factory_; | |
45 Runtime::FunctionId function_id_; | |
46 }; | |
47 | |
48 } // namespace | |
49 | |
50 TEST(IsJSReceiver) { | |
51 HandleAndZoneScope handles; | |
52 | |
53 InvokeIntrinsicHelper helper(handles.main_isolate(), handles.main_zone(), | |
54 Runtime::kInlineIsJSReceiver); | |
55 Factory* factory = handles.main_isolate()->factory(); | |
56 | |
57 CHECK_EQ(*factory->true_value(), | |
58 *helper.Invoke(helper.NewObject("new Date()"))); | |
59 CHECK_EQ(*factory->true_value(), | |
60 *helper.Invoke(helper.NewObject("(function() {})"))); | |
61 CHECK_EQ(*factory->true_value(), *helper.Invoke(helper.NewObject("([1])"))); | |
62 CHECK_EQ(*factory->true_value(), *helper.Invoke(helper.NewObject("({})"))); | |
63 CHECK_EQ(*factory->true_value(), *helper.Invoke(helper.NewObject("(/x/)"))); | |
64 CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.Undefined())); | |
65 CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.Null())); | |
66 CHECK_EQ(*factory->false_value(), | |
67 *helper.Invoke(helper.NewObject("'string'"))); | |
68 CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.NewObject("42"))); | |
69 } | |
70 | |
71 TEST(IsArray) { | |
72 HandleAndZoneScope handles; | |
73 | |
74 InvokeIntrinsicHelper helper(handles.main_isolate(), handles.main_zone(), | |
75 Runtime::kInlineIsArray); | |
76 Factory* factory = handles.main_isolate()->factory(); | |
77 | |
78 CHECK_EQ(*factory->false_value(), | |
79 *helper.Invoke(helper.NewObject("new Date()"))); | |
80 CHECK_EQ(*factory->false_value(), | |
81 *helper.Invoke(helper.NewObject("(function() {})"))); | |
82 CHECK_EQ(*factory->true_value(), *helper.Invoke(helper.NewObject("([1])"))); | |
83 CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.NewObject("({})"))); | |
84 CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.NewObject("(/x/)"))); | |
85 CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.Undefined())); | |
86 CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.Null())); | |
87 CHECK_EQ(*factory->false_value(), | |
88 *helper.Invoke(helper.NewObject("'string'"))); | |
89 CHECK_EQ(*factory->false_value(), *helper.Invoke(helper.NewObject("42"))); | |
90 } | |
91 | |
92 } // namespace interpreter | |
93 } // namespace internal | |
94 } // namespace v8 | |
OLD | NEW |