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

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

Issue 8068026: Begin to handlify the stub cache. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 9 years, 2 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
« src/ic.cc ('K') | « src/stub-cache.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 *secondary = *primary; 102 *secondary = *primary;
103 } 103 }
104 104
105 // Update primary cache. 105 // Update primary cache.
106 primary->key = name; 106 primary->key = name;
107 primary->value = code; 107 primary->value = code;
108 return code; 108 return code;
109 } 109 }
110 110
111 111
112 MaybeObject* StubCache::ComputeLoadNonexistent(String* name, 112 // This static helper should be removed if
113 JSObject* receiver) { 113 // LoadStubCompiler::CompileLoadNonexistent is handlified.
114 static Handle<Code> CompileLoadNonexistent(Isolate* isolate,
115 LoadStubCompiler* compiler,
116 Handle<String> cache_name,
117 Handle<JSObject> receiver,
118 Handle<JSObject> last) {
119 CALL_HEAP_FUNCTION(
Kevin Millikin (Chromium) 2011/09/29 09:21:32 This is the interface between handle code and raw
120 isolate,
121 compiler->CompileLoadNonexistent(*cache_name, *receiver, *last),
122 Code);
123 }
124
125
126 static void UpdateMapCodeCache(Isolate* isolate,
127 Handle<JSObject> receiver,
128 Handle<String> cache_name,
129 Handle<Code> code) {
130 CALL_HEAP_FUNCTION_VOID(isolate,
131 receiver->UpdateMapCodeCache(*cache_name, *code));
132 }
133
134
135 Handle<Code> StubCache::ComputeLoadNonexistent(Handle<String> name,
136 Handle<JSObject> receiver) {
114 ASSERT(receiver->IsGlobalObject() || receiver->HasFastProperties()); 137 ASSERT(receiver->IsGlobalObject() || receiver->HasFastProperties());
115 // If no global objects are present in the prototype chain, the load 138 // If no global objects are present in the prototype chain, the load
116 // nonexistent IC stub can be shared for all names for a given map 139 // nonexistent IC stub can be shared for all names for a given map
117 // and we use the empty string for the map cache in that case. If 140 // and we use the empty string for the map cache in that case. If
118 // there are global objects involved, we need to check global 141 // there are global objects involved, we need to check global
119 // property cells in the stub and therefore the stub will be 142 // property cells in the stub and therefore the stub will be
120 // specific to the name. 143 // specific to the name.
121 String* cache_name = heap()->empty_string(); 144 Handle<String> cache_name = factory()->empty_string();
122 if (receiver->IsGlobalObject()) cache_name = name; 145 if (receiver->IsGlobalObject()) cache_name = name;
123 JSObject* last = receiver; 146
147 // TODO(kmillikin): If we were willing to write
148 // *last.location() = JSObject::cast(last->GetPrototype());
149 // we could avoid the linear space usage.
Kevin Millikin (Chromium) 2011/09/29 09:21:32 We never do this trick because we're paranoid abou
150 Handle<JSObject> last = receiver;
124 while (last->GetPrototype() != heap()->null_value()) { 151 while (last->GetPrototype() != heap()->null_value()) {
125 last = JSObject::cast(last->GetPrototype()); 152 last = Handle<JSObject>(JSObject::cast(last->GetPrototype()));
126 if (last->IsGlobalObject()) cache_name = name; 153 if (last->IsGlobalObject()) cache_name = name;
127 } 154 }
128 // Compile the stub that is either shared for all names or 155 // Compile the stub that is either shared for all names or
129 // name specific if there are global objects involved. 156 // name specific if there are global objects involved.
130 Code::Flags flags = 157 Code::Flags flags =
131 Code::ComputeMonomorphicFlags(Code::LOAD_IC, NONEXISTENT); 158 Code::ComputeMonomorphicFlags(Code::LOAD_IC, NONEXISTENT);
132 Object* code = receiver->map()->FindInCodeCache(cache_name, flags); 159 Handle<Object> probe(receiver->map()->FindInCodeCache(*cache_name, flags));
133 if (code->IsUndefined()) { 160 if (probe->IsCode()) return Handle<Code>::cast(probe);
134 LoadStubCompiler compiler; 161
Kevin Millikin (Chromium) 2011/09/29 09:21:32 Though this implicitly introduces a handle scope,
135 { MaybeObject* maybe_code = 162 LoadStubCompiler compiler(isolate_);
136 compiler.CompileLoadNonexistent(cache_name, receiver, last); 163 Handle<Code> code =
137 if (!maybe_code->ToObject(&code)) return maybe_code; 164 CompileLoadNonexistent(isolate_, &compiler, cache_name, receiver, last);
138 } 165 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *cache_name));
139 PROFILE(isolate_, 166 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *cache_name, *code));
140 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), cache_name)); 167 UpdateMapCodeCache(isolate_, receiver, cache_name, code);
141 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, cache_name, Code::cast(code))); 168 return code;
142 Object* result; 169 }
143 { MaybeObject* maybe_result = 170
144 receiver->UpdateMapCodeCache(cache_name, Code::cast(code)); 171
145 if (!maybe_result->ToObject(&result)) return maybe_result; 172 // This static helper should be removed if
146 } 173 // LoadStubCompiler::CompileLoadField is handlified.
147 } 174 static Handle<Code> CompileLoadField(Isolate* isolate,
148 return code; 175 LoadStubCompiler* compiler,
149 } 176 Handle<JSObject> receiver,
150 177 Handle<JSObject> holder,
151 178 int field_index,
152 MaybeObject* StubCache::ComputeLoadField(String* name, 179 Handle<String> name) {
153 JSObject* receiver, 180 CALL_HEAP_FUNCTION(
154 JSObject* holder, 181 isolate,
182 compiler->CompileLoadField(*receiver, *holder, field_index, *name),
183 Code);
184 }
185
186
187 Handle<Code> StubCache::ComputeLoadField(Handle<String> name,
188 Handle<JSObject> receiver,
189 Handle<JSObject> holder,
155 int field_index) { 190 int field_index) {
156 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); 191 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP);
157 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, FIELD); 192 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, FIELD);
158 Object* code = receiver->map()->FindInCodeCache(name, flags); 193 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags));
159 if (code->IsUndefined()) { 194 if (probe->IsCode()) return Handle<Code>::cast(probe);
160 LoadStubCompiler compiler; 195
161 { MaybeObject* maybe_code = 196 LoadStubCompiler compiler(isolate_);
162 compiler.CompileLoadField(receiver, holder, field_index, name); 197 Handle<Code> code = CompileLoadField(isolate_,
163 if (!maybe_code->ToObject(&code)) return maybe_code; 198 &compiler,
164 } 199 receiver,
165 PROFILE(isolate_, 200 holder,
166 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); 201 field_index,
167 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); 202 name);
168 Object* result; 203 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name));
169 { MaybeObject* maybe_result = 204 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code));
170 receiver->UpdateMapCodeCache(name, Code::cast(code)); 205 UpdateMapCodeCache(isolate_, receiver, name, code);
171 if (!maybe_result->ToObject(&result)) return maybe_result; 206 return code;
172 } 207 }
173 } 208
174 return code; 209
175 } 210 // This static helper should be removed if
176 211 // LoadStubCompiler::CompileLoadCallback is handlified.
177 212 static Handle<Code> CompileLoadCallback(Isolate* isolate,
178 MaybeObject* StubCache::ComputeLoadCallback(String* name, 213 LoadStubCompiler* compiler,
179 JSObject* receiver, 214 Handle<String> name,
180 JSObject* holder, 215 Handle<JSObject> receiver,
181 AccessorInfo* callback) { 216 Handle<JSObject> holder,
217 Handle<AccessorInfo> callback) {
218 CALL_HEAP_FUNCTION(
219 isolate,
220 compiler->CompileLoadCallback(*name, *receiver, *holder, *callback),
221 Code);
222 }
223
224
225 Handle<Code> StubCache::ComputeLoadCallback(Handle<String> name,
226 Handle<JSObject> receiver,
227 Handle<JSObject> holder,
228 Handle<AccessorInfo> callback) {
182 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); 229 ASSERT(v8::ToCData<Address>(callback->getter()) != 0);
183 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); 230 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP);
184 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, CALLBACKS); 231 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, CALLBACKS);
185 Object* code = receiver->map()->FindInCodeCache(name, flags); 232 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags));
186 if (code->IsUndefined()) { 233 if (probe->IsCode()) return Handle<Code>::cast(probe);
187 LoadStubCompiler compiler; 234
188 { MaybeObject* maybe_code = 235 LoadStubCompiler compiler(isolate_);
189 compiler.CompileLoadCallback(name, receiver, holder, callback); 236 Handle<Code> code = CompileLoadCallback(isolate_,
190 if (!maybe_code->ToObject(&code)) return maybe_code; 237 &compiler,
191 } 238 name,
192 PROFILE(isolate_, 239 receiver,
193 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); 240 holder,
194 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); 241 callback);
195 Object* result; 242 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name));
196 { MaybeObject* maybe_result = 243 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code));
197 receiver->UpdateMapCodeCache(name, Code::cast(code)); 244 UpdateMapCodeCache(isolate_, receiver, name, code);
198 if (!maybe_result->ToObject(&result)) return maybe_result; 245 return code;
199 } 246 }
200 } 247
201 return code; 248
202 } 249 // This static helper should be removed if
203 250 // LoadStubCompiler::CompileLoadConstant is handlified.
204 251 static Handle<Code> CompileLoadConstant(Isolate* isolate,
205 MaybeObject* StubCache::ComputeLoadConstant(String* name, 252 LoadStubCompiler* compiler,
206 JSObject* receiver, 253 Handle<JSObject> receiver,
207 JSObject* holder, 254 Handle<JSObject> holder,
208 Object* value) { 255 Handle<Object> value,
209 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); 256 Handle<String> name) {
257 CALL_HEAP_FUNCTION(
258 isolate,
259 compiler->CompileLoadConstant(*receiver, *holder, *value, *name),
260 Code);
261 }
262
263
264 Handle<Code> StubCache::ComputeLoadConstant(Handle<String> name,
265 Handle<JSObject> receiver,
266 Handle<JSObject> holder,
267 Handle<Object> value) {
268 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP);
210 Code::Flags flags = 269 Code::Flags flags =
211 Code::ComputeMonomorphicFlags(Code::LOAD_IC, CONSTANT_FUNCTION); 270 Code::ComputeMonomorphicFlags(Code::LOAD_IC, CONSTANT_FUNCTION);
212 Object* code = receiver->map()->FindInCodeCache(name, flags); 271 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags));
213 if (code->IsUndefined()) { 272 if (probe->IsCode()) return Handle<Code>::cast(probe);
214 LoadStubCompiler compiler; 273
215 { MaybeObject* maybe_code = 274 LoadStubCompiler compiler(isolate_);
216 compiler.CompileLoadConstant(receiver, holder, value, name); 275 Handle<Code> code = CompileLoadConstant(isolate_,
217 if (!maybe_code->ToObject(&code)) return maybe_code; 276 &compiler,
218 } 277 receiver,
219 PROFILE(isolate_, 278 holder,
220 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); 279 value,
221 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); 280 name);
222 Object* result; 281 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name));
223 { MaybeObject* maybe_result = 282 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code));
224 receiver->UpdateMapCodeCache(name, Code::cast(code)); 283 UpdateMapCodeCache(isolate_, receiver, name, code);
225 if (!maybe_result->ToObject(&result)) return maybe_result; 284 return code;
226 } 285 }
227 } 286
228 return code; 287
229 } 288 // This static helper should be removed if
230 289 // LoadStubCompiler::CompileLoadInterceptor is handlified.
231 290 static Handle<Code> CompileLoadInterceptor(Isolate* isolate,
232 MaybeObject* StubCache::ComputeLoadInterceptor(String* name, 291 LoadStubCompiler* compiler,
233 JSObject* receiver, 292 Handle<JSObject> receiver,
234 JSObject* holder) { 293 Handle<JSObject> holder,
235 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); 294 Handle<String> name) {
295 CALL_HEAP_FUNCTION(
296 isolate,
297 compiler->CompileLoadInterceptor(*receiver, *holder, *name),
298 Code);
299 }
300
301
302 Handle<Code> StubCache::ComputeLoadInterceptor(Handle<String> name,
303 Handle<JSObject> receiver,
304 Handle<JSObject> holder) {
305 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP);
236 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, INTERCEPTOR); 306 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, INTERCEPTOR);
237 Object* code = receiver->map()->FindInCodeCache(name, flags); 307 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags));
238 if (code->IsUndefined()) { 308 if (probe->IsCode()) return Handle<Code>::cast(probe);
239 LoadStubCompiler compiler; 309
240 { MaybeObject* maybe_code = 310 LoadStubCompiler compiler(isolate_);
241 compiler.CompileLoadInterceptor(receiver, holder, name); 311 Handle<Code> code = CompileLoadInterceptor(isolate_,
242 if (!maybe_code->ToObject(&code)) return maybe_code; 312 &compiler,
243 } 313 receiver,
244 PROFILE(isolate_, 314 holder,
245 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); 315 name);
246 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); 316 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name));
247 Object* result; 317 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code));
248 { MaybeObject* maybe_result = 318 UpdateMapCodeCache(isolate_, receiver, name, code);
249 receiver->UpdateMapCodeCache(name, Code::cast(code)); 319 return code;
250 if (!maybe_result->ToObject(&result)) return maybe_result; 320 }
251 } 321
252 } 322
253 return code; 323 Handle<Code> StubCache::ComputeLoadNormal() {
254 } 324 return isolate_->builtins()->LoadIC_Normal();
255 325 }
256 326
257 MaybeObject* StubCache::ComputeLoadNormal() { 327
258 return isolate_->builtins()->builtin(Builtins::kLoadIC_Normal); 328 // This static helper should be removed if
259 } 329 // LoadStubCompiler::CompileLoadGlobal is handlified.
260 330 static Handle<Code> CompileLoadGlobal(Isolate* isolate,
261 331 LoadStubCompiler* compiler,
262 MaybeObject* StubCache::ComputeLoadGlobal(String* name, 332 Handle<JSObject> receiver,
263 JSObject* receiver, 333 Handle<GlobalObject> holder,
264 GlobalObject* holder, 334 Handle<JSGlobalPropertyCell> cell,
265 JSGlobalPropertyCell* cell, 335 Handle<String> name,
336 bool is_dont_delete) {
337 CALL_HEAP_FUNCTION(
338 isolate,
339 compiler->CompileLoadGlobal(*receiver, *holder, *cell, *name,
340 is_dont_delete),
341 Code);
342 }
343
344
345 Handle<Code> StubCache::ComputeLoadGlobal(Handle<String> name,
346 Handle<JSObject> receiver,
347 Handle<GlobalObject> holder,
348 Handle<JSGlobalPropertyCell> cell,
266 bool is_dont_delete) { 349 bool is_dont_delete) {
267 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); 350 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP);
268 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, NORMAL); 351 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, NORMAL);
269 Object* code = receiver->map()->FindInCodeCache(name, flags); 352 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags));
270 if (code->IsUndefined()) { 353 if (probe->IsCode()) return Handle<Code>::cast(probe);
271 LoadStubCompiler compiler; 354
272 { MaybeObject* maybe_code = compiler.CompileLoadGlobal(receiver, 355 LoadStubCompiler compiler(isolate_);
273 holder, 356 Handle<Code> code = CompileLoadGlobal(isolate_,
274 cell, 357 &compiler,
275 name, 358 receiver,
276 is_dont_delete); 359 holder,
277 if (!maybe_code->ToObject(&code)) return maybe_code; 360 cell,
278 } 361 name,
279 PROFILE(isolate_, 362 is_dont_delete);
280 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); 363 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name));
281 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); 364 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code));
282 Object* result; 365 UpdateMapCodeCache(isolate_, receiver, name, code);
283 { MaybeObject* maybe_result = 366 return code;
284 receiver->UpdateMapCodeCache(name, Code::cast(code)); 367 }
285 if (!maybe_result->ToObject(&result)) return maybe_result; 368
286 }
287 }
288 return code;
289 }
290
291 369
292 MaybeObject* StubCache::ComputeKeyedLoadField(String* name, 370 MaybeObject* StubCache::ComputeKeyedLoadField(String* name,
293 JSObject* receiver, 371 JSObject* receiver,
294 JSObject* holder, 372 JSObject* holder,
295 int field_index) { 373 int field_index) {
296 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); 374 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP);
297 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, FIELD); 375 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, FIELD);
298 Object* code = receiver->map()->FindInCodeCache(name, flags); 376 Object* code = receiver->map()->FindInCodeCache(name, flags);
299 if (code->IsUndefined()) { 377 if (code->IsUndefined()) {
300 KeyedLoadStubCompiler compiler; 378 HandleScope scope(isolate());
379 KeyedLoadStubCompiler compiler(isolate());
301 { MaybeObject* maybe_code = 380 { MaybeObject* maybe_code =
302 compiler.CompileLoadField(name, receiver, holder, field_index); 381 compiler.CompileLoadField(name, receiver, holder, field_index);
303 if (!maybe_code->ToObject(&code)) return maybe_code; 382 if (!maybe_code->ToObject(&code)) return maybe_code;
304 } 383 }
305 PROFILE(isolate_, 384 PROFILE(isolate_,
306 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); 385 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name));
307 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); 386 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code)));
308 Object* result; 387 Object* result;
309 { MaybeObject* maybe_result = 388 { MaybeObject* maybe_result =
310 receiver->UpdateMapCodeCache(name, Code::cast(code)); 389 receiver->UpdateMapCodeCache(name, Code::cast(code));
311 if (!maybe_result->ToObject(&result)) return maybe_result; 390 if (!maybe_result->ToObject(&result)) return maybe_result;
312 } 391 }
313 } 392 }
314 return code; 393 return code;
315 } 394 }
316 395
317 396
318 MaybeObject* StubCache::ComputeKeyedLoadConstant(String* name, 397 MaybeObject* StubCache::ComputeKeyedLoadConstant(String* name,
319 JSObject* receiver, 398 JSObject* receiver,
320 JSObject* holder, 399 JSObject* holder,
321 Object* value) { 400 Object* value) {
322 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); 401 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP);
323 Code::Flags flags = 402 Code::Flags flags =
324 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CONSTANT_FUNCTION); 403 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CONSTANT_FUNCTION);
325 Object* code = receiver->map()->FindInCodeCache(name, flags); 404 Object* code = receiver->map()->FindInCodeCache(name, flags);
326 if (code->IsUndefined()) { 405 if (code->IsUndefined()) {
327 KeyedLoadStubCompiler compiler; 406 HandleScope scope(isolate());
407 KeyedLoadStubCompiler compiler(isolate());
328 { MaybeObject* maybe_code = 408 { MaybeObject* maybe_code =
329 compiler.CompileLoadConstant(name, receiver, holder, value); 409 compiler.CompileLoadConstant(name, receiver, holder, value);
330 if (!maybe_code->ToObject(&code)) return maybe_code; 410 if (!maybe_code->ToObject(&code)) return maybe_code;
331 } 411 }
332 PROFILE(isolate_, 412 PROFILE(isolate_,
333 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); 413 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name));
334 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); 414 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code)));
335 Object* result; 415 Object* result;
336 { MaybeObject* maybe_result = 416 { MaybeObject* maybe_result =
337 receiver->UpdateMapCodeCache(name, Code::cast(code)); 417 receiver->UpdateMapCodeCache(name, Code::cast(code));
338 if (!maybe_result->ToObject(&result)) return maybe_result; 418 if (!maybe_result->ToObject(&result)) return maybe_result;
339 } 419 }
340 } 420 }
341 return code; 421 return code;
342 } 422 }
343 423
344 424
345 MaybeObject* StubCache::ComputeKeyedLoadInterceptor(String* name, 425 MaybeObject* StubCache::ComputeKeyedLoadInterceptor(String* name,
346 JSObject* receiver, 426 JSObject* receiver,
347 JSObject* holder) { 427 JSObject* holder) {
348 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); 428 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP);
349 Code::Flags flags = 429 Code::Flags flags =
350 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, INTERCEPTOR); 430 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, INTERCEPTOR);
351 Object* code = receiver->map()->FindInCodeCache(name, flags); 431 Object* code = receiver->map()->FindInCodeCache(name, flags);
352 if (code->IsUndefined()) { 432 if (code->IsUndefined()) {
353 KeyedLoadStubCompiler compiler; 433 HandleScope scope(isolate());
434 KeyedLoadStubCompiler compiler(isolate());
354 { MaybeObject* maybe_code = 435 { MaybeObject* maybe_code =
355 compiler.CompileLoadInterceptor(receiver, holder, name); 436 compiler.CompileLoadInterceptor(receiver, holder, name);
356 if (!maybe_code->ToObject(&code)) return maybe_code; 437 if (!maybe_code->ToObject(&code)) return maybe_code;
357 } 438 }
358 PROFILE(isolate_, 439 PROFILE(isolate_,
359 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); 440 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name));
360 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); 441 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code)));
361 Object* result; 442 Object* result;
362 { MaybeObject* maybe_result = 443 { MaybeObject* maybe_result =
363 receiver->UpdateMapCodeCache(name, Code::cast(code)); 444 receiver->UpdateMapCodeCache(name, Code::cast(code));
364 if (!maybe_result->ToObject(&result)) return maybe_result; 445 if (!maybe_result->ToObject(&result)) return maybe_result;
365 } 446 }
366 } 447 }
367 return code; 448 return code;
368 } 449 }
369 450
370 451
371 MaybeObject* StubCache::ComputeKeyedLoadCallback(String* name, 452 MaybeObject* StubCache::ComputeKeyedLoadCallback(String* name,
372 JSObject* receiver, 453 JSObject* receiver,
373 JSObject* holder, 454 JSObject* holder,
374 AccessorInfo* callback) { 455 AccessorInfo* callback) {
375 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); 456 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP);
376 Code::Flags flags = 457 Code::Flags flags =
377 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); 458 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS);
378 Object* code = receiver->map()->FindInCodeCache(name, flags); 459 Object* code = receiver->map()->FindInCodeCache(name, flags);
379 if (code->IsUndefined()) { 460 if (code->IsUndefined()) {
380 KeyedLoadStubCompiler compiler; 461 HandleScope scope(isolate());
462 KeyedLoadStubCompiler compiler(isolate());
381 { MaybeObject* maybe_code = 463 { MaybeObject* maybe_code =
382 compiler.CompileLoadCallback(name, receiver, holder, callback); 464 compiler.CompileLoadCallback(name, receiver, holder, callback);
383 if (!maybe_code->ToObject(&code)) return maybe_code; 465 if (!maybe_code->ToObject(&code)) return maybe_code;
384 } 466 }
385 PROFILE(isolate_, 467 PROFILE(isolate_,
386 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); 468 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name));
387 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); 469 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code)));
388 Object* result; 470 Object* result;
389 { MaybeObject* maybe_result = 471 { MaybeObject* maybe_result =
390 receiver->UpdateMapCodeCache(name, Code::cast(code)); 472 receiver->UpdateMapCodeCache(name, Code::cast(code));
391 if (!maybe_result->ToObject(&result)) return maybe_result; 473 if (!maybe_result->ToObject(&result)) return maybe_result;
392 } 474 }
393 } 475 }
394 return code; 476 return code;
395 } 477 }
396 478
397 479
398 480
399 MaybeObject* StubCache::ComputeKeyedLoadArrayLength(String* name, 481 MaybeObject* StubCache::ComputeKeyedLoadArrayLength(String* name,
400 JSArray* receiver) { 482 JSArray* receiver) {
401 Code::Flags flags = 483 Code::Flags flags =
402 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); 484 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS);
403 ASSERT(receiver->IsJSObject()); 485 ASSERT(receiver->IsJSObject());
404 Object* code = receiver->map()->FindInCodeCache(name, flags); 486 Object* code = receiver->map()->FindInCodeCache(name, flags);
405 if (code->IsUndefined()) { 487 if (code->IsUndefined()) {
406 KeyedLoadStubCompiler compiler; 488 HandleScope scope(isolate());
489 KeyedLoadStubCompiler compiler(isolate());
407 { MaybeObject* maybe_code = compiler.CompileLoadArrayLength(name); 490 { MaybeObject* maybe_code = compiler.CompileLoadArrayLength(name);
408 if (!maybe_code->ToObject(&code)) return maybe_code; 491 if (!maybe_code->ToObject(&code)) return maybe_code;
409 } 492 }
410 PROFILE(isolate_, 493 PROFILE(isolate_,
411 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); 494 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name));
412 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); 495 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code)));
413 Object* result; 496 Object* result;
414 { MaybeObject* maybe_result = 497 { MaybeObject* maybe_result =
415 receiver->UpdateMapCodeCache(name, Code::cast(code)); 498 receiver->UpdateMapCodeCache(name, Code::cast(code));
416 if (!maybe_result->ToObject(&result)) return maybe_result; 499 if (!maybe_result->ToObject(&result)) return maybe_result;
417 } 500 }
418 } 501 }
419 return code; 502 return code;
420 } 503 }
421 504
422 505
423 MaybeObject* StubCache::ComputeKeyedLoadStringLength(String* name, 506 MaybeObject* StubCache::ComputeKeyedLoadStringLength(String* name,
424 String* receiver) { 507 String* receiver) {
425 Code::Flags flags = 508 Code::Flags flags =
426 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); 509 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS);
427 Map* map = receiver->map(); 510 Map* map = receiver->map();
428 Object* code = map->FindInCodeCache(name, flags); 511 Object* code = map->FindInCodeCache(name, flags);
429 if (code->IsUndefined()) { 512 if (code->IsUndefined()) {
430 KeyedLoadStubCompiler compiler; 513 HandleScope scope(isolate());
514 KeyedLoadStubCompiler compiler(isolate());
431 { MaybeObject* maybe_code = compiler.CompileLoadStringLength(name); 515 { MaybeObject* maybe_code = compiler.CompileLoadStringLength(name);
432 if (!maybe_code->ToObject(&code)) return maybe_code; 516 if (!maybe_code->ToObject(&code)) return maybe_code;
433 } 517 }
434 PROFILE(isolate_, 518 PROFILE(isolate_,
435 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); 519 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name));
436 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); 520 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code)));
437 Object* result; 521 Object* result;
438 { MaybeObject* maybe_result = map->UpdateCodeCache(name, Code::cast(code)); 522 { MaybeObject* maybe_result = map->UpdateCodeCache(name, Code::cast(code));
439 if (!maybe_result->ToObject(&result)) return maybe_result; 523 if (!maybe_result->ToObject(&result)) return maybe_result;
440 } 524 }
441 } 525 }
442 return code; 526 return code;
443 } 527 }
444 528
445 529
446 MaybeObject* StubCache::ComputeKeyedLoadFunctionPrototype( 530 MaybeObject* StubCache::ComputeKeyedLoadFunctionPrototype(
447 String* name, 531 String* name,
448 JSFunction* receiver) { 532 JSFunction* receiver) {
449 Code::Flags flags = 533 Code::Flags flags =
450 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); 534 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS);
451 Object* code = receiver->map()->FindInCodeCache(name, flags); 535 Object* code = receiver->map()->FindInCodeCache(name, flags);
452 if (code->IsUndefined()) { 536 if (code->IsUndefined()) {
453 KeyedLoadStubCompiler compiler; 537 HandleScope scope(isolate());
538 KeyedLoadStubCompiler compiler(isolate());
454 { MaybeObject* maybe_code = compiler.CompileLoadFunctionPrototype(name); 539 { MaybeObject* maybe_code = compiler.CompileLoadFunctionPrototype(name);
455 if (!maybe_code->ToObject(&code)) return maybe_code; 540 if (!maybe_code->ToObject(&code)) return maybe_code;
456 } 541 }
457 PROFILE(isolate_, 542 PROFILE(isolate_,
458 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); 543 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name));
459 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); 544 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code)));
460 Object* result; 545 Object* result;
461 { MaybeObject* maybe_result = 546 { MaybeObject* maybe_result =
462 receiver->UpdateMapCodeCache(name, Code::cast(code)); 547 receiver->UpdateMapCodeCache(name, Code::cast(code));
463 if (!maybe_result->ToObject(&result)) return maybe_result; 548 if (!maybe_result->ToObject(&result)) return maybe_result;
464 } 549 }
465 } 550 }
466 return code; 551 return code;
467 } 552 }
468 553
469 554
470 MaybeObject* StubCache::ComputeStoreField(String* name, 555 MaybeObject* StubCache::ComputeStoreField(String* name,
471 JSObject* receiver, 556 JSObject* receiver,
472 int field_index, 557 int field_index,
473 Map* transition, 558 Map* transition,
474 StrictModeFlag strict_mode) { 559 StrictModeFlag strict_mode) {
475 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; 560 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION;
476 Code::Flags flags = Code::ComputeMonomorphicFlags( 561 Code::Flags flags = Code::ComputeMonomorphicFlags(
477 Code::STORE_IC, type, strict_mode); 562 Code::STORE_IC, type, strict_mode);
478 Object* code = receiver->map()->FindInCodeCache(name, flags); 563 Object* code = receiver->map()->FindInCodeCache(name, flags);
479 if (code->IsUndefined()) { 564 if (code->IsUndefined()) {
480 StoreStubCompiler compiler(strict_mode); 565 HandleScope scope(isolate());
566 StoreStubCompiler compiler(isolate(), strict_mode);
481 { MaybeObject* maybe_code = 567 { MaybeObject* maybe_code =
482 compiler.CompileStoreField(receiver, field_index, transition, name); 568 compiler.CompileStoreField(receiver, field_index, transition, name);
483 if (!maybe_code->ToObject(&code)) return maybe_code; 569 if (!maybe_code->ToObject(&code)) return maybe_code;
484 } 570 }
485 PROFILE(isolate_, 571 PROFILE(isolate_,
486 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); 572 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name));
487 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); 573 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code)));
488 Object* result; 574 Object* result;
489 { MaybeObject* maybe_result = 575 { MaybeObject* maybe_result =
490 receiver->UpdateMapCodeCache(name, Code::cast(code)); 576 receiver->UpdateMapCodeCache(name, Code::cast(code));
(...skipping 16 matching lines...) Expand all
507 strict_mode); 593 strict_mode);
508 String* name = is_store 594 String* name = is_store
509 ? isolate()->heap()->KeyedStoreElementMonomorphic_symbol() 595 ? isolate()->heap()->KeyedStoreElementMonomorphic_symbol()
510 : isolate()->heap()->KeyedLoadElementMonomorphic_symbol(); 596 : isolate()->heap()->KeyedLoadElementMonomorphic_symbol();
511 Object* maybe_code = receiver->map()->FindInCodeCache(name, flags); 597 Object* maybe_code = receiver->map()->FindInCodeCache(name, flags);
512 if (!maybe_code->IsUndefined()) return Code::cast(maybe_code); 598 if (!maybe_code->IsUndefined()) return Code::cast(maybe_code);
513 599
514 MaybeObject* maybe_new_code = NULL; 600 MaybeObject* maybe_new_code = NULL;
515 Map* receiver_map = receiver->map(); 601 Map* receiver_map = receiver->map();
516 if (is_store) { 602 if (is_store) {
517 KeyedStoreStubCompiler compiler(strict_mode); 603 HandleScope scope(isolate());
604 KeyedStoreStubCompiler compiler(isolate(), strict_mode);
518 maybe_new_code = compiler.CompileStoreElement(receiver_map); 605 maybe_new_code = compiler.CompileStoreElement(receiver_map);
519 } else { 606 } else {
520 KeyedLoadStubCompiler compiler; 607 HandleScope scope(isolate());
608 KeyedLoadStubCompiler compiler(isolate());
521 maybe_new_code = compiler.CompileLoadElement(receiver_map); 609 maybe_new_code = compiler.CompileLoadElement(receiver_map);
522 } 610 }
523 Code* code; 611 Code* code;
524 if (!maybe_new_code->To(&code)) return maybe_new_code; 612 if (!maybe_new_code->To(&code)) return maybe_new_code;
525 if (is_store) { 613 if (is_store) {
526 PROFILE(isolate_, 614 PROFILE(isolate_,
527 CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, 615 CodeCreateEvent(Logger::KEYED_STORE_IC_TAG,
528 Code::cast(code), 0)); 616 Code::cast(code), 0));
529 } else { 617 } else {
530 PROFILE(isolate_, 618 PROFILE(isolate_,
(...skipping 18 matching lines...) Expand all
549 637
550 638
551 MaybeObject* StubCache::ComputeStoreGlobal(String* name, 639 MaybeObject* StubCache::ComputeStoreGlobal(String* name,
552 GlobalObject* receiver, 640 GlobalObject* receiver,
553 JSGlobalPropertyCell* cell, 641 JSGlobalPropertyCell* cell,
554 StrictModeFlag strict_mode) { 642 StrictModeFlag strict_mode) {
555 Code::Flags flags = Code::ComputeMonomorphicFlags( 643 Code::Flags flags = Code::ComputeMonomorphicFlags(
556 Code::STORE_IC, NORMAL, strict_mode); 644 Code::STORE_IC, NORMAL, strict_mode);
557 Object* code = receiver->map()->FindInCodeCache(name, flags); 645 Object* code = receiver->map()->FindInCodeCache(name, flags);
558 if (code->IsUndefined()) { 646 if (code->IsUndefined()) {
559 StoreStubCompiler compiler(strict_mode); 647 HandleScope scope(isolate());
648 StoreStubCompiler compiler(isolate(), strict_mode);
560 { MaybeObject* maybe_code = 649 { MaybeObject* maybe_code =
561 compiler.CompileStoreGlobal(receiver, cell, name); 650 compiler.CompileStoreGlobal(receiver, cell, name);
562 if (!maybe_code->ToObject(&code)) return maybe_code; 651 if (!maybe_code->ToObject(&code)) return maybe_code;
563 } 652 }
564 PROFILE(isolate_, 653 PROFILE(isolate_,
565 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); 654 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name));
566 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); 655 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code)));
567 Object* result; 656 Object* result;
568 { MaybeObject* maybe_result = 657 { MaybeObject* maybe_result =
569 receiver->UpdateMapCodeCache(name, Code::cast(code)); 658 receiver->UpdateMapCodeCache(name, Code::cast(code));
570 if (!maybe_result->ToObject(&result)) return maybe_result; 659 if (!maybe_result->ToObject(&result)) return maybe_result;
571 } 660 }
572 } 661 }
573 return code; 662 return code;
574 } 663 }
575 664
576 665
577 MaybeObject* StubCache::ComputeStoreCallback( 666 MaybeObject* StubCache::ComputeStoreCallback(
578 String* name, 667 String* name,
579 JSObject* receiver, 668 JSObject* receiver,
580 AccessorInfo* callback, 669 AccessorInfo* callback,
581 StrictModeFlag strict_mode) { 670 StrictModeFlag strict_mode) {
582 ASSERT(v8::ToCData<Address>(callback->setter()) != 0); 671 ASSERT(v8::ToCData<Address>(callback->setter()) != 0);
583 Code::Flags flags = Code::ComputeMonomorphicFlags( 672 Code::Flags flags = Code::ComputeMonomorphicFlags(
584 Code::STORE_IC, CALLBACKS, strict_mode); 673 Code::STORE_IC, CALLBACKS, strict_mode);
585 Object* code = receiver->map()->FindInCodeCache(name, flags); 674 Object* code = receiver->map()->FindInCodeCache(name, flags);
586 if (code->IsUndefined()) { 675 if (code->IsUndefined()) {
587 StoreStubCompiler compiler(strict_mode); 676 HandleScope scope(isolate());
677 StoreStubCompiler compiler(isolate(), strict_mode);
588 { MaybeObject* maybe_code = 678 { MaybeObject* maybe_code =
589 compiler.CompileStoreCallback(receiver, callback, name); 679 compiler.CompileStoreCallback(receiver, callback, name);
590 if (!maybe_code->ToObject(&code)) return maybe_code; 680 if (!maybe_code->ToObject(&code)) return maybe_code;
591 } 681 }
592 PROFILE(isolate_, 682 PROFILE(isolate_,
593 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); 683 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name));
594 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); 684 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code)));
595 Object* result; 685 Object* result;
596 { MaybeObject* maybe_result = 686 { MaybeObject* maybe_result =
597 receiver->UpdateMapCodeCache(name, Code::cast(code)); 687 receiver->UpdateMapCodeCache(name, Code::cast(code));
598 if (!maybe_result->ToObject(&result)) return maybe_result; 688 if (!maybe_result->ToObject(&result)) return maybe_result;
599 } 689 }
600 } 690 }
601 return code; 691 return code;
602 } 692 }
603 693
604 694
605 MaybeObject* StubCache::ComputeStoreInterceptor( 695 MaybeObject* StubCache::ComputeStoreInterceptor(
606 String* name, 696 String* name,
607 JSObject* receiver, 697 JSObject* receiver,
608 StrictModeFlag strict_mode) { 698 StrictModeFlag strict_mode) {
609 Code::Flags flags = Code::ComputeMonomorphicFlags( 699 Code::Flags flags = Code::ComputeMonomorphicFlags(
610 Code::STORE_IC, INTERCEPTOR, strict_mode); 700 Code::STORE_IC, INTERCEPTOR, strict_mode);
611 Object* code = receiver->map()->FindInCodeCache(name, flags); 701 Object* code = receiver->map()->FindInCodeCache(name, flags);
612 if (code->IsUndefined()) { 702 if (code->IsUndefined()) {
613 StoreStubCompiler compiler(strict_mode); 703 HandleScope scope(isolate());
704 StoreStubCompiler compiler(isolate(), strict_mode);
614 { MaybeObject* maybe_code = 705 { MaybeObject* maybe_code =
615 compiler.CompileStoreInterceptor(receiver, name); 706 compiler.CompileStoreInterceptor(receiver, name);
616 if (!maybe_code->ToObject(&code)) return maybe_code; 707 if (!maybe_code->ToObject(&code)) return maybe_code;
617 } 708 }
618 PROFILE(isolate_, 709 PROFILE(isolate_,
619 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); 710 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name));
620 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); 711 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code)));
621 Object* result; 712 Object* result;
622 { MaybeObject* maybe_result = 713 { MaybeObject* maybe_result =
623 receiver->UpdateMapCodeCache(name, Code::cast(code)); 714 receiver->UpdateMapCodeCache(name, Code::cast(code));
624 if (!maybe_result->ToObject(&result)) return maybe_result; 715 if (!maybe_result->ToObject(&result)) return maybe_result;
625 } 716 }
626 } 717 }
627 return code; 718 return code;
628 } 719 }
629 720
630 721
631 MaybeObject* StubCache::ComputeKeyedStoreField(String* name, 722 MaybeObject* StubCache::ComputeKeyedStoreField(String* name,
632 JSObject* receiver, 723 JSObject* receiver,
633 int field_index, 724 int field_index,
634 Map* transition, 725 Map* transition,
635 StrictModeFlag strict_mode) { 726 StrictModeFlag strict_mode) {
636 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; 727 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION;
637 Code::Flags flags = Code::ComputeMonomorphicFlags( 728 Code::Flags flags = Code::ComputeMonomorphicFlags(
638 Code::KEYED_STORE_IC, type, strict_mode); 729 Code::KEYED_STORE_IC, type, strict_mode);
639 Object* code = receiver->map()->FindInCodeCache(name, flags); 730 Object* code = receiver->map()->FindInCodeCache(name, flags);
640 if (code->IsUndefined()) { 731 if (code->IsUndefined()) {
641 KeyedStoreStubCompiler compiler(strict_mode); 732 HandleScope scope(isolate());
733 KeyedStoreStubCompiler compiler(isolate(), strict_mode);
642 { MaybeObject* maybe_code = 734 { MaybeObject* maybe_code =
643 compiler.CompileStoreField(receiver, field_index, transition, name); 735 compiler.CompileStoreField(receiver, field_index, transition, name);
644 if (!maybe_code->ToObject(&code)) return maybe_code; 736 if (!maybe_code->ToObject(&code)) return maybe_code;
645 } 737 }
646 PROFILE(isolate(), 738 PROFILE(isolate(),
647 CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, 739 CodeCreateEvent(Logger::KEYED_STORE_IC_TAG,
648 Code::cast(code), name)); 740 Code::cast(code), name));
649 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, name, Code::cast(code))); 741 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, name, Code::cast(code)));
650 Object* result; 742 Object* result;
651 { MaybeObject* maybe_result = 743 { MaybeObject* maybe_result =
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
687 cache_holder, 779 cache_holder,
688 argc); 780 argc);
689 Object* code = map_holder->map()->FindInCodeCache(name, flags); 781 Object* code = map_holder->map()->FindInCodeCache(name, flags);
690 if (code->IsUndefined()) { 782 if (code->IsUndefined()) {
691 // If the function hasn't been compiled yet, we cannot do it now 783 // If the function hasn't been compiled yet, we cannot do it now
692 // because it may cause GC. To avoid this issue, we return an 784 // because it may cause GC. To avoid this issue, we return an
693 // internal error which will make sure we do not update any 785 // internal error which will make sure we do not update any
694 // caches. 786 // caches.
695 if (!function->is_compiled()) return Failure::InternalError(); 787 if (!function->is_compiled()) return Failure::InternalError();
696 // Compile the stub - only create stubs for fully compiled functions. 788 // Compile the stub - only create stubs for fully compiled functions.
697 CallStubCompiler compiler(argc, kind, extra_ic_state, cache_holder); 789 HandleScope scope(isolate());
790 CallStubCompiler compiler(isolate(), argc, kind, extra_ic_state,
791 cache_holder);
698 { MaybeObject* maybe_code = 792 { MaybeObject* maybe_code =
699 compiler.CompileCallConstant(object, holder, function, name, check); 793 compiler.CompileCallConstant(object, holder, function, name, check);
700 if (!maybe_code->ToObject(&code)) return maybe_code; 794 if (!maybe_code->ToObject(&code)) return maybe_code;
701 } 795 }
702 Code::cast(code)->set_check_type(check); 796 Code::cast(code)->set_check_type(check);
703 ASSERT_EQ(flags, Code::cast(code)->flags()); 797 ASSERT_EQ(flags, Code::cast(code)->flags());
704 PROFILE(isolate_, 798 PROFILE(isolate_,
705 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), 799 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG),
706 Code::cast(code), name)); 800 Code::cast(code), name));
707 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); 801 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code)));
(...skipping 26 matching lines...) Expand all
734 object = holder; 828 object = holder;
735 } 829 }
736 830
737 Code::Flags flags = Code::ComputeMonomorphicFlags(kind, 831 Code::Flags flags = Code::ComputeMonomorphicFlags(kind,
738 FIELD, 832 FIELD,
739 extra_ic_state, 833 extra_ic_state,
740 cache_holder, 834 cache_holder,
741 argc); 835 argc);
742 Object* code = map_holder->map()->FindInCodeCache(name, flags); 836 Object* code = map_holder->map()->FindInCodeCache(name, flags);
743 if (code->IsUndefined()) { 837 if (code->IsUndefined()) {
744 CallStubCompiler compiler(argc, kind, extra_ic_state, cache_holder); 838 HandleScope scope(isolate());
839 CallStubCompiler compiler(isolate(), argc, kind, extra_ic_state,
840 cache_holder);
745 { MaybeObject* maybe_code = 841 { MaybeObject* maybe_code =
746 compiler.CompileCallField(JSObject::cast(object), 842 compiler.CompileCallField(JSObject::cast(object),
747 holder, 843 holder,
748 index, 844 index,
749 name); 845 name);
750 if (!maybe_code->ToObject(&code)) return maybe_code; 846 if (!maybe_code->ToObject(&code)) return maybe_code;
751 } 847 }
752 ASSERT_EQ(flags, Code::cast(code)->flags()); 848 ASSERT_EQ(flags, Code::cast(code)->flags());
753 PROFILE(isolate_, 849 PROFILE(isolate_,
754 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), 850 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG),
(...skipping 28 matching lines...) Expand all
783 object = holder; 879 object = holder;
784 } 880 }
785 881
786 Code::Flags flags = Code::ComputeMonomorphicFlags(kind, 882 Code::Flags flags = Code::ComputeMonomorphicFlags(kind,
787 INTERCEPTOR, 883 INTERCEPTOR,
788 extra_ic_state, 884 extra_ic_state,
789 cache_holder, 885 cache_holder,
790 argc); 886 argc);
791 Object* code = map_holder->map()->FindInCodeCache(name, flags); 887 Object* code = map_holder->map()->FindInCodeCache(name, flags);
792 if (code->IsUndefined()) { 888 if (code->IsUndefined()) {
793 CallStubCompiler compiler(argc, kind, extra_ic_state, cache_holder); 889 HandleScope scope(isolate());
890 CallStubCompiler compiler(isolate(), argc, kind, extra_ic_state,
891 cache_holder);
794 { MaybeObject* maybe_code = 892 { MaybeObject* maybe_code =
795 compiler.CompileCallInterceptor(JSObject::cast(object), holder, name); 893 compiler.CompileCallInterceptor(JSObject::cast(object), holder, name);
796 if (!maybe_code->ToObject(&code)) return maybe_code; 894 if (!maybe_code->ToObject(&code)) return maybe_code;
797 } 895 }
798 ASSERT_EQ(flags, Code::cast(code)->flags()); 896 ASSERT_EQ(flags, Code::cast(code)->flags());
799 PROFILE(isolate(), 897 PROFILE(isolate(),
800 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), 898 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG),
801 Code::cast(code), name)); 899 Code::cast(code), name));
802 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); 900 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code)));
803 Object* result; 901 Object* result;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
839 extra_ic_state, 937 extra_ic_state,
840 cache_holder, 938 cache_holder,
841 argc); 939 argc);
842 Object* code = map_holder->map()->FindInCodeCache(name, flags); 940 Object* code = map_holder->map()->FindInCodeCache(name, flags);
843 if (code->IsUndefined()) { 941 if (code->IsUndefined()) {
844 // If the function hasn't been compiled yet, we cannot do it now 942 // If the function hasn't been compiled yet, we cannot do it now
845 // because it may cause GC. To avoid this issue, we return an 943 // because it may cause GC. To avoid this issue, we return an
846 // internal error which will make sure we do not update any 944 // internal error which will make sure we do not update any
847 // caches. 945 // caches.
848 if (!function->is_compiled()) return Failure::InternalError(); 946 if (!function->is_compiled()) return Failure::InternalError();
849 CallStubCompiler compiler(argc, kind, extra_ic_state, cache_holder); 947 HandleScope scope(isolate());
948 CallStubCompiler compiler(isolate(), argc, kind, extra_ic_state,
949 cache_holder);
850 { MaybeObject* maybe_code = 950 { MaybeObject* maybe_code =
851 compiler.CompileCallGlobal(receiver, holder, cell, function, name); 951 compiler.CompileCallGlobal(receiver, holder, cell, function, name);
852 if (!maybe_code->ToObject(&code)) return maybe_code; 952 if (!maybe_code->ToObject(&code)) return maybe_code;
853 } 953 }
854 ASSERT_EQ(flags, Code::cast(code)->flags()); 954 ASSERT_EQ(flags, Code::cast(code)->flags());
855 PROFILE(isolate(), 955 PROFILE(isolate(),
856 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), 956 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG),
857 Code::cast(code), name)); 957 Code::cast(code), name));
858 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); 958 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code)));
859 Object* result; 959 Object* result;
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
942 Code::Flags flags = Code::ComputeFlags(kind, 1042 Code::Flags flags = Code::ComputeFlags(kind,
943 UNINITIALIZED, 1043 UNINITIALIZED,
944 extra_state, 1044 extra_state,
945 NORMAL, 1045 NORMAL,
946 argc); 1046 argc);
947 Object* probe; 1047 Object* probe;
948 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); 1048 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags);
949 if (!maybe_probe->ToObject(&probe)) return maybe_probe; 1049 if (!maybe_probe->ToObject(&probe)) return maybe_probe;
950 } 1050 }
951 if (!probe->IsUndefined()) return probe; 1051 if (!probe->IsUndefined()) return probe;
952 StubCompiler compiler; 1052 HandleScope scope(isolate());
1053 StubCompiler compiler(isolate());
953 return FillCache(isolate_, compiler.CompileCallInitialize(flags)); 1054 return FillCache(isolate_, compiler.CompileCallInitialize(flags));
954 } 1055 }
955 1056
956 1057
957 Handle<Code> StubCache::ComputeCallInitialize(int argc, 1058 Handle<Code> StubCache::ComputeCallInitialize(int argc,
958 RelocInfo::Mode mode) { 1059 RelocInfo::Mode mode) {
959 CALL_HEAP_FUNCTION(isolate_, 1060 CALL_HEAP_FUNCTION(isolate_,
960 ComputeCallInitialize(argc, mode, Code::CALL_IC), 1061 ComputeCallInitialize(argc, mode, Code::CALL_IC),
961 Code); 1062 Code);
962 } 1063 }
(...skipping 14 matching lines...) Expand all
977 Code::Flags flags = Code::ComputeFlags(kind, 1078 Code::Flags flags = Code::ComputeFlags(kind,
978 PREMONOMORPHIC, 1079 PREMONOMORPHIC,
979 extra_ic_state, 1080 extra_ic_state,
980 NORMAL, 1081 NORMAL,
981 argc); 1082 argc);
982 Object* probe; 1083 Object* probe;
983 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); 1084 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags);
984 if (!maybe_probe->ToObject(&probe)) return maybe_probe; 1085 if (!maybe_probe->ToObject(&probe)) return maybe_probe;
985 } 1086 }
986 if (!probe->IsUndefined()) return probe; 1087 if (!probe->IsUndefined()) return probe;
987 StubCompiler compiler; 1088 HandleScope scope(isolate());
1089 StubCompiler compiler(isolate());
988 return FillCache(isolate_, compiler.CompileCallPreMonomorphic(flags)); 1090 return FillCache(isolate_, compiler.CompileCallPreMonomorphic(flags));
989 } 1091 }
990 1092
991 1093
992 MaybeObject* StubCache::ComputeCallNormal(int argc, 1094 MaybeObject* StubCache::ComputeCallNormal(int argc,
993 Code::Kind kind, 1095 Code::Kind kind,
994 Code::ExtraICState extra_ic_state) { 1096 Code::ExtraICState extra_ic_state) {
995 Code::Flags flags = Code::ComputeFlags(kind, 1097 Code::Flags flags = Code::ComputeFlags(kind,
996 MONOMORPHIC, 1098 MONOMORPHIC,
997 extra_ic_state, 1099 extra_ic_state,
998 NORMAL, 1100 NORMAL,
999 argc); 1101 argc);
1000 Object* probe; 1102 Object* probe;
1001 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); 1103 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags);
1002 if (!maybe_probe->ToObject(&probe)) return maybe_probe; 1104 if (!maybe_probe->ToObject(&probe)) return maybe_probe;
1003 } 1105 }
1004 if (!probe->IsUndefined()) return probe; 1106 if (!probe->IsUndefined()) return probe;
1005 StubCompiler compiler; 1107 HandleScope scope(isolate());
1108 StubCompiler compiler(isolate());
1006 return FillCache(isolate_, compiler.CompileCallNormal(flags)); 1109 return FillCache(isolate_, compiler.CompileCallNormal(flags));
1007 } 1110 }
1008 1111
1009 1112
1010 MaybeObject* StubCache::ComputeCallArguments(int argc, Code::Kind kind) { 1113 MaybeObject* StubCache::ComputeCallArguments(int argc, Code::Kind kind) {
1011 ASSERT(kind == Code::KEYED_CALL_IC); 1114 ASSERT(kind == Code::KEYED_CALL_IC);
1012 Code::Flags flags = Code::ComputeFlags(kind, 1115 Code::Flags flags = Code::ComputeFlags(kind,
1013 MEGAMORPHIC, 1116 MEGAMORPHIC,
1014 Code::kNoExtraICState, 1117 Code::kNoExtraICState,
1015 NORMAL, 1118 NORMAL,
1016 argc); 1119 argc);
1017 Object* probe; 1120 Object* probe;
1018 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); 1121 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags);
1019 if (!maybe_probe->ToObject(&probe)) return maybe_probe; 1122 if (!maybe_probe->ToObject(&probe)) return maybe_probe;
1020 } 1123 }
1021 if (!probe->IsUndefined()) return probe; 1124 if (!probe->IsUndefined()) return probe;
1022 StubCompiler compiler; 1125 HandleScope scope(isolate());
1126 StubCompiler compiler(isolate());
1023 return FillCache(isolate_, compiler.CompileCallArguments(flags)); 1127 return FillCache(isolate_, compiler.CompileCallArguments(flags));
1024 } 1128 }
1025 1129
1026 1130
1027 MaybeObject* StubCache::ComputeCallMegamorphic( 1131 MaybeObject* StubCache::ComputeCallMegamorphic(
1028 int argc, 1132 int argc,
1029 Code::Kind kind, 1133 Code::Kind kind,
1030 Code::ExtraICState extra_ic_state) { 1134 Code::ExtraICState extra_ic_state) {
1031 Code::Flags flags = Code::ComputeFlags(kind, 1135 Code::Flags flags = Code::ComputeFlags(kind,
1032 MEGAMORPHIC, 1136 MEGAMORPHIC,
1033 extra_ic_state, 1137 extra_ic_state,
1034 NORMAL, 1138 NORMAL,
1035 argc); 1139 argc);
1036 Object* probe; 1140 Object* probe;
1037 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); 1141 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags);
1038 if (!maybe_probe->ToObject(&probe)) return maybe_probe; 1142 if (!maybe_probe->ToObject(&probe)) return maybe_probe;
1039 } 1143 }
1040 if (!probe->IsUndefined()) return probe; 1144 if (!probe->IsUndefined()) return probe;
1041 StubCompiler compiler; 1145 HandleScope scope(isolate());
1146 StubCompiler compiler(isolate());
1042 return FillCache(isolate_, compiler.CompileCallMegamorphic(flags)); 1147 return FillCache(isolate_, compiler.CompileCallMegamorphic(flags));
1043 } 1148 }
1044 1149
1045 1150
1046 MaybeObject* StubCache::ComputeCallMiss(int argc, 1151 MaybeObject* StubCache::ComputeCallMiss(int argc,
1047 Code::Kind kind, 1152 Code::Kind kind,
1048 Code::ExtraICState extra_ic_state) { 1153 Code::ExtraICState extra_ic_state) {
1049 // MONOMORPHIC_PROTOTYPE_FAILURE state is used to make sure that miss stubs 1154 // MONOMORPHIC_PROTOTYPE_FAILURE state is used to make sure that miss stubs
1050 // and monomorphic stubs are not mixed up together in the stub cache. 1155 // and monomorphic stubs are not mixed up together in the stub cache.
1051 Code::Flags flags = Code::ComputeFlags(kind, 1156 Code::Flags flags = Code::ComputeFlags(kind,
1052 MONOMORPHIC_PROTOTYPE_FAILURE, 1157 MONOMORPHIC_PROTOTYPE_FAILURE,
1053 extra_ic_state, 1158 extra_ic_state,
1054 NORMAL, 1159 NORMAL,
1055 argc, 1160 argc,
1056 OWN_MAP); 1161 OWN_MAP);
1057 Object* probe; 1162 Object* probe;
1058 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); 1163 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags);
1059 if (!maybe_probe->ToObject(&probe)) return maybe_probe; 1164 if (!maybe_probe->ToObject(&probe)) return maybe_probe;
1060 } 1165 }
1061 if (!probe->IsUndefined()) return probe; 1166 if (!probe->IsUndefined()) return probe;
1062 StubCompiler compiler; 1167 HandleScope scope(isolate());
1168 StubCompiler compiler(isolate());
1063 return FillCache(isolate_, compiler.CompileCallMiss(flags)); 1169 return FillCache(isolate_, compiler.CompileCallMiss(flags));
1064 } 1170 }
1065 1171
1066 1172
1067 #ifdef ENABLE_DEBUGGER_SUPPORT 1173 #ifdef ENABLE_DEBUGGER_SUPPORT
1068 MaybeObject* StubCache::ComputeCallDebugBreak( 1174 MaybeObject* StubCache::ComputeCallDebugBreak(
1069 int argc, 1175 int argc,
1070 Code::Kind kind) { 1176 Code::Kind kind) {
1071 // Extra IC state is irrelevant for debug break ICs. They jump to 1177 // Extra IC state is irrelevant for debug break ICs. They jump to
1072 // the actual call ic to carry out the work. 1178 // the actual call ic to carry out the work.
1073 Code::Flags flags = Code::ComputeFlags(kind, 1179 Code::Flags flags = Code::ComputeFlags(kind,
1074 DEBUG_BREAK, 1180 DEBUG_BREAK,
1075 Code::kNoExtraICState, 1181 Code::kNoExtraICState,
1076 NORMAL, 1182 NORMAL,
1077 argc); 1183 argc);
1078 Object* probe; 1184 Object* probe;
1079 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); 1185 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags);
1080 if (!maybe_probe->ToObject(&probe)) return maybe_probe; 1186 if (!maybe_probe->ToObject(&probe)) return maybe_probe;
1081 } 1187 }
1082 if (!probe->IsUndefined()) return probe; 1188 if (!probe->IsUndefined()) return probe;
1083 StubCompiler compiler; 1189 HandleScope scope(isolate());
1190 StubCompiler compiler(isolate());
1084 return FillCache(isolate_, compiler.CompileCallDebugBreak(flags)); 1191 return FillCache(isolate_, compiler.CompileCallDebugBreak(flags));
1085 } 1192 }
1086 1193
1087 1194
1088 MaybeObject* StubCache::ComputeCallDebugPrepareStepIn( 1195 MaybeObject* StubCache::ComputeCallDebugPrepareStepIn(
1089 int argc, 1196 int argc,
1090 Code::Kind kind) { 1197 Code::Kind kind) {
1091 // Extra IC state is irrelevant for debug break ICs. They jump to 1198 // Extra IC state is irrelevant for debug break ICs. They jump to
1092 // the actual call ic to carry out the work. 1199 // the actual call ic to carry out the work.
1093 Code::Flags flags = Code::ComputeFlags(kind, 1200 Code::Flags flags = Code::ComputeFlags(kind,
1094 DEBUG_PREPARE_STEP_IN, 1201 DEBUG_PREPARE_STEP_IN,
1095 Code::kNoExtraICState, 1202 Code::kNoExtraICState,
1096 NORMAL, 1203 NORMAL,
1097 argc); 1204 argc);
1098 Object* probe; 1205 Object* probe;
1099 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); 1206 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags);
1100 if (!maybe_probe->ToObject(&probe)) return maybe_probe; 1207 if (!maybe_probe->ToObject(&probe)) return maybe_probe;
1101 } 1208 }
1102 if (!probe->IsUndefined()) return probe; 1209 if (!probe->IsUndefined()) return probe;
1103 StubCompiler compiler; 1210 HandleScope scope(isolate());
1211 StubCompiler compiler(isolate());
1104 return FillCache(isolate_, compiler.CompileCallDebugPrepareStepIn(flags)); 1212 return FillCache(isolate_, compiler.CompileCallDebugPrepareStepIn(flags));
1105 } 1213 }
1106 #endif 1214 #endif
1107 1215
1108 1216
1109 void StubCache::Clear() { 1217 void StubCache::Clear() {
1110 Code* empty = isolate_->builtins()->builtin(Builtins::kIllegal); 1218 Code* empty = isolate_->builtins()->builtin(Builtins::kIllegal);
1111 for (int i = 0; i < kPrimaryTableSize; i++) { 1219 for (int i = 0; i < kPrimaryTableSize; i++) {
1112 Code* code = primary_[i].value; 1220 Code* code = primary_[i].value;
1113 if (code != empty && !code->is_pregenerated()) { 1221 if (code != empty && !code->is_pregenerated()) {
(...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after
1685 return result; 1793 return result;
1686 } 1794 }
1687 1795
1688 1796
1689 void KeyedStoreStubCompiler::GenerateStoreDictionaryElement( 1797 void KeyedStoreStubCompiler::GenerateStoreDictionaryElement(
1690 MacroAssembler* masm) { 1798 MacroAssembler* masm) {
1691 KeyedStoreIC::GenerateSlow(masm); 1799 KeyedStoreIC::GenerateSlow(masm);
1692 } 1800 }
1693 1801
1694 1802
1695 CallStubCompiler::CallStubCompiler(int argc, 1803 CallStubCompiler::CallStubCompiler(Isolate* isolate,
1804 int argc,
1696 Code::Kind kind, 1805 Code::Kind kind,
1697 Code::ExtraICState extra_ic_state, 1806 Code::ExtraICState extra_ic_state,
1698 InlineCacheHolderFlag cache_holder) 1807 InlineCacheHolderFlag cache_holder)
1699 : arguments_(argc), 1808 : StubCompiler(isolate),
1809 arguments_(argc),
1700 kind_(kind), 1810 kind_(kind),
1701 extra_ic_state_(extra_ic_state), 1811 extra_ic_state_(extra_ic_state),
1702 cache_holder_(cache_holder) { 1812 cache_holder_(cache_holder) {
1703 } 1813 }
1704 1814
1705 1815
1706 bool CallStubCompiler::HasCustomCallGenerator(JSFunction* function) { 1816 bool CallStubCompiler::HasCustomCallGenerator(JSFunction* function) {
1707 SharedFunctionInfo* info = function->shared(); 1817 SharedFunctionInfo* info = function->shared();
1708 if (info->HasBuiltinFunctionId()) { 1818 if (info->HasBuiltinFunctionId()) {
1709 BuiltinFunctionId id = info->builtin_function_id(); 1819 BuiltinFunctionId id = info->builtin_function_id();
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
1846 expected_receiver_type_ = 1956 expected_receiver_type_ =
1847 FunctionTemplateInfo::cast(signature->receiver()); 1957 FunctionTemplateInfo::cast(signature->receiver());
1848 } 1958 }
1849 } 1959 }
1850 1960
1851 is_simple_api_call_ = true; 1961 is_simple_api_call_ = true;
1852 } 1962 }
1853 1963
1854 1964
1855 } } // namespace v8::internal 1965 } } // namespace v8::internal
OLDNEW
« src/ic.cc ('K') | « src/stub-cache.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698