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

Side by Side Diff: src/stub-cache.cc

Issue 12781004: Refactoring Store ICs. A first step towards polymorphic store ICs. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: space nits Created 7 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 | Annotate | Revision Log
« no previous file with comments | « src/stub-cache.h ('k') | src/x64/code-stubs-x64.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 InlineCacheHolderFlag cache_holder = 105 InlineCacheHolderFlag cache_holder =
106 IC::GetCodeCacheForObject(*receiver, *holder); 106 IC::GetCodeCacheForObject(*receiver, *holder);
107 return Handle<JSObject>(IC::GetCodeCacheHolder( 107 return Handle<JSObject>(IC::GetCodeCacheHolder(
108 isolate_, *receiver, cache_holder)); 108 isolate_, *receiver, cache_holder));
109 } 109 }
110 110
111 111
112 Handle<Code> StubCache::FindIC(Handle<Name> name, 112 Handle<Code> StubCache::FindIC(Handle<Name> name,
113 Handle<JSObject> stub_holder, 113 Handle<JSObject> stub_holder,
114 Code::Kind kind, 114 Code::Kind kind,
115 Code::StubType type) { 115 Code::StubType type,
116 Code::Flags flags = Code::ComputeMonomorphicFlags( 116 Code::ExtraICState extra_ic_state) {
117 kind, Code::kNoExtraICState, type); 117 Code::Flags flags = Code::ComputeMonomorphicFlags(kind, extra_ic_state, type);
118 Handle<Object> probe(stub_holder->map()->FindInCodeCache(*name, flags), 118 Handle<Object> probe(stub_holder->map()->FindInCodeCache(*name, flags),
119 isolate_); 119 isolate_);
120 if (probe->IsCode()) return Handle<Code>::cast(probe); 120 if (probe->IsCode()) return Handle<Code>::cast(probe);
121 return Handle<Code>::null(); 121 return Handle<Code>::null();
122 } 122 }
123 123
124 124
125 Handle<Code> StubCache::FindStub(Handle<Name> name, 125 Handle<Code> StubCache::FindHandler(Handle<Name> name,
126 Handle<JSObject> stub_holder, 126 Handle<JSObject> stub_holder,
127 Code::Kind kind, 127 Code::Kind kind,
128 Code::StubType type) { 128 Code::StubType type,
129 Code::ExtraICState extra_ic_state) {
129 ASSERT(type != Code::NORMAL); 130 ASSERT(type != Code::NORMAL);
130 int extra_flags = -1;
131 if (kind == Code::LOAD_IC || kind == Code::KEYED_LOAD_IC) {
132 extra_flags = kind;
133 kind = Code::STUB;
134 }
135 Code::Flags flags = Code::ComputeMonomorphicFlags( 131 Code::Flags flags = Code::ComputeMonomorphicFlags(
136 kind, Code::kNoExtraICState, type, extra_flags); 132 Code::STUB, extra_ic_state, type, kind);
137 Handle<Object> probe(stub_holder->map()->FindInCodeCache(*name, flags), 133 Handle<Object> probe(stub_holder->map()->FindInCodeCache(*name, flags),
138 isolate_); 134 isolate_);
139 if (probe->IsCode()) return Handle<Code>::cast(probe); 135 if (probe->IsCode()) return Handle<Code>::cast(probe);
140 return Handle<Code>::null(); 136 return Handle<Code>::null();
141 } 137 }
142 138
143 139
144 Handle<Code> StubCache::ComputeMonomorphicIC(Handle<JSObject> receiver, 140 Handle<Code> StubCache::ComputeMonomorphicIC(Handle<JSObject> receiver,
145 Handle<Code> handler, 141 Handle<Code> handler,
146 Handle<Name> name) { 142 Handle<Name> name) {
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
190 if (current->IsGlobalObject()) { 186 if (current->IsGlobalObject()) {
191 global = Handle<GlobalObject>::cast(current); 187 global = Handle<GlobalObject>::cast(current);
192 cache_name = name; 188 cache_name = name;
193 } else if (!current->HasFastProperties()) { 189 } else if (!current->HasFastProperties()) {
194 cache_name = name; 190 cache_name = name;
195 } 191 }
196 } while (!next->IsNull()); 192 } while (!next->IsNull());
197 193
198 // Compile the stub that is either shared for all names or 194 // Compile the stub that is either shared for all names or
199 // name specific if there are global objects involved. 195 // name specific if there are global objects involved.
200 Handle<Code> handler = FindStub( 196 Handle<Code> handler = FindHandler(
201 cache_name, receiver, Code::LOAD_IC, Code::NONEXISTENT); 197 cache_name, receiver, Code::LOAD_IC, Code::NONEXISTENT);
202 if (!handler.is_null()) return handler; 198 if (!handler.is_null()) return handler;
203 199
204 LoadStubCompiler compiler(isolate_); 200 LoadStubCompiler compiler(isolate_);
205 handler = 201 handler =
206 compiler.CompileLoadNonexistent(receiver, current, cache_name, global); 202 compiler.CompileLoadNonexistent(receiver, current, cache_name, global);
207 JSObject::UpdateMapCodeCache(receiver, cache_name, handler); 203 JSObject::UpdateMapCodeCache(receiver, cache_name, handler);
208 return handler; 204 return handler;
209 } 205 }
210 206
211 207
212 Handle<Code> StubCache::ComputeLoadField(Handle<Name> name, 208 Handle<Code> StubCache::ComputeLoadField(Handle<Name> name,
213 Handle<JSObject> receiver, 209 Handle<JSObject> receiver,
214 Handle<JSObject> holder, 210 Handle<JSObject> holder,
215 PropertyIndex field) { 211 PropertyIndex field) {
216 if (receiver.is_identical_to(holder)) { 212 if (receiver.is_identical_to(holder)) {
217 LoadFieldStub stub(LoadStubCompiler::receiver(), 213 LoadFieldStub stub(LoadStubCompiler::receiver(),
218 field.is_inobject(holder), 214 field.is_inobject(holder),
219 field.translate(holder)); 215 field.translate(holder));
220 return stub.GetCode(isolate()); 216 return stub.GetCode(isolate());
221 } 217 }
222 218
223 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 219 Handle<JSObject> stub_holder = StubHolder(receiver, holder);
224 Handle<Code> stub = FindStub( 220 Handle<Code> stub = FindHandler(
225 name, stub_holder, Code::LOAD_IC, Code::FIELD); 221 name, stub_holder, Code::LOAD_IC, Code::FIELD);
226 if (!stub.is_null()) return stub; 222 if (!stub.is_null()) return stub;
227 223
228 LoadStubCompiler compiler(isolate_); 224 LoadStubCompiler compiler(isolate_);
229 Handle<Code> handler = 225 Handle<Code> handler =
230 compiler.CompileLoadField(receiver, holder, name, field); 226 compiler.CompileLoadField(receiver, holder, name, field);
231 JSObject::UpdateMapCodeCache(stub_holder, name, handler); 227 JSObject::UpdateMapCodeCache(stub_holder, name, handler);
232 return handler; 228 return handler;
233 } 229 }
234 230
235 231
236 Handle<Code> StubCache::ComputeLoadCallback( 232 Handle<Code> StubCache::ComputeLoadCallback(
237 Handle<Name> name, 233 Handle<Name> name,
238 Handle<JSObject> receiver, 234 Handle<JSObject> receiver,
239 Handle<JSObject> holder, 235 Handle<JSObject> holder,
240 Handle<ExecutableAccessorInfo> callback) { 236 Handle<ExecutableAccessorInfo> callback) {
241 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); 237 ASSERT(v8::ToCData<Address>(callback->getter()) != 0);
242 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 238 Handle<JSObject> stub_holder = StubHolder(receiver, holder);
243 Handle<Code> stub = FindStub( 239 Handle<Code> stub = FindHandler(
244 name, stub_holder, Code::LOAD_IC, Code::CALLBACKS); 240 name, stub_holder, Code::LOAD_IC, Code::CALLBACKS);
245 if (!stub.is_null()) return stub; 241 if (!stub.is_null()) return stub;
246 242
247 LoadStubCompiler compiler(isolate_); 243 LoadStubCompiler compiler(isolate_);
248 Handle<Code> handler = 244 Handle<Code> handler =
249 compiler.CompileLoadCallback(receiver, holder, name, callback); 245 compiler.CompileLoadCallback(receiver, holder, name, callback);
250 JSObject::UpdateMapCodeCache(stub_holder, name, handler); 246 JSObject::UpdateMapCodeCache(stub_holder, name, handler);
251 return handler; 247 return handler;
252 } 248 }
253 249
254 250
255 Handle<Code> StubCache::ComputeLoadViaGetter(Handle<Name> name, 251 Handle<Code> StubCache::ComputeLoadViaGetter(Handle<Name> name,
256 Handle<JSObject> receiver, 252 Handle<JSObject> receiver,
257 Handle<JSObject> holder, 253 Handle<JSObject> holder,
258 Handle<JSFunction> getter) { 254 Handle<JSFunction> getter) {
259 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 255 Handle<JSObject> stub_holder = StubHolder(receiver, holder);
260 Handle<Code> stub = FindStub( 256 Handle<Code> stub = FindHandler(
261 name, stub_holder, Code::LOAD_IC, Code::CALLBACKS); 257 name, stub_holder, Code::LOAD_IC, Code::CALLBACKS);
262 if (!stub.is_null()) return stub; 258 if (!stub.is_null()) return stub;
263 259
264 LoadStubCompiler compiler(isolate_); 260 LoadStubCompiler compiler(isolate_);
265 Handle<Code> handler = 261 Handle<Code> handler =
266 compiler.CompileLoadViaGetter(receiver, holder, name, getter); 262 compiler.CompileLoadViaGetter(receiver, holder, name, getter);
267 JSObject::UpdateMapCodeCache(stub_holder, name, handler); 263 JSObject::UpdateMapCodeCache(stub_holder, name, handler);
268 return handler; 264 return handler;
269 } 265 }
270 266
271 267
272 Handle<Code> StubCache::ComputeLoadConstant(Handle<Name> name, 268 Handle<Code> StubCache::ComputeLoadConstant(Handle<Name> name,
273 Handle<JSObject> receiver, 269 Handle<JSObject> receiver,
274 Handle<JSObject> holder, 270 Handle<JSObject> holder,
275 Handle<JSFunction> value) { 271 Handle<JSFunction> value) {
276 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 272 Handle<JSObject> stub_holder = StubHolder(receiver, holder);
277 Handle<Code> handler = FindStub( 273 Handle<Code> handler = FindHandler(
278 name, stub_holder, Code::LOAD_IC, Code::CONSTANT_FUNCTION); 274 name, stub_holder, Code::LOAD_IC, Code::CONSTANT_FUNCTION);
279 if (!handler.is_null()) return handler; 275 if (!handler.is_null()) return handler;
280 276
281 LoadStubCompiler compiler(isolate_); 277 LoadStubCompiler compiler(isolate_);
282 handler = compiler.CompileLoadConstant(receiver, holder, name, value); 278 handler = compiler.CompileLoadConstant(receiver, holder, name, value);
283 JSObject::UpdateMapCodeCache(stub_holder, name, handler); 279 JSObject::UpdateMapCodeCache(stub_holder, name, handler);
284 280
285 return handler; 281 return handler;
286 } 282 }
287 283
288 284
289 Handle<Code> StubCache::ComputeLoadInterceptor(Handle<Name> name, 285 Handle<Code> StubCache::ComputeLoadInterceptor(Handle<Name> name,
290 Handle<JSObject> receiver, 286 Handle<JSObject> receiver,
291 Handle<JSObject> holder) { 287 Handle<JSObject> holder) {
292 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 288 Handle<JSObject> stub_holder = StubHolder(receiver, holder);
293 Handle<Code> stub = FindStub( 289 Handle<Code> stub = FindHandler(
294 name, stub_holder, Code::LOAD_IC, Code::INTERCEPTOR); 290 name, stub_holder, Code::LOAD_IC, Code::INTERCEPTOR);
295 if (!stub.is_null()) return stub; 291 if (!stub.is_null()) return stub;
296 292
297 LoadStubCompiler compiler(isolate_); 293 LoadStubCompiler compiler(isolate_);
298 Handle<Code> handler = 294 Handle<Code> handler =
299 compiler.CompileLoadInterceptor(receiver, holder, name); 295 compiler.CompileLoadInterceptor(receiver, holder, name);
300 JSObject::UpdateMapCodeCache(stub_holder, name, handler); 296 JSObject::UpdateMapCodeCache(stub_holder, name, handler);
301 return handler; 297 return handler;
302 } 298 }
303 299
(...skipping 26 matching lines...) Expand all
330 Handle<JSObject> holder, 326 Handle<JSObject> holder,
331 PropertyIndex field) { 327 PropertyIndex field) {
332 if (receiver.is_identical_to(holder)) { 328 if (receiver.is_identical_to(holder)) {
333 LoadFieldStub stub(KeyedLoadStubCompiler::receiver(), 329 LoadFieldStub stub(KeyedLoadStubCompiler::receiver(),
334 field.is_inobject(holder), 330 field.is_inobject(holder),
335 field.translate(holder)); 331 field.translate(holder));
336 return stub.GetCode(isolate()); 332 return stub.GetCode(isolate());
337 } 333 }
338 334
339 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 335 Handle<JSObject> stub_holder = StubHolder(receiver, holder);
340 Handle<Code> stub = FindStub( 336 Handle<Code> stub = FindHandler(
341 name, stub_holder, Code::KEYED_LOAD_IC, Code::FIELD); 337 name, stub_holder, Code::KEYED_LOAD_IC, Code::FIELD);
342 if (!stub.is_null()) return stub; 338 if (!stub.is_null()) return stub;
343 339
344 KeyedLoadStubCompiler compiler(isolate_); 340 KeyedLoadStubCompiler compiler(isolate_);
345 Handle<Code> handler = 341 Handle<Code> handler =
346 compiler.CompileLoadField(receiver, holder, name, field); 342 compiler.CompileLoadField(receiver, holder, name, field);
347 JSObject::UpdateMapCodeCache(stub_holder, name, handler); 343 JSObject::UpdateMapCodeCache(stub_holder, name, handler);
348 return handler; 344 return handler;
349 } 345 }
350 346
351 347
352 Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<Name> name, 348 Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<Name> name,
353 Handle<JSObject> receiver, 349 Handle<JSObject> receiver,
354 Handle<JSObject> holder, 350 Handle<JSObject> holder,
355 Handle<JSFunction> value) { 351 Handle<JSFunction> value) {
356 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 352 Handle<JSObject> stub_holder = StubHolder(receiver, holder);
357 Handle<Code> handler = FindStub( 353 Handle<Code> handler = FindHandler(
358 name, stub_holder, Code::KEYED_LOAD_IC, Code::CONSTANT_FUNCTION); 354 name, stub_holder, Code::KEYED_LOAD_IC, Code::CONSTANT_FUNCTION);
359 if (!handler.is_null()) return handler; 355 if (!handler.is_null()) return handler;
360 356
361 KeyedLoadStubCompiler compiler(isolate_); 357 KeyedLoadStubCompiler compiler(isolate_);
362 handler = compiler.CompileLoadConstant(receiver, holder, name, value); 358 handler = compiler.CompileLoadConstant(receiver, holder, name, value);
363 JSObject::UpdateMapCodeCache(stub_holder, name, handler); 359 JSObject::UpdateMapCodeCache(stub_holder, name, handler);
364 return handler; 360 return handler;
365 } 361 }
366 362
367 363
368 Handle<Code> StubCache::ComputeKeyedLoadInterceptor(Handle<Name> name, 364 Handle<Code> StubCache::ComputeKeyedLoadInterceptor(Handle<Name> name,
369 Handle<JSObject> receiver, 365 Handle<JSObject> receiver,
370 Handle<JSObject> holder) { 366 Handle<JSObject> holder) {
371 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 367 Handle<JSObject> stub_holder = StubHolder(receiver, holder);
372 Handle<Code> stub = FindStub( 368 Handle<Code> stub = FindHandler(
373 name, stub_holder, Code::KEYED_LOAD_IC, Code::INTERCEPTOR); 369 name, stub_holder, Code::KEYED_LOAD_IC, Code::INTERCEPTOR);
374 if (!stub.is_null()) return stub; 370 if (!stub.is_null()) return stub;
375 371
376 KeyedLoadStubCompiler compiler(isolate_); 372 KeyedLoadStubCompiler compiler(isolate_);
377 Handle<Code> handler = 373 Handle<Code> handler =
378 compiler.CompileLoadInterceptor(receiver, holder, name); 374 compiler.CompileLoadInterceptor(receiver, holder, name);
379 JSObject::UpdateMapCodeCache(stub_holder, name, handler); 375 JSObject::UpdateMapCodeCache(stub_holder, name, handler);
380 return handler; 376 return handler;
381 } 377 }
382 378
383 379
384 Handle<Code> StubCache::ComputeKeyedLoadCallback( 380 Handle<Code> StubCache::ComputeKeyedLoadCallback(
385 Handle<Name> name, 381 Handle<Name> name,
386 Handle<JSObject> receiver, 382 Handle<JSObject> receiver,
387 Handle<JSObject> holder, 383 Handle<JSObject> holder,
388 Handle<ExecutableAccessorInfo> callback) { 384 Handle<ExecutableAccessorInfo> callback) {
389 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 385 Handle<JSObject> stub_holder = StubHolder(receiver, holder);
390 Handle<Code> stub = FindStub( 386 Handle<Code> stub = FindHandler(
391 name, stub_holder, Code::KEYED_LOAD_IC, Code::CALLBACKS); 387 name, stub_holder, Code::KEYED_LOAD_IC, Code::CALLBACKS);
392 if (!stub.is_null()) return stub; 388 if (!stub.is_null()) return stub;
393 389
394 KeyedLoadStubCompiler compiler(isolate_); 390 KeyedLoadStubCompiler compiler(isolate_);
395 Handle<Code> handler = 391 Handle<Code> handler =
396 compiler.CompileLoadCallback(receiver, holder, name, callback); 392 compiler.CompileLoadCallback(receiver, holder, name, callback);
397 JSObject::UpdateMapCodeCache(stub_holder, name, handler); 393 JSObject::UpdateMapCodeCache(stub_holder, name, handler);
398 return handler; 394 return handler;
399 } 395 }
400 396
401 397
402 Handle<Code> StubCache::ComputeStoreField(Handle<Name> name, 398 Handle<Code> StubCache::ComputeStoreField(Handle<Name> name,
403 Handle<JSObject> receiver, 399 Handle<JSObject> receiver,
404 int field_index, 400 int field_index,
405 Handle<Map> transition, 401 Handle<Map> transition,
406 StrictModeFlag strict_mode) { 402 StrictModeFlag strict_mode) {
407 Code::StubType type = 403 Code::StubType type =
408 (transition.is_null()) ? Code::FIELD : Code::MAP_TRANSITION; 404 transition.is_null() ? Code::FIELD : Code::MAP_TRANSITION;
409 Code::Flags flags = Code::ComputeMonomorphicFlags( 405
410 Code::STORE_IC, strict_mode, type); 406 Handle<Code> stub = FindIC(
411 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), 407 name, receiver, Code::STORE_IC, type, strict_mode);
412 isolate_); 408 if (!stub.is_null()) return stub;
413 if (probe->IsCode()) return Handle<Code>::cast(probe);
414 409
415 StoreStubCompiler compiler(isolate_, strict_mode); 410 StoreStubCompiler compiler(isolate_, strict_mode);
416 Handle<Code> code = 411 Handle<Code> code =
417 compiler.CompileStoreField(receiver, field_index, transition, name); 412 compiler.CompileStoreField(receiver, field_index, transition, name);
418 JSObject::UpdateMapCodeCache(receiver, name, code); 413 JSObject::UpdateMapCodeCache(receiver, name, code);
419 return code; 414 return code;
420 } 415 }
421 416
422 417
423 Handle<Code> StubCache::ComputeKeyedLoadElement(Handle<Map> receiver_map) { 418 Handle<Code> StubCache::ComputeKeyedLoadElement(Handle<Map> receiver_map) {
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
466 return (strict_mode == kStrictMode) 461 return (strict_mode == kStrictMode)
467 ? isolate_->builtins()->Builtins::StoreIC_Normal_Strict() 462 ? isolate_->builtins()->Builtins::StoreIC_Normal_Strict()
468 : isolate_->builtins()->Builtins::StoreIC_Normal(); 463 : isolate_->builtins()->Builtins::StoreIC_Normal();
469 } 464 }
470 465
471 466
472 Handle<Code> StubCache::ComputeStoreGlobal(Handle<Name> name, 467 Handle<Code> StubCache::ComputeStoreGlobal(Handle<Name> name,
473 Handle<GlobalObject> receiver, 468 Handle<GlobalObject> receiver,
474 Handle<JSGlobalPropertyCell> cell, 469 Handle<JSGlobalPropertyCell> cell,
475 StrictModeFlag strict_mode) { 470 StrictModeFlag strict_mode) {
476 Code::Flags flags = Code::ComputeMonomorphicFlags( 471 Handle<Code> stub = FindIC(
477 Code::STORE_IC, strict_mode); 472 name, receiver, Code::STORE_IC, Code::NORMAL, strict_mode);
478 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), 473 if (!stub.is_null()) return stub;
479 isolate_);
480 if (probe->IsCode()) return Handle<Code>::cast(probe);
481 474
482 StoreStubCompiler compiler(isolate_, strict_mode); 475 StoreStubCompiler compiler(isolate_, strict_mode);
483 Handle<Code> code = compiler.CompileStoreGlobal(receiver, cell, name); 476 Handle<Code> code = compiler.CompileStoreGlobal(receiver, cell, name);
484 JSObject::UpdateMapCodeCache(receiver, name, code); 477 JSObject::UpdateMapCodeCache(receiver, name, code);
485 return code; 478 return code;
486 } 479 }
487 480
488 481
489 Handle<Code> StubCache::ComputeStoreCallback( 482 Handle<Code> StubCache::ComputeStoreCallback(
490 Handle<Name> name, 483 Handle<Name> name,
491 Handle<JSObject> receiver, 484 Handle<JSObject> receiver,
492 Handle<JSObject> holder, 485 Handle<JSObject> holder,
493 Handle<ExecutableAccessorInfo> callback, 486 Handle<ExecutableAccessorInfo> callback,
494 StrictModeFlag strict_mode) { 487 StrictModeFlag strict_mode) {
495 ASSERT(v8::ToCData<Address>(callback->setter()) != 0); 488 ASSERT(v8::ToCData<Address>(callback->setter()) != 0);
496 Code::Flags flags = Code::ComputeMonomorphicFlags( 489 Handle<Code> stub = FindIC(
497 Code::STORE_IC, strict_mode, Code::CALLBACKS); 490 name, receiver, Code::STORE_IC, Code::CALLBACKS, strict_mode);
498 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), 491 if (!stub.is_null()) return stub;
499 isolate_);
500 if (probe->IsCode()) return Handle<Code>::cast(probe);
501 492
502 StoreStubCompiler compiler(isolate_, strict_mode); 493 StoreStubCompiler compiler(isolate_, strict_mode);
503 Handle<Code> code = 494 Handle<Code> code =
504 compiler.CompileStoreCallback(name, receiver, holder, callback); 495 compiler.CompileStoreCallback(name, receiver, holder, callback);
505 JSObject::UpdateMapCodeCache(receiver, name, code); 496 JSObject::UpdateMapCodeCache(receiver, name, code);
506 return code; 497 return code;
507 } 498 }
508 499
509 500
510 Handle<Code> StubCache::ComputeStoreViaSetter(Handle<Name> name, 501 Handle<Code> StubCache::ComputeStoreViaSetter(Handle<Name> name,
511 Handle<JSObject> receiver, 502 Handle<JSObject> receiver,
512 Handle<JSObject> holder, 503 Handle<JSObject> holder,
513 Handle<JSFunction> setter, 504 Handle<JSFunction> setter,
514 StrictModeFlag strict_mode) { 505 StrictModeFlag strict_mode) {
515 Code::Flags flags = Code::ComputeMonomorphicFlags( 506 Handle<Code> stub = FindIC(
516 Code::STORE_IC, strict_mode, Code::CALLBACKS); 507 name, receiver, Code::STORE_IC, Code::CALLBACKS, strict_mode);
517 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), 508 if (!stub.is_null()) return stub;
518 isolate_);
519 if (probe->IsCode()) return Handle<Code>::cast(probe);
520 509
521 StoreStubCompiler compiler(isolate_, strict_mode); 510 StoreStubCompiler compiler(isolate_, strict_mode);
522 Handle<Code> code = 511 Handle<Code> code =
523 compiler.CompileStoreViaSetter(name, receiver, holder, setter); 512 compiler.CompileStoreViaSetter(name, receiver, holder, setter);
524 JSObject::UpdateMapCodeCache(receiver, name, code); 513 JSObject::UpdateMapCodeCache(receiver, name, code);
525 return code; 514 return code;
526 } 515 }
527 516
528 517
529 Handle<Code> StubCache::ComputeStoreInterceptor(Handle<Name> name, 518 Handle<Code> StubCache::ComputeStoreInterceptor(Handle<Name> name,
530 Handle<JSObject> receiver, 519 Handle<JSObject> receiver,
531 StrictModeFlag strict_mode) { 520 StrictModeFlag strict_mode) {
532 Code::Flags flags = Code::ComputeMonomorphicFlags( 521 Handle<Code> stub = FindIC(
533 Code::STORE_IC, strict_mode, Code::INTERCEPTOR); 522 name, receiver, Code::STORE_IC, Code::INTERCEPTOR, strict_mode);
534 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), 523 if (!stub.is_null()) return stub;
535 isolate_);
536 if (probe->IsCode()) return Handle<Code>::cast(probe);
537 524
538 StoreStubCompiler compiler(isolate_, strict_mode); 525 StoreStubCompiler compiler(isolate_, strict_mode);
539 Handle<Code> code = compiler.CompileStoreInterceptor(receiver, name); 526 Handle<Code> code = compiler.CompileStoreInterceptor(receiver, name);
540 JSObject::UpdateMapCodeCache(receiver, name, code); 527 JSObject::UpdateMapCodeCache(receiver, name, code);
541 return code; 528 return code;
542 } 529 }
543 530
544 Handle<Code> StubCache::ComputeKeyedStoreField(Handle<Name> name, 531 Handle<Code> StubCache::ComputeKeyedStoreField(Handle<Name> name,
545 Handle<JSObject> receiver, 532 Handle<JSObject> receiver,
546 int field_index, 533 int field_index,
547 Handle<Map> transition, 534 Handle<Map> transition,
548 StrictModeFlag strict_mode) { 535 StrictModeFlag strict_mode) {
549 Code::StubType type = 536 Code::StubType type =
550 (transition.is_null()) ? Code::FIELD : Code::MAP_TRANSITION; 537 (transition.is_null()) ? Code::FIELD : Code::MAP_TRANSITION;
551 Code::Flags flags = Code::ComputeMonomorphicFlags( 538 Handle<Code> stub = FindIC(
552 Code::KEYED_STORE_IC, strict_mode, type); 539 name, receiver, Code::KEYED_STORE_IC, type, strict_mode);
553 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), 540 if (!stub.is_null()) return stub;
554 isolate_);
555 if (probe->IsCode()) return Handle<Code>::cast(probe);
556 541
557 KeyedStoreStubCompiler compiler(isolate(), strict_mode, STANDARD_STORE); 542 KeyedStoreStubCompiler compiler(isolate(), strict_mode, STANDARD_STORE);
558 Handle<Code> code = 543 Handle<Code> code =
559 compiler.CompileStoreField(receiver, field_index, transition, name); 544 compiler.CompileStoreField(receiver, field_index, transition, name);
560 JSObject::UpdateMapCodeCache(receiver, name, code); 545 JSObject::UpdateMapCodeCache(receiver, name, code);
561 return code; 546 return code;
562 } 547 }
563 548
564 549
565 #define CALL_LOGGER_TAG(kind, type) \ 550 #define CALL_LOGGER_TAG(kind, type) \
(...skipping 879 matching lines...) Expand 10 before | Expand all | Expand 10 after
1445 1430
1446 Handle<Code> BaseLoadStubCompiler::CompileLoadField(Handle<JSObject> object, 1431 Handle<Code> BaseLoadStubCompiler::CompileLoadField(Handle<JSObject> object,
1447 Handle<JSObject> holder, 1432 Handle<JSObject> holder,
1448 Handle<Name> name, 1433 Handle<Name> name,
1449 PropertyIndex field) { 1434 PropertyIndex field) {
1450 Label miss; 1435 Label miss;
1451 1436
1452 Register reg = HandlerFrontendHeader(object, receiver(), holder, name, &miss); 1437 Register reg = HandlerFrontendHeader(object, receiver(), holder, name, &miss);
1453 1438
1454 LoadFieldStub stub(reg, field.is_inobject(holder), field.translate(holder)); 1439 LoadFieldStub stub(reg, field.is_inobject(holder), field.translate(holder));
1455 GenerateTailCall(stub.GetCode(isolate())); 1440 GenerateTailCall(masm(), stub.GetCode(isolate()));
1456 1441
1457 __ bind(&miss); 1442 __ bind(&miss);
1458 GenerateLoadMiss(masm(), kind()); 1443 TailCallBuiltin(masm(), MissBuiltin(kind()));
1459 1444
1460 // Return the generated code. 1445 // Return the generated code.
1461 return GetCode(kind(), Code::FIELD, name); 1446 return GetCode(kind(), Code::FIELD, name);
1462 } 1447 }
1463 1448
1464 1449
1450 // Load a fast property out of a holder object (src). In-object properties
1451 // are loaded directly otherwise the property is loaded from the properties
1452 // fixed array.
1453 void StubCompiler::GenerateFastPropertyLoad(MacroAssembler* masm,
1454 Register dst,
1455 Register src,
1456 Handle<JSObject> holder,
1457 PropertyIndex index) {
1458 DoGenerateFastPropertyLoad(
1459 masm, dst, src, index.is_inobject(holder), index.translate(holder));
1460 }
1461
1462
1465 Handle<Code> BaseLoadStubCompiler::CompileLoadConstant( 1463 Handle<Code> BaseLoadStubCompiler::CompileLoadConstant(
1466 Handle<JSObject> object, 1464 Handle<JSObject> object,
1467 Handle<JSObject> holder, 1465 Handle<JSObject> holder,
1468 Handle<Name> name, 1466 Handle<Name> name,
1469 Handle<JSFunction> value) { 1467 Handle<JSFunction> value) {
1470 Label success; 1468 Label success;
1471 HandlerFrontend(object, receiver(), holder, name, &success); 1469 HandlerFrontend(object, receiver(), holder, name, &success);
1472 __ bind(&success); 1470 __ bind(&success);
1473 GenerateLoadConstant(value); 1471 GenerateLoadConstant(value);
1474 1472
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1520 Handle<Name> name, 1518 Handle<Name> name,
1521 LookupResult* lookup) { 1519 LookupResult* lookup) {
1522 Label success; 1520 Label success;
1523 Handle<JSObject> holder(lookup->holder()); 1521 Handle<JSObject> holder(lookup->holder());
1524 if (lookup->IsField()) { 1522 if (lookup->IsField()) {
1525 PropertyIndex field = lookup->GetFieldIndex(); 1523 PropertyIndex field = lookup->GetFieldIndex();
1526 if (interceptor_holder.is_identical_to(holder)) { 1524 if (interceptor_holder.is_identical_to(holder)) {
1527 LoadFieldStub stub(interceptor_reg, 1525 LoadFieldStub stub(interceptor_reg,
1528 field.is_inobject(holder), 1526 field.is_inobject(holder),
1529 field.translate(holder)); 1527 field.translate(holder));
1530 GenerateTailCall(stub.GetCode(isolate())); 1528 GenerateTailCall(masm(), stub.GetCode(isolate()));
1531 } else { 1529 } else {
1532 // We found FIELD property in prototype chain of interceptor's holder. 1530 // We found FIELD property in prototype chain of interceptor's holder.
1533 // Retrieve a field from field's holder. 1531 // Retrieve a field from field's holder.
1534 Register reg = HandlerFrontend( 1532 Register reg = HandlerFrontend(
1535 interceptor_holder, interceptor_reg, holder, name, &success); 1533 interceptor_holder, interceptor_reg, holder, name, &success);
1536 __ bind(&success); 1534 __ bind(&success);
1537 GenerateLoadField(reg, holder, field); 1535 GenerateLoadField(reg, holder, field);
1538 } 1536 }
1539 } else { 1537 } else {
1540 // We found CALLBACKS property in prototype chain of interceptor's 1538 // We found CALLBACKS property in prototype chain of interceptor's
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1574 HandlerFrontend(object, receiver(), holder, name, &success); 1572 HandlerFrontend(object, receiver(), holder, name, &success);
1575 1573
1576 __ bind(&success); 1574 __ bind(&success);
1577 GenerateLoadViaGetter(masm(), getter); 1575 GenerateLoadViaGetter(masm(), getter);
1578 1576
1579 // Return the generated code. 1577 // Return the generated code.
1580 return GetCode(kind(), Code::CALLBACKS, name); 1578 return GetCode(kind(), Code::CALLBACKS, name);
1581 } 1579 }
1582 1580
1583 1581
1582 Handle<Code> BaseStoreStubCompiler::CompileStoreField(Handle<JSObject> object,
1583 int index,
1584 Handle<Map> transition,
1585 Handle<Name> name) {
1586 Label miss, miss_restore_name;
1587
1588 GenerateNameCheck(name, this->name(), &miss);
1589
1590 // Generate store field code.
1591 GenerateStoreField(masm(),
1592 object,
1593 index,
1594 transition,
1595 name,
1596 receiver(), this->name(), value(), scratch1(), scratch2(),
1597 &miss,
1598 &miss_restore_name);
1599
1600 // Handle store cache miss.
1601 GenerateRestoreName(masm(), &miss_restore_name, name);
1602 __ bind(&miss);
1603 TailCallBuiltin(masm(), MissBuiltin(kind()));
1604
1605 // Return the generated code.
1606 return GetICCode(kind(),
1607 transition.is_null() ? Code::FIELD : Code::MAP_TRANSITION,
1608 name);
1609 }
1610
1611
1584 #undef __ 1612 #undef __
1585 1613
1586 1614
1615 void StubCompiler::TailCallBuiltin(MacroAssembler* masm, Builtins::Name name) {
1616 Handle<Code> code(masm->isolate()->builtins()->builtin(name));
1617 GenerateTailCall(masm, code);
1618 }
1619
1620
1587 void LoadStubCompiler::JitEvent(Handle<Name> name, Handle<Code> code) { 1621 void LoadStubCompiler::JitEvent(Handle<Name> name, Handle<Code> code) {
1588 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); 1622 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code));
1589 } 1623 }
1590 1624
1591 1625
1592 void KeyedLoadStubCompiler::JitEvent(Handle<Name> name, Handle<Code> code) { 1626 void KeyedLoadStubCompiler::JitEvent(Handle<Name> name, Handle<Code> code) {
1593 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); 1627 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code));
1594 } 1628 }
1595 1629
1596 1630
1631 void StoreStubCompiler::JitEvent(Handle<Name> name, Handle<Code> code) {
1632 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code));
1633 }
1634
1635
1636 void KeyedStoreStubCompiler::JitEvent(Handle<Name> name, Handle<Code> code) {
1637 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, *name, *code));
1638 }
1639
1640
1597 Handle<Code> BaseLoadStubCompiler::GetICCode(Code::Kind kind, 1641 Handle<Code> BaseLoadStubCompiler::GetICCode(Code::Kind kind,
1598 Code::StubType type, 1642 Code::StubType type,
1599 Handle<Name> name, 1643 Handle<Name> name,
1600 InlineCacheState state) { 1644 InlineCacheState state) {
1601 Code::Flags flags = Code::ComputeFlags( 1645 Code::Flags flags = Code::ComputeFlags(
1602 kind, state, Code::kNoExtraICState, type); 1646 kind, state, Code::kNoExtraICState, type);
1603 Handle<Code> code = GetCodeWithFlags(flags, name); 1647 Handle<Code> code = GetCodeWithFlags(flags, name);
1604 PROFILE(isolate(), CodeCreateEvent(log_kind(code), *code, *name)); 1648 PROFILE(isolate(), CodeCreateEvent(log_kind(code), *code, *name));
1605 JitEvent(name, code); 1649 JitEvent(name, code);
1606 return code; 1650 return code;
1607 } 1651 }
1608 1652
1609 1653
1610 Handle<Code> BaseLoadStubCompiler::GetCode(Code::Kind kind, 1654 Handle<Code> BaseLoadStubCompiler::GetCode(Code::Kind kind,
1611 Code::StubType type, 1655 Code::StubType type,
1612 Handle<Name> name) { 1656 Handle<Name> name) {
1613 ASSERT(type != Code::NORMAL); 1657 ASSERT(type != Code::NORMAL);
1614 Code::Flags flags = Code::ComputeFlags( 1658 Code::Flags flags = Code::ComputeFlags(
1615 Code::STUB, MONOMORPHIC, Code::kNoExtraICState, type, kind); 1659 Code::STUB, MONOMORPHIC, Code::kNoExtraICState, type, kind);
1616 Handle<Code> code = GetCodeWithFlags(flags, name); 1660 Handle<Code> code = GetCodeWithFlags(flags, name);
1617 PROFILE(isolate(), CodeCreateEvent(log_kind(code), *code, *name)); 1661 PROFILE(isolate(), CodeCreateEvent(log_kind(code), *code, *name));
1618 JitEvent(name, code); 1662 JitEvent(name, code);
1619 return code; 1663 return code;
1620 } 1664 }
1621 1665
1622 1666
1667 Handle<Code> BaseStoreStubCompiler::GetICCode(Code::Kind kind,
1668 Code::StubType type,
1669 Handle<Name> name,
1670 InlineCacheState state) {
1671 Code::Flags flags = Code::ComputeFlags(
1672 kind, state, extra_state(), type);
1673 Handle<Code> code = GetCodeWithFlags(flags, name);
1674 PROFILE(isolate(), CodeCreateEvent(log_kind(code), *code, *name));
1675 JitEvent(name, code);
1676 return code;
1677 }
1678
1679
1680 Handle<Code> BaseStoreStubCompiler::GetCode(Code::Kind kind,
1681 Code::StubType type,
1682 Handle<Name> name) {
1683 ASSERT(type != Code::NORMAL);
1684 Code::Flags flags = Code::ComputeFlags(
1685 Code::STUB, MONOMORPHIC, extra_state(), type, kind);
1686 Handle<Code> code = GetCodeWithFlags(flags, name);
1687 PROFILE(isolate(), CodeCreateEvent(log_kind(code), *code, *name));
1688 JitEvent(name, code);
1689 return code;
1690 }
1691
1692
1623 void KeyedLoadStubCompiler::CompileElementHandlers(MapHandleList* receiver_maps, 1693 void KeyedLoadStubCompiler::CompileElementHandlers(MapHandleList* receiver_maps,
1624 CodeHandleList* handlers) { 1694 CodeHandleList* handlers) {
1625 for (int i = 0; i < receiver_maps->length(); ++i) { 1695 for (int i = 0; i < receiver_maps->length(); ++i) {
1626 Handle<Map> receiver_map = receiver_maps->at(i); 1696 Handle<Map> receiver_map = receiver_maps->at(i);
1627 Handle<Code> cached_stub; 1697 Handle<Code> cached_stub;
1628 1698
1629 if ((receiver_map->instance_type() & kNotStringTag) == 0) { 1699 if ((receiver_map->instance_type() & kNotStringTag) == 0) {
1630 cached_stub = isolate()->builtins()->KeyedLoadIC_String(); 1700 cached_stub = isolate()->builtins()->KeyedLoadIC_String();
1631 } else { 1701 } else {
1632 bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE; 1702 bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE;
1633 ElementsKind elements_kind = receiver_map->elements_kind(); 1703 ElementsKind elements_kind = receiver_map->elements_kind();
1634 1704
1635 if (IsFastElementsKind(elements_kind) || 1705 if (IsFastElementsKind(elements_kind) ||
1636 IsExternalArrayElementsKind(elements_kind)) { 1706 IsExternalArrayElementsKind(elements_kind)) {
1637 cached_stub = 1707 cached_stub =
1638 KeyedLoadFastElementStub(is_js_array, 1708 KeyedLoadFastElementStub(is_js_array,
1639 elements_kind).GetCode(isolate()); 1709 elements_kind).GetCode(isolate());
1640 } else { 1710 } else {
1641 ASSERT(elements_kind == DICTIONARY_ELEMENTS); 1711 ASSERT(elements_kind == DICTIONARY_ELEMENTS);
1642 cached_stub = KeyedLoadDictionaryElementStub().GetCode(isolate()); 1712 cached_stub = KeyedLoadDictionaryElementStub().GetCode(isolate());
1643 } 1713 }
1644 } 1714 }
1645 1715
1646 handlers->Add(cached_stub); 1716 handlers->Add(cached_stub);
1647 } 1717 }
1648 } 1718 }
1649 1719
1650 1720
1651 Handle<Code> StoreStubCompiler::GetCode(Code::StubType type,
1652 Handle<Name> name) {
1653 Code::Flags flags = Code::ComputeMonomorphicFlags(
1654 Code::STORE_IC, strict_mode_, type);
1655 Handle<Code> code = GetCodeWithFlags(flags, name);
1656 PROFILE(isolate(), CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name));
1657 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code));
1658 return code;
1659 }
1660
1661
1662 Handle<Code> KeyedStoreStubCompiler::GetCode(Code::StubType type,
1663 Handle<Name> name,
1664 InlineCacheState state) {
1665 Code::ExtraICState extra_state =
1666 Code::ComputeExtraICState(store_mode_, strict_mode_);
1667 Code::Flags flags =
1668 Code::ComputeFlags(Code::KEYED_STORE_IC, state, extra_state, type);
1669 Handle<Code> code = GetCodeWithFlags(flags, name);
1670 PROFILE(isolate(), CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, *code, *name));
1671 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, *name, *code));
1672 return code;
1673 }
1674
1675
1676 Handle<Code> KeyedStoreStubCompiler::CompileStoreElementPolymorphic( 1721 Handle<Code> KeyedStoreStubCompiler::CompileStoreElementPolymorphic(
1677 MapHandleList* receiver_maps) { 1722 MapHandleList* receiver_maps) {
1678 // Collect MONOMORPHIC stubs for all |receiver_maps|. 1723 // Collect MONOMORPHIC stubs for all |receiver_maps|.
1679 CodeHandleList handlers(receiver_maps->length()); 1724 CodeHandleList handlers(receiver_maps->length());
1680 MapHandleList transitioned_maps(receiver_maps->length()); 1725 MapHandleList transitioned_maps(receiver_maps->length());
1681 for (int i = 0; i < receiver_maps->length(); ++i) { 1726 for (int i = 0; i < receiver_maps->length(); ++i) {
1682 Handle<Map> receiver_map(receiver_maps->at(i)); 1727 Handle<Map> receiver_map(receiver_maps->at(i));
1683 Handle<Code> cached_stub; 1728 Handle<Code> cached_stub;
1684 Handle<Map> transitioned_map = 1729 Handle<Map> transitioned_map =
1685 receiver_map->FindTransitionedMap(receiver_maps); 1730 receiver_map->FindTransitionedMap(receiver_maps);
1686 1731
1687 // TODO(mvstanton): The code below is doing pessimistic elements 1732 // TODO(mvstanton): The code below is doing pessimistic elements
1688 // transitions. I would like to stop doing that and rely on Allocation Site 1733 // transitions. I would like to stop doing that and rely on Allocation Site
1689 // Tracking to do a better job of ensuring the data types are what they need 1734 // Tracking to do a better job of ensuring the data types are what they need
1690 // to be. Not all the elements are in place yet, pessimistic elements 1735 // to be. Not all the elements are in place yet, pessimistic elements
1691 // transitions are still important for performance. 1736 // transitions are still important for performance.
1692 bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE; 1737 bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE;
1693 ElementsKind elements_kind = receiver_map->elements_kind(); 1738 ElementsKind elements_kind = receiver_map->elements_kind();
1694 if (!transitioned_map.is_null()) { 1739 if (!transitioned_map.is_null()) {
1695 cached_stub = ElementsTransitionAndStoreStub( 1740 cached_stub = ElementsTransitionAndStoreStub(
1696 elements_kind, 1741 elements_kind,
1697 transitioned_map->elements_kind(), 1742 transitioned_map->elements_kind(),
1698 is_js_array, 1743 is_js_array,
1699 strict_mode_, 1744 strict_mode(),
1700 store_mode_).GetCode(isolate()); 1745 store_mode_).GetCode(isolate());
1701 } else { 1746 } else {
1702 cached_stub = KeyedStoreElementStub( 1747 cached_stub = KeyedStoreElementStub(
1703 is_js_array, 1748 is_js_array,
1704 elements_kind, 1749 elements_kind,
1705 store_mode_).GetCode(isolate()); 1750 store_mode_).GetCode(isolate());
1706 } 1751 }
1707 ASSERT(!cached_stub.is_null()); 1752 ASSERT(!cached_stub.is_null());
1708 handlers.Add(cached_stub); 1753 handlers.Add(cached_stub);
1709 transitioned_maps.Add(transitioned_map); 1754 transitioned_maps.Add(transitioned_map);
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
1877 Handle<FunctionTemplateInfo>( 1922 Handle<FunctionTemplateInfo>(
1878 FunctionTemplateInfo::cast(signature->receiver())); 1923 FunctionTemplateInfo::cast(signature->receiver()));
1879 } 1924 }
1880 } 1925 }
1881 1926
1882 is_simple_api_call_ = true; 1927 is_simple_api_call_ = true;
1883 } 1928 }
1884 1929
1885 1930
1886 } } // namespace v8::internal 1931 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/stub-cache.h ('k') | src/x64/code-stubs-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698