Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(445)

Side by Side Diff: test/cctest/test-api-fast-accessor-builder.cc

Issue 2741683004: [rename] Rename internal field to embedder field. (Closed)
Patch Set: DEPRECATE_SOON(GetInternalField) Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 .FromJust()); 107 .FromJust());
108 108
109 // Wrap f.barf + IC warmup. 109 // Wrap f.barf + IC warmup.
110 CompileRun(FN_WARMUP("barf", "f = new foo(); return f.barf")); 110 CompileRun(FN_WARMUP("barf", "f = new foo(); return f.barf"));
111 111
112 ExpectInt32("f = new foo(); f.bar", 123); 112 ExpectInt32("f = new foo(); f.bar", 123);
113 ExpectInt32("f = new foo(); f.barf", 123); // First call in this call site. 113 ExpectInt32("f = new foo(); f.barf", 123); // First call in this call site.
114 ExpectInt32("barf()", 124); // Call via warmed-up callsite. 114 ExpectInt32("barf()", 124); // Call via warmed-up callsite.
115 } 115 }
116 116
117 void AddInternalFieldAccessor(v8::Isolate* isolate, 117 void AddEmbedderFieldAccessor(v8::Isolate* isolate,
118 v8::Local<v8::Template> templ, const char* name, 118 v8::Local<v8::Template> templ, const char* name,
119 int field_no, bool useUncheckedLoader) { 119 int field_no, bool useUncheckedLoader) {
120 auto builder = v8::experimental::FastAccessorBuilder::New(isolate); 120 auto builder = v8::experimental::FastAccessorBuilder::New(isolate);
121 121
122 if (useUncheckedLoader) { 122 if (useUncheckedLoader) {
123 builder->ReturnValue( 123 builder->ReturnValue(
124 builder->LoadInternalFieldUnchecked(builder->GetReceiver(), field_no)); 124 builder->LoadEmbedderFieldUnchecked(builder->GetReceiver(), field_no));
125 } else { 125 } else {
126 builder->ReturnValue( 126 builder->ReturnValue(
127 builder->LoadInternalField(builder->GetReceiver(), field_no)); 127 builder->LoadEmbedderField(builder->GetReceiver(), field_no));
128 } 128 }
129 129
130 templ->SetAccessorProperty(v8_str(name), 130 templ->SetAccessorProperty(v8_str(name),
131 v8::FunctionTemplate::NewWithFastHandler( 131 v8::FunctionTemplate::NewWithFastHandler(
132 isolate, NativePropertyAccessor, builder)); 132 isolate, NativePropertyAccessor, builder));
133 } 133 }
134 134
135 void checkLoadInternalField(bool useUncheckedLoader, bool emitDebugChecks) { 135 void checkLoadEmbedderField(bool useUncheckedLoader, bool emitDebugChecks) {
136 // Crankshaft support for fast accessors is not implemented; crankshafted 136 // Crankshaft support for fast accessors is not implemented; crankshafted
137 // code uses the slow accessor which breaks this test's expectations. 137 // code uses the slow accessor which breaks this test's expectations.
138 v8::internal::FLAG_always_opt = false; 138 v8::internal::FLAG_always_opt = false;
139 139
140 // De/activate debug checks. 140 // De/activate debug checks.
141 v8::internal::FLAG_debug_code = emitDebugChecks; 141 v8::internal::FLAG_debug_code = emitDebugChecks;
142 LocalContext env; 142 LocalContext env;
143 v8::Isolate* isolate = env->GetIsolate(); 143 v8::Isolate* isolate = env->GetIsolate();
144 v8::HandleScope scope(isolate); 144 v8::HandleScope scope(isolate);
145 145
146 v8::Local<v8::ObjectTemplate> foo = v8::ObjectTemplate::New(isolate); 146 v8::Local<v8::ObjectTemplate> foo = v8::ObjectTemplate::New(isolate);
147 foo->SetInternalFieldCount(3); 147 foo->SetEmbedderFieldCount(3);
148 AddInternalFieldAccessor(isolate, foo, "field0", 0, useUncheckedLoader); 148 AddEmbedderFieldAccessor(isolate, foo, "field0", 0, useUncheckedLoader);
149 AddInternalFieldAccessor(isolate, foo, "field1", 1, useUncheckedLoader); 149 AddEmbedderFieldAccessor(isolate, foo, "field1", 1, useUncheckedLoader);
150 AddInternalFieldAccessor(isolate, foo, "field2", 2, useUncheckedLoader); 150 AddEmbedderFieldAccessor(isolate, foo, "field2", 2, useUncheckedLoader);
151 151
152 // Create an instance w/ 3 internal fields, put in a string, a Smi, nothing. 152 // Create an instance w/ 3 embedder fields, put in a string, a Smi, nothing.
153 v8::Local<v8::Object> obj = foo->NewInstance(env.local()).ToLocalChecked(); 153 v8::Local<v8::Object> obj = foo->NewInstance(env.local()).ToLocalChecked();
154 obj->SetInternalField(0, v8_str("Hi there!")); 154 obj->SetEmbedderField(0, v8_str("Hi there!"));
155 obj->SetInternalField(1, v8::Integer::New(isolate, 4321)); 155 obj->SetEmbedderField(1, v8::Integer::New(isolate, 4321));
156 CHECK(env->Global()->Set(env.local(), v8_str("obj"), obj).FromJust()); 156 CHECK(env->Global()->Set(env.local(), v8_str("obj"), obj).FromJust());
157 157
158 // Warmup. 158 // Warmup.
159 CompileRun(FN_WARMUP("field0", "return obj.field0")); 159 CompileRun(FN_WARMUP("field0", "return obj.field0"));
160 CompileRun(FN_WARMUP("field1", "return obj.field1")); 160 CompileRun(FN_WARMUP("field1", "return obj.field1"));
161 CompileRun(FN_WARMUP("field2", "return obj.field2")); 161 CompileRun(FN_WARMUP("field2", "return obj.field2"));
162 162
163 // Access fields. 163 // Access fields.
164 ExpectString("field0()", "Hi there!"); 164 ExpectString("field0()", "Hi there!");
165 ExpectInt32("field1()", 4321); 165 ExpectInt32("field1()", 4321);
166 ExpectUndefined("field2()"); 166 ExpectUndefined("field2()");
167 } 167 }
168 168
169 // "Fast" accessor that accesses an internal field. 169 // "Fast" accessor that accesses an embedder field.
170 TEST(FastAccessorWithInternalField) { checkLoadInternalField(false, false); } 170 TEST(FastAccessorWithEmbedderField) { checkLoadEmbedderField(false, false); }
171 171
172 // "Fast" accessor that accesses an internal field using the fast(er) 172 // "Fast" accessor that accesses an embedder field using the fast(er)
173 // implementation of LoadInternalField. 173 // implementation of LoadEmbedderField.
174 TEST(FastAccessorLoadInternalFieldUnchecked) { 174 TEST(FastAccessorLoadEmbedderFieldUnchecked) {
175 checkLoadInternalField(true, false); 175 checkLoadEmbedderField(true, false);
176 checkLoadInternalField(true, true); 176 checkLoadEmbedderField(true, true);
177 } 177 }
178 178
179 // "Fast" accessor with control flow via ...OrReturnNull methods. 179 // "Fast" accessor with control flow via ...OrReturnNull methods.
180 TEST(FastAccessorOrReturnNull) { 180 TEST(FastAccessorOrReturnNull) {
181 // Crankshaft support for fast accessors is not implemented; crankshafted 181 // Crankshaft support for fast accessors is not implemented; crankshafted
182 // code uses the slow accessor which breaks this test's expectations. 182 // code uses the slow accessor which breaks this test's expectations.
183 v8::internal::FLAG_always_opt = false; 183 v8::internal::FLAG_always_opt = false;
184 LocalContext env; 184 LocalContext env;
185 v8::Isolate* isolate = env->GetIsolate(); 185 v8::Isolate* isolate = env->GetIsolate();
186 v8::HandleScope scope(isolate); 186 v8::HandleScope scope(isolate);
187 187
188 v8::Local<v8::ObjectTemplate> foo = v8::ObjectTemplate::New(isolate); 188 v8::Local<v8::ObjectTemplate> foo = v8::ObjectTemplate::New(isolate);
189 foo->SetInternalFieldCount(2); 189 foo->SetEmbedderFieldCount(2);
190 { 190 {
191 // accessor "nullcheck": Return null if field 0 is non-null object; else 5. 191 // accessor "nullcheck": Return null if field 0 is non-null object; else 5.
192 auto builder = v8::experimental::FastAccessorBuilder::New(isolate); 192 auto builder = v8::experimental::FastAccessorBuilder::New(isolate);
193 auto val = builder->LoadInternalField(builder->GetReceiver(), 0); 193 auto val = builder->LoadEmbedderField(builder->GetReceiver(), 0);
194 builder->CheckNotZeroOrReturnNull(val); 194 builder->CheckNotZeroOrReturnNull(val);
195 builder->ReturnValue(builder->IntegerConstant(5)); 195 builder->ReturnValue(builder->IntegerConstant(5));
196 foo->SetAccessorProperty(v8_str("nullcheck"), 196 foo->SetAccessorProperty(v8_str("nullcheck"),
197 v8::FunctionTemplate::NewWithFastHandler( 197 v8::FunctionTemplate::NewWithFastHandler(
198 isolate, NativePropertyAccessor, builder)); 198 isolate, NativePropertyAccessor, builder));
199 } 199 }
200 { 200 {
201 // accessor "maskcheck": Return null if field 1 has 3rd bit set. 201 // accessor "maskcheck": Return null if field 1 has 3rd bit set.
202 auto builder = v8::experimental::FastAccessorBuilder::New(isolate); 202 auto builder = v8::experimental::FastAccessorBuilder::New(isolate);
203 auto val = builder->LoadInternalField(builder->GetReceiver(), 1); 203 auto val = builder->LoadEmbedderField(builder->GetReceiver(), 1);
204 builder->CheckFlagSetOrReturnNull(val, 0x4); 204 builder->CheckFlagSetOrReturnNull(val, 0x4);
205 builder->ReturnValue(builder->IntegerConstant(42)); 205 builder->ReturnValue(builder->IntegerConstant(42));
206 foo->SetAccessorProperty(v8_str("maskcheck"), 206 foo->SetAccessorProperty(v8_str("maskcheck"),
207 v8::FunctionTemplate::NewWithFastHandler( 207 v8::FunctionTemplate::NewWithFastHandler(
208 isolate, NativePropertyAccessor, builder)); 208 isolate, NativePropertyAccessor, builder));
209 } 209 }
210 210
211 // Create an instance. 211 // Create an instance.
212 v8::Local<v8::Object> obj = foo->NewInstance(env.local()).ToLocalChecked(); 212 v8::Local<v8::Object> obj = foo->NewInstance(env.local()).ToLocalChecked();
213 CHECK(env->Global()->Set(env.local(), v8_str("obj"), obj).FromJust()); 213 CHECK(env->Global()->Set(env.local(), v8_str("obj"), obj).FromJust());
214 214
215 // CheckNotZeroOrReturnNull: 215 // CheckNotZeroOrReturnNull:
216 CompileRun(FN_WARMUP("nullcheck", "return obj.nullcheck")); 216 CompileRun(FN_WARMUP("nullcheck", "return obj.nullcheck"));
217 obj->SetAlignedPointerInInternalField(0, /* anything != nullptr */ isolate); 217 obj->SetAlignedPointerInEmbedderField(0, /* anything != nullptr */ isolate);
218 ExpectInt32("nullcheck()", 5); 218 ExpectInt32("nullcheck()", 5);
219 obj->SetAlignedPointerInInternalField(0, nullptr); 219 obj->SetAlignedPointerInEmbedderField(0, nullptr);
220 ExpectNull("nullcheck()"); 220 ExpectNull("nullcheck()");
221 221
222 // CheckFlagSetOrReturnNull: 222 // CheckFlagSetOrReturnNull:
223 CompileRun(FN_WARMUP("maskcheck", "return obj.maskcheck")); 223 CompileRun(FN_WARMUP("maskcheck", "return obj.maskcheck"));
224 obj->SetAlignedPointerInInternalField(1, reinterpret_cast<void*>(0xf0)); 224 obj->SetAlignedPointerInEmbedderField(1, reinterpret_cast<void*>(0xf0));
225 ExpectNull("maskcheck()"); 225 ExpectNull("maskcheck()");
226 obj->SetAlignedPointerInInternalField(1, reinterpret_cast<void*>(0xfe)); 226 obj->SetAlignedPointerInEmbedderField(1, reinterpret_cast<void*>(0xfe));
227 ExpectInt32("maskcheck()", 42); 227 ExpectInt32("maskcheck()", 42);
228 } 228 }
229 229
230 230
231 // "Fast" accessor with simple control flow via explicit labels. 231 // "Fast" accessor with simple control flow via explicit labels.
232 TEST(FastAccessorControlFlowWithLabels) { 232 TEST(FastAccessorControlFlowWithLabels) {
233 // Crankshaft support for fast accessors is not implemented; crankshafted 233 // Crankshaft support for fast accessors is not implemented; crankshafted
234 // code uses the slow accessor which breaks this test's expectations. 234 // code uses the slow accessor which breaks this test's expectations.
235 v8::internal::FLAG_always_opt = false; 235 v8::internal::FLAG_always_opt = false;
236 LocalContext env; 236 LocalContext env;
237 v8::Isolate* isolate = env->GetIsolate(); 237 v8::Isolate* isolate = env->GetIsolate();
238 v8::HandleScope scope(isolate); 238 v8::HandleScope scope(isolate);
239 239
240 v8::Local<v8::ObjectTemplate> foo = v8::ObjectTemplate::New(isolate); 240 v8::Local<v8::ObjectTemplate> foo = v8::ObjectTemplate::New(isolate);
241 foo->SetInternalFieldCount(1); 241 foo->SetEmbedderFieldCount(1);
242 { 242 {
243 // accessor isnull: 0 for nullptr, else 1. 243 // accessor isnull: 0 for nullptr, else 1.
244 auto builder = v8::experimental::FastAccessorBuilder::New(isolate); 244 auto builder = v8::experimental::FastAccessorBuilder::New(isolate);
245 auto label = builder->MakeLabel(); 245 auto label = builder->MakeLabel();
246 auto val = builder->LoadInternalField(builder->GetReceiver(), 0); 246 auto val = builder->LoadEmbedderField(builder->GetReceiver(), 0);
247 builder->CheckNotZeroOrJump(val, label); 247 builder->CheckNotZeroOrJump(val, label);
248 builder->ReturnValue(builder->IntegerConstant(1)); 248 builder->ReturnValue(builder->IntegerConstant(1));
249 builder->SetLabel(label); 249 builder->SetLabel(label);
250 builder->ReturnValue(builder->IntegerConstant(0)); 250 builder->ReturnValue(builder->IntegerConstant(0));
251 foo->SetAccessorProperty(v8_str("isnull"), 251 foo->SetAccessorProperty(v8_str("isnull"),
252 v8::FunctionTemplate::NewWithFastHandler( 252 v8::FunctionTemplate::NewWithFastHandler(
253 isolate, NativePropertyAccessor, builder)); 253 isolate, NativePropertyAccessor, builder));
254 } 254 }
255 255
256 // Create an instance. 256 // Create an instance.
257 v8::Local<v8::Object> obj = foo->NewInstance(env.local()).ToLocalChecked(); 257 v8::Local<v8::Object> obj = foo->NewInstance(env.local()).ToLocalChecked();
258 CHECK(env->Global()->Set(env.local(), v8_str("obj"), obj).FromJust()); 258 CHECK(env->Global()->Set(env.local(), v8_str("obj"), obj).FromJust());
259 259
260 // CheckNotZeroOrReturnNull: 260 // CheckNotZeroOrReturnNull:
261 CompileRun(FN_WARMUP("isnull", "return obj.isnull")); 261 CompileRun(FN_WARMUP("isnull", "return obj.isnull"));
262 obj->SetAlignedPointerInInternalField(0, /* anything != nullptr */ isolate); 262 obj->SetAlignedPointerInEmbedderField(0, /* anything != nullptr */ isolate);
263 ExpectInt32("isnull()", 1); 263 ExpectInt32("isnull()", 1);
264 obj->SetAlignedPointerInInternalField(0, nullptr); 264 obj->SetAlignedPointerInEmbedderField(0, nullptr);
265 ExpectInt32("isnull()", 0); 265 ExpectInt32("isnull()", 0);
266 } 266 }
267 267
268 268
269 // "Fast" accessor, loading things. 269 // "Fast" accessor, loading things.
270 TEST(FastAccessorLoad) { 270 TEST(FastAccessorLoad) {
271 // Crankshaft support for fast accessors is not implemented; crankshafted 271 // Crankshaft support for fast accessors is not implemented; crankshafted
272 // code uses the slow accessor which breaks this test's expectations. 272 // code uses the slow accessor which breaks this test's expectations.
273 v8::internal::FLAG_always_opt = false; 273 v8::internal::FLAG_always_opt = false;
274 LocalContext env; 274 LocalContext env;
275 v8::Isolate* isolate = env->GetIsolate(); 275 v8::Isolate* isolate = env->GetIsolate();
276 v8::HandleScope scope(isolate); 276 v8::HandleScope scope(isolate);
277 277
278 v8::Local<v8::ObjectTemplate> foo = v8::ObjectTemplate::New(isolate); 278 v8::Local<v8::ObjectTemplate> foo = v8::ObjectTemplate::New(isolate);
279 foo->SetInternalFieldCount(1); 279 foo->SetEmbedderFieldCount(1);
280 280
281 // Internal field 0 is a pointer to a C++ data structure that we wish to load 281 // Internal field 0 is a pointer to a C++ data structure that we wish to load
282 // field values from. 282 // field values from.
283 struct { 283 struct {
284 size_t intval; 284 size_t intval;
285 v8::Local<v8::String> v8val; 285 v8::Local<v8::String> v8val;
286 } val = {54321, v8_str("Hello")}; 286 } val = {54321, v8_str("Hello")};
287 287
288 { 288 {
289 // accessor intisnonzero 289 // accessor intisnonzero
290 int intval_offset = 290 int intval_offset =
291 static_cast<int>(reinterpret_cast<intptr_t>(&val.intval) - 291 static_cast<int>(reinterpret_cast<intptr_t>(&val.intval) -
292 reinterpret_cast<intptr_t>(&val)); 292 reinterpret_cast<intptr_t>(&val));
293 auto builder = v8::experimental::FastAccessorBuilder::New(isolate); 293 auto builder = v8::experimental::FastAccessorBuilder::New(isolate);
294 auto label = builder->MakeLabel(); 294 auto label = builder->MakeLabel();
295 auto val = builder->LoadValue( 295 auto val = builder->LoadValue(
296 builder->LoadInternalField(builder->GetReceiver(), 0), intval_offset); 296 builder->LoadEmbedderField(builder->GetReceiver(), 0), intval_offset);
297 builder->CheckNotZeroOrJump(val, label); 297 builder->CheckNotZeroOrJump(val, label);
298 builder->ReturnValue(builder->IntegerConstant(1)); 298 builder->ReturnValue(builder->IntegerConstant(1));
299 builder->SetLabel(label); 299 builder->SetLabel(label);
300 builder->ReturnValue(builder->IntegerConstant(0)); 300 builder->ReturnValue(builder->IntegerConstant(0));
301 foo->SetAccessorProperty(v8_str("nonzero"), 301 foo->SetAccessorProperty(v8_str("nonzero"),
302 v8::FunctionTemplate::NewWithFastHandler( 302 v8::FunctionTemplate::NewWithFastHandler(
303 isolate, NativePropertyAccessor, builder)); 303 isolate, NativePropertyAccessor, builder));
304 } 304 }
305 { 305 {
306 // accessor loadval 306 // accessor loadval
307 int v8val_offset = static_cast<int>(reinterpret_cast<intptr_t>(&val.v8val) - 307 int v8val_offset = static_cast<int>(reinterpret_cast<intptr_t>(&val.v8val) -
308 reinterpret_cast<intptr_t>(&val)); 308 reinterpret_cast<intptr_t>(&val));
309 auto builder = v8::experimental::FastAccessorBuilder::New(isolate); 309 auto builder = v8::experimental::FastAccessorBuilder::New(isolate);
310 builder->ReturnValue(builder->LoadObject( 310 builder->ReturnValue(builder->LoadObject(
311 builder->LoadInternalField(builder->GetReceiver(), 0), v8val_offset)); 311 builder->LoadEmbedderField(builder->GetReceiver(), 0), v8val_offset));
312 foo->SetAccessorProperty(v8_str("loadval"), 312 foo->SetAccessorProperty(v8_str("loadval"),
313 v8::FunctionTemplate::NewWithFastHandler( 313 v8::FunctionTemplate::NewWithFastHandler(
314 isolate, NativePropertyAccessor, builder)); 314 isolate, NativePropertyAccessor, builder));
315 } 315 }
316 316
317 // Create an instance. 317 // Create an instance.
318 v8::Local<v8::Object> obj = foo->NewInstance(env.local()).ToLocalChecked(); 318 v8::Local<v8::Object> obj = foo->NewInstance(env.local()).ToLocalChecked();
319 obj->SetAlignedPointerInInternalField(0, &val); 319 obj->SetAlignedPointerInEmbedderField(0, &val);
320 CHECK(env->Global()->Set(env.local(), v8_str("obj"), obj).FromJust()); 320 CHECK(env->Global()->Set(env.local(), v8_str("obj"), obj).FromJust());
321 321
322 // Access val.intval: 322 // Access val.intval:
323 CompileRun(FN_WARMUP("nonzero", "return obj.nonzero")); 323 CompileRun(FN_WARMUP("nonzero", "return obj.nonzero"));
324 ExpectInt32("nonzero()", 1); 324 ExpectInt32("nonzero()", 1);
325 val.intval = 0; 325 val.intval = 0;
326 ExpectInt32("nonzero()", 0); 326 ExpectInt32("nonzero()", 0);
327 val.intval = 27; 327 val.intval = 27;
328 ExpectInt32("nonzero()", 1); 328 ExpectInt32("nonzero()", 1);
329 329
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
404 404
405 TEST(FastAccessorToSmi) { 405 TEST(FastAccessorToSmi) {
406 // Crankshaft support for fast accessors is not implemented; crankshafted 406 // Crankshaft support for fast accessors is not implemented; crankshafted
407 // code uses the slow accessor which breaks this test's expectations. 407 // code uses the slow accessor which breaks this test's expectations.
408 v8::internal::FLAG_always_opt = false; 408 v8::internal::FLAG_always_opt = false;
409 LocalContext env; 409 LocalContext env;
410 v8::Isolate* isolate = env->GetIsolate(); 410 v8::Isolate* isolate = env->GetIsolate();
411 v8::HandleScope scope(isolate); 411 v8::HandleScope scope(isolate);
412 412
413 v8::Local<v8::ObjectTemplate> foo = v8::ObjectTemplate::New(isolate); 413 v8::Local<v8::ObjectTemplate> foo = v8::ObjectTemplate::New(isolate);
414 foo->SetInternalFieldCount(1); 414 foo->SetEmbedderFieldCount(1);
415 415
416 { 416 {
417 // Accessor load_smi. 417 // Accessor load_smi.
418 auto builder = v8::experimental::FastAccessorBuilder::New(isolate); 418 auto builder = v8::experimental::FastAccessorBuilder::New(isolate);
419 419
420 // Read the variable and convert it to a Smi. 420 // Read the variable and convert it to a Smi.
421 auto flags = builder->LoadValue( 421 auto flags = builder->LoadValue(
422 builder->LoadInternalField(builder->GetReceiver(), 0), 0); 422 builder->LoadEmbedderField(builder->GetReceiver(), 0), 0);
423 builder->ReturnValue(builder->ToSmi(flags)); 423 builder->ReturnValue(builder->ToSmi(flags));
424 foo->SetAccessorProperty(v8_str("load_smi"), 424 foo->SetAccessorProperty(v8_str("load_smi"),
425 v8::FunctionTemplate::NewWithFastHandler( 425 v8::FunctionTemplate::NewWithFastHandler(
426 isolate, NativePropertyAccessor, builder)); 426 isolate, NativePropertyAccessor, builder));
427 } 427 }
428 428
429 // Create an instance. 429 // Create an instance.
430 v8::Local<v8::Object> obj = foo->NewInstance(env.local()).ToLocalChecked(); 430 v8::Local<v8::Object> obj = foo->NewInstance(env.local()).ToLocalChecked();
431 431
432 uintptr_t flags; 432 uintptr_t flags;
433 obj->SetAlignedPointerInInternalField(0, &flags); 433 obj->SetAlignedPointerInEmbedderField(0, &flags);
434 CHECK(env->Global()->Set(env.local(), v8_str("obj"), obj).FromJust()); 434 CHECK(env->Global()->Set(env.local(), v8_str("obj"), obj).FromJust());
435 435
436 // Access flags. 436 // Access flags.
437 CompileRun(FN_WARMUP("load_smi", "return obj.load_smi")); 437 CompileRun(FN_WARMUP("load_smi", "return obj.load_smi"));
438 438
439 flags = 54321; 439 flags = 54321;
440 ExpectInt32("load_smi()", 54321); 440 ExpectInt32("load_smi()", 54321);
441 441
442 flags = 0; 442 flags = 0;
443 ExpectInt32("load_smi()", 0); 443 ExpectInt32("load_smi()", 0);
444 444
445 flags = 123456789; 445 flags = 123456789;
446 ExpectInt32("load_smi()", 123456789); 446 ExpectInt32("load_smi()", 123456789);
447 } 447 }
448 448
449 TEST(FastAccessorGoto) { 449 TEST(FastAccessorGoto) {
450 // Crankshaft support for fast accessors is not implemented; crankshafted 450 // Crankshaft support for fast accessors is not implemented; crankshafted
451 // code uses the slow accessor which breaks this test's expectations. 451 // code uses the slow accessor which breaks this test's expectations.
452 v8::internal::FLAG_always_opt = false; 452 v8::internal::FLAG_always_opt = false;
453 LocalContext env; 453 LocalContext env;
454 v8::Isolate* isolate = env->GetIsolate(); 454 v8::Isolate* isolate = env->GetIsolate();
455 v8::HandleScope scope(isolate); 455 v8::HandleScope scope(isolate);
456 456
457 v8::Local<v8::ObjectTemplate> foo = v8::ObjectTemplate::New(isolate); 457 v8::Local<v8::ObjectTemplate> foo = v8::ObjectTemplate::New(isolate);
458 foo->SetInternalFieldCount(1); 458 foo->SetEmbedderFieldCount(1);
459 459
460 { 460 {
461 auto builder = v8::experimental::FastAccessorBuilder::New(isolate); 461 auto builder = v8::experimental::FastAccessorBuilder::New(isolate);
462 auto successLabel = builder->MakeLabel(); 462 auto successLabel = builder->MakeLabel();
463 auto failLabel = builder->MakeLabel(); 463 auto failLabel = builder->MakeLabel();
464 464
465 // The underlying raw assembler is clever enough to reject unreachable 465 // The underlying raw assembler is clever enough to reject unreachable
466 // basic blocks, this instruction has no effect besides marking the failed 466 // basic blocks, this instruction has no effect besides marking the failed
467 // return BB as reachable. 467 // return BB as reachable.
468 builder->CheckNotZeroOrJump(builder->IntegerConstant(1234), failLabel); 468 builder->CheckNotZeroOrJump(builder->IntegerConstant(1234), failLabel);
(...skipping 14 matching lines...) Expand all
483 // Create an instance. 483 // Create an instance.
484 v8::Local<v8::Object> obj = foo->NewInstance(env.local()).ToLocalChecked(); 484 v8::Local<v8::Object> obj = foo->NewInstance(env.local()).ToLocalChecked();
485 485
486 CHECK(env->Global()->Set(env.local(), v8_str("obj"), obj).FromJust()); 486 CHECK(env->Global()->Set(env.local(), v8_str("obj"), obj).FromJust());
487 487
488 // Access flags. 488 // Access flags.
489 CompileRun(FN_WARMUP("test", "return obj.goto_test")); 489 CompileRun(FN_WARMUP("test", "return obj.goto_test"));
490 490
491 ExpectInt32("test()", 60707357); 491 ExpectInt32("test()", 60707357);
492 } 492 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698