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

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

Issue 12319144: Avoid TLS accesses in Object::Lookup and Object::GetPrototype. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Simplified Object::GetPrototype a bit Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/string-stream.cc ('k') | src/x64/stub-cache-x64.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
140 return code; 140 return code;
141 } 141 }
142 142
143 143
144 Handle<Code> StubCache::ComputeLoadField(Handle<String> name, 144 Handle<Code> StubCache::ComputeLoadField(Handle<String> name,
145 Handle<JSObject> receiver, 145 Handle<JSObject> receiver,
146 Handle<JSObject> holder, 146 Handle<JSObject> holder,
147 PropertyIndex field) { 147 PropertyIndex field) {
148 InlineCacheHolderFlag cache_holder = 148 InlineCacheHolderFlag cache_holder =
149 IC::GetCodeCacheForObject(*receiver, *holder); 149 IC::GetCodeCacheForObject(*receiver, *holder);
150 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); 150 Handle<JSObject> map_holder(
151 IC::GetCodeCacheHolder(isolate_, *receiver, cache_holder));
151 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::FIELD); 152 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::FIELD);
152 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), 153 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags),
153 isolate_); 154 isolate_);
154 if (probe->IsCode()) return Handle<Code>::cast(probe); 155 if (probe->IsCode()) return Handle<Code>::cast(probe);
155 156
156 LoadStubCompiler compiler(isolate_); 157 LoadStubCompiler compiler(isolate_);
157 Handle<Code> code = compiler.CompileLoadField(receiver, holder, name, field); 158 Handle<Code> code = compiler.CompileLoadField(receiver, holder, name, field);
158 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); 159 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name));
159 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); 160 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code));
160 JSObject::UpdateMapCodeCache(map_holder, name, code); 161 JSObject::UpdateMapCodeCache(map_holder, name, code);
161 return code; 162 return code;
162 } 163 }
163 164
164 165
165 Handle<Code> StubCache::ComputeLoadCallback( 166 Handle<Code> StubCache::ComputeLoadCallback(
166 Handle<String> name, 167 Handle<String> name,
167 Handle<JSObject> receiver, 168 Handle<JSObject> receiver,
168 Handle<JSObject> holder, 169 Handle<JSObject> holder,
169 Handle<ExecutableAccessorInfo> callback) { 170 Handle<ExecutableAccessorInfo> callback) {
170 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); 171 ASSERT(v8::ToCData<Address>(callback->getter()) != 0);
171 InlineCacheHolderFlag cache_holder = 172 InlineCacheHolderFlag cache_holder =
172 IC::GetCodeCacheForObject(*receiver, *holder); 173 IC::GetCodeCacheForObject(*receiver, *holder);
173 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); 174 Handle<JSObject> map_holder(
175 IC::GetCodeCacheHolder(isolate_, *receiver, cache_holder));
174 Code::Flags flags = 176 Code::Flags flags =
175 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::CALLBACKS); 177 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::CALLBACKS);
176 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), 178 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags),
177 isolate_); 179 isolate_);
178 if (probe->IsCode()) return Handle<Code>::cast(probe); 180 if (probe->IsCode()) return Handle<Code>::cast(probe);
179 181
180 LoadStubCompiler compiler(isolate_); 182 LoadStubCompiler compiler(isolate_);
181 Handle<Code> code = 183 Handle<Code> code =
182 compiler.CompileLoadCallback(receiver, holder, name, callback); 184 compiler.CompileLoadCallback(receiver, holder, name, callback);
183 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); 185 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name));
184 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); 186 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code));
185 JSObject::UpdateMapCodeCache(map_holder, name, code); 187 JSObject::UpdateMapCodeCache(map_holder, name, code);
186 return code; 188 return code;
187 } 189 }
188 190
189 191
190 Handle<Code> StubCache::ComputeLoadViaGetter(Handle<String> name, 192 Handle<Code> StubCache::ComputeLoadViaGetter(Handle<String> name,
191 Handle<JSObject> receiver, 193 Handle<JSObject> receiver,
192 Handle<JSObject> holder, 194 Handle<JSObject> holder,
193 Handle<JSFunction> getter) { 195 Handle<JSFunction> getter) {
194 InlineCacheHolderFlag cache_holder = 196 InlineCacheHolderFlag cache_holder =
195 IC::GetCodeCacheForObject(*receiver, *holder); 197 IC::GetCodeCacheForObject(*receiver, *holder);
196 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); 198 Handle<JSObject> map_holder(
199 IC::GetCodeCacheHolder(isolate_, *receiver, cache_holder));
197 Code::Flags flags = 200 Code::Flags flags =
198 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::CALLBACKS); 201 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::CALLBACKS);
199 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), 202 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags),
200 isolate_); 203 isolate_);
201 if (probe->IsCode()) return Handle<Code>::cast(probe); 204 if (probe->IsCode()) return Handle<Code>::cast(probe);
202 205
203 LoadStubCompiler compiler(isolate_); 206 LoadStubCompiler compiler(isolate_);
204 Handle<Code> code = 207 Handle<Code> code =
205 compiler.CompileLoadViaGetter(receiver, holder, name, getter); 208 compiler.CompileLoadViaGetter(receiver, holder, name, getter);
206 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); 209 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name));
207 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); 210 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code));
208 JSObject::UpdateMapCodeCache(map_holder, name, code); 211 JSObject::UpdateMapCodeCache(map_holder, name, code);
209 return code; 212 return code;
210 } 213 }
211 214
212 215
213 Handle<Code> StubCache::ComputeLoadConstant(Handle<String> name, 216 Handle<Code> StubCache::ComputeLoadConstant(Handle<String> name,
214 Handle<JSObject> receiver, 217 Handle<JSObject> receiver,
215 Handle<JSObject> holder, 218 Handle<JSObject> holder,
216 Handle<JSFunction> value) { 219 Handle<JSFunction> value) {
217 InlineCacheHolderFlag cache_holder = 220 InlineCacheHolderFlag cache_holder =
218 IC::GetCodeCacheForObject(*receiver, *holder); 221 IC::GetCodeCacheForObject(*receiver, *holder);
219 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); 222 Handle<JSObject> map_holder(
223 IC::GetCodeCacheHolder(isolate_, *receiver, cache_holder));
220 Code::Flags flags = 224 Code::Flags flags =
221 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::CONSTANT_FUNCTION); 225 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::CONSTANT_FUNCTION);
222 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), 226 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags),
223 isolate_); 227 isolate_);
224 if (probe->IsCode()) return Handle<Code>::cast(probe); 228 if (probe->IsCode()) return Handle<Code>::cast(probe);
225 229
226 LoadStubCompiler compiler(isolate_); 230 LoadStubCompiler compiler(isolate_);
227 Handle<Code> code = 231 Handle<Code> code =
228 compiler.CompileLoadConstant(receiver, holder, name, value); 232 compiler.CompileLoadConstant(receiver, holder, name, value);
229 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); 233 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name));
230 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); 234 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code));
231 JSObject::UpdateMapCodeCache(map_holder, name, code); 235 JSObject::UpdateMapCodeCache(map_holder, name, code);
232 return code; 236 return code;
233 } 237 }
234 238
235 239
236 Handle<Code> StubCache::ComputeLoadInterceptor(Handle<String> name, 240 Handle<Code> StubCache::ComputeLoadInterceptor(Handle<String> name,
237 Handle<JSObject> receiver, 241 Handle<JSObject> receiver,
238 Handle<JSObject> holder) { 242 Handle<JSObject> holder) {
239 InlineCacheHolderFlag cache_holder = 243 InlineCacheHolderFlag cache_holder =
240 IC::GetCodeCacheForObject(*receiver, *holder); 244 IC::GetCodeCacheForObject(*receiver, *holder);
241 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); 245 Handle<JSObject> map_holder(
246 IC::GetCodeCacheHolder(isolate_, *receiver, cache_holder));
242 Code::Flags flags = 247 Code::Flags flags =
243 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::INTERCEPTOR); 248 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::INTERCEPTOR);
244 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), 249 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags),
245 isolate_); 250 isolate_);
246 if (probe->IsCode()) return Handle<Code>::cast(probe); 251 if (probe->IsCode()) return Handle<Code>::cast(probe);
247 252
248 LoadStubCompiler compiler(isolate_); 253 LoadStubCompiler compiler(isolate_);
249 Handle<Code> code = 254 Handle<Code> code =
250 compiler.CompileLoadInterceptor(receiver, holder, name); 255 compiler.CompileLoadInterceptor(receiver, holder, name);
251 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); 256 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name));
252 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); 257 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code));
253 JSObject::UpdateMapCodeCache(map_holder, name, code); 258 JSObject::UpdateMapCodeCache(map_holder, name, code);
254 return code; 259 return code;
255 } 260 }
256 261
257 262
258 Handle<Code> StubCache::ComputeLoadNormal() { 263 Handle<Code> StubCache::ComputeLoadNormal() {
259 return isolate_->builtins()->LoadIC_Normal(); 264 return isolate_->builtins()->LoadIC_Normal();
260 } 265 }
261 266
262 267
263 Handle<Code> StubCache::ComputeLoadGlobal(Handle<String> name, 268 Handle<Code> StubCache::ComputeLoadGlobal(Handle<String> name,
264 Handle<JSObject> receiver, 269 Handle<JSObject> receiver,
265 Handle<GlobalObject> holder, 270 Handle<GlobalObject> holder,
266 Handle<JSGlobalPropertyCell> cell, 271 Handle<JSGlobalPropertyCell> cell,
267 bool is_dont_delete) { 272 bool is_dont_delete) {
268 InlineCacheHolderFlag cache_holder = 273 InlineCacheHolderFlag cache_holder =
269 IC::GetCodeCacheForObject(*receiver, *holder); 274 IC::GetCodeCacheForObject(*receiver, *holder);
270 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); 275 Handle<JSObject> map_holder(
276 IC::GetCodeCacheHolder(isolate_, *receiver, cache_holder));
271 Code::Flags flags = 277 Code::Flags flags =
272 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::NORMAL); 278 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::NORMAL);
273 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), 279 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags),
274 isolate_); 280 isolate_);
275 if (probe->IsCode()) return Handle<Code>::cast(probe); 281 if (probe->IsCode()) return Handle<Code>::cast(probe);
276 282
277 LoadStubCompiler compiler(isolate_); 283 LoadStubCompiler compiler(isolate_);
278 Handle<Code> code = 284 Handle<Code> code =
279 compiler.CompileLoadGlobal(receiver, holder, cell, name, is_dont_delete); 285 compiler.CompileLoadGlobal(receiver, holder, cell, name, is_dont_delete);
280 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); 286 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name));
281 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); 287 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code));
282 JSObject::UpdateMapCodeCache(map_holder, name, code); 288 JSObject::UpdateMapCodeCache(map_holder, name, code);
283 return code; 289 return code;
284 } 290 }
285 291
286 292
287 Handle<Code> StubCache::ComputeKeyedLoadField(Handle<String> name, 293 Handle<Code> StubCache::ComputeKeyedLoadField(Handle<String> name,
288 Handle<JSObject> receiver, 294 Handle<JSObject> receiver,
289 Handle<JSObject> holder, 295 Handle<JSObject> holder,
290 PropertyIndex field) { 296 PropertyIndex field) {
291 InlineCacheHolderFlag cache_holder = 297 InlineCacheHolderFlag cache_holder =
292 IC::GetCodeCacheForObject(*receiver, *holder); 298 IC::GetCodeCacheForObject(*receiver, *holder);
293 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); 299 Handle<JSObject> map_holder(
300 IC::GetCodeCacheHolder(isolate_, *receiver, cache_holder));
294 Code::Flags flags = 301 Code::Flags flags =
295 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::FIELD); 302 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::FIELD);
296 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), 303 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags),
297 isolate_); 304 isolate_);
298 if (probe->IsCode()) return Handle<Code>::cast(probe); 305 if (probe->IsCode()) return Handle<Code>::cast(probe);
299 306
300 KeyedLoadStubCompiler compiler(isolate_); 307 KeyedLoadStubCompiler compiler(isolate_);
301 Handle<Code> code = compiler.CompileLoadField(receiver, holder, name, field); 308 Handle<Code> code = compiler.CompileLoadField(receiver, holder, name, field);
302 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); 309 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name));
303 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); 310 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code));
304 JSObject::UpdateMapCodeCache(map_holder, name, code); 311 JSObject::UpdateMapCodeCache(map_holder, name, code);
305 return code; 312 return code;
306 } 313 }
307 314
308 315
309 Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<String> name, 316 Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<String> name,
310 Handle<JSObject> receiver, 317 Handle<JSObject> receiver,
311 Handle<JSObject> holder, 318 Handle<JSObject> holder,
312 Handle<JSFunction> value) { 319 Handle<JSFunction> value) {
313 InlineCacheHolderFlag cache_holder = 320 InlineCacheHolderFlag cache_holder =
314 IC::GetCodeCacheForObject(*receiver, *holder); 321 IC::GetCodeCacheForObject(*receiver, *holder);
315 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); 322 Handle<JSObject> map_holder(
323 IC::GetCodeCacheHolder(isolate_, *receiver, cache_holder));
316 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, 324 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC,
317 Code::CONSTANT_FUNCTION); 325 Code::CONSTANT_FUNCTION);
318 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), 326 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags),
319 isolate_); 327 isolate_);
320 if (probe->IsCode()) return Handle<Code>::cast(probe); 328 if (probe->IsCode()) return Handle<Code>::cast(probe);
321 329
322 KeyedLoadStubCompiler compiler(isolate_); 330 KeyedLoadStubCompiler compiler(isolate_);
323 Handle<Code> code = 331 Handle<Code> code =
324 compiler.CompileLoadConstant(receiver, holder, name, value); 332 compiler.CompileLoadConstant(receiver, holder, name, value);
325 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); 333 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name));
326 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); 334 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code));
327 JSObject::UpdateMapCodeCache(map_holder, name, code); 335 JSObject::UpdateMapCodeCache(map_holder, name, code);
328 return code; 336 return code;
329 } 337 }
330 338
331 339
332 Handle<Code> StubCache::ComputeKeyedLoadInterceptor(Handle<String> name, 340 Handle<Code> StubCache::ComputeKeyedLoadInterceptor(Handle<String> name,
333 Handle<JSObject> receiver, 341 Handle<JSObject> receiver,
334 Handle<JSObject> holder) { 342 Handle<JSObject> holder) {
335 InlineCacheHolderFlag cache_holder = 343 InlineCacheHolderFlag cache_holder =
336 IC::GetCodeCacheForObject(*receiver, *holder); 344 IC::GetCodeCacheForObject(*receiver, *holder);
337 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); 345 Handle<JSObject> map_holder(
346 IC::GetCodeCacheHolder(isolate_, *receiver, cache_holder));
338 Code::Flags flags = 347 Code::Flags flags =
339 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::INTERCEPTOR); 348 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::INTERCEPTOR);
340 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), 349 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags),
341 isolate_); 350 isolate_);
342 if (probe->IsCode()) return Handle<Code>::cast(probe); 351 if (probe->IsCode()) return Handle<Code>::cast(probe);
343 352
344 KeyedLoadStubCompiler compiler(isolate_); 353 KeyedLoadStubCompiler compiler(isolate_);
345 Handle<Code> code = compiler.CompileLoadInterceptor(receiver, holder, name); 354 Handle<Code> code = compiler.CompileLoadInterceptor(receiver, holder, name);
346 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); 355 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name));
347 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); 356 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code));
348 JSObject::UpdateMapCodeCache(map_holder, name, code); 357 JSObject::UpdateMapCodeCache(map_holder, name, code);
349 return code; 358 return code;
350 } 359 }
351 360
352 361
353 Handle<Code> StubCache::ComputeKeyedLoadCallback( 362 Handle<Code> StubCache::ComputeKeyedLoadCallback(
354 Handle<String> name, 363 Handle<String> name,
355 Handle<JSObject> receiver, 364 Handle<JSObject> receiver,
356 Handle<JSObject> holder, 365 Handle<JSObject> holder,
357 Handle<ExecutableAccessorInfo> callback) { 366 Handle<ExecutableAccessorInfo> callback) {
358 InlineCacheHolderFlag cache_holder = 367 InlineCacheHolderFlag cache_holder =
359 IC::GetCodeCacheForObject(*receiver, *holder); 368 IC::GetCodeCacheForObject(*receiver, *holder);
360 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); 369 Handle<JSObject> map_holder(
370 IC::GetCodeCacheHolder(isolate_, *receiver, cache_holder));
361 Code::Flags flags = 371 Code::Flags flags =
362 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CALLBACKS); 372 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CALLBACKS);
363 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), 373 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags),
364 isolate_); 374 isolate_);
365 if (probe->IsCode()) return Handle<Code>::cast(probe); 375 if (probe->IsCode()) return Handle<Code>::cast(probe);
366 376
367 KeyedLoadStubCompiler compiler(isolate_); 377 KeyedLoadStubCompiler compiler(isolate_);
368 Handle<Code> code = 378 Handle<Code> code =
369 compiler.CompileLoadCallback(receiver, holder, name, callback); 379 compiler.CompileLoadCallback(receiver, holder, name, callback);
370 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); 380 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name));
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
561 Handle<Code> StubCache::ComputeCallConstant(int argc, 571 Handle<Code> StubCache::ComputeCallConstant(int argc,
562 Code::Kind kind, 572 Code::Kind kind,
563 Code::ExtraICState extra_state, 573 Code::ExtraICState extra_state,
564 Handle<String> name, 574 Handle<String> name,
565 Handle<Object> object, 575 Handle<Object> object,
566 Handle<JSObject> holder, 576 Handle<JSObject> holder,
567 Handle<JSFunction> function) { 577 Handle<JSFunction> function) {
568 // Compute the check type and the map. 578 // Compute the check type and the map.
569 InlineCacheHolderFlag cache_holder = 579 InlineCacheHolderFlag cache_holder =
570 IC::GetCodeCacheForObject(*object, *holder); 580 IC::GetCodeCacheForObject(*object, *holder);
571 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*object, cache_holder)); 581 Handle<JSObject> map_holder(
582 IC::GetCodeCacheHolder(isolate_, *object, cache_holder));
572 583
573 // Compute check type based on receiver/holder. 584 // Compute check type based on receiver/holder.
574 CheckType check = RECEIVER_MAP_CHECK; 585 CheckType check = RECEIVER_MAP_CHECK;
575 if (object->IsString()) { 586 if (object->IsString()) {
576 check = STRING_CHECK; 587 check = STRING_CHECK;
577 } else if (object->IsNumber()) { 588 } else if (object->IsNumber()) {
578 check = NUMBER_CHECK; 589 check = NUMBER_CHECK;
579 } else if (object->IsBoolean()) { 590 } else if (object->IsBoolean()) {
580 check = BOOLEAN_CHECK; 591 check = BOOLEAN_CHECK;
581 } 592 }
(...skipping 29 matching lines...) Expand all
611 Handle<Code> StubCache::ComputeCallField(int argc, 622 Handle<Code> StubCache::ComputeCallField(int argc,
612 Code::Kind kind, 623 Code::Kind kind,
613 Code::ExtraICState extra_state, 624 Code::ExtraICState extra_state,
614 Handle<String> name, 625 Handle<String> name,
615 Handle<Object> object, 626 Handle<Object> object,
616 Handle<JSObject> holder, 627 Handle<JSObject> holder,
617 PropertyIndex index) { 628 PropertyIndex index) {
618 // Compute the check type and the map. 629 // Compute the check type and the map.
619 InlineCacheHolderFlag cache_holder = 630 InlineCacheHolderFlag cache_holder =
620 IC::GetCodeCacheForObject(*object, *holder); 631 IC::GetCodeCacheForObject(*object, *holder);
621 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*object, cache_holder)); 632 Handle<JSObject> map_holder(
633 IC::GetCodeCacheHolder(isolate_, *object, cache_holder));
622 634
623 // TODO(1233596): We cannot do receiver map check for non-JS objects 635 // TODO(1233596): We cannot do receiver map check for non-JS objects
624 // because they may be represented as immediates without a 636 // because they may be represented as immediates without a
625 // map. Instead, we check against the map in the holder. 637 // map. Instead, we check against the map in the holder.
626 if (object->IsNumber() || object->IsBoolean() || object->IsString()) { 638 if (object->IsNumber() || object->IsBoolean() || object->IsString()) {
627 object = holder; 639 object = holder;
628 } 640 }
629 641
630 Code::Flags flags = 642 Code::Flags flags =
631 Code::ComputeMonomorphicFlags(kind, Code::FIELD, extra_state, 643 Code::ComputeMonomorphicFlags(kind, Code::FIELD, extra_state,
(...skipping 17 matching lines...) Expand all
649 661
650 Handle<Code> StubCache::ComputeCallInterceptor(int argc, 662 Handle<Code> StubCache::ComputeCallInterceptor(int argc,
651 Code::Kind kind, 663 Code::Kind kind,
652 Code::ExtraICState extra_state, 664 Code::ExtraICState extra_state,
653 Handle<String> name, 665 Handle<String> name,
654 Handle<Object> object, 666 Handle<Object> object,
655 Handle<JSObject> holder) { 667 Handle<JSObject> holder) {
656 // Compute the check type and the map. 668 // Compute the check type and the map.
657 InlineCacheHolderFlag cache_holder = 669 InlineCacheHolderFlag cache_holder =
658 IC::GetCodeCacheForObject(*object, *holder); 670 IC::GetCodeCacheForObject(*object, *holder);
659 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*object, cache_holder)); 671 Handle<JSObject> map_holder(
672 IC::GetCodeCacheHolder(isolate_, *object, cache_holder));
660 673
661 // TODO(1233596): We cannot do receiver map check for non-JS objects 674 // TODO(1233596): We cannot do receiver map check for non-JS objects
662 // because they may be represented as immediates without a 675 // because they may be represented as immediates without a
663 // map. Instead, we check against the map in the holder. 676 // map. Instead, we check against the map in the holder.
664 if (object->IsNumber() || object->IsBoolean() || object->IsString()) { 677 if (object->IsNumber() || object->IsBoolean() || object->IsString()) {
665 object = holder; 678 object = holder;
666 } 679 }
667 680
668 Code::Flags flags = 681 Code::Flags flags =
669 Code::ComputeMonomorphicFlags(kind, Code::INTERCEPTOR, extra_state, 682 Code::ComputeMonomorphicFlags(kind, Code::INTERCEPTOR, extra_state,
(...skipping 18 matching lines...) Expand all
688 Handle<Code> StubCache::ComputeCallGlobal(int argc, 701 Handle<Code> StubCache::ComputeCallGlobal(int argc,
689 Code::Kind kind, 702 Code::Kind kind,
690 Code::ExtraICState extra_state, 703 Code::ExtraICState extra_state,
691 Handle<String> name, 704 Handle<String> name,
692 Handle<JSObject> receiver, 705 Handle<JSObject> receiver,
693 Handle<GlobalObject> holder, 706 Handle<GlobalObject> holder,
694 Handle<JSGlobalPropertyCell> cell, 707 Handle<JSGlobalPropertyCell> cell,
695 Handle<JSFunction> function) { 708 Handle<JSFunction> function) {
696 InlineCacheHolderFlag cache_holder = 709 InlineCacheHolderFlag cache_holder =
697 IC::GetCodeCacheForObject(*receiver, *holder); 710 IC::GetCodeCacheForObject(*receiver, *holder);
698 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); 711 Handle<JSObject> map_holder(
712 IC::GetCodeCacheHolder(isolate_, *receiver, cache_holder));
699 Code::Flags flags = 713 Code::Flags flags =
700 Code::ComputeMonomorphicFlags(kind, Code::NORMAL, extra_state, 714 Code::ComputeMonomorphicFlags(kind, Code::NORMAL, extra_state,
701 cache_holder, argc); 715 cache_holder, argc);
702 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), 716 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags),
703 isolate_); 717 isolate_);
704 if (probe->IsCode()) return Handle<Code>::cast(probe); 718 if (probe->IsCode()) return Handle<Code>::cast(probe);
705 719
706 CallStubCompiler compiler(isolate(), argc, kind, extra_state, cache_holder); 720 CallStubCompiler compiler(isolate(), argc, kind, extra_state, cache_holder);
707 Handle<Code> code = 721 Handle<Code> code =
708 compiler.CompileCallGlobal(receiver, holder, cell, function, name); 722 compiler.CompileCallGlobal(receiver, holder, cell, function, name);
(...skipping 1056 matching lines...) Expand 10 before | Expand all | Expand 10 after
1765 Handle<FunctionTemplateInfo>( 1779 Handle<FunctionTemplateInfo>(
1766 FunctionTemplateInfo::cast(signature->receiver())); 1780 FunctionTemplateInfo::cast(signature->receiver()));
1767 } 1781 }
1768 } 1782 }
1769 1783
1770 is_simple_api_call_ = true; 1784 is_simple_api_call_ = true;
1771 } 1785 }
1772 1786
1773 1787
1774 } } // namespace v8::internal 1788 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/string-stream.cc ('k') | src/x64/stub-cache-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698