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

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

Issue 13552003: Add extra flag for load-ic stubs in code cache. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 8 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') | test/mjsunit/regress/regress-2593.js » ('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 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
116 Code::ExtraICState extra_ic_state) { 116 Code::ExtraICState extra_ic_state) {
117 Code::Flags flags = Code::ComputeMonomorphicFlags(kind, extra_ic_state, type); 117 Code::Flags flags = Code::ComputeMonomorphicFlags(kind, extra_ic_state, type);
118 Handle<Object> probe(stub_holder->map()->FindInCodeCache(*name, flags), 118 Handle<Object> probe(stub_holder->map()->FindInCodeCache(*name, flags),
119 isolate_); 119 isolate_);
120 if (probe->IsCode()) return Handle<Code>::cast(probe); 120 if (probe->IsCode()) return Handle<Code>::cast(probe);
121 return Handle<Code>::null(); 121 return Handle<Code>::null();
122 } 122 }
123 123
124 124
125 Handle<Code> StubCache::FindHandler(Handle<Name> name, 125 Handle<Code> StubCache::FindHandler(Handle<Name> name,
126 Handle<JSObject> receiver,
126 Handle<JSObject> stub_holder, 127 Handle<JSObject> stub_holder,
127 Code::Kind kind, 128 Code::Kind kind,
128 Code::StubType type, 129 Code::StubType type) {
129 Code::ExtraICState extra_ic_state) { 130 Code::ExtraICState extra_ic_state = Code::ComputeExtraICState(
131 receiver.is_identical_to(stub_holder) ? Code::OWN_STUB
132 : Code::PROTOTYPE_STUB);
130 ASSERT(type != Code::NORMAL); 133 ASSERT(type != Code::NORMAL);
131 Code::Flags flags = Code::ComputeMonomorphicFlags( 134 Code::Flags flags = Code::ComputeMonomorphicFlags(
132 Code::STUB, extra_ic_state, type, kind); 135 Code::STUB, extra_ic_state, type, kind);
133 Handle<Object> probe(stub_holder->map()->FindInCodeCache(*name, flags), 136 Handle<Object> probe(stub_holder->map()->FindInCodeCache(*name, flags),
134 isolate_); 137 isolate_);
135 if (probe->IsCode()) return Handle<Code>::cast(probe); 138 if (probe->IsCode()) return Handle<Code>::cast(probe);
136 return Handle<Code>::null(); 139 return Handle<Code>::null();
137 } 140 }
138 141
139 142
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 global = Handle<GlobalObject>::cast(current); 190 global = Handle<GlobalObject>::cast(current);
188 cache_name = name; 191 cache_name = name;
189 } else if (!current->HasFastProperties()) { 192 } else if (!current->HasFastProperties()) {
190 cache_name = name; 193 cache_name = name;
191 } 194 }
192 } while (!next->IsNull()); 195 } while (!next->IsNull());
193 196
194 // Compile the stub that is either shared for all names or 197 // Compile the stub that is either shared for all names or
195 // name specific if there are global objects involved. 198 // name specific if there are global objects involved.
196 Handle<Code> handler = FindHandler( 199 Handle<Code> handler = FindHandler(
197 cache_name, receiver, Code::LOAD_IC, Code::NONEXISTENT); 200 cache_name, receiver, receiver, Code::LOAD_IC, Code::NONEXISTENT);
198 if (!handler.is_null()) return handler; 201 if (!handler.is_null()) return handler;
199 202
200 LoadStubCompiler compiler(isolate_); 203 LoadStubCompiler compiler(isolate_);
201 handler = 204 handler =
202 compiler.CompileLoadNonexistent(receiver, current, cache_name, global); 205 compiler.CompileLoadNonexistent(receiver, current, cache_name, global);
203 JSObject::UpdateMapCodeCache(receiver, cache_name, handler); 206 JSObject::UpdateMapCodeCache(receiver, cache_name, handler);
204 return handler; 207 return handler;
205 } 208 }
206 209
207 210
208 Handle<Code> StubCache::ComputeLoadField(Handle<Name> name, 211 Handle<Code> StubCache::ComputeLoadField(Handle<Name> name,
209 Handle<JSObject> receiver, 212 Handle<JSObject> receiver,
210 Handle<JSObject> holder, 213 Handle<JSObject> holder,
211 PropertyIndex field) { 214 PropertyIndex field) {
212 if (receiver.is_identical_to(holder)) { 215 if (receiver.is_identical_to(holder)) {
213 LoadFieldStub stub(LoadStubCompiler::receiver(), 216 LoadFieldStub stub(LoadStubCompiler::receiver(),
214 field.is_inobject(holder), 217 field.is_inobject(holder),
215 field.translate(holder)); 218 field.translate(holder));
216 return stub.GetCode(isolate()); 219 return stub.GetCode(isolate());
217 } 220 }
218 221
219 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 222 Handle<JSObject> stub_holder = StubHolder(receiver, holder);
220 Handle<Code> stub = FindHandler( 223 Handle<Code> stub = FindHandler(
221 name, stub_holder, Code::LOAD_IC, Code::FIELD); 224 name, receiver, stub_holder, Code::LOAD_IC, Code::FIELD);
222 if (!stub.is_null()) return stub; 225 if (!stub.is_null()) return stub;
223 226
224 LoadStubCompiler compiler(isolate_); 227 LoadStubCompiler compiler(isolate_);
225 Handle<Code> handler = 228 Handle<Code> handler =
226 compiler.CompileLoadField(receiver, holder, name, field); 229 compiler.CompileLoadField(receiver, holder, name, field);
227 JSObject::UpdateMapCodeCache(stub_holder, name, handler); 230 JSObject::UpdateMapCodeCache(stub_holder, name, handler);
228 return handler; 231 return handler;
229 } 232 }
230 233
231 234
232 Handle<Code> StubCache::ComputeLoadCallback( 235 Handle<Code> StubCache::ComputeLoadCallback(
233 Handle<Name> name, 236 Handle<Name> name,
234 Handle<JSObject> receiver, 237 Handle<JSObject> receiver,
235 Handle<JSObject> holder, 238 Handle<JSObject> holder,
236 Handle<ExecutableAccessorInfo> callback) { 239 Handle<ExecutableAccessorInfo> callback) {
237 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); 240 ASSERT(v8::ToCData<Address>(callback->getter()) != 0);
238 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 241 Handle<JSObject> stub_holder = StubHolder(receiver, holder);
239 Handle<Code> stub = FindHandler( 242 Handle<Code> stub = FindHandler(
240 name, stub_holder, Code::LOAD_IC, Code::CALLBACKS); 243 name, receiver, stub_holder, Code::LOAD_IC, Code::CALLBACKS);
241 if (!stub.is_null()) return stub; 244 if (!stub.is_null()) return stub;
242 245
243 LoadStubCompiler compiler(isolate_); 246 LoadStubCompiler compiler(isolate_);
244 Handle<Code> handler = 247 Handle<Code> handler =
245 compiler.CompileLoadCallback(receiver, holder, name, callback); 248 compiler.CompileLoadCallback(receiver, holder, name, callback);
246 JSObject::UpdateMapCodeCache(stub_holder, name, handler); 249 JSObject::UpdateMapCodeCache(stub_holder, name, handler);
247 return handler; 250 return handler;
248 } 251 }
249 252
250 253
251 Handle<Code> StubCache::ComputeLoadViaGetter(Handle<Name> name, 254 Handle<Code> StubCache::ComputeLoadViaGetter(Handle<Name> name,
252 Handle<JSObject> receiver, 255 Handle<JSObject> receiver,
253 Handle<JSObject> holder, 256 Handle<JSObject> holder,
254 Handle<JSFunction> getter) { 257 Handle<JSFunction> getter) {
255 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 258 Handle<JSObject> stub_holder = StubHolder(receiver, holder);
256 Handle<Code> stub = FindHandler( 259 Handle<Code> stub = FindHandler(
257 name, stub_holder, Code::LOAD_IC, Code::CALLBACKS); 260 name, receiver, stub_holder, Code::LOAD_IC, Code::CALLBACKS);
258 if (!stub.is_null()) return stub; 261 if (!stub.is_null()) return stub;
259 262
260 LoadStubCompiler compiler(isolate_); 263 LoadStubCompiler compiler(isolate_);
261 Handle<Code> handler = 264 Handle<Code> handler =
262 compiler.CompileLoadViaGetter(receiver, holder, name, getter); 265 compiler.CompileLoadViaGetter(receiver, holder, name, getter);
263 JSObject::UpdateMapCodeCache(stub_holder, name, handler); 266 JSObject::UpdateMapCodeCache(stub_holder, name, handler);
264 return handler; 267 return handler;
265 } 268 }
266 269
267 270
268 Handle<Code> StubCache::ComputeLoadConstant(Handle<Name> name, 271 Handle<Code> StubCache::ComputeLoadConstant(Handle<Name> name,
269 Handle<JSObject> receiver, 272 Handle<JSObject> receiver,
270 Handle<JSObject> holder, 273 Handle<JSObject> holder,
271 Handle<JSFunction> value) { 274 Handle<JSFunction> value) {
272 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 275 Handle<JSObject> stub_holder = StubHolder(receiver, holder);
273 Handle<Code> handler = FindHandler( 276 Handle<Code> handler = FindHandler(
274 name, stub_holder, Code::LOAD_IC, Code::CONSTANT_FUNCTION); 277 name, receiver, stub_holder, Code::LOAD_IC, Code::CONSTANT_FUNCTION);
275 if (!handler.is_null()) return handler; 278 if (!handler.is_null()) return handler;
276 279
277 LoadStubCompiler compiler(isolate_); 280 LoadStubCompiler compiler(isolate_);
278 handler = compiler.CompileLoadConstant(receiver, holder, name, value); 281 handler = compiler.CompileLoadConstant(receiver, holder, name, value);
279 JSObject::UpdateMapCodeCache(stub_holder, name, handler); 282 JSObject::UpdateMapCodeCache(stub_holder, name, handler);
280 283
281 return handler; 284 return handler;
282 } 285 }
283 286
284 287
285 Handle<Code> StubCache::ComputeLoadInterceptor(Handle<Name> name, 288 Handle<Code> StubCache::ComputeLoadInterceptor(Handle<Name> name,
286 Handle<JSObject> receiver, 289 Handle<JSObject> receiver,
287 Handle<JSObject> holder) { 290 Handle<JSObject> holder) {
288 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 291 Handle<JSObject> stub_holder = StubHolder(receiver, holder);
289 Handle<Code> stub = FindHandler( 292 Handle<Code> stub = FindHandler(
290 name, stub_holder, Code::LOAD_IC, Code::INTERCEPTOR); 293 name, receiver, stub_holder, Code::LOAD_IC, Code::INTERCEPTOR);
291 if (!stub.is_null()) return stub; 294 if (!stub.is_null()) return stub;
292 295
293 LoadStubCompiler compiler(isolate_); 296 LoadStubCompiler compiler(isolate_);
294 Handle<Code> handler = 297 Handle<Code> handler =
295 compiler.CompileLoadInterceptor(receiver, holder, name); 298 compiler.CompileLoadInterceptor(receiver, holder, name);
296 JSObject::UpdateMapCodeCache(stub_holder, name, handler); 299 JSObject::UpdateMapCodeCache(stub_holder, name, handler);
297 return handler; 300 return handler;
298 } 301 }
299 302
300 303
(...skipping 26 matching lines...) Expand all
327 PropertyIndex field) { 330 PropertyIndex field) {
328 if (receiver.is_identical_to(holder)) { 331 if (receiver.is_identical_to(holder)) {
329 LoadFieldStub stub(KeyedLoadStubCompiler::receiver(), 332 LoadFieldStub stub(KeyedLoadStubCompiler::receiver(),
330 field.is_inobject(holder), 333 field.is_inobject(holder),
331 field.translate(holder)); 334 field.translate(holder));
332 return stub.GetCode(isolate()); 335 return stub.GetCode(isolate());
333 } 336 }
334 337
335 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 338 Handle<JSObject> stub_holder = StubHolder(receiver, holder);
336 Handle<Code> stub = FindHandler( 339 Handle<Code> stub = FindHandler(
337 name, stub_holder, Code::KEYED_LOAD_IC, Code::FIELD); 340 name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::FIELD);
338 if (!stub.is_null()) return stub; 341 if (!stub.is_null()) return stub;
339 342
340 KeyedLoadStubCompiler compiler(isolate_); 343 KeyedLoadStubCompiler compiler(isolate_);
341 Handle<Code> handler = 344 Handle<Code> handler =
342 compiler.CompileLoadField(receiver, holder, name, field); 345 compiler.CompileLoadField(receiver, holder, name, field);
343 JSObject::UpdateMapCodeCache(stub_holder, name, handler); 346 JSObject::UpdateMapCodeCache(stub_holder, name, handler);
344 return handler; 347 return handler;
345 } 348 }
346 349
347 350
348 Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<Name> name, 351 Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<Name> name,
349 Handle<JSObject> receiver, 352 Handle<JSObject> receiver,
350 Handle<JSObject> holder, 353 Handle<JSObject> holder,
351 Handle<JSFunction> value) { 354 Handle<JSFunction> value) {
352 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 355 Handle<JSObject> stub_holder = StubHolder(receiver, holder);
353 Handle<Code> handler = FindHandler( 356 Handle<Code> handler = FindHandler(
354 name, stub_holder, Code::KEYED_LOAD_IC, Code::CONSTANT_FUNCTION); 357 name, receiver, stub_holder, Code::KEYED_LOAD_IC,
358 Code::CONSTANT_FUNCTION);
355 if (!handler.is_null()) return handler; 359 if (!handler.is_null()) return handler;
356 360
357 KeyedLoadStubCompiler compiler(isolate_); 361 KeyedLoadStubCompiler compiler(isolate_);
358 handler = compiler.CompileLoadConstant(receiver, holder, name, value); 362 handler = compiler.CompileLoadConstant(receiver, holder, name, value);
359 JSObject::UpdateMapCodeCache(stub_holder, name, handler); 363 JSObject::UpdateMapCodeCache(stub_holder, name, handler);
360 return handler; 364 return handler;
361 } 365 }
362 366
363 367
364 Handle<Code> StubCache::ComputeKeyedLoadInterceptor(Handle<Name> name, 368 Handle<Code> StubCache::ComputeKeyedLoadInterceptor(Handle<Name> name,
365 Handle<JSObject> receiver, 369 Handle<JSObject> receiver,
366 Handle<JSObject> holder) { 370 Handle<JSObject> holder) {
367 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 371 Handle<JSObject> stub_holder = StubHolder(receiver, holder);
368 Handle<Code> stub = FindHandler( 372 Handle<Code> stub = FindHandler(
369 name, stub_holder, Code::KEYED_LOAD_IC, Code::INTERCEPTOR); 373 name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::INTERCEPTOR);
370 if (!stub.is_null()) return stub; 374 if (!stub.is_null()) return stub;
371 375
372 KeyedLoadStubCompiler compiler(isolate_); 376 KeyedLoadStubCompiler compiler(isolate_);
373 Handle<Code> handler = 377 Handle<Code> handler =
374 compiler.CompileLoadInterceptor(receiver, holder, name); 378 compiler.CompileLoadInterceptor(receiver, holder, name);
375 JSObject::UpdateMapCodeCache(stub_holder, name, handler); 379 JSObject::UpdateMapCodeCache(stub_holder, name, handler);
376 return handler; 380 return handler;
377 } 381 }
378 382
379 383
380 Handle<Code> StubCache::ComputeKeyedLoadCallback( 384 Handle<Code> StubCache::ComputeKeyedLoadCallback(
381 Handle<Name> name, 385 Handle<Name> name,
382 Handle<JSObject> receiver, 386 Handle<JSObject> receiver,
383 Handle<JSObject> holder, 387 Handle<JSObject> holder,
384 Handle<ExecutableAccessorInfo> callback) { 388 Handle<ExecutableAccessorInfo> callback) {
385 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 389 Handle<JSObject> stub_holder = StubHolder(receiver, holder);
386 Handle<Code> stub = FindHandler( 390 Handle<Code> stub = FindHandler(
387 name, stub_holder, Code::KEYED_LOAD_IC, Code::CALLBACKS); 391 name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::CALLBACKS);
388 if (!stub.is_null()) return stub; 392 if (!stub.is_null()) return stub;
389 393
390 KeyedLoadStubCompiler compiler(isolate_); 394 KeyedLoadStubCompiler compiler(isolate_);
391 Handle<Code> handler = 395 Handle<Code> handler =
392 compiler.CompileLoadCallback(receiver, holder, name, callback); 396 compiler.CompileLoadCallback(receiver, holder, name, callback);
393 JSObject::UpdateMapCodeCache(stub_holder, name, handler); 397 JSObject::UpdateMapCodeCache(stub_holder, name, handler);
394 return handler; 398 return handler;
395 } 399 }
396 400
397 401
(...skipping 1611 matching lines...) Expand 10 before | Expand all | Expand 10 after
2009 Handle<FunctionTemplateInfo>( 2013 Handle<FunctionTemplateInfo>(
2010 FunctionTemplateInfo::cast(signature->receiver())); 2014 FunctionTemplateInfo::cast(signature->receiver()));
2011 } 2015 }
2012 } 2016 }
2013 2017
2014 is_simple_api_call_ = true; 2018 is_simple_api_call_ = true;
2015 } 2019 }
2016 2020
2017 2021
2018 } } // namespace v8::internal 2022 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/stub-cache.h ('k') | test/mjsunit/regress/regress-2593.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698