OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <stdlib.h> | 5 #include <stdlib.h> |
6 | 6 |
7 #include "include/v8.h" | 7 #include "include/v8.h" |
8 #include "include/v8-experimental.h" | 8 #include "include/v8-experimental.h" |
9 | 9 |
10 #include "src/api.h" | 10 #include "src/api.h" |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
105 builder->ReturnValue( | 105 builder->ReturnValue( |
106 builder->LoadInternalField(builder->GetReceiver(), field_no)); | 106 builder->LoadInternalField(builder->GetReceiver(), field_no)); |
107 templ->SetAccessorProperty(v8_str(name), | 107 templ->SetAccessorProperty(v8_str(name), |
108 v8::FunctionTemplate::NewWithFastHandler( | 108 v8::FunctionTemplate::NewWithFastHandler( |
109 isolate, NativePropertyAccessor, builder)); | 109 isolate, NativePropertyAccessor, builder)); |
110 } | 110 } |
111 | 111 |
112 | 112 |
113 // "Fast" accessor that accesses an internal field. | 113 // "Fast" accessor that accesses an internal field. |
114 TEST(FastAccessorWithInternalField) { | 114 TEST(FastAccessorWithInternalField) { |
| 115 // Crankshaft support for fast accessors is not implemented; crankshafted |
| 116 // code uses the slow accessor which breaks this test's expectations. |
| 117 v8::internal::FLAG_always_opt = false; |
115 LocalContext env; | 118 LocalContext env; |
116 v8::Isolate* isolate = env->GetIsolate(); | 119 v8::Isolate* isolate = env->GetIsolate(); |
117 v8::HandleScope scope(isolate); | 120 v8::HandleScope scope(isolate); |
118 | 121 |
119 v8::Local<v8::ObjectTemplate> foo = v8::ObjectTemplate::New(isolate); | 122 v8::Local<v8::ObjectTemplate> foo = v8::ObjectTemplate::New(isolate); |
120 foo->SetInternalFieldCount(3); | 123 foo->SetInternalFieldCount(3); |
121 AddInternalFieldAccessor(isolate, foo, "field0", 0); | 124 AddInternalFieldAccessor(isolate, foo, "field0", 0); |
122 AddInternalFieldAccessor(isolate, foo, "field1", 1); | 125 AddInternalFieldAccessor(isolate, foo, "field1", 1); |
123 AddInternalFieldAccessor(isolate, foo, "field2", 2); | 126 AddInternalFieldAccessor(isolate, foo, "field2", 2); |
124 | 127 |
(...skipping 10 matching lines...) Expand all Loading... |
135 | 138 |
136 // Access fields. | 139 // Access fields. |
137 ExpectString("field0()", "Hi there!"); | 140 ExpectString("field0()", "Hi there!"); |
138 ExpectInt32("field1()", 4321); | 141 ExpectInt32("field1()", 4321); |
139 ExpectUndefined("field2()"); | 142 ExpectUndefined("field2()"); |
140 } | 143 } |
141 | 144 |
142 | 145 |
143 // "Fast" accessor with control flow via ...OrReturnNull methods. | 146 // "Fast" accessor with control flow via ...OrReturnNull methods. |
144 TEST(FastAccessorOrReturnNull) { | 147 TEST(FastAccessorOrReturnNull) { |
| 148 // Crankshaft support for fast accessors is not implemented; crankshafted |
| 149 // code uses the slow accessor which breaks this test's expectations. |
| 150 v8::internal::FLAG_always_opt = false; |
145 LocalContext env; | 151 LocalContext env; |
146 v8::Isolate* isolate = env->GetIsolate(); | 152 v8::Isolate* isolate = env->GetIsolate(); |
147 v8::HandleScope scope(isolate); | 153 v8::HandleScope scope(isolate); |
148 | 154 |
149 v8::Local<v8::ObjectTemplate> foo = v8::ObjectTemplate::New(isolate); | 155 v8::Local<v8::ObjectTemplate> foo = v8::ObjectTemplate::New(isolate); |
150 foo->SetInternalFieldCount(2); | 156 foo->SetInternalFieldCount(2); |
151 { | 157 { |
152 // accessor "nullcheck": Return null if field 0 is non-null object; else 5. | 158 // accessor "nullcheck": Return null if field 0 is non-null object; else 5. |
153 auto builder = v8::experimental::FastAccessorBuilder::New(isolate); | 159 auto builder = v8::experimental::FastAccessorBuilder::New(isolate); |
154 auto val = builder->LoadInternalField(builder->GetReceiver(), 0); | 160 auto val = builder->LoadInternalField(builder->GetReceiver(), 0); |
(...skipping 29 matching lines...) Expand all Loading... |
184 CompileRun(FN_WARMUP("maskcheck", "return obj.maskcheck")); | 190 CompileRun(FN_WARMUP("maskcheck", "return obj.maskcheck")); |
185 obj->SetAlignedPointerInInternalField(1, reinterpret_cast<void*>(0xf0)); | 191 obj->SetAlignedPointerInInternalField(1, reinterpret_cast<void*>(0xf0)); |
186 ExpectInt32("maskcheck()", 42); | 192 ExpectInt32("maskcheck()", 42); |
187 obj->SetAlignedPointerInInternalField(1, reinterpret_cast<void*>(0xfe)); | 193 obj->SetAlignedPointerInInternalField(1, reinterpret_cast<void*>(0xfe)); |
188 ExpectNull("maskcheck()"); | 194 ExpectNull("maskcheck()"); |
189 } | 195 } |
190 | 196 |
191 | 197 |
192 // "Fast" accessor with simple control flow via explicit labels. | 198 // "Fast" accessor with simple control flow via explicit labels. |
193 TEST(FastAccessorControlFlowWithLabels) { | 199 TEST(FastAccessorControlFlowWithLabels) { |
| 200 // Crankshaft support for fast accessors is not implemented; crankshafted |
| 201 // code uses the slow accessor which breaks this test's expectations. |
| 202 v8::internal::FLAG_always_opt = false; |
194 LocalContext env; | 203 LocalContext env; |
195 v8::Isolate* isolate = env->GetIsolate(); | 204 v8::Isolate* isolate = env->GetIsolate(); |
196 v8::HandleScope scope(isolate); | 205 v8::HandleScope scope(isolate); |
197 | 206 |
198 v8::Local<v8::ObjectTemplate> foo = v8::ObjectTemplate::New(isolate); | 207 v8::Local<v8::ObjectTemplate> foo = v8::ObjectTemplate::New(isolate); |
199 foo->SetInternalFieldCount(1); | 208 foo->SetInternalFieldCount(1); |
200 { | 209 { |
201 // accessor isnull: 0 for nullptr, else 1. | 210 // accessor isnull: 0 for nullptr, else 1. |
202 auto builder = v8::experimental::FastAccessorBuilder::New(isolate); | 211 auto builder = v8::experimental::FastAccessorBuilder::New(isolate); |
203 auto label = builder->MakeLabel(); | 212 auto label = builder->MakeLabel(); |
(...skipping 15 matching lines...) Expand all Loading... |
219 CompileRun(FN_WARMUP("isnull", "return obj.isnull")); | 228 CompileRun(FN_WARMUP("isnull", "return obj.isnull")); |
220 obj->SetAlignedPointerInInternalField(0, /* anything != nullptr */ isolate); | 229 obj->SetAlignedPointerInInternalField(0, /* anything != nullptr */ isolate); |
221 ExpectInt32("isnull()", 1); | 230 ExpectInt32("isnull()", 1); |
222 obj->SetAlignedPointerInInternalField(0, nullptr); | 231 obj->SetAlignedPointerInInternalField(0, nullptr); |
223 ExpectInt32("isnull()", 0); | 232 ExpectInt32("isnull()", 0); |
224 } | 233 } |
225 | 234 |
226 | 235 |
227 // "Fast" accessor, loading things. | 236 // "Fast" accessor, loading things. |
228 TEST(FastAccessorLoad) { | 237 TEST(FastAccessorLoad) { |
| 238 // Crankshaft support for fast accessors is not implemented; crankshafted |
| 239 // code uses the slow accessor which breaks this test's expectations. |
| 240 v8::internal::FLAG_always_opt = false; |
229 LocalContext env; | 241 LocalContext env; |
230 v8::Isolate* isolate = env->GetIsolate(); | 242 v8::Isolate* isolate = env->GetIsolate(); |
231 v8::HandleScope scope(isolate); | 243 v8::HandleScope scope(isolate); |
232 | 244 |
233 v8::Local<v8::ObjectTemplate> foo = v8::ObjectTemplate::New(isolate); | 245 v8::Local<v8::ObjectTemplate> foo = v8::ObjectTemplate::New(isolate); |
234 foo->SetInternalFieldCount(1); | 246 foo->SetInternalFieldCount(1); |
235 | 247 |
236 // Internal field 0 is a pointer to a C++ data structure that we wish to load | 248 // Internal field 0 is a pointer to a C++ data structure that we wish to load |
237 // field values from. | 249 // field values from. |
238 struct { | 250 struct { |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
298 } | 310 } |
299 | 311 |
300 void ApiCallbackParam(const v8::FunctionCallbackInfo<v8::Value>& info) { | 312 void ApiCallbackParam(const v8::FunctionCallbackInfo<v8::Value>& info) { |
301 CHECK_EQ(1, info.Length()); | 313 CHECK_EQ(1, info.Length()); |
302 CHECK(info[0]->IsNumber()); | 314 CHECK(info[0]->IsNumber()); |
303 info.GetReturnValue().Set(info[0]); | 315 info.GetReturnValue().Set(info[0]); |
304 } | 316 } |
305 | 317 |
306 // "Fast" accessor, callback to embedder | 318 // "Fast" accessor, callback to embedder |
307 TEST(FastAccessorCallback) { | 319 TEST(FastAccessorCallback) { |
| 320 // Crankshaft support for fast accessors is not implemented; crankshafted |
| 321 // code uses the slow accessor which breaks this test's expectations. |
| 322 v8::internal::FLAG_always_opt = false; |
308 LocalContext env; | 323 LocalContext env; |
309 v8::Isolate* isolate = env->GetIsolate(); | 324 v8::Isolate* isolate = env->GetIsolate(); |
310 v8::HandleScope scope(isolate); | 325 v8::HandleScope scope(isolate); |
311 | 326 |
312 v8::Local<v8::ObjectTemplate> foo = v8::ObjectTemplate::New(isolate); | 327 v8::Local<v8::ObjectTemplate> foo = v8::ObjectTemplate::New(isolate); |
313 { | 328 { |
314 auto builder = v8::experimental::FastAccessorBuilder::New(isolate); | 329 auto builder = v8::experimental::FastAccessorBuilder::New(isolate); |
315 builder->ReturnValue( | 330 builder->ReturnValue( |
316 builder->Call(&ApiCallbackInt, builder->IntegerConstant(999))); | 331 builder->Call(&ApiCallbackInt, builder->IntegerConstant(999))); |
317 foo->SetAccessorProperty(v8_str("int"), | 332 foo->SetAccessorProperty(v8_str("int"), |
(...skipping 22 matching lines...) Expand all Loading... |
340 // Callbacks: | 355 // Callbacks: |
341 CompileRun(FN_WARMUP("callbackint", "return obj.int")); | 356 CompileRun(FN_WARMUP("callbackint", "return obj.int")); |
342 ExpectInt32("callbackint()", 12345); | 357 ExpectInt32("callbackint()", 12345); |
343 | 358 |
344 CompileRun(FN_WARMUP("callbackstr", "return obj.str")); | 359 CompileRun(FN_WARMUP("callbackstr", "return obj.str")); |
345 ExpectString("callbackstr()", kApiCallbackStringValue); | 360 ExpectString("callbackstr()", kApiCallbackStringValue); |
346 | 361 |
347 CompileRun(FN_WARMUP("callbackparam", "return obj.param")); | 362 CompileRun(FN_WARMUP("callbackparam", "return obj.param")); |
348 ExpectInt32("callbackparam()", 1000); | 363 ExpectInt32("callbackparam()", 1000); |
349 } | 364 } |
OLD | NEW |