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

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

Issue 145773008: A64: Synchronize with r17104. (Closed) Base URL: https://v8.googlecode.com/svn/branches/experimental/a64
Patch Set: Created 6 years, 10 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/type-info.h » ('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 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
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,
115 Code::ExtraICState extra_state) { 105 Code::ExtraICState extra_state) {
116 Code::Flags flags = Code::ComputeMonomorphicFlags(kind, extra_state, type); 106 Code::Flags flags = Code::ComputeMonomorphicFlags(kind, extra_state);
117 Handle<Object> probe(stub_holder_map->FindInCodeCache(*name, flags), 107 Handle<Object> probe(stub_holder_map->FindInCodeCache(*name, flags),
118 isolate_); 108 isolate_);
119 if (probe->IsCode()) return Handle<Code>::cast(probe); 109 if (probe->IsCode()) return Handle<Code>::cast(probe);
120 return Handle<Code>::null(); 110 return Handle<Code>::null();
121 } 111 }
122 112
123 113
124 Handle<Code> StubCache::FindIC(Handle<Name> name, 114 Handle<Code> StubCache::FindIC(Handle<Name> name,
125 Handle<JSObject> stub_holder, 115 Handle<JSObject> stub_holder,
126 Code::Kind kind, 116 Code::Kind kind,
127 Code::StubType type,
128 Code::ExtraICState extra_ic_state) { 117 Code::ExtraICState extra_ic_state) {
129 return FindIC(name, Handle<Map>(stub_holder->map()), kind, 118 return FindIC(name, Handle<Map>(stub_holder->map()), kind, extra_ic_state);
130 type, extra_ic_state);
131 } 119 }
132 120
133 121
134 Handle<Code> StubCache::FindLoadHandler(Handle<Name> name, 122 Handle<Code> StubCache::FindLoadHandler(Handle<Name> name,
135 Handle<JSObject> receiver, 123 Handle<JSObject> receiver,
136 Handle<JSObject> stub_holder, 124 Code::Kind kind) {
137 Code::Kind kind,
138 Code::StubType type) {
139 InlineCacheHolderFlag holder_flag = receiver.is_identical_to(stub_holder)
140 ? OWN_MAP : PROTOTYPE_MAP;
141 ASSERT(type != Code::NORMAL);
142 Code::Flags flags = Code::ComputeMonomorphicFlags( 125 Code::Flags flags = Code::ComputeMonomorphicFlags(
143 Code::STUB, Code::kNoExtraICState, type, kind, holder_flag); 126 Code::HANDLER, Code::kNoExtraICState, Code::NORMAL, kind);
144 Handle<Object> probe(stub_holder->map()->FindInCodeCache(*name, flags), 127 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags),
145 isolate_); 128 isolate_);
146 if (probe->IsCode()) return Handle<Code>::cast(probe); 129 if (probe->IsCode()) return Handle<Code>::cast(probe);
147 return Handle<Code>::null(); 130 return Handle<Code>::null();
148 } 131 }
149 132
150 133
151 Handle<Code> StubCache::FindStoreHandler(Handle<Name> name, 134 Handle<Code> StubCache::FindStoreHandler(Handle<Name> name,
152 Handle<JSObject> receiver, 135 Handle<JSObject> receiver,
153 Code::Kind kind, 136 Code::Kind kind,
154 Code::StubType type,
155 StrictModeFlag strict_mode) { 137 StrictModeFlag strict_mode) {
156 Code::ExtraICState extra_ic_state = Code::ComputeExtraICState( 138 Code::ExtraICState extra_ic_state = Code::ComputeExtraICState(
157 STANDARD_STORE, strict_mode); 139 STANDARD_STORE, strict_mode);
158 ASSERT(type != Code::NORMAL);
159 Code::Flags flags = Code::ComputeMonomorphicFlags( 140 Code::Flags flags = Code::ComputeMonomorphicFlags(
160 Code::STUB, extra_ic_state, type, kind); 141 Code::HANDLER, extra_ic_state, Code::NORMAL, kind);
161 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), 142 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags),
162 isolate_); 143 isolate_);
163 if (probe->IsCode()) return Handle<Code>::cast(probe); 144 if (probe->IsCode()) return Handle<Code>::cast(probe);
164 return Handle<Code>::null(); 145 return Handle<Code>::null();
165 } 146 }
166 147
167 148
168 Handle<Code> StubCache::ComputeMonomorphicLoadIC(Handle<HeapObject> receiver, 149 Handle<Code> StubCache::ComputeMonomorphicIC(Handle<HeapObject> receiver,
169 Handle<Code> handler, 150 Handle<Code> handler,
170 Handle<Name> name) { 151 Handle<Name> name,
152 StrictModeFlag strict_mode) {
153 Code::Kind kind = handler->handler_kind();
171 Handle<Map> map(receiver->map()); 154 Handle<Map> map(receiver->map());
172 Handle<Code> ic = FindIC(name, map, Code::LOAD_IC, handler->type()); 155 Handle<Code> ic = FindIC(name, map, kind, strict_mode);
173 if (!ic.is_null()) return ic; 156 if (!ic.is_null()) return ic;
174 157
175 LoadStubCompiler ic_compiler(isolate()); 158 if (kind == Code::LOAD_IC) {
176 ic = ic_compiler.CompileMonomorphicIC(map, handler, name); 159 LoadStubCompiler ic_compiler(isolate());
160 ic = ic_compiler.CompileMonomorphicIC(map, handler, name);
161 } else if (kind == Code::KEYED_LOAD_IC) {
162 KeyedLoadStubCompiler ic_compiler(isolate());
163 ic = ic_compiler.CompileMonomorphicIC(map, handler, name);
164 } else if (kind == Code::STORE_IC) {
165 StoreStubCompiler ic_compiler(isolate(), strict_mode);
166 ic = ic_compiler.CompileMonomorphicIC(map, handler, name);
167 } else {
168 ASSERT(kind == Code::KEYED_STORE_IC);
169 KeyedStoreStubCompiler ic_compiler(isolate(), strict_mode, STANDARD_STORE);
170 ic = ic_compiler.CompileMonomorphicIC(map, handler, name);
171 }
177 172
178 HeapObject::UpdateMapCodeCache(receiver, name, ic); 173 HeapObject::UpdateMapCodeCache(receiver, name, ic);
179 return ic; 174 return ic;
180 }
181
182
183 Handle<Code> StubCache::ComputeMonomorphicKeyedLoadIC(
184 Handle<HeapObject> receiver,
185 Handle<Code> handler,
186 Handle<Name> name) {
187 Handle<Map> map(receiver->map());
188 Handle<Code> ic = FindIC(name, map, Code::KEYED_LOAD_IC, handler->type());
189 if (!ic.is_null()) return ic;
190
191 KeyedLoadStubCompiler ic_compiler(isolate());
192 ic = ic_compiler.CompileMonomorphicIC(map, handler, name);
193
194 HeapObject::UpdateMapCodeCache(receiver, name, ic);
195 return ic;
196 }
197
198
199 Handle<Code> StubCache::ComputeMonomorphicStoreIC(Handle<HeapObject> receiver,
200 Handle<Code> handler,
201 Handle<Name> name,
202 StrictModeFlag strict_mode) {
203 Handle<Map> map(receiver->map());
204 Handle<Code> ic = FindIC(
205 name, map, Code::STORE_IC, handler->type(), strict_mode);
206 if (!ic.is_null()) return ic;
207
208 StoreStubCompiler ic_compiler(isolate(), strict_mode);
209 ic = ic_compiler.CompileMonomorphicIC(map, handler, name);
210
211 HeapObject::UpdateMapCodeCache(receiver, name, ic);
212 return ic;
213 }
214
215
216 Handle<Code> StubCache::ComputeMonomorphicKeyedStoreIC(
217 Handle<HeapObject> receiver,
218 Handle<Code> handler,
219 Handle<Name> name,
220 StrictModeFlag strict_mode) {
221 Handle<Map> map(receiver->map());
222 Handle<Code> ic = FindIC(
223 name, map, Code::KEYED_STORE_IC, handler->type(), strict_mode);
224 if (!ic.is_null()) return ic;
225
226 KeyedStoreStubCompiler ic_compiler(isolate(), strict_mode, STANDARD_STORE);
227 ic = ic_compiler.CompileMonomorphicIC(map, handler, name);
228
229 HeapObject::UpdateMapCodeCache(receiver, name, ic);
230 return ic;
231 } 175 }
232 176
233 177
234 Handle<Code> StubCache::ComputeLoadNonexistent(Handle<Name> name, 178 Handle<Code> StubCache::ComputeLoadNonexistent(Handle<Name> name,
235 Handle<JSObject> receiver) { 179 Handle<JSObject> receiver) {
236 // If no global objects are present in the prototype chain, the load 180 // If no global objects are present in the prototype chain, the load
237 // nonexistent IC stub can be shared for all names for a given map 181 // nonexistent IC stub can be shared for all names for a given map
238 // and we use the empty string for the map cache in that case. If 182 // and we use the empty string for the map cache in that case. If
239 // there are global objects involved, we need to check global 183 // there are global objects involved, we need to check global
240 // property cells in the stub and therefore the stub will be 184 // property cells in the stub and therefore the stub will be
241 // specific to the name. 185 // specific to the name.
242 Handle<Name> cache_name = factory()->empty_string(); 186 Handle<Name> cache_name = factory()->empty_string();
243 Handle<JSObject> current; 187 Handle<JSObject> current;
244 Handle<Object> next = receiver; 188 Handle<Object> next = receiver;
245 Handle<GlobalObject> global; 189 Handle<GlobalObject> global;
246 do { 190 do {
247 current = Handle<JSObject>::cast(next); 191 current = Handle<JSObject>::cast(next);
248 next = Handle<Object>(current->GetPrototype(), isolate_); 192 next = Handle<Object>(current->GetPrototype(), isolate_);
249 if (current->IsGlobalObject()) { 193 if (current->IsGlobalObject()) {
250 global = Handle<GlobalObject>::cast(current); 194 global = Handle<GlobalObject>::cast(current);
251 cache_name = name; 195 cache_name = name;
252 } else if (!current->HasFastProperties()) { 196 } else if (!current->HasFastProperties()) {
253 cache_name = name; 197 cache_name = name;
254 } 198 }
255 } while (!next->IsNull()); 199 } while (!next->IsNull());
256 200
257 // Compile the stub that is either shared for all names or 201 // Compile the stub that is either shared for all names or
258 // name specific if there are global objects involved. 202 // name specific if there are global objects involved.
259 Handle<Code> handler = FindLoadHandler( 203 Handle<Code> handler = FindLoadHandler(cache_name, receiver, Code::LOAD_IC);
260 cache_name, receiver, receiver, Code::LOAD_IC, Code::NONEXISTENT);
261 if (!handler.is_null()) return handler; 204 if (!handler.is_null()) return handler;
262 205
263 LoadStubCompiler compiler(isolate_); 206 LoadStubCompiler compiler(isolate_);
264 handler = 207 handler =
265 compiler.CompileLoadNonexistent(receiver, current, cache_name, global); 208 compiler.CompileLoadNonexistent(receiver, current, cache_name, global);
266 HeapObject::UpdateMapCodeCache(receiver, cache_name, handler); 209 HeapObject::UpdateMapCodeCache(receiver, cache_name, handler);
267 return handler; 210 return handler;
268 } 211 }
269 212
270 213
271 Handle<Code> StubCache::ComputeLoadField(Handle<Name> name, 214 Handle<Code> StubCache::ComputeLoadField(Handle<Name> name,
272 Handle<JSObject> receiver, 215 Handle<JSObject> receiver,
273 Handle<JSObject> holder, 216 Handle<JSObject> holder,
274 PropertyIndex field, 217 PropertyIndex field,
275 Representation representation) { 218 Representation representation) {
276 if (receiver.is_identical_to(holder)) { 219 if (receiver.is_identical_to(holder)) {
277 LoadFieldStub stub(field.is_inobject(holder), 220 LoadFieldStub stub(field.is_inobject(holder),
278 field.translate(holder), 221 field.translate(holder),
279 representation); 222 representation);
280 return stub.GetCode(isolate()); 223 return stub.GetCode(isolate());
281 } 224 }
282 225
283 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 226 Handle<Code> stub = FindLoadHandler(name, receiver, Code::LOAD_IC);
284 Handle<Code> stub = FindLoadHandler(
285 name, receiver, stub_holder, Code::LOAD_IC, Code::FIELD);
286 if (!stub.is_null()) return stub; 227 if (!stub.is_null()) return stub;
287 228
288 LoadStubCompiler compiler(isolate_); 229 LoadStubCompiler compiler(isolate_);
289 Handle<Code> handler = 230 Handle<Code> handler =
290 compiler.CompileLoadField(receiver, holder, name, field, representation); 231 compiler.CompileLoadField(receiver, holder, name, field, representation);
291 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); 232 HeapObject::UpdateMapCodeCache(receiver, name, handler);
292 return handler; 233 return handler;
293 } 234 }
294 235
295 236
296 Handle<Code> StubCache::ComputeLoadCallback( 237 Handle<Code> StubCache::ComputeLoadCallback(
297 Handle<Name> name, 238 Handle<Name> name,
298 Handle<JSObject> receiver, 239 Handle<JSObject> receiver,
299 Handle<JSObject> holder, 240 Handle<JSObject> holder,
300 Handle<ExecutableAccessorInfo> callback) { 241 Handle<ExecutableAccessorInfo> callback) {
301 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); 242 ASSERT(v8::ToCData<Address>(callback->getter()) != 0);
302 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 243 Handle<Code> stub = FindLoadHandler(name, receiver, Code::LOAD_IC);
303 Handle<Code> stub = FindLoadHandler(
304 name, receiver, stub_holder, Code::LOAD_IC, Code::CALLBACKS);
305 if (!stub.is_null()) return stub; 244 if (!stub.is_null()) return stub;
306 245
307 LoadStubCompiler compiler(isolate_); 246 LoadStubCompiler compiler(isolate_);
308 Handle<Code> handler = 247 Handle<Code> handler =
309 compiler.CompileLoadCallback(receiver, holder, name, callback); 248 compiler.CompileLoadCallback(receiver, holder, name, callback);
310 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); 249 HeapObject::UpdateMapCodeCache(receiver, name, handler);
311 return handler; 250 return handler;
312 } 251 }
313 252
314 253
315 Handle<Code> StubCache::ComputeLoadCallback( 254 Handle<Code> StubCache::ComputeLoadCallback(
316 Handle<Name> name, 255 Handle<Name> name,
317 Handle<JSObject> receiver, 256 Handle<JSObject> receiver,
318 Handle<JSObject> holder, 257 Handle<JSObject> holder,
319 const CallOptimization& call_optimization) { 258 const CallOptimization& call_optimization) {
320 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 259 Handle<Code> stub = FindLoadHandler(name, receiver, Code::LOAD_IC);
321 Handle<Code> stub = FindLoadHandler(
322 name, receiver, stub_holder, Code::LOAD_IC, Code::CALLBACKS);
323 if (!stub.is_null()) return stub; 260 if (!stub.is_null()) return stub;
324 261
325 LoadStubCompiler compiler(isolate_); 262 LoadStubCompiler compiler(isolate_);
326 Handle<Code> handler = 263 Handle<Code> handler =
327 compiler.CompileLoadCallback(receiver, holder, name, call_optimization); 264 compiler.CompileLoadCallback(receiver, holder, name, call_optimization);
328 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); 265 HeapObject::UpdateMapCodeCache(receiver, name, handler);
329 return handler; 266 return handler;
330 } 267 }
331 268
332 269
333 Handle<Code> StubCache::ComputeLoadViaGetter(Handle<Name> name, 270 Handle<Code> StubCache::ComputeLoadViaGetter(Handle<Name> name,
334 Handle<JSObject> receiver, 271 Handle<JSObject> receiver,
335 Handle<JSObject> holder, 272 Handle<JSObject> holder,
336 Handle<JSFunction> getter) { 273 Handle<JSFunction> getter) {
337 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 274 Handle<Code> stub = FindLoadHandler(name, receiver, Code::LOAD_IC);
338 Handle<Code> stub = FindLoadHandler(
339 name, receiver, stub_holder, Code::LOAD_IC, Code::CALLBACKS);
340 if (!stub.is_null()) return stub; 275 if (!stub.is_null()) return stub;
341 276
342 LoadStubCompiler compiler(isolate_); 277 LoadStubCompiler compiler(isolate_);
343 Handle<Code> handler = 278 Handle<Code> handler =
344 compiler.CompileLoadViaGetter(receiver, holder, name, getter); 279 compiler.CompileLoadViaGetter(receiver, holder, name, getter);
345 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); 280 HeapObject::UpdateMapCodeCache(receiver, name, handler);
346 return handler; 281 return handler;
347 } 282 }
348 283
349 284
350 Handle<Code> StubCache::ComputeLoadConstant(Handle<Name> name, 285 Handle<Code> StubCache::ComputeLoadConstant(Handle<Name> name,
351 Handle<JSObject> receiver, 286 Handle<JSObject> receiver,
352 Handle<JSObject> holder, 287 Handle<JSObject> holder,
353 Handle<Object> value) { 288 Handle<Object> value) {
354 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 289 Handle<Code> handler = FindLoadHandler(name, receiver, Code::LOAD_IC);
355 Handle<Code> handler = FindLoadHandler(
356 name, receiver, stub_holder, Code::LOAD_IC, Code::CONSTANT);
357 if (!handler.is_null()) return handler; 290 if (!handler.is_null()) return handler;
358 291
359 LoadStubCompiler compiler(isolate_); 292 LoadStubCompiler compiler(isolate_);
360 handler = compiler.CompileLoadConstant(receiver, holder, name, value); 293 handler = compiler.CompileLoadConstant(receiver, holder, name, value);
361 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); 294 HeapObject::UpdateMapCodeCache(receiver, name, handler);
362 295
363 return handler; 296 return handler;
364 } 297 }
365 298
366 299
367 Handle<Code> StubCache::ComputeLoadInterceptor(Handle<Name> name, 300 Handle<Code> StubCache::ComputeLoadInterceptor(Handle<Name> name,
368 Handle<JSObject> receiver, 301 Handle<JSObject> receiver,
369 Handle<JSObject> holder) { 302 Handle<JSObject> holder) {
370 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 303 Handle<Code> stub = FindLoadHandler(name, receiver, Code::LOAD_IC);
371 Handle<Code> stub = FindLoadHandler(
372 name, receiver, stub_holder, Code::LOAD_IC, Code::INTERCEPTOR);
373 if (!stub.is_null()) return stub; 304 if (!stub.is_null()) return stub;
374 305
375 LoadStubCompiler compiler(isolate_); 306 LoadStubCompiler compiler(isolate_);
376 Handle<Code> handler = 307 Handle<Code> handler =
377 compiler.CompileLoadInterceptor(receiver, holder, name); 308 compiler.CompileLoadInterceptor(receiver, holder, name);
378 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); 309 HeapObject::UpdateMapCodeCache(receiver, name, handler);
379 return handler; 310 return handler;
380 } 311 }
381 312
382 313
383 Handle<Code> StubCache::ComputeLoadNormal(Handle<Name> name, 314 Handle<Code> StubCache::ComputeLoadNormal(Handle<Name> name,
384 Handle<JSObject> receiver) { 315 Handle<JSObject> receiver) {
385 return isolate_->builtins()->LoadIC_Normal(); 316 return isolate_->builtins()->LoadIC_Normal();
386 } 317 }
387 318
388 319
389 Handle<Code> StubCache::ComputeLoadGlobal(Handle<Name> name, 320 Handle<Code> StubCache::ComputeLoadGlobal(Handle<Name> name,
390 Handle<JSObject> receiver, 321 Handle<JSObject> receiver,
391 Handle<GlobalObject> holder, 322 Handle<GlobalObject> holder,
392 Handle<PropertyCell> cell, 323 Handle<PropertyCell> cell,
393 bool is_dont_delete) { 324 bool is_dont_delete) {
394 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 325 Handle<Code> stub = FindIC(name, receiver, Code::LOAD_IC);
395 Handle<Code> stub = FindIC(name, stub_holder, Code::LOAD_IC, Code::NORMAL);
396 if (!stub.is_null()) return stub; 326 if (!stub.is_null()) return stub;
397 327
398 LoadStubCompiler compiler(isolate_); 328 LoadStubCompiler compiler(isolate_);
399 Handle<Code> ic = 329 Handle<Code> ic =
400 compiler.CompileLoadGlobal(receiver, holder, cell, name, is_dont_delete); 330 compiler.CompileLoadGlobal(receiver, holder, cell, name, is_dont_delete);
401 HeapObject::UpdateMapCodeCache(stub_holder, name, ic); 331 HeapObject::UpdateMapCodeCache(receiver, name, ic);
402 return ic; 332 return ic;
403 } 333 }
404 334
405 335
406 Handle<Code> StubCache::ComputeKeyedLoadField(Handle<Name> name, 336 Handle<Code> StubCache::ComputeKeyedLoadField(Handle<Name> name,
407 Handle<JSObject> receiver, 337 Handle<JSObject> receiver,
408 Handle<JSObject> holder, 338 Handle<JSObject> holder,
409 PropertyIndex field, 339 PropertyIndex field,
410 Representation representation) { 340 Representation representation) {
411 if (receiver.is_identical_to(holder)) { 341 if (receiver.is_identical_to(holder)) {
412 // TODO(titzer): this should use an HObjectAccess 342 // TODO(titzer): this should use an HObjectAccess
413 KeyedLoadFieldStub stub(field.is_inobject(holder), 343 KeyedLoadFieldStub stub(field.is_inobject(holder),
414 field.translate(holder), 344 field.translate(holder),
415 representation); 345 representation);
416 return stub.GetCode(isolate()); 346 return stub.GetCode(isolate());
417 } 347 }
418 348
419 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 349 Handle<Code> stub = FindLoadHandler(name, receiver, Code::KEYED_LOAD_IC);
420 Handle<Code> stub = FindLoadHandler(
421 name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::FIELD);
422 if (!stub.is_null()) return stub; 350 if (!stub.is_null()) return stub;
423 351
424 KeyedLoadStubCompiler compiler(isolate_); 352 KeyedLoadStubCompiler compiler(isolate_);
425 Handle<Code> handler = 353 Handle<Code> handler =
426 compiler.CompileLoadField(receiver, holder, name, field, representation); 354 compiler.CompileLoadField(receiver, holder, name, field, representation);
427 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); 355 HeapObject::UpdateMapCodeCache(receiver, name, handler);
428 return handler; 356 return handler;
429 } 357 }
430 358
431 359
432 Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<Name> name, 360 Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<Name> name,
433 Handle<JSObject> receiver, 361 Handle<JSObject> receiver,
434 Handle<JSObject> holder, 362 Handle<JSObject> holder,
435 Handle<Object> value) { 363 Handle<Object> value) {
436 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 364 Handle<Code> handler = FindLoadHandler(name, receiver, Code::KEYED_LOAD_IC);
437 Handle<Code> handler = FindLoadHandler(
438 name, receiver, stub_holder, Code::KEYED_LOAD_IC,
439 Code::CONSTANT);
440 if (!handler.is_null()) return handler; 365 if (!handler.is_null()) return handler;
441 366
442 KeyedLoadStubCompiler compiler(isolate_); 367 KeyedLoadStubCompiler compiler(isolate_);
443 handler = compiler.CompileLoadConstant(receiver, holder, name, value); 368 handler = compiler.CompileLoadConstant(receiver, holder, name, value);
444 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); 369 HeapObject::UpdateMapCodeCache(receiver, name, handler);
445 return handler; 370 return handler;
446 } 371 }
447 372
448 373
449 Handle<Code> StubCache::ComputeKeyedLoadInterceptor(Handle<Name> name, 374 Handle<Code> StubCache::ComputeKeyedLoadInterceptor(Handle<Name> name,
450 Handle<JSObject> receiver, 375 Handle<JSObject> receiver,
451 Handle<JSObject> holder) { 376 Handle<JSObject> holder) {
452 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 377 Handle<Code> stub = FindLoadHandler(name, receiver, Code::KEYED_LOAD_IC);
453 Handle<Code> stub = FindLoadHandler(
454 name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::INTERCEPTOR);
455 if (!stub.is_null()) return stub; 378 if (!stub.is_null()) return stub;
456 379
457 KeyedLoadStubCompiler compiler(isolate_); 380 KeyedLoadStubCompiler compiler(isolate_);
458 Handle<Code> handler = 381 Handle<Code> handler =
459 compiler.CompileLoadInterceptor(receiver, holder, name); 382 compiler.CompileLoadInterceptor(receiver, holder, name);
460 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); 383 HeapObject::UpdateMapCodeCache(receiver, name, handler);
461 return handler; 384 return handler;
462 } 385 }
463 386
464 387
465 Handle<Code> StubCache::ComputeKeyedLoadCallback( 388 Handle<Code> StubCache::ComputeKeyedLoadCallback(
466 Handle<Name> name, 389 Handle<Name> name,
467 Handle<JSObject> receiver, 390 Handle<JSObject> receiver,
468 Handle<JSObject> holder, 391 Handle<JSObject> holder,
469 Handle<ExecutableAccessorInfo> callback) { 392 Handle<ExecutableAccessorInfo> callback) {
470 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 393 Handle<Code> stub = FindLoadHandler(name, receiver, Code::KEYED_LOAD_IC);
471 Handle<Code> stub = FindLoadHandler(
472 name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::CALLBACKS);
473 if (!stub.is_null()) return stub; 394 if (!stub.is_null()) return stub;
474 395
475 KeyedLoadStubCompiler compiler(isolate_); 396 KeyedLoadStubCompiler compiler(isolate_);
476 Handle<Code> handler = 397 Handle<Code> handler =
477 compiler.CompileLoadCallback(receiver, holder, name, callback); 398 compiler.CompileLoadCallback(receiver, holder, name, callback);
478 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); 399 HeapObject::UpdateMapCodeCache(receiver, name, handler);
479 return handler; 400 return handler;
480 } 401 }
481 402
482 403
483 Handle<Code> StubCache::ComputeKeyedLoadCallback( 404 Handle<Code> StubCache::ComputeKeyedLoadCallback(
484 Handle<Name> name, 405 Handle<Name> name,
485 Handle<JSObject> receiver, 406 Handle<JSObject> receiver,
486 Handle<JSObject> holder, 407 Handle<JSObject> holder,
487 const CallOptimization& call_optimization) { 408 const CallOptimization& call_optimization) {
488 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 409 Handle<Code> stub = FindLoadHandler(name, receiver, Code::KEYED_LOAD_IC);
489 Handle<Code> stub = FindLoadHandler(
490 name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::CALLBACKS);
491 if (!stub.is_null()) return stub; 410 if (!stub.is_null()) return stub;
492 411
493 KeyedLoadStubCompiler compiler(isolate_); 412 KeyedLoadStubCompiler compiler(isolate_);
494 Handle<Code> handler = 413 Handle<Code> handler =
495 compiler.CompileLoadCallback(receiver, holder, name, call_optimization); 414 compiler.CompileLoadCallback(receiver, holder, name, call_optimization);
496 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); 415 HeapObject::UpdateMapCodeCache(receiver, name, handler);
497 return handler; 416 return handler;
498 } 417 }
499 418
500 419
501 Handle<Code> StubCache::ComputeStoreField(Handle<Name> name, 420 Handle<Code> StubCache::ComputeStoreField(Handle<Name> name,
502 Handle<JSObject> receiver, 421 Handle<JSObject> receiver,
503 LookupResult* lookup, 422 LookupResult* lookup,
504 StrictModeFlag strict_mode) { 423 StrictModeFlag strict_mode) {
505 Handle<Code> stub = FindStoreHandler( 424 Handle<Code> stub = FindStoreHandler(
506 name, receiver, Code::STORE_IC, Code::FIELD, strict_mode); 425 name, receiver, Code::STORE_IC, strict_mode);
507 if (!stub.is_null()) return stub; 426 if (!stub.is_null()) return stub;
508 427
509 StoreStubCompiler compiler(isolate_, strict_mode); 428 StoreStubCompiler compiler(isolate_, strict_mode);
510 Handle<Code> handler = compiler.CompileStoreField(receiver, lookup, name); 429 Handle<Code> handler = compiler.CompileStoreField(receiver, lookup, name);
511 HeapObject::UpdateMapCodeCache(receiver, name, handler); 430 HeapObject::UpdateMapCodeCache(receiver, name, handler);
512 return handler; 431 return handler;
513 } 432 }
514 433
515 434
516 Handle<Code> StubCache::ComputeStoreTransition(Handle<Name> name, 435 Handle<Code> StubCache::ComputeStoreTransition(Handle<Name> name,
517 Handle<JSObject> receiver, 436 Handle<JSObject> receiver,
518 LookupResult* lookup, 437 LookupResult* lookup,
519 Handle<Map> transition, 438 Handle<Map> transition,
520 StrictModeFlag strict_mode) { 439 StrictModeFlag strict_mode) {
521 Handle<Code> stub = FindStoreHandler( 440 Handle<Code> stub = FindStoreHandler(
522 name, receiver, Code::STORE_IC, Code::TRANSITION, strict_mode); 441 name, receiver, Code::STORE_IC, strict_mode);
523 if (!stub.is_null()) return stub; 442 if (!stub.is_null()) return stub;
524 443
525 StoreStubCompiler compiler(isolate_, strict_mode); 444 StoreStubCompiler compiler(isolate_, strict_mode);
526 Handle<Code> handler = 445 Handle<Code> handler =
527 compiler.CompileStoreTransition(receiver, lookup, transition, name); 446 compiler.CompileStoreTransition(receiver, lookup, transition, name);
528 HeapObject::UpdateMapCodeCache(receiver, name, handler); 447 HeapObject::UpdateMapCodeCache(receiver, name, handler);
529 return handler; 448 return handler;
530 } 449 }
531 450
532 451
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
586 Handle<PropertyCell> cell, 505 Handle<PropertyCell> cell,
587 Handle<Object> value, 506 Handle<Object> value,
588 StrictModeFlag strict_mode) { 507 StrictModeFlag strict_mode) {
589 Isolate* isolate = cell->GetIsolate(); 508 Isolate* isolate = cell->GetIsolate();
590 Handle<Type> union_type(PropertyCell::UpdateType(cell, value), isolate); 509 Handle<Type> union_type(PropertyCell::UpdateType(cell, value), isolate);
591 bool is_constant = union_type->IsConstant(); 510 bool is_constant = union_type->IsConstant();
592 StoreGlobalStub stub(strict_mode, is_constant); 511 StoreGlobalStub stub(strict_mode, is_constant);
593 512
594 Handle<Code> code = FindIC( 513 Handle<Code> code = FindIC(
595 name, Handle<JSObject>::cast(receiver), 514 name, Handle<JSObject>::cast(receiver),
596 Code::STORE_IC, Code::NORMAL, stub.GetExtraICState()); 515 Code::STORE_IC, stub.GetExtraICState());
597 if (!code.is_null()) return code; 516 if (!code.is_null()) return code;
598 517
599 // Replace the placeholder cell and global object map with the actual global 518 // Replace the placeholder cell and global object map with the actual global
600 // cell and receiver map. 519 // cell and receiver map.
601 Handle<Map> meta_map(isolate_->heap()->meta_map()); 520 Handle<Map> meta_map(isolate_->heap()->meta_map());
602 Handle<Object> receiver_map(receiver->map(), isolate_); 521 Handle<Object> receiver_map(receiver->map(), isolate_);
603 code = stub.GetCodeCopyFromTemplate(isolate_); 522 code = stub.GetCodeCopyFromTemplate(isolate_);
604 code->ReplaceNthObject(1, *meta_map, *receiver_map); 523 code->ReplaceNthObject(1, *meta_map, *receiver_map);
605 Handle<Map> cell_map(isolate_->heap()->global_property_cell_map()); 524 Handle<Map> cell_map(isolate_->heap()->global_property_cell_map());
606 code->ReplaceNthObject(1, *cell_map, *cell); 525 code->ReplaceNthObject(1, *cell_map, *cell);
607 526
608 HeapObject::UpdateMapCodeCache(receiver, name, code); 527 HeapObject::UpdateMapCodeCache(receiver, name, code);
609 528
610 return code; 529 return code;
611 } 530 }
612 531
613 532
614 Handle<Code> StubCache::ComputeStoreCallback( 533 Handle<Code> StubCache::ComputeStoreCallback(
615 Handle<Name> name, 534 Handle<Name> name,
616 Handle<JSObject> receiver, 535 Handle<JSObject> receiver,
617 Handle<JSObject> holder, 536 Handle<JSObject> holder,
618 Handle<ExecutableAccessorInfo> callback, 537 Handle<ExecutableAccessorInfo> callback,
619 StrictModeFlag strict_mode) { 538 StrictModeFlag strict_mode) {
620 ASSERT(v8::ToCData<Address>(callback->setter()) != 0); 539 ASSERT(v8::ToCData<Address>(callback->setter()) != 0);
621 Handle<Code> stub = FindStoreHandler( 540 Handle<Code> stub = FindStoreHandler(
622 name, receiver, Code::STORE_IC, Code::CALLBACKS, strict_mode); 541 name, receiver, Code::STORE_IC, strict_mode);
623 if (!stub.is_null()) return stub; 542 if (!stub.is_null()) return stub;
624 543
625 StoreStubCompiler compiler(isolate_, strict_mode); 544 StoreStubCompiler compiler(isolate_, strict_mode);
626 Handle<Code> handler = compiler.CompileStoreCallback( 545 Handle<Code> handler = compiler.CompileStoreCallback(
627 receiver, holder, name, callback); 546 receiver, holder, name, callback);
628 HeapObject::UpdateMapCodeCache(receiver, name, handler); 547 HeapObject::UpdateMapCodeCache(receiver, name, handler);
629 return handler; 548 return handler;
630 } 549 }
631 550
632 551
633 Handle<Code> StubCache::ComputeStoreCallback( 552 Handle<Code> StubCache::ComputeStoreCallback(
634 Handle<Name> name, 553 Handle<Name> name,
635 Handle<JSObject> receiver, 554 Handle<JSObject> receiver,
636 Handle<JSObject> holder, 555 Handle<JSObject> holder,
637 const CallOptimization& call_optimization, 556 const CallOptimization& call_optimization,
638 StrictModeFlag strict_mode) { 557 StrictModeFlag strict_mode) {
639 Handle<Code> stub = FindStoreHandler( 558 Handle<Code> stub = FindStoreHandler(
640 name, receiver, Code::STORE_IC, Code::CALLBACKS, strict_mode); 559 name, receiver, Code::STORE_IC, strict_mode);
641 if (!stub.is_null()) return stub; 560 if (!stub.is_null()) return stub;
642 561
643 StoreStubCompiler compiler(isolate_, strict_mode); 562 StoreStubCompiler compiler(isolate_, strict_mode);
644 Handle<Code> handler = compiler.CompileStoreCallback( 563 Handle<Code> handler = compiler.CompileStoreCallback(
645 receiver, holder, name, call_optimization); 564 receiver, holder, name, call_optimization);
646 HeapObject::UpdateMapCodeCache(receiver, name, handler); 565 HeapObject::UpdateMapCodeCache(receiver, name, handler);
647 return handler; 566 return handler;
648 } 567 }
649 568
650 569
651 Handle<Code> StubCache::ComputeStoreViaSetter(Handle<Name> name, 570 Handle<Code> StubCache::ComputeStoreViaSetter(Handle<Name> name,
652 Handle<JSObject> receiver, 571 Handle<JSObject> receiver,
653 Handle<JSObject> holder, 572 Handle<JSObject> holder,
654 Handle<JSFunction> setter, 573 Handle<JSFunction> setter,
655 StrictModeFlag strict_mode) { 574 StrictModeFlag strict_mode) {
656 Handle<Code> stub = FindStoreHandler( 575 Handle<Code> stub = FindStoreHandler(
657 name, receiver, Code::STORE_IC, Code::CALLBACKS, strict_mode); 576 name, receiver, Code::STORE_IC, strict_mode);
658 if (!stub.is_null()) return stub; 577 if (!stub.is_null()) return stub;
659 578
660 StoreStubCompiler compiler(isolate_, strict_mode); 579 StoreStubCompiler compiler(isolate_, strict_mode);
661 Handle<Code> handler = compiler.CompileStoreViaSetter( 580 Handle<Code> handler = compiler.CompileStoreViaSetter(
662 receiver, holder, name, setter); 581 receiver, holder, name, setter);
663 HeapObject::UpdateMapCodeCache(receiver, name, handler); 582 HeapObject::UpdateMapCodeCache(receiver, name, handler);
664 return handler; 583 return handler;
665 } 584 }
666 585
667 586
668 Handle<Code> StubCache::ComputeStoreInterceptor(Handle<Name> name, 587 Handle<Code> StubCache::ComputeStoreInterceptor(Handle<Name> name,
669 Handle<JSObject> receiver, 588 Handle<JSObject> receiver,
670 StrictModeFlag strict_mode) { 589 StrictModeFlag strict_mode) {
671 Handle<Code> stub = FindStoreHandler( 590 Handle<Code> stub = FindStoreHandler(
672 name, receiver, Code::STORE_IC, Code::INTERCEPTOR, strict_mode); 591 name, receiver, Code::STORE_IC, strict_mode);
673 if (!stub.is_null()) return stub; 592 if (!stub.is_null()) return stub;
674 593
675 StoreStubCompiler compiler(isolate_, strict_mode); 594 StoreStubCompiler compiler(isolate_, strict_mode);
676 Handle<Code> handler = compiler.CompileStoreInterceptor(receiver, name); 595 Handle<Code> handler = compiler.CompileStoreInterceptor(receiver, name);
677 HeapObject::UpdateMapCodeCache(receiver, name, handler); 596 HeapObject::UpdateMapCodeCache(receiver, name, handler);
678 return handler; 597 return handler;
679 } 598 }
680 599
681 600
682 Handle<Code> StubCache::ComputeKeyedStoreField(Handle<Name> name, 601 Handle<Code> StubCache::ComputeKeyedStoreField(Handle<Name> name,
683 Handle<JSObject> receiver, 602 Handle<JSObject> receiver,
684 LookupResult* lookup, 603 LookupResult* lookup,
685 StrictModeFlag strict_mode) { 604 StrictModeFlag strict_mode) {
686 Handle<Code> stub = FindStoreHandler( 605 Handle<Code> stub = FindStoreHandler(
687 name, receiver, Code::KEYED_STORE_IC, Code::FIELD, strict_mode); 606 name, receiver, Code::KEYED_STORE_IC, strict_mode);
688 if (!stub.is_null()) return stub; 607 if (!stub.is_null()) return stub;
689 608
690 KeyedStoreStubCompiler compiler(isolate(), strict_mode, STANDARD_STORE); 609 KeyedStoreStubCompiler compiler(isolate(), strict_mode, STANDARD_STORE);
691 Handle<Code> handler = compiler.CompileStoreField(receiver, lookup, name); 610 Handle<Code> handler = compiler.CompileStoreField(receiver, lookup, name);
692 HeapObject::UpdateMapCodeCache(receiver, name, handler); 611 HeapObject::UpdateMapCodeCache(receiver, name, handler);
693 return handler; 612 return handler;
694 } 613 }
695 614
696 615
697 Handle<Code> StubCache::ComputeKeyedStoreTransition( 616 Handle<Code> StubCache::ComputeKeyedStoreTransition(
698 Handle<Name> name, 617 Handle<Name> name,
699 Handle<JSObject> receiver, 618 Handle<JSObject> receiver,
700 LookupResult* lookup, 619 LookupResult* lookup,
701 Handle<Map> transition, 620 Handle<Map> transition,
702 StrictModeFlag strict_mode) { 621 StrictModeFlag strict_mode) {
703 Handle<Code> stub = FindStoreHandler( 622 Handle<Code> stub = FindStoreHandler(
704 name, receiver, Code::KEYED_STORE_IC, Code::TRANSITION, strict_mode); 623 name, receiver, Code::KEYED_STORE_IC, strict_mode);
705 if (!stub.is_null()) return stub; 624 if (!stub.is_null()) return stub;
706 625
707 KeyedStoreStubCompiler compiler(isolate(), strict_mode, STANDARD_STORE); 626 KeyedStoreStubCompiler compiler(isolate(), strict_mode, STANDARD_STORE);
708 Handle<Code> handler = 627 Handle<Code> handler =
709 compiler.CompileStoreTransition(receiver, lookup, transition, name); 628 compiler.CompileStoreTransition(receiver, lookup, transition, name);
710 HeapObject::UpdateMapCodeCache(receiver, name, handler); 629 HeapObject::UpdateMapCodeCache(receiver, name, handler);
711 return handler; 630 return handler;
712 } 631 }
713 632
714 633
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
850 769
851 770
852 Handle<Code> StubCache::ComputeCallGlobal(int argc, 771 Handle<Code> StubCache::ComputeCallGlobal(int argc,
853 Code::Kind kind, 772 Code::Kind kind,
854 Code::ExtraICState extra_state, 773 Code::ExtraICState extra_state,
855 Handle<Name> name, 774 Handle<Name> name,
856 Handle<JSObject> receiver, 775 Handle<JSObject> receiver,
857 Handle<GlobalObject> holder, 776 Handle<GlobalObject> holder,
858 Handle<PropertyCell> cell, 777 Handle<PropertyCell> cell,
859 Handle<JSFunction> function) { 778 Handle<JSFunction> function) {
860 InlineCacheHolderFlag cache_holder =
861 IC::GetCodeCacheForObject(*receiver, *holder);
862 Handle<JSObject> stub_holder(IC::GetCodeCacheHolder(
863 isolate_, *receiver, cache_holder));
864 Code::Flags flags = Code::ComputeMonomorphicFlags( 779 Code::Flags flags = Code::ComputeMonomorphicFlags(
865 kind, extra_state, Code::NORMAL, argc, cache_holder); 780 kind, extra_state, Code::NORMAL, argc);
866 Handle<Object> probe(stub_holder->map()->FindInCodeCache(*name, flags), 781 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags),
867 isolate_); 782 isolate_);
868 if (probe->IsCode()) return Handle<Code>::cast(probe); 783 if (probe->IsCode()) return Handle<Code>::cast(probe);
869 784
870 CallStubCompiler compiler(isolate(), argc, kind, extra_state, cache_holder); 785 CallStubCompiler compiler(isolate(), argc, kind, extra_state);
871 Handle<Code> code = 786 Handle<Code> code =
872 compiler.CompileCallGlobal(receiver, holder, cell, function, name); 787 compiler.CompileCallGlobal(receiver, holder, cell, function, name);
873 ASSERT(flags == code->flags()); 788 ASSERT(flags == code->flags());
874 PROFILE(isolate(), 789 PROFILE(isolate(),
875 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name)); 790 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name));
876 GDBJIT(AddCode(GDBJITInterface::CALL_IC, *name, *code)); 791 GDBJIT(AddCode(GDBJITInterface::CALL_IC, *name, *code));
877 if (CallStubCompiler::CanBeCached(function)) { 792 if (CallStubCompiler::CanBeCached(function)) {
878 HeapObject::UpdateMapCodeCache(stub_holder, name, code); 793 HeapObject::UpdateMapCodeCache(receiver, name, code);
879 } 794 }
880 return code; 795 return code;
881 } 796 }
882 797
883 798
884 static void FillCache(Isolate* isolate, Handle<Code> code) { 799 static void FillCache(Isolate* isolate, Handle<Code> code) {
885 Handle<UnseededNumberDictionary> dictionary = 800 Handle<UnseededNumberDictionary> dictionary =
886 UnseededNumberDictionary::Set(isolate->factory()->non_monomorphic_cache(), 801 UnseededNumberDictionary::Set(isolate->factory()->non_monomorphic_cache(),
887 code->flags(), 802 code->flags(),
888 code); 803 code);
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
1028 FillCache(isolate_, code); 943 FillCache(isolate_, code);
1029 return code; 944 return code;
1030 } 945 }
1031 946
1032 947
1033 Handle<Code> StubCache::ComputeCompareNil(Handle<Map> receiver_map, 948 Handle<Code> StubCache::ComputeCompareNil(Handle<Map> receiver_map,
1034 CompareNilICStub& stub) { 949 CompareNilICStub& stub) {
1035 Handle<String> name(isolate_->heap()->empty_string()); 950 Handle<String> name(isolate_->heap()->empty_string());
1036 if (!receiver_map->is_shared()) { 951 if (!receiver_map->is_shared()) {
1037 Handle<Code> cached_ic = FindIC(name, receiver_map, Code::COMPARE_NIL_IC, 952 Handle<Code> cached_ic = FindIC(name, receiver_map, Code::COMPARE_NIL_IC,
1038 Code::NORMAL, stub.GetExtraICState()); 953 stub.GetExtraICState());
1039 if (!cached_ic.is_null()) return cached_ic; 954 if (!cached_ic.is_null()) return cached_ic;
1040 } 955 }
1041 956
1042 Handle<Code> ic = stub.GetCodeCopyFromTemplate(isolate_); 957 Handle<Code> ic = stub.GetCodeCopyFromTemplate(isolate_);
1043 ic->ReplaceNthObject(1, isolate_->heap()->meta_map(), *receiver_map); 958 ic->ReplaceNthObject(1, isolate_->heap()->meta_map(), *receiver_map);
1044 959
1045 if (!receiver_map->is_shared()) { 960 if (!receiver_map->is_shared()) {
1046 Map::UpdateCodeCache(receiver_map, name, ic); 961 Map::UpdateCodeCache(receiver_map, name, ic);
1047 } 962 }
1048 963
(...skipping 16 matching lines...) Expand all
1065 receiver_maps, &handlers, factory()->empty_string(), 980 receiver_maps, &handlers, factory()->empty_string(),
1066 Code::NORMAL, ELEMENT); 981 Code::NORMAL, ELEMENT);
1067 982
1068 isolate()->counters()->keyed_load_polymorphic_stubs()->Increment(); 983 isolate()->counters()->keyed_load_polymorphic_stubs()->Increment();
1069 984
1070 PolymorphicCodeCache::Update(cache, receiver_maps, flags, code); 985 PolymorphicCodeCache::Update(cache, receiver_maps, flags, code);
1071 return code; 986 return code;
1072 } 987 }
1073 988
1074 989
1075 Handle<Code> StubCache::ComputePolymorphicLoadIC(MapHandleList* receiver_maps, 990 Handle<Code> StubCache::ComputePolymorphicIC(MapHandleList* receiver_maps,
1076 CodeHandleList* handlers, 991 CodeHandleList* handlers,
1077 int number_of_valid_maps, 992 int number_of_valid_maps,
1078 Handle<Name> name) { 993 Handle<Name> name,
1079 LoadStubCompiler ic_compiler(isolate_); 994 StrictModeFlag strict_mode) {
1080 Code::StubType type = number_of_valid_maps == 1 ? handlers->at(0)->type() 995 Handle<Code> handler = handlers->at(0);
996 Code::Kind kind = handler->handler_kind();
997 Code::StubType type = number_of_valid_maps == 1 ? handler->type()
1081 : Code::NORMAL; 998 : Code::NORMAL;
1082 Handle<Code> ic = ic_compiler.CompilePolymorphicIC( 999 if (kind == Code::LOAD_IC) {
1083 receiver_maps, handlers, name, type, PROPERTY); 1000 LoadStubCompiler ic_compiler(isolate_);
1084 return ic; 1001 return ic_compiler.CompilePolymorphicIC(
1002 receiver_maps, handlers, name, type, PROPERTY);
1003 } else {
1004 ASSERT(kind == Code::STORE_IC);
1005 StoreStubCompiler ic_compiler(isolate_, strict_mode);
1006 return ic_compiler.CompilePolymorphicIC(
1007 receiver_maps, handlers, name, type, PROPERTY);
1008 }
1085 } 1009 }
1086 1010
1087 1011
1088 Handle<Code> StubCache::ComputePolymorphicStoreIC(MapHandleList* receiver_maps,
1089 CodeHandleList* handlers,
1090 int number_of_valid_maps,
1091 Handle<Name> name,
1092 StrictModeFlag strict_mode) {
1093 StoreStubCompiler ic_compiler(isolate_, strict_mode);
1094 Code::StubType type = number_of_valid_maps == 1 ? handlers->at(0)->type()
1095 : Code::NORMAL;
1096 Handle<Code> ic = ic_compiler.CompilePolymorphicIC(
1097 receiver_maps, handlers, name, type, PROPERTY);
1098 return ic;
1099 }
1100
1101
1102 Handle<Code> StubCache::ComputeStoreElementPolymorphic( 1012 Handle<Code> StubCache::ComputeStoreElementPolymorphic(
1103 MapHandleList* receiver_maps, 1013 MapHandleList* receiver_maps,
1104 KeyedAccessStoreMode store_mode, 1014 KeyedAccessStoreMode store_mode,
1105 StrictModeFlag strict_mode) { 1015 StrictModeFlag strict_mode) {
1106 ASSERT(store_mode == STANDARD_STORE || 1016 ASSERT(store_mode == STANDARD_STORE ||
1107 store_mode == STORE_AND_GROW_NO_TRANSITION || 1017 store_mode == STORE_AND_GROW_NO_TRANSITION ||
1108 store_mode == STORE_NO_TRANSITION_IGNORE_OUT_OF_BOUNDS || 1018 store_mode == STORE_NO_TRANSITION_IGNORE_OUT_OF_BOUNDS ||
1109 store_mode == STORE_NO_TRANSITION_HANDLE_COW); 1019 store_mode == STORE_NO_TRANSITION_HANDLE_COW);
1110 Handle<PolymorphicCodeCache> cache = 1020 Handle<PolymorphicCodeCache> cache =
1111 isolate_->factory()->polymorphic_code_cache(); 1021 isolate_->factory()->polymorphic_code_cache();
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
1292 } 1202 }
1293 1203
1294 return isolate->heap()->no_interceptor_result_sentinel(); 1204 return isolate->heap()->no_interceptor_result_sentinel();
1295 } 1205 }
1296 1206
1297 1207
1298 static MaybeObject* ThrowReferenceError(Isolate* isolate, Name* name) { 1208 static MaybeObject* ThrowReferenceError(Isolate* isolate, Name* name) {
1299 // If the load is non-contextual, just return the undefined result. 1209 // If the load is non-contextual, just return the undefined result.
1300 // Note that both keyed and non-keyed loads may end up here, so we 1210 // Note that both keyed and non-keyed loads may end up here, so we
1301 // can't use either LoadIC or KeyedLoadIC constructors. 1211 // can't use either LoadIC or KeyedLoadIC constructors.
1212 HandleScope scope(isolate);
1302 IC ic(IC::NO_EXTRA_FRAME, isolate); 1213 IC ic(IC::NO_EXTRA_FRAME, isolate);
1303 ASSERT(ic.target()->is_load_stub() || ic.target()->is_keyed_load_stub()); 1214 ASSERT(ic.target()->is_load_stub() || ic.target()->is_keyed_load_stub());
1304 if (!ic.SlowIsUndeclaredGlobal()) return isolate->heap()->undefined_value(); 1215 if (!ic.SlowIsUndeclaredGlobal()) return isolate->heap()->undefined_value();
1305 1216
1306 // Throw a reference error. 1217 // Throw a reference error.
1307 HandleScope scope(isolate);
1308 Handle<Name> name_handle(name); 1218 Handle<Name> name_handle(name);
1309 Handle<Object> error = 1219 Handle<Object> error =
1310 isolate->factory()->NewReferenceError("not_defined", 1220 isolate->factory()->NewReferenceError("not_defined",
1311 HandleVector(&name_handle, 1)); 1221 HandleVector(&name_handle, 1));
1312 return isolate->Throw(*error); 1222 return isolate->Throw(*error);
1313 } 1223 }
1314 1224
1315 1225
1316 static MaybeObject* LoadWithInterceptor(Arguments* args, 1226 static MaybeObject* LoadWithInterceptor(Arguments* args,
1317 PropertyAttributes* attrs) { 1227 PropertyAttributes* attrs) {
(...skipping 648 matching lines...) Expand 10 before | Expand all | Expand 10 after
1966 1876
1967 void KeyedStoreStubCompiler::JitEvent(Handle<Name> name, Handle<Code> code) { 1877 void KeyedStoreStubCompiler::JitEvent(Handle<Name> name, Handle<Code> code) {
1968 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, *name, *code)); 1878 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, *name, *code));
1969 } 1879 }
1970 1880
1971 1881
1972 Handle<Code> BaseLoadStoreStubCompiler::GetICCode(Code::Kind kind, 1882 Handle<Code> BaseLoadStoreStubCompiler::GetICCode(Code::Kind kind,
1973 Code::StubType type, 1883 Code::StubType type,
1974 Handle<Name> name, 1884 Handle<Name> name,
1975 InlineCacheState state) { 1885 InlineCacheState state) {
1976 Code::Flags flags = Code::ComputeFlags( 1886 Code::Flags flags = Code::ComputeFlags(kind, state, extra_state(), type);
1977 kind, state, extra_state(), type);
1978 Handle<Code> code = GetCodeWithFlags(flags, name); 1887 Handle<Code> code = GetCodeWithFlags(flags, name);
1979 PROFILE(isolate(), CodeCreateEvent(log_kind(code), *code, *name)); 1888 PROFILE(isolate(), CodeCreateEvent(log_kind(code), *code, *name));
1980 JitEvent(name, code); 1889 JitEvent(name, code);
1981 return code; 1890 return code;
1982 } 1891 }
1983 1892
1984 1893
1985 Handle<Code> BaseLoadStubCompiler::GetCode(Code::Kind kind, 1894 Handle<Code> BaseLoadStoreStubCompiler::GetCode(Code::Kind kind,
1986 Code::StubType type, 1895 Code::StubType type,
1987 Handle<Name> name) { 1896 Handle<Name> name) {
1988 ASSERT(type != Code::NORMAL); 1897 ASSERT(type != Code::NORMAL);
1989 Code::Flags flags = Code::ComputeFlags( 1898 Code::Flags flags = Code::ComputeFlags(
1990 Code::STUB, MONOMORPHIC, Code::kNoExtraICState, type, kind); 1899 Code::HANDLER, MONOMORPHIC, extra_state(), type, kind);
1991 Handle<Code> code = GetCodeWithFlags(flags, name); 1900 Handle<Code> code = GetCodeWithFlags(flags, name);
1992 PROFILE(isolate(), CodeCreateEvent(log_kind(code), *code, *name)); 1901 PROFILE(isolate(), CodeCreateEvent(log_kind(code), *code, *name));
1993 JitEvent(name, code); 1902 JitEvent(name, code);
1994 return code;
1995 }
1996
1997
1998 Handle<Code> BaseStoreStubCompiler::GetCode(Code::Kind kind,
1999 Code::StubType type,
2000 Handle<Name> name) {
2001 ASSERT(type != Code::NORMAL);
2002 Code::Flags flags = Code::ComputeFlags(
2003 Code::STUB, MONOMORPHIC, extra_state(), type, kind);
2004 Handle<Code> code = GetCodeWithFlags(flags, name);
2005 PROFILE(isolate(), CodeCreateEvent(log_kind(code), *code, *name));
2006 JitEvent(name, code);
2007 return code; 1903 return code;
2008 } 1904 }
2009 1905
2010 1906
2011 void KeyedLoadStubCompiler::CompileElementHandlers(MapHandleList* receiver_maps, 1907 void KeyedLoadStubCompiler::CompileElementHandlers(MapHandleList* receiver_maps,
2012 CodeHandleList* handlers) { 1908 CodeHandleList* handlers) {
2013 for (int i = 0; i < receiver_maps->length(); ++i) { 1909 for (int i = 0; i < receiver_maps->length(); ++i) {
2014 Handle<Map> receiver_map = receiver_maps->at(i); 1910 Handle<Map> receiver_map = receiver_maps->at(i);
2015 Handle<Code> cached_stub; 1911 Handle<Code> cached_stub;
2016 1912
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
2253 Handle<FunctionTemplateInfo>( 2149 Handle<FunctionTemplateInfo>(
2254 FunctionTemplateInfo::cast(signature->receiver())); 2150 FunctionTemplateInfo::cast(signature->receiver()));
2255 } 2151 }
2256 } 2152 }
2257 2153
2258 is_simple_api_call_ = true; 2154 is_simple_api_call_ = true;
2259 } 2155 }
2260 2156
2261 2157
2262 } } // namespace v8::internal 2158 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/stub-cache.h ('k') | src/type-info.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698