| 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 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 92 | 92 |
| 93 // Update primary cache. | 93 // Update primary cache. |
| 94 primary->key = name; | 94 primary->key = name; |
| 95 primary->value = code; | 95 primary->value = code; |
| 96 primary->map = map; | 96 primary->map = map; |
| 97 isolate()->counters()->megamorphic_stub_cache_updates()->Increment(); | 97 isolate()->counters()->megamorphic_stub_cache_updates()->Increment(); |
| 98 return code; | 98 return code; |
| 99 } | 99 } |
| 100 | 100 |
| 101 | 101 |
| 102 Handle<JSObject> StubCache::StubHolder(Handle<JSObject> receiver, | |
| 103 Handle<JSObject> holder) { | |
| 104 InlineCacheHolderFlag cache_holder = | |
| 105 IC::GetCodeCacheForObject(*receiver, *holder); | |
| 106 return Handle<JSObject>(IC::GetCodeCacheHolder( | |
| 107 isolate_, *receiver, cache_holder)); | |
| 108 } | |
| 109 | |
| 110 | |
| 111 Handle<Code> StubCache::FindIC(Handle<Name> name, | 102 Handle<Code> StubCache::FindIC(Handle<Name> name, |
| 112 Handle<Map> stub_holder_map, | 103 Handle<Map> stub_holder_map, |
| 113 Code::Kind kind, | 104 Code::Kind kind, |
| 114 Code::StubType type, | 105 Code::StubType type, |
| 115 Code::ExtraICState extra_state) { | 106 Code::ExtraICState extra_state) { |
| 116 Code::Flags flags = Code::ComputeMonomorphicFlags(kind, extra_state, type); | 107 Code::Flags flags = Code::ComputeMonomorphicFlags(kind, extra_state, type); |
| 117 Handle<Object> probe(stub_holder_map->FindInCodeCache(*name, flags), | 108 Handle<Object> probe(stub_holder_map->FindInCodeCache(*name, flags), |
| 118 isolate_); | 109 isolate_); |
| 119 if (probe->IsCode()) return Handle<Code>::cast(probe); | 110 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 120 return Handle<Code>::null(); | 111 return Handle<Code>::null(); |
| 121 } | 112 } |
| 122 | 113 |
| 123 | 114 |
| 124 Handle<Code> StubCache::FindIC(Handle<Name> name, | 115 Handle<Code> StubCache::FindIC(Handle<Name> name, |
| 125 Handle<JSObject> stub_holder, | 116 Handle<JSObject> stub_holder, |
| 126 Code::Kind kind, | 117 Code::Kind kind, |
| 127 Code::StubType type, | 118 Code::StubType type, |
| 128 Code::ExtraICState extra_ic_state) { | 119 Code::ExtraICState extra_ic_state) { |
| 129 return FindIC(name, Handle<Map>(stub_holder->map()), kind, | 120 return FindIC(name, Handle<Map>(stub_holder->map()), kind, |
| 130 type, extra_ic_state); | 121 type, extra_ic_state); |
| 131 } | 122 } |
| 132 | 123 |
| 133 | 124 |
| 134 Handle<Code> StubCache::FindLoadHandler(Handle<Name> name, | 125 Handle<Code> StubCache::FindLoadHandler(Handle<Name> name, |
| 135 Handle<JSObject> receiver, | 126 Handle<JSObject> receiver, |
| 136 Handle<JSObject> stub_holder, | |
| 137 Code::Kind kind, | 127 Code::Kind kind, |
| 138 Code::StubType type) { | 128 Code::StubType type) { |
| 139 InlineCacheHolderFlag holder_flag = receiver.is_identical_to(stub_holder) | |
| 140 ? OWN_MAP : PROTOTYPE_MAP; | |
| 141 ASSERT(type != Code::NORMAL); | 129 ASSERT(type != Code::NORMAL); |
| 142 Code::Flags flags = Code::ComputeMonomorphicFlags( | 130 Code::Flags flags = Code::ComputeMonomorphicFlags( |
| 143 Code::HANDLER, Code::kNoExtraICState, type, kind, holder_flag); | 131 Code::HANDLER, Code::kNoExtraICState, type, kind); |
| 144 Handle<Object> probe(stub_holder->map()->FindInCodeCache(*name, flags), | 132 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), |
| 145 isolate_); | 133 isolate_); |
| 146 if (probe->IsCode()) return Handle<Code>::cast(probe); | 134 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 147 return Handle<Code>::null(); | 135 return Handle<Code>::null(); |
| 148 } | 136 } |
| 149 | 137 |
| 150 | 138 |
| 151 Handle<Code> StubCache::FindStoreHandler(Handle<Name> name, | 139 Handle<Code> StubCache::FindStoreHandler(Handle<Name> name, |
| 152 Handle<JSObject> receiver, | 140 Handle<JSObject> receiver, |
| 153 Code::Kind kind, | 141 Code::Kind kind, |
| 154 Code::StubType type, | 142 Code::StubType type, |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 213 global = Handle<GlobalObject>::cast(current); | 201 global = Handle<GlobalObject>::cast(current); |
| 214 cache_name = name; | 202 cache_name = name; |
| 215 } else if (!current->HasFastProperties()) { | 203 } else if (!current->HasFastProperties()) { |
| 216 cache_name = name; | 204 cache_name = name; |
| 217 } | 205 } |
| 218 } while (!next->IsNull()); | 206 } while (!next->IsNull()); |
| 219 | 207 |
| 220 // Compile the stub that is either shared for all names or | 208 // Compile the stub that is either shared for all names or |
| 221 // name specific if there are global objects involved. | 209 // name specific if there are global objects involved. |
| 222 Handle<Code> handler = FindLoadHandler( | 210 Handle<Code> handler = FindLoadHandler( |
| 223 cache_name, receiver, receiver, Code::LOAD_IC, Code::NONEXISTENT); | 211 cache_name, receiver, Code::LOAD_IC, Code::NONEXISTENT); |
| 224 if (!handler.is_null()) return handler; | 212 if (!handler.is_null()) return handler; |
| 225 | 213 |
| 226 LoadStubCompiler compiler(isolate_); | 214 LoadStubCompiler compiler(isolate_); |
| 227 handler = | 215 handler = |
| 228 compiler.CompileLoadNonexistent(receiver, current, cache_name, global); | 216 compiler.CompileLoadNonexistent(receiver, current, cache_name, global); |
| 229 HeapObject::UpdateMapCodeCache(receiver, cache_name, handler); | 217 HeapObject::UpdateMapCodeCache(receiver, cache_name, handler); |
| 230 return handler; | 218 return handler; |
| 231 } | 219 } |
| 232 | 220 |
| 233 | 221 |
| 234 Handle<Code> StubCache::ComputeLoadField(Handle<Name> name, | 222 Handle<Code> StubCache::ComputeLoadField(Handle<Name> name, |
| 235 Handle<JSObject> receiver, | 223 Handle<JSObject> receiver, |
| 236 Handle<JSObject> holder, | 224 Handle<JSObject> holder, |
| 237 PropertyIndex field, | 225 PropertyIndex field, |
| 238 Representation representation) { | 226 Representation representation) { |
| 239 if (receiver.is_identical_to(holder)) { | 227 if (receiver.is_identical_to(holder)) { |
| 240 LoadFieldStub stub(field.is_inobject(holder), | 228 LoadFieldStub stub(field.is_inobject(holder), |
| 241 field.translate(holder), | 229 field.translate(holder), |
| 242 representation); | 230 representation); |
| 243 return stub.GetCode(isolate()); | 231 return stub.GetCode(isolate()); |
| 244 } | 232 } |
| 245 | 233 |
| 246 Handle<JSObject> stub_holder = StubHolder(receiver, holder); | |
| 247 Handle<Code> stub = FindLoadHandler( | 234 Handle<Code> stub = FindLoadHandler( |
| 248 name, receiver, stub_holder, Code::LOAD_IC, Code::FIELD); | 235 name, receiver, Code::LOAD_IC, Code::FIELD); |
| 249 if (!stub.is_null()) return stub; | 236 if (!stub.is_null()) return stub; |
| 250 | 237 |
| 251 LoadStubCompiler compiler(isolate_); | 238 LoadStubCompiler compiler(isolate_); |
| 252 Handle<Code> handler = | 239 Handle<Code> handler = |
| 253 compiler.CompileLoadField(receiver, holder, name, field, representation); | 240 compiler.CompileLoadField(receiver, holder, name, field, representation); |
| 254 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); | 241 HeapObject::UpdateMapCodeCache(receiver, name, handler); |
| 255 return handler; | 242 return handler; |
| 256 } | 243 } |
| 257 | 244 |
| 258 | 245 |
| 259 Handle<Code> StubCache::ComputeLoadCallback( | 246 Handle<Code> StubCache::ComputeLoadCallback( |
| 260 Handle<Name> name, | 247 Handle<Name> name, |
| 261 Handle<JSObject> receiver, | 248 Handle<JSObject> receiver, |
| 262 Handle<JSObject> holder, | 249 Handle<JSObject> holder, |
| 263 Handle<ExecutableAccessorInfo> callback) { | 250 Handle<ExecutableAccessorInfo> callback) { |
| 264 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); | 251 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); |
| 265 Handle<JSObject> stub_holder = StubHolder(receiver, holder); | |
| 266 Handle<Code> stub = FindLoadHandler( | 252 Handle<Code> stub = FindLoadHandler( |
| 267 name, receiver, stub_holder, Code::LOAD_IC, Code::CALLBACKS); | 253 name, receiver, Code::LOAD_IC, Code::CALLBACKS); |
| 268 if (!stub.is_null()) return stub; | 254 if (!stub.is_null()) return stub; |
| 269 | 255 |
| 270 LoadStubCompiler compiler(isolate_); | 256 LoadStubCompiler compiler(isolate_); |
| 271 Handle<Code> handler = | 257 Handle<Code> handler = |
| 272 compiler.CompileLoadCallback(receiver, holder, name, callback); | 258 compiler.CompileLoadCallback(receiver, holder, name, callback); |
| 273 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); | 259 HeapObject::UpdateMapCodeCache(receiver, name, handler); |
| 274 return handler; | 260 return handler; |
| 275 } | 261 } |
| 276 | 262 |
| 277 | 263 |
| 278 Handle<Code> StubCache::ComputeLoadCallback( | 264 Handle<Code> StubCache::ComputeLoadCallback( |
| 279 Handle<Name> name, | 265 Handle<Name> name, |
| 280 Handle<JSObject> receiver, | 266 Handle<JSObject> receiver, |
| 281 Handle<JSObject> holder, | 267 Handle<JSObject> holder, |
| 282 const CallOptimization& call_optimization) { | 268 const CallOptimization& call_optimization) { |
| 283 Handle<JSObject> stub_holder = StubHolder(receiver, holder); | |
| 284 Handle<Code> stub = FindLoadHandler( | 269 Handle<Code> stub = FindLoadHandler( |
| 285 name, receiver, stub_holder, Code::LOAD_IC, Code::CALLBACKS); | 270 name, receiver, Code::LOAD_IC, Code::CALLBACKS); |
| 286 if (!stub.is_null()) return stub; | 271 if (!stub.is_null()) return stub; |
| 287 | 272 |
| 288 LoadStubCompiler compiler(isolate_); | 273 LoadStubCompiler compiler(isolate_); |
| 289 Handle<Code> handler = | 274 Handle<Code> handler = |
| 290 compiler.CompileLoadCallback(receiver, holder, name, call_optimization); | 275 compiler.CompileLoadCallback(receiver, holder, name, call_optimization); |
| 291 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); | 276 HeapObject::UpdateMapCodeCache(receiver, name, handler); |
| 292 return handler; | 277 return handler; |
| 293 } | 278 } |
| 294 | 279 |
| 295 | 280 |
| 296 Handle<Code> StubCache::ComputeLoadViaGetter(Handle<Name> name, | 281 Handle<Code> StubCache::ComputeLoadViaGetter(Handle<Name> name, |
| 297 Handle<JSObject> receiver, | 282 Handle<JSObject> receiver, |
| 298 Handle<JSObject> holder, | 283 Handle<JSObject> holder, |
| 299 Handle<JSFunction> getter) { | 284 Handle<JSFunction> getter) { |
| 300 Handle<JSObject> stub_holder = StubHolder(receiver, holder); | |
| 301 Handle<Code> stub = FindLoadHandler( | 285 Handle<Code> stub = FindLoadHandler( |
| 302 name, receiver, stub_holder, Code::LOAD_IC, Code::CALLBACKS); | 286 name, receiver, Code::LOAD_IC, Code::CALLBACKS); |
| 303 if (!stub.is_null()) return stub; | 287 if (!stub.is_null()) return stub; |
| 304 | 288 |
| 305 LoadStubCompiler compiler(isolate_); | 289 LoadStubCompiler compiler(isolate_); |
| 306 Handle<Code> handler = | 290 Handle<Code> handler = |
| 307 compiler.CompileLoadViaGetter(receiver, holder, name, getter); | 291 compiler.CompileLoadViaGetter(receiver, holder, name, getter); |
| 308 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); | 292 HeapObject::UpdateMapCodeCache(receiver, name, handler); |
| 309 return handler; | 293 return handler; |
| 310 } | 294 } |
| 311 | 295 |
| 312 | 296 |
| 313 Handle<Code> StubCache::ComputeLoadConstant(Handle<Name> name, | 297 Handle<Code> StubCache::ComputeLoadConstant(Handle<Name> name, |
| 314 Handle<JSObject> receiver, | 298 Handle<JSObject> receiver, |
| 315 Handle<JSObject> holder, | 299 Handle<JSObject> holder, |
| 316 Handle<Object> value) { | 300 Handle<Object> value) { |
| 317 Handle<JSObject> stub_holder = StubHolder(receiver, holder); | |
| 318 Handle<Code> handler = FindLoadHandler( | 301 Handle<Code> handler = FindLoadHandler( |
| 319 name, receiver, stub_holder, Code::LOAD_IC, Code::CONSTANT); | 302 name, receiver, Code::LOAD_IC, Code::CONSTANT); |
| 320 if (!handler.is_null()) return handler; | 303 if (!handler.is_null()) return handler; |
| 321 | 304 |
| 322 LoadStubCompiler compiler(isolate_); | 305 LoadStubCompiler compiler(isolate_); |
| 323 handler = compiler.CompileLoadConstant(receiver, holder, name, value); | 306 handler = compiler.CompileLoadConstant(receiver, holder, name, value); |
| 324 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); | 307 HeapObject::UpdateMapCodeCache(receiver, name, handler); |
| 325 | 308 |
| 326 return handler; | 309 return handler; |
| 327 } | 310 } |
| 328 | 311 |
| 329 | 312 |
| 330 Handle<Code> StubCache::ComputeLoadInterceptor(Handle<Name> name, | 313 Handle<Code> StubCache::ComputeLoadInterceptor(Handle<Name> name, |
| 331 Handle<JSObject> receiver, | 314 Handle<JSObject> receiver, |
| 332 Handle<JSObject> holder) { | 315 Handle<JSObject> holder) { |
| 333 Handle<JSObject> stub_holder = StubHolder(receiver, holder); | |
| 334 Handle<Code> stub = FindLoadHandler( | 316 Handle<Code> stub = FindLoadHandler( |
| 335 name, receiver, stub_holder, Code::LOAD_IC, Code::INTERCEPTOR); | 317 name, receiver, Code::LOAD_IC, Code::INTERCEPTOR); |
| 336 if (!stub.is_null()) return stub; | 318 if (!stub.is_null()) return stub; |
| 337 | 319 |
| 338 LoadStubCompiler compiler(isolate_); | 320 LoadStubCompiler compiler(isolate_); |
| 339 Handle<Code> handler = | 321 Handle<Code> handler = |
| 340 compiler.CompileLoadInterceptor(receiver, holder, name); | 322 compiler.CompileLoadInterceptor(receiver, holder, name); |
| 341 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); | 323 HeapObject::UpdateMapCodeCache(receiver, name, handler); |
| 342 return handler; | 324 return handler; |
| 343 } | 325 } |
| 344 | 326 |
| 345 | 327 |
| 346 Handle<Code> StubCache::ComputeLoadNormal(Handle<Name> name, | 328 Handle<Code> StubCache::ComputeLoadNormal(Handle<Name> name, |
| 347 Handle<JSObject> receiver) { | 329 Handle<JSObject> receiver) { |
| 348 return isolate_->builtins()->LoadIC_Normal(); | 330 return isolate_->builtins()->LoadIC_Normal(); |
| 349 } | 331 } |
| 350 | 332 |
| 351 | 333 |
| 352 Handle<Code> StubCache::ComputeLoadGlobal(Handle<Name> name, | 334 Handle<Code> StubCache::ComputeLoadGlobal(Handle<Name> name, |
| 353 Handle<JSObject> receiver, | 335 Handle<JSObject> receiver, |
| 354 Handle<GlobalObject> holder, | 336 Handle<GlobalObject> holder, |
| 355 Handle<PropertyCell> cell, | 337 Handle<PropertyCell> cell, |
| 356 bool is_dont_delete) { | 338 bool is_dont_delete) { |
| 357 Handle<JSObject> stub_holder = StubHolder(receiver, holder); | 339 Handle<Code> stub = FindIC(name, receiver, Code::LOAD_IC, Code::NORMAL); |
| 358 Handle<Code> stub = FindIC(name, stub_holder, Code::LOAD_IC, Code::NORMAL); | |
| 359 if (!stub.is_null()) return stub; | 340 if (!stub.is_null()) return stub; |
| 360 | 341 |
| 361 LoadStubCompiler compiler(isolate_); | 342 LoadStubCompiler compiler(isolate_); |
| 362 Handle<Code> ic = | 343 Handle<Code> ic = |
| 363 compiler.CompileLoadGlobal(receiver, holder, cell, name, is_dont_delete); | 344 compiler.CompileLoadGlobal(receiver, holder, cell, name, is_dont_delete); |
| 364 HeapObject::UpdateMapCodeCache(stub_holder, name, ic); | 345 HeapObject::UpdateMapCodeCache(receiver, name, ic); |
| 365 return ic; | 346 return ic; |
| 366 } | 347 } |
| 367 | 348 |
| 368 | 349 |
| 369 Handle<Code> StubCache::ComputeKeyedLoadField(Handle<Name> name, | 350 Handle<Code> StubCache::ComputeKeyedLoadField(Handle<Name> name, |
| 370 Handle<JSObject> receiver, | 351 Handle<JSObject> receiver, |
| 371 Handle<JSObject> holder, | 352 Handle<JSObject> holder, |
| 372 PropertyIndex field, | 353 PropertyIndex field, |
| 373 Representation representation) { | 354 Representation representation) { |
| 374 if (receiver.is_identical_to(holder)) { | 355 if (receiver.is_identical_to(holder)) { |
| 375 // TODO(titzer): this should use an HObjectAccess | 356 // TODO(titzer): this should use an HObjectAccess |
| 376 KeyedLoadFieldStub stub(field.is_inobject(holder), | 357 KeyedLoadFieldStub stub(field.is_inobject(holder), |
| 377 field.translate(holder), | 358 field.translate(holder), |
| 378 representation); | 359 representation); |
| 379 return stub.GetCode(isolate()); | 360 return stub.GetCode(isolate()); |
| 380 } | 361 } |
| 381 | 362 |
| 382 Handle<JSObject> stub_holder = StubHolder(receiver, holder); | |
| 383 Handle<Code> stub = FindLoadHandler( | 363 Handle<Code> stub = FindLoadHandler( |
| 384 name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::FIELD); | 364 name, receiver, Code::KEYED_LOAD_IC, Code::FIELD); |
| 385 if (!stub.is_null()) return stub; | 365 if (!stub.is_null()) return stub; |
| 386 | 366 |
| 387 KeyedLoadStubCompiler compiler(isolate_); | 367 KeyedLoadStubCompiler compiler(isolate_); |
| 388 Handle<Code> handler = | 368 Handle<Code> handler = |
| 389 compiler.CompileLoadField(receiver, holder, name, field, representation); | 369 compiler.CompileLoadField(receiver, holder, name, field, representation); |
| 390 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); | 370 HeapObject::UpdateMapCodeCache(receiver, name, handler); |
| 391 return handler; | 371 return handler; |
| 392 } | 372 } |
| 393 | 373 |
| 394 | 374 |
| 395 Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<Name> name, | 375 Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<Name> name, |
| 396 Handle<JSObject> receiver, | 376 Handle<JSObject> receiver, |
| 397 Handle<JSObject> holder, | 377 Handle<JSObject> holder, |
| 398 Handle<Object> value) { | 378 Handle<Object> value) { |
| 399 Handle<JSObject> stub_holder = StubHolder(receiver, holder); | |
| 400 Handle<Code> handler = FindLoadHandler( | 379 Handle<Code> handler = FindLoadHandler( |
| 401 name, receiver, stub_holder, Code::KEYED_LOAD_IC, | 380 name, receiver, Code::KEYED_LOAD_IC, Code::CONSTANT); |
| 402 Code::CONSTANT); | |
| 403 if (!handler.is_null()) return handler; | 381 if (!handler.is_null()) return handler; |
| 404 | 382 |
| 405 KeyedLoadStubCompiler compiler(isolate_); | 383 KeyedLoadStubCompiler compiler(isolate_); |
| 406 handler = compiler.CompileLoadConstant(receiver, holder, name, value); | 384 handler = compiler.CompileLoadConstant(receiver, holder, name, value); |
| 407 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); | 385 HeapObject::UpdateMapCodeCache(receiver, name, handler); |
| 408 return handler; | 386 return handler; |
| 409 } | 387 } |
| 410 | 388 |
| 411 | 389 |
| 412 Handle<Code> StubCache::ComputeKeyedLoadInterceptor(Handle<Name> name, | 390 Handle<Code> StubCache::ComputeKeyedLoadInterceptor(Handle<Name> name, |
| 413 Handle<JSObject> receiver, | 391 Handle<JSObject> receiver, |
| 414 Handle<JSObject> holder) { | 392 Handle<JSObject> holder) { |
| 415 Handle<JSObject> stub_holder = StubHolder(receiver, holder); | |
| 416 Handle<Code> stub = FindLoadHandler( | 393 Handle<Code> stub = FindLoadHandler( |
| 417 name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::INTERCEPTOR); | 394 name, receiver, Code::KEYED_LOAD_IC, Code::INTERCEPTOR); |
| 418 if (!stub.is_null()) return stub; | 395 if (!stub.is_null()) return stub; |
| 419 | 396 |
| 420 KeyedLoadStubCompiler compiler(isolate_); | 397 KeyedLoadStubCompiler compiler(isolate_); |
| 421 Handle<Code> handler = | 398 Handle<Code> handler = |
| 422 compiler.CompileLoadInterceptor(receiver, holder, name); | 399 compiler.CompileLoadInterceptor(receiver, holder, name); |
| 423 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); | 400 HeapObject::UpdateMapCodeCache(receiver, name, handler); |
| 424 return handler; | 401 return handler; |
| 425 } | 402 } |
| 426 | 403 |
| 427 | 404 |
| 428 Handle<Code> StubCache::ComputeKeyedLoadCallback( | 405 Handle<Code> StubCache::ComputeKeyedLoadCallback( |
| 429 Handle<Name> name, | 406 Handle<Name> name, |
| 430 Handle<JSObject> receiver, | 407 Handle<JSObject> receiver, |
| 431 Handle<JSObject> holder, | 408 Handle<JSObject> holder, |
| 432 Handle<ExecutableAccessorInfo> callback) { | 409 Handle<ExecutableAccessorInfo> callback) { |
| 433 Handle<JSObject> stub_holder = StubHolder(receiver, holder); | |
| 434 Handle<Code> stub = FindLoadHandler( | 410 Handle<Code> stub = FindLoadHandler( |
| 435 name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::CALLBACKS); | 411 name, receiver, Code::KEYED_LOAD_IC, Code::CALLBACKS); |
| 436 if (!stub.is_null()) return stub; | 412 if (!stub.is_null()) return stub; |
| 437 | 413 |
| 438 KeyedLoadStubCompiler compiler(isolate_); | 414 KeyedLoadStubCompiler compiler(isolate_); |
| 439 Handle<Code> handler = | 415 Handle<Code> handler = |
| 440 compiler.CompileLoadCallback(receiver, holder, name, callback); | 416 compiler.CompileLoadCallback(receiver, holder, name, callback); |
| 441 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); | 417 HeapObject::UpdateMapCodeCache(receiver, name, handler); |
| 442 return handler; | 418 return handler; |
| 443 } | 419 } |
| 444 | 420 |
| 445 | 421 |
| 446 Handle<Code> StubCache::ComputeKeyedLoadCallback( | 422 Handle<Code> StubCache::ComputeKeyedLoadCallback( |
| 447 Handle<Name> name, | 423 Handle<Name> name, |
| 448 Handle<JSObject> receiver, | 424 Handle<JSObject> receiver, |
| 449 Handle<JSObject> holder, | 425 Handle<JSObject> holder, |
| 450 const CallOptimization& call_optimization) { | 426 const CallOptimization& call_optimization) { |
| 451 Handle<JSObject> stub_holder = StubHolder(receiver, holder); | |
| 452 Handle<Code> stub = FindLoadHandler( | 427 Handle<Code> stub = FindLoadHandler( |
| 453 name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::CALLBACKS); | 428 name, receiver, Code::KEYED_LOAD_IC, Code::CALLBACKS); |
| 454 if (!stub.is_null()) return stub; | 429 if (!stub.is_null()) return stub; |
| 455 | 430 |
| 456 KeyedLoadStubCompiler compiler(isolate_); | 431 KeyedLoadStubCompiler compiler(isolate_); |
| 457 Handle<Code> handler = | 432 Handle<Code> handler = |
| 458 compiler.CompileLoadCallback(receiver, holder, name, call_optimization); | 433 compiler.CompileLoadCallback(receiver, holder, name, call_optimization); |
| 459 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); | 434 HeapObject::UpdateMapCodeCache(receiver, name, handler); |
| 460 return handler; | 435 return handler; |
| 461 } | 436 } |
| 462 | 437 |
| 463 | 438 |
| 464 Handle<Code> StubCache::ComputeStoreField(Handle<Name> name, | 439 Handle<Code> StubCache::ComputeStoreField(Handle<Name> name, |
| 465 Handle<JSObject> receiver, | 440 Handle<JSObject> receiver, |
| 466 LookupResult* lookup, | 441 LookupResult* lookup, |
| 467 StrictModeFlag strict_mode) { | 442 StrictModeFlag strict_mode) { |
| 468 Handle<Code> stub = FindStoreHandler( | 443 Handle<Code> stub = FindStoreHandler( |
| 469 name, receiver, Code::STORE_IC, Code::FIELD, strict_mode); | 444 name, receiver, Code::STORE_IC, Code::FIELD, strict_mode); |
| (...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 813 | 788 |
| 814 | 789 |
| 815 Handle<Code> StubCache::ComputeCallGlobal(int argc, | 790 Handle<Code> StubCache::ComputeCallGlobal(int argc, |
| 816 Code::Kind kind, | 791 Code::Kind kind, |
| 817 Code::ExtraICState extra_state, | 792 Code::ExtraICState extra_state, |
| 818 Handle<Name> name, | 793 Handle<Name> name, |
| 819 Handle<JSObject> receiver, | 794 Handle<JSObject> receiver, |
| 820 Handle<GlobalObject> holder, | 795 Handle<GlobalObject> holder, |
| 821 Handle<PropertyCell> cell, | 796 Handle<PropertyCell> cell, |
| 822 Handle<JSFunction> function) { | 797 Handle<JSFunction> function) { |
| 823 InlineCacheHolderFlag cache_holder = | |
| 824 IC::GetCodeCacheForObject(*receiver, *holder); | |
| 825 Handle<JSObject> stub_holder(IC::GetCodeCacheHolder( | |
| 826 isolate_, *receiver, cache_holder)); | |
| 827 Code::Flags flags = Code::ComputeMonomorphicFlags( | 798 Code::Flags flags = Code::ComputeMonomorphicFlags( |
| 828 kind, extra_state, Code::NORMAL, argc, cache_holder); | 799 kind, extra_state, Code::NORMAL, argc); |
| 829 Handle<Object> probe(stub_holder->map()->FindInCodeCache(*name, flags), | 800 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), |
| 830 isolate_); | 801 isolate_); |
| 831 if (probe->IsCode()) return Handle<Code>::cast(probe); | 802 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 832 | 803 |
| 833 CallStubCompiler compiler(isolate(), argc, kind, extra_state, cache_holder); | 804 CallStubCompiler compiler(isolate(), argc, kind, extra_state); |
| 834 Handle<Code> code = | 805 Handle<Code> code = |
| 835 compiler.CompileCallGlobal(receiver, holder, cell, function, name); | 806 compiler.CompileCallGlobal(receiver, holder, cell, function, name); |
| 836 ASSERT(flags == code->flags()); | 807 ASSERT(flags == code->flags()); |
| 837 PROFILE(isolate(), | 808 PROFILE(isolate(), |
| 838 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name)); | 809 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name)); |
| 839 GDBJIT(AddCode(GDBJITInterface::CALL_IC, *name, *code)); | 810 GDBJIT(AddCode(GDBJITInterface::CALL_IC, *name, *code)); |
| 840 if (CallStubCompiler::CanBeCached(function)) { | 811 if (CallStubCompiler::CanBeCached(function)) { |
| 841 HeapObject::UpdateMapCodeCache(stub_holder, name, code); | 812 HeapObject::UpdateMapCodeCache(receiver, name, code); |
| 842 } | 813 } |
| 843 return code; | 814 return code; |
| 844 } | 815 } |
| 845 | 816 |
| 846 | 817 |
| 847 static void FillCache(Isolate* isolate, Handle<Code> code) { | 818 static void FillCache(Isolate* isolate, Handle<Code> code) { |
| 848 Handle<UnseededNumberDictionary> dictionary = | 819 Handle<UnseededNumberDictionary> dictionary = |
| 849 UnseededNumberDictionary::Set(isolate->factory()->non_monomorphic_cache(), | 820 UnseededNumberDictionary::Set(isolate->factory()->non_monomorphic_cache(), |
| 850 code->flags(), | 821 code->flags(), |
| 851 code); | 822 code); |
| (...skipping 1345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2197 Handle<FunctionTemplateInfo>( | 2168 Handle<FunctionTemplateInfo>( |
| 2198 FunctionTemplateInfo::cast(signature->receiver())); | 2169 FunctionTemplateInfo::cast(signature->receiver())); |
| 2199 } | 2170 } |
| 2200 } | 2171 } |
| 2201 | 2172 |
| 2202 is_simple_api_call_ = true; | 2173 is_simple_api_call_ = true; |
| 2203 } | 2174 } |
| 2204 | 2175 |
| 2205 | 2176 |
| 2206 } } // namespace v8::internal | 2177 } } // namespace v8::internal |
| OLD | NEW |