OLD | NEW |
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 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
265 handler = | 265 handler = |
266 compiler.CompileLoadNonexistent(receiver, current, cache_name, global); | 266 compiler.CompileLoadNonexistent(receiver, current, cache_name, global); |
267 JSObject::UpdateMapCodeCache(receiver, cache_name, handler); | 267 JSObject::UpdateMapCodeCache(receiver, cache_name, handler); |
268 return handler; | 268 return handler; |
269 } | 269 } |
270 | 270 |
271 | 271 |
272 Handle<Code> StubCache::ComputeLoadField(Handle<Name> name, | 272 Handle<Code> StubCache::ComputeLoadField(Handle<Name> name, |
273 Handle<JSObject> receiver, | 273 Handle<JSObject> receiver, |
274 Handle<JSObject> holder, | 274 Handle<JSObject> holder, |
| 275 Code::Kind kind, |
275 PropertyIndex field, | 276 PropertyIndex field, |
276 Representation representation) { | 277 Representation representation) { |
277 if (receiver.is_identical_to(holder)) { | 278 if (receiver.is_identical_to(holder)) { |
278 LoadFieldStub stub(field.is_inobject(holder), | 279 if (kind == Code::LOAD_IC) { |
279 field.translate(holder), | 280 LoadFieldStub stub(field.is_inobject(holder), |
280 representation); | 281 field.translate(holder), |
281 return stub.GetCode(isolate()); | 282 representation); |
| 283 return stub.GetCode(isolate()); |
| 284 } else { |
| 285 KeyedLoadFieldStub stub(field.is_inobject(holder), |
| 286 field.translate(holder), |
| 287 representation); |
| 288 return stub.GetCode(isolate()); |
| 289 } |
282 } | 290 } |
283 | 291 |
284 Handle<JSObject> stub_holder = StubHolder(receiver, holder); | 292 Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
285 Handle<Code> stub = FindLoadHandler( | 293 Handle<Code> stub = FindLoadHandler( |
286 name, receiver, stub_holder, Code::LOAD_IC, Code::FIELD); | 294 name, receiver, stub_holder, kind, Code::FIELD); |
287 if (!stub.is_null()) return stub; | 295 if (!stub.is_null()) return stub; |
288 | 296 |
289 LoadStubCompiler compiler(isolate_); | 297 BaseLoadStubCompiler compiler(isolate_, kind); |
290 Handle<Code> handler = | 298 Handle<Code> handler = |
291 compiler.CompileLoadField(receiver, holder, name, field, representation); | 299 compiler.CompileLoadField(receiver, holder, name, field, representation); |
292 JSObject::UpdateMapCodeCache(stub_holder, name, handler); | 300 JSObject::UpdateMapCodeCache(stub_holder, name, handler); |
293 return handler; | 301 return handler; |
294 } | 302 } |
295 | 303 |
296 | 304 |
297 Handle<Code> StubCache::ComputeLoadCallback( | 305 Handle<Code> StubCache::ComputeLoadCallback( |
298 Handle<Name> name, | 306 Handle<Name> name, |
299 Handle<JSObject> receiver, | 307 Handle<JSObject> receiver, |
300 Handle<JSObject> holder, | 308 Handle<JSObject> holder, |
| 309 Code::Kind kind, |
301 Handle<ExecutableAccessorInfo> callback) { | 310 Handle<ExecutableAccessorInfo> callback) { |
302 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); | 311 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); |
303 Handle<JSObject> stub_holder = StubHolder(receiver, holder); | 312 Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
304 Handle<Code> stub = FindLoadHandler( | 313 Handle<Code> stub = FindLoadHandler( |
305 name, receiver, stub_holder, Code::LOAD_IC, Code::CALLBACKS); | 314 name, receiver, stub_holder, kind, Code::CALLBACKS); |
306 if (!stub.is_null()) return stub; | 315 if (!stub.is_null()) return stub; |
307 | 316 |
308 LoadStubCompiler compiler(isolate_); | 317 BaseLoadStubCompiler compiler(isolate_, kind); |
309 Handle<Code> handler = | 318 Handle<Code> handler = |
310 compiler.CompileLoadCallback(receiver, holder, name, callback); | 319 compiler.CompileLoadCallback(receiver, holder, name, callback); |
311 JSObject::UpdateMapCodeCache(stub_holder, name, handler); | 320 JSObject::UpdateMapCodeCache(stub_holder, name, handler); |
312 return handler; | 321 return handler; |
313 } | 322 } |
314 | 323 |
315 | 324 |
316 Handle<Code> StubCache::ComputeLoadCallback( | 325 Handle<Code> StubCache::ComputeLoadCallback( |
317 Handle<Name> name, | 326 Handle<Name> name, |
318 Handle<JSObject> receiver, | 327 Handle<JSObject> receiver, |
319 Handle<JSObject> holder, | 328 Handle<JSObject> holder, |
| 329 Code::Kind kind, |
320 const CallOptimization& call_optimization) { | 330 const CallOptimization& call_optimization) { |
321 Handle<JSObject> stub_holder = StubHolder(receiver, holder); | 331 Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
322 Handle<Code> stub = FindLoadHandler( | 332 Handle<Code> stub = FindLoadHandler( |
323 name, receiver, stub_holder, Code::LOAD_IC, Code::CALLBACKS); | 333 name, receiver, stub_holder, kind, Code::CALLBACKS); |
324 if (!stub.is_null()) return stub; | 334 if (!stub.is_null()) return stub; |
325 | 335 |
326 LoadStubCompiler compiler(isolate_); | 336 BaseLoadStubCompiler compiler(isolate_, kind); |
327 Handle<Code> handler = | 337 Handle<Code> handler = |
328 compiler.CompileLoadCallback(receiver, holder, name, call_optimization); | 338 compiler.CompileLoadCallback(receiver, holder, name, call_optimization); |
329 JSObject::UpdateMapCodeCache(stub_holder, name, handler); | 339 JSObject::UpdateMapCodeCache(stub_holder, name, handler); |
330 return handler; | 340 return handler; |
331 } | 341 } |
332 | 342 |
333 | 343 |
334 Handle<Code> StubCache::ComputeLoadViaGetter(Handle<Name> name, | 344 Handle<Code> StubCache::ComputeLoadViaGetter(Handle<Name> name, |
335 Handle<JSObject> receiver, | 345 Handle<JSObject> receiver, |
336 Handle<JSObject> holder, | 346 Handle<JSObject> holder, |
337 Handle<JSFunction> getter) { | 347 Handle<JSFunction> getter) { |
338 Handle<JSObject> stub_holder = StubHolder(receiver, holder); | 348 Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
339 Handle<Code> stub = FindLoadHandler( | 349 Handle<Code> stub = FindLoadHandler( |
340 name, receiver, stub_holder, Code::LOAD_IC, Code::CALLBACKS); | 350 name, receiver, stub_holder, Code::LOAD_IC, Code::CALLBACKS); |
341 if (!stub.is_null()) return stub; | 351 if (!stub.is_null()) return stub; |
342 | 352 |
343 LoadStubCompiler compiler(isolate_); | 353 LoadStubCompiler compiler(isolate_); |
344 Handle<Code> handler = | 354 Handle<Code> handler = |
345 compiler.CompileLoadViaGetter(receiver, holder, name, getter); | 355 compiler.CompileLoadViaGetter(receiver, holder, name, getter); |
346 JSObject::UpdateMapCodeCache(stub_holder, name, handler); | 356 JSObject::UpdateMapCodeCache(stub_holder, name, handler); |
347 return handler; | 357 return handler; |
348 } | 358 } |
349 | 359 |
350 | 360 |
351 Handle<Code> StubCache::ComputeLoadConstant(Handle<Name> name, | 361 Handle<Code> StubCache::ComputeLoadConstant(Handle<Name> name, |
352 Handle<JSObject> receiver, | 362 Handle<JSObject> receiver, |
353 Handle<JSObject> holder, | 363 Handle<JSObject> holder, |
| 364 Code::Kind kind, |
354 Handle<Object> value) { | 365 Handle<Object> value) { |
355 Handle<JSObject> stub_holder = StubHolder(receiver, holder); | 366 Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
356 Handle<Code> handler = FindLoadHandler( | 367 Handle<Code> handler = FindLoadHandler( |
357 name, receiver, stub_holder, Code::LOAD_IC, Code::CONSTANT); | 368 name, receiver, stub_holder, kind, Code::CONSTANT); |
358 if (!handler.is_null()) return handler; | 369 if (!handler.is_null()) return handler; |
359 | 370 |
360 LoadStubCompiler compiler(isolate_); | 371 BaseLoadStubCompiler compiler(isolate_, kind); |
361 handler = compiler.CompileLoadConstant(receiver, holder, name, value); | 372 handler = compiler.CompileLoadConstant(receiver, holder, name, value); |
362 JSObject::UpdateMapCodeCache(stub_holder, name, handler); | 373 JSObject::UpdateMapCodeCache(stub_holder, name, handler); |
363 | |
364 return handler; | 374 return handler; |
365 } | 375 } |
366 | 376 |
367 | 377 |
368 Handle<Code> StubCache::ComputeLoadInterceptor(Handle<Name> name, | 378 Handle<Code> StubCache::ComputeLoadInterceptor(Handle<Name> name, |
369 Handle<JSObject> receiver, | 379 Handle<JSObject> receiver, |
370 Handle<JSObject> holder) { | 380 Handle<JSObject> holder, |
| 381 Code::Kind kind) { |
371 Handle<JSObject> stub_holder = StubHolder(receiver, holder); | 382 Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
372 Handle<Code> stub = FindLoadHandler( | 383 Handle<Code> stub = FindLoadHandler( |
373 name, receiver, stub_holder, Code::LOAD_IC, Code::INTERCEPTOR); | 384 name, receiver, stub_holder, kind, Code::INTERCEPTOR); |
374 if (!stub.is_null()) return stub; | 385 if (!stub.is_null()) return stub; |
375 | 386 |
376 LoadStubCompiler compiler(isolate_); | 387 BaseLoadStubCompiler compiler(isolate_, kind); |
377 Handle<Code> handler = | 388 Handle<Code> handler = |
378 compiler.CompileLoadInterceptor(receiver, holder, name); | 389 compiler.CompileLoadInterceptor(receiver, holder, name); |
379 JSObject::UpdateMapCodeCache(stub_holder, name, handler); | 390 JSObject::UpdateMapCodeCache(stub_holder, name, handler); |
380 return handler; | 391 return handler; |
381 } | 392 } |
382 | 393 |
383 | 394 |
384 Handle<Code> StubCache::ComputeLoadNormal(Handle<Name> name, | 395 Handle<Code> StubCache::ComputeLoadNormal(Handle<Name> name, |
385 Handle<JSObject> receiver) { | 396 Handle<JSObject> receiver) { |
386 return isolate_->builtins()->LoadIC_Normal(); | 397 return isolate_->builtins()->LoadIC_Normal(); |
(...skipping 10 matching lines...) Expand all Loading... |
397 if (!stub.is_null()) return stub; | 408 if (!stub.is_null()) return stub; |
398 | 409 |
399 LoadStubCompiler compiler(isolate_); | 410 LoadStubCompiler compiler(isolate_); |
400 Handle<Code> ic = | 411 Handle<Code> ic = |
401 compiler.CompileLoadGlobal(receiver, holder, cell, name, is_dont_delete); | 412 compiler.CompileLoadGlobal(receiver, holder, cell, name, is_dont_delete); |
402 JSObject::UpdateMapCodeCache(stub_holder, name, ic); | 413 JSObject::UpdateMapCodeCache(stub_holder, name, ic); |
403 return ic; | 414 return ic; |
404 } | 415 } |
405 | 416 |
406 | 417 |
407 Handle<Code> StubCache::ComputeKeyedLoadField(Handle<Name> name, | |
408 Handle<JSObject> receiver, | |
409 Handle<JSObject> holder, | |
410 PropertyIndex field, | |
411 Representation representation) { | |
412 if (receiver.is_identical_to(holder)) { | |
413 // TODO(titzer): this should use an HObjectAccess | |
414 KeyedLoadFieldStub stub(field.is_inobject(holder), | |
415 field.translate(holder), | |
416 representation); | |
417 return stub.GetCode(isolate()); | |
418 } | |
419 | |
420 Handle<JSObject> stub_holder = StubHolder(receiver, holder); | |
421 Handle<Code> stub = FindLoadHandler( | |
422 name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::FIELD); | |
423 if (!stub.is_null()) return stub; | |
424 | |
425 KeyedLoadStubCompiler compiler(isolate_); | |
426 Handle<Code> handler = | |
427 compiler.CompileLoadField(receiver, holder, name, field, representation); | |
428 JSObject::UpdateMapCodeCache(stub_holder, name, handler); | |
429 return handler; | |
430 } | |
431 | |
432 | |
433 Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<Name> name, | |
434 Handle<JSObject> receiver, | |
435 Handle<JSObject> holder, | |
436 Handle<Object> value) { | |
437 Handle<JSObject> stub_holder = StubHolder(receiver, holder); | |
438 Handle<Code> handler = FindLoadHandler( | |
439 name, receiver, stub_holder, Code::KEYED_LOAD_IC, | |
440 Code::CONSTANT); | |
441 if (!handler.is_null()) return handler; | |
442 | |
443 KeyedLoadStubCompiler compiler(isolate_); | |
444 handler = compiler.CompileLoadConstant(receiver, holder, name, value); | |
445 JSObject::UpdateMapCodeCache(stub_holder, name, handler); | |
446 return handler; | |
447 } | |
448 | |
449 | |
450 Handle<Code> StubCache::ComputeKeyedLoadInterceptor(Handle<Name> name, | |
451 Handle<JSObject> receiver, | |
452 Handle<JSObject> holder) { | |
453 Handle<JSObject> stub_holder = StubHolder(receiver, holder); | |
454 Handle<Code> stub = FindLoadHandler( | |
455 name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::INTERCEPTOR); | |
456 if (!stub.is_null()) return stub; | |
457 | |
458 KeyedLoadStubCompiler compiler(isolate_); | |
459 Handle<Code> handler = | |
460 compiler.CompileLoadInterceptor(receiver, holder, name); | |
461 JSObject::UpdateMapCodeCache(stub_holder, name, handler); | |
462 return handler; | |
463 } | |
464 | |
465 | |
466 Handle<Code> StubCache::ComputeKeyedLoadCallback( | |
467 Handle<Name> name, | |
468 Handle<JSObject> receiver, | |
469 Handle<JSObject> holder, | |
470 Handle<ExecutableAccessorInfo> callback) { | |
471 Handle<JSObject> stub_holder = StubHolder(receiver, holder); | |
472 Handle<Code> stub = FindLoadHandler( | |
473 name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::CALLBACKS); | |
474 if (!stub.is_null()) return stub; | |
475 | |
476 KeyedLoadStubCompiler compiler(isolate_); | |
477 Handle<Code> handler = | |
478 compiler.CompileLoadCallback(receiver, holder, name, callback); | |
479 JSObject::UpdateMapCodeCache(stub_holder, name, handler); | |
480 return handler; | |
481 } | |
482 | |
483 | |
484 Handle<Code> StubCache::ComputeKeyedLoadCallback( | |
485 Handle<Name> name, | |
486 Handle<JSObject> receiver, | |
487 Handle<JSObject> holder, | |
488 const CallOptimization& call_optimization) { | |
489 Handle<JSObject> stub_holder = StubHolder(receiver, holder); | |
490 Handle<Code> stub = FindLoadHandler( | |
491 name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::CALLBACKS); | |
492 if (!stub.is_null()) return stub; | |
493 | |
494 KeyedLoadStubCompiler compiler(isolate_); | |
495 Handle<Code> handler = | |
496 compiler.CompileLoadCallback(receiver, holder, name, call_optimization); | |
497 JSObject::UpdateMapCodeCache(stub_holder, name, handler); | |
498 return handler; | |
499 } | |
500 | |
501 | |
502 Handle<Code> StubCache::ComputeStoreField(Handle<Name> name, | 418 Handle<Code> StubCache::ComputeStoreField(Handle<Name> name, |
503 Handle<JSObject> receiver, | 419 Handle<JSObject> receiver, |
504 LookupResult* lookup, | 420 LookupResult* lookup, |
505 StrictModeFlag strict_mode) { | 421 StrictModeFlag strict_mode) { |
506 Handle<Code> stub = FindStoreHandler( | 422 Handle<Code> stub = FindStoreHandler( |
507 name, receiver, Code::STORE_IC, Code::FIELD, strict_mode); | 423 name, receiver, Code::STORE_IC, Code::FIELD, strict_mode); |
508 if (!stub.is_null()) return stub; | 424 if (!stub.is_null()) return stub; |
509 | 425 |
510 StoreStubCompiler compiler(isolate_, strict_mode); | 426 StoreStubCompiler compiler(isolate_, strict_mode); |
511 Handle<Code> handler = compiler.CompileStoreField(receiver, lookup, name); | 427 Handle<Code> handler = compiler.CompileStoreField(receiver, lookup, name); |
(...skipping 1420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1932 | 1848 |
1933 #undef __ | 1849 #undef __ |
1934 | 1850 |
1935 | 1851 |
1936 void StubCompiler::TailCallBuiltin(MacroAssembler* masm, Builtins::Name name) { | 1852 void StubCompiler::TailCallBuiltin(MacroAssembler* masm, Builtins::Name name) { |
1937 Handle<Code> code(masm->isolate()->builtins()->builtin(name)); | 1853 Handle<Code> code(masm->isolate()->builtins()->builtin(name)); |
1938 GenerateTailCall(masm, code); | 1854 GenerateTailCall(masm, code); |
1939 } | 1855 } |
1940 | 1856 |
1941 | 1857 |
1942 void LoadStubCompiler::JitEvent(Handle<Name> name, Handle<Code> code) { | 1858 Register* BaseLoadStoreStubCompiler::GetRegisters(Code::Kind kind) { |
1943 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); | 1859 switch (kind) { |
| 1860 case Code::LOAD_IC: return LoadStubCompiler::registers(); |
| 1861 case Code::STORE_IC: return StoreStubCompiler::registers(); |
| 1862 case Code::KEYED_LOAD_IC: return KeyedLoadStubCompiler::registers(); |
| 1863 case Code::KEYED_STORE_IC: return KeyedStoreStubCompiler::registers(); |
| 1864 default: UNREACHABLE(); |
| 1865 } |
| 1866 return NULL; |
1944 } | 1867 } |
1945 | 1868 |
1946 | 1869 |
1947 void KeyedLoadStubCompiler::JitEvent(Handle<Name> name, Handle<Code> code) { | |
1948 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); | |
1949 } | |
1950 | |
1951 | |
1952 void StoreStubCompiler::JitEvent(Handle<Name> name, Handle<Code> code) { | |
1953 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); | |
1954 } | |
1955 | |
1956 | |
1957 void KeyedStoreStubCompiler::JitEvent(Handle<Name> name, Handle<Code> code) { | |
1958 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, *name, *code)); | |
1959 } | |
1960 | |
1961 | |
1962 Handle<Code> BaseLoadStoreStubCompiler::GetICCode(Code::Kind kind, | 1870 Handle<Code> BaseLoadStoreStubCompiler::GetICCode(Code::Kind kind, |
1963 Code::StubType type, | 1871 Code::StubType type, |
1964 Handle<Name> name, | 1872 Handle<Name> name, |
1965 InlineCacheState state) { | 1873 InlineCacheState state) { |
1966 Code::Flags flags = Code::ComputeFlags( | 1874 Code::Flags flags = Code::ComputeFlags( |
1967 kind, state, extra_state(), type); | 1875 kind, state, extra_state(), type); |
1968 Handle<Code> code = GetCodeWithFlags(flags, name); | 1876 Handle<Code> code = GetCodeWithFlags(flags, name); |
1969 PROFILE(isolate(), CodeCreateEvent(log_kind(code), *code, *name)); | 1877 PROFILE(isolate(), CodeCreateEvent(log_kind(code), *code, *name)); |
1970 JitEvent(name, code); | 1878 JitEvent(name, code); |
1971 return code; | 1879 return code; |
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2243 Handle<FunctionTemplateInfo>( | 2151 Handle<FunctionTemplateInfo>( |
2244 FunctionTemplateInfo::cast(signature->receiver())); | 2152 FunctionTemplateInfo::cast(signature->receiver())); |
2245 } | 2153 } |
2246 } | 2154 } |
2247 | 2155 |
2248 is_simple_api_call_ = true; | 2156 is_simple_api_call_ = true; |
2249 } | 2157 } |
2250 | 2158 |
2251 | 2159 |
2252 } } // namespace v8::internal | 2160 } } // namespace v8::internal |
OLD | NEW |