OLD | NEW |
---|---|
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 Loading... | |
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 Handle<Code> LoadStubCompiler::CompileLoadNonexistent(Handle<String> name, |
113 JSObject* receiver) { | 113 Handle<JSObject> object, |
114 Handle<JSObject> last) { | |
115 CALL_HEAP_FUNCTION(isolate(), | |
116 CompileLoadNonexistent(*name, *object, *last), | |
117 Code); | |
118 } | |
119 | |
120 | |
121 Handle<Code> StubCache::ComputeLoadNonexistent(Handle<String> name, | |
122 Handle<JSObject> receiver) { | |
114 ASSERT(receiver->IsGlobalObject() || receiver->HasFastProperties()); | 123 ASSERT(receiver->IsGlobalObject() || receiver->HasFastProperties()); |
115 // If no global objects are present in the prototype chain, the load | 124 // 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 | 125 // 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 | 126 // 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 | 127 // there are global objects involved, we need to check global |
119 // property cells in the stub and therefore the stub will be | 128 // property cells in the stub and therefore the stub will be |
120 // specific to the name. | 129 // specific to the name. |
121 String* cache_name = heap()->empty_string(); | 130 Handle<String> cache_name = factory()->empty_string(); |
122 if (receiver->IsGlobalObject()) cache_name = name; | 131 if (receiver->IsGlobalObject()) cache_name = name; |
123 JSObject* last = receiver; | 132 Handle<JSObject> last = receiver; |
124 while (last->GetPrototype() != heap()->null_value()) { | 133 while (last->GetPrototype() != heap()->null_value()) { |
125 last = JSObject::cast(last->GetPrototype()); | 134 last = Handle<JSObject>(JSObject::cast(last->GetPrototype())); |
126 if (last->IsGlobalObject()) cache_name = name; | 135 if (last->IsGlobalObject()) cache_name = name; |
127 } | 136 } |
128 // Compile the stub that is either shared for all names or | 137 // Compile the stub that is either shared for all names or |
129 // name specific if there are global objects involved. | 138 // name specific if there are global objects involved. |
130 Code::Flags flags = | 139 Code::Flags flags = |
131 Code::ComputeMonomorphicFlags(Code::LOAD_IC, NONEXISTENT); | 140 Code::ComputeMonomorphicFlags(Code::LOAD_IC, NONEXISTENT); |
132 Object* code = receiver->map()->FindInCodeCache(cache_name, flags); | 141 Handle<Object> probe(receiver->map()->FindInCodeCache(*cache_name, flags)); |
133 if (code->IsUndefined()) { | 142 if (probe->IsCode()) return Handle<Code>::cast(probe); |
Kevin Millikin (Chromium)
2011/10/18 08:46:47
I like a blank line right after this one, to highl
ulan
2011/10/18 09:31:00
Done.
| |
134 LoadStubCompiler compiler; | 143 LoadStubCompiler compiler(isolate_); |
135 { MaybeObject* maybe_code = | 144 Handle<Code> code = |
136 compiler.CompileLoadNonexistent(cache_name, receiver, last); | 145 compiler.CompileLoadNonexistent(cache_name, receiver, last); |
137 if (!maybe_code->ToObject(&code)) return maybe_code; | 146 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *cache_name)); |
138 } | 147 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *cache_name, *code)); |
Kevin Millikin (Chromium)
2011/10/18 08:46:47
I think that this code is ignored unless we set up
| |
139 PROFILE(isolate_, | 148 JSObject::UpdateMapCodeCache(isolate_, receiver, cache_name, code); |
140 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), cache_name)); | |
141 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, cache_name, Code::cast(code))); | |
142 Object* result; | |
143 { MaybeObject* maybe_result = | |
144 receiver->UpdateMapCodeCache(cache_name, Code::cast(code)); | |
145 if (!maybe_result->ToObject(&result)) return maybe_result; | |
146 } | |
147 } | |
148 return code; | 149 return code; |
149 } | 150 } |
150 | 151 |
151 | 152 |
152 MaybeObject* StubCache::ComputeLoadField(String* name, | 153 Handle<Code> LoadStubCompiler::CompileLoadField(Handle<JSObject> object, |
153 JSObject* receiver, | 154 Handle<JSObject> holder, |
154 JSObject* holder, | 155 int index, |
156 Handle<String> name) { | |
157 CALL_HEAP_FUNCTION(isolate(), | |
158 CompileLoadField(*object, *holder, index, *name), | |
159 Code); | |
160 } | |
161 | |
162 | |
163 Handle<Code> StubCache::ComputeLoadField(Handle<String> name, | |
164 Handle<JSObject> receiver, | |
165 Handle<JSObject> holder, | |
155 int field_index) { | 166 int field_index) { |
156 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 167 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
157 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, FIELD); | 168 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, FIELD); |
158 Object* code = receiver->map()->FindInCodeCache(name, flags); | 169 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
159 if (code->IsUndefined()) { | 170 if (probe->IsCode()) return Handle<Code>::cast(probe); |
160 LoadStubCompiler compiler; | 171 LoadStubCompiler compiler(isolate_); |
161 { MaybeObject* maybe_code = | 172 Handle<Code> code = |
162 compiler.CompileLoadField(receiver, holder, field_index, name); | 173 compiler.CompileLoadField(receiver, holder, field_index, name); |
163 if (!maybe_code->ToObject(&code)) return maybe_code; | 174 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
164 } | 175 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
165 PROFILE(isolate_, | 176 JSObject::UpdateMapCodeCache(isolate_, receiver, name, code); |
166 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); | |
167 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); | |
168 Object* result; | |
169 { MaybeObject* maybe_result = | |
170 receiver->UpdateMapCodeCache(name, Code::cast(code)); | |
171 if (!maybe_result->ToObject(&result)) return maybe_result; | |
172 } | |
173 } | |
174 return code; | 177 return code; |
175 } | 178 } |
176 | 179 |
177 | 180 |
178 MaybeObject* StubCache::ComputeLoadCallback(String* name, | 181 Handle<Code> LoadStubCompiler::CompileLoadCallback( |
179 JSObject* receiver, | 182 Handle<String> name, |
180 JSObject* holder, | 183 Handle<JSObject> object, |
181 AccessorInfo* callback) { | 184 Handle<JSObject> holder, |
185 Handle<AccessorInfo> callback) { | |
186 CALL_HEAP_FUNCTION(isolate(), | |
187 CompileLoadCallback(*name, *object, *holder, *callback), | |
188 Code); | |
189 } | |
190 | |
191 | |
192 Handle<Code> StubCache::ComputeLoadCallback(Handle<String> name, | |
193 Handle<JSObject> receiver, | |
194 Handle<JSObject> holder, | |
195 Handle<AccessorInfo> callback) { | |
182 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); | 196 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); |
183 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 197 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
184 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, CALLBACKS); | 198 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, CALLBACKS); |
185 Object* code = receiver->map()->FindInCodeCache(name, flags); | 199 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
186 if (code->IsUndefined()) { | 200 if (probe->IsCode()) return Handle<Code>::cast(probe); |
187 LoadStubCompiler compiler; | 201 LoadStubCompiler compiler(isolate_); |
188 { MaybeObject* maybe_code = | 202 Handle<Code> code = |
189 compiler.CompileLoadCallback(name, receiver, holder, callback); | 203 compiler.CompileLoadCallback(name, receiver, holder, callback); |
190 if (!maybe_code->ToObject(&code)) return maybe_code; | 204 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
191 } | 205 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
192 PROFILE(isolate_, | 206 JSObject::UpdateMapCodeCache(isolate_, receiver, name, code); |
193 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); | |
194 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); | |
195 Object* result; | |
196 { MaybeObject* maybe_result = | |
197 receiver->UpdateMapCodeCache(name, Code::cast(code)); | |
198 if (!maybe_result->ToObject(&result)) return maybe_result; | |
199 } | |
200 } | |
201 return code; | 207 return code; |
202 } | 208 } |
203 | 209 |
204 | 210 |
205 MaybeObject* StubCache::ComputeLoadConstant(String* name, | 211 Handle<Code> LoadStubCompiler::CompileLoadConstant(Handle<JSObject> object, |
206 JSObject* receiver, | 212 Handle<JSObject> holder, |
207 JSObject* holder, | 213 Handle<Object> value, |
208 Object* value) { | 214 Handle<String> name) { |
209 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 215 CALL_HEAP_FUNCTION(isolate(), |
216 CompileLoadConstant(*object, *holder, *value, *name), | |
217 Code); | |
218 } | |
219 | |
220 | |
221 Handle<Code> StubCache::ComputeLoadConstant(Handle<String> name, | |
222 Handle<JSObject> receiver, | |
223 Handle<JSObject> holder, | |
224 Handle<Object> value) { | |
225 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | |
210 Code::Flags flags = | 226 Code::Flags flags = |
211 Code::ComputeMonomorphicFlags(Code::LOAD_IC, CONSTANT_FUNCTION); | 227 Code::ComputeMonomorphicFlags(Code::LOAD_IC, CONSTANT_FUNCTION); |
212 Object* code = receiver->map()->FindInCodeCache(name, flags); | 228 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
213 if (code->IsUndefined()) { | 229 if (probe->IsCode()) return Handle<Code>::cast(probe); |
214 LoadStubCompiler compiler; | 230 LoadStubCompiler compiler(isolate_); |
215 { MaybeObject* maybe_code = | 231 Handle<Code> code = |
216 compiler.CompileLoadConstant(receiver, holder, value, name); | 232 compiler.CompileLoadConstant(receiver, holder, value, name); |
217 if (!maybe_code->ToObject(&code)) return maybe_code; | 233 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
218 } | 234 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
219 PROFILE(isolate_, | 235 JSObject::UpdateMapCodeCache(isolate_, receiver, name, code); |
220 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); | |
221 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); | |
222 Object* result; | |
223 { MaybeObject* maybe_result = | |
224 receiver->UpdateMapCodeCache(name, Code::cast(code)); | |
225 if (!maybe_result->ToObject(&result)) return maybe_result; | |
226 } | |
227 } | |
228 return code; | 236 return code; |
229 } | 237 } |
230 | 238 |
231 | 239 |
232 MaybeObject* StubCache::ComputeLoadInterceptor(String* name, | 240 Handle<Code> LoadStubCompiler::CompileLoadInterceptor(Handle<JSObject> object, |
233 JSObject* receiver, | 241 Handle<JSObject> holder, |
234 JSObject* holder) { | 242 Handle<String> name) { |
235 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 243 CALL_HEAP_FUNCTION(isolate(), |
244 CompileLoadInterceptor(*object, *holder, *name), | |
245 Code); | |
246 } | |
247 | |
248 | |
249 Handle<Code> StubCache::ComputeLoadInterceptor(Handle<String> name, | |
250 Handle<JSObject> receiver, | |
251 Handle<JSObject> holder) { | |
252 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | |
236 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, INTERCEPTOR); | 253 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, INTERCEPTOR); |
237 Object* code = receiver->map()->FindInCodeCache(name, flags); | 254 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
238 if (code->IsUndefined()) { | 255 if (probe->IsCode()) return Handle<Code>::cast(probe); |
239 LoadStubCompiler compiler; | 256 LoadStubCompiler compiler(isolate_); |
240 { MaybeObject* maybe_code = | 257 Handle<Code> code = |
241 compiler.CompileLoadInterceptor(receiver, holder, name); | 258 compiler.CompileLoadInterceptor(receiver, holder, name); |
242 if (!maybe_code->ToObject(&code)) return maybe_code; | 259 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
243 } | 260 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
244 PROFILE(isolate_, | 261 JSObject::UpdateMapCodeCache(isolate_, receiver, name, code); |
245 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); | |
246 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); | |
247 Object* result; | |
248 { MaybeObject* maybe_result = | |
249 receiver->UpdateMapCodeCache(name, Code::cast(code)); | |
250 if (!maybe_result->ToObject(&result)) return maybe_result; | |
251 } | |
252 } | |
253 return code; | 262 return code; |
254 } | 263 } |
255 | 264 |
256 | 265 |
257 MaybeObject* StubCache::ComputeLoadNormal() { | 266 Handle<Code> StubCache::ComputeLoadNormal() { |
258 return isolate_->builtins()->builtin(Builtins::kLoadIC_Normal); | 267 return isolate_->builtins()->LoadIC_Normal(); |
259 } | 268 } |
260 | 269 |
261 | 270 Handle<Code> LoadStubCompiler::CompileLoadGlobal( |
262 MaybeObject* StubCache::ComputeLoadGlobal(String* name, | 271 Handle<JSObject> object, |
263 JSObject* receiver, | 272 Handle<GlobalObject> holder, |
264 GlobalObject* holder, | 273 Handle<JSGlobalPropertyCell> cell, |
265 JSGlobalPropertyCell* cell, | 274 Handle<String> name, |
275 bool is_dont_delete) { | |
276 CALL_HEAP_FUNCTION(isolate(), | |
277 CompileLoadGlobal(*object, | |
278 *holder, | |
279 *cell, | |
280 *name, | |
281 is_dont_delete), | |
282 Code); | |
283 } | |
284 Handle<Code> StubCache::ComputeLoadGlobal(Handle<String> name, | |
285 Handle<JSObject> receiver, | |
286 Handle<GlobalObject> holder, | |
287 Handle<JSGlobalPropertyCell> cell, | |
266 bool is_dont_delete) { | 288 bool is_dont_delete) { |
267 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 289 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
268 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, NORMAL); | 290 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, NORMAL); |
269 Object* code = receiver->map()->FindInCodeCache(name, flags); | 291 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
270 if (code->IsUndefined()) { | 292 if (probe->IsCode()) return Handle<Code>::cast(probe); |
271 LoadStubCompiler compiler; | 293 LoadStubCompiler compiler(isolate_); |
272 { MaybeObject* maybe_code = compiler.CompileLoadGlobal(receiver, | 294 Handle<Code> code = |
273 holder, | 295 compiler.CompileLoadGlobal(receiver, holder, cell, name, is_dont_delete); |
274 cell, | 296 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
275 name, | 297 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
276 is_dont_delete); | 298 JSObject::UpdateMapCodeCache(isolate_, receiver, name, code); |
277 if (!maybe_code->ToObject(&code)) return maybe_code; | |
278 } | |
279 PROFILE(isolate_, | |
280 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); | |
281 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); | |
282 Object* result; | |
283 { MaybeObject* maybe_result = | |
284 receiver->UpdateMapCodeCache(name, Code::cast(code)); | |
285 if (!maybe_result->ToObject(&result)) return maybe_result; | |
286 } | |
287 } | |
288 return code; | 299 return code; |
289 } | 300 } |
290 | 301 |
291 | 302 |
292 MaybeObject* StubCache::ComputeKeyedLoadField(String* name, | 303 MaybeObject* StubCache::ComputeKeyedLoadField(String* name, |
293 JSObject* receiver, | 304 JSObject* receiver, |
294 JSObject* holder, | 305 JSObject* holder, |
295 int field_index) { | 306 int field_index) { |
296 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 307 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
297 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, FIELD); | 308 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, FIELD); |
298 Object* code = receiver->map()->FindInCodeCache(name, flags); | 309 Object* code = receiver->map()->FindInCodeCache(name, flags); |
299 if (code->IsUndefined()) { | 310 if (code->IsUndefined()) { |
300 KeyedLoadStubCompiler compiler; | 311 HandleScope scope(isolate_); |
312 KeyedLoadStubCompiler compiler(isolate_); | |
301 { MaybeObject* maybe_code = | 313 { MaybeObject* maybe_code = |
302 compiler.CompileLoadField(name, receiver, holder, field_index); | 314 compiler.CompileLoadField(name, receiver, holder, field_index); |
303 if (!maybe_code->ToObject(&code)) return maybe_code; | 315 if (!maybe_code->ToObject(&code)) return maybe_code; |
304 } | 316 } |
305 PROFILE(isolate_, | 317 PROFILE(isolate_, |
306 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 318 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
307 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 319 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
308 Object* result; | 320 Object* result; |
309 { MaybeObject* maybe_result = | 321 { MaybeObject* maybe_result = |
310 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 322 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
311 if (!maybe_result->ToObject(&result)) return maybe_result; | 323 if (!maybe_result->ToObject(&result)) return maybe_result; |
312 } | 324 } |
313 } | 325 } |
314 return code; | 326 return code; |
315 } | 327 } |
316 | 328 |
317 | 329 |
318 MaybeObject* StubCache::ComputeKeyedLoadConstant(String* name, | 330 MaybeObject* StubCache::ComputeKeyedLoadConstant(String* name, |
319 JSObject* receiver, | 331 JSObject* receiver, |
320 JSObject* holder, | 332 JSObject* holder, |
321 Object* value) { | 333 Object* value) { |
322 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 334 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
323 Code::Flags flags = | 335 Code::Flags flags = |
324 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CONSTANT_FUNCTION); | 336 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CONSTANT_FUNCTION); |
325 Object* code = receiver->map()->FindInCodeCache(name, flags); | 337 Object* code = receiver->map()->FindInCodeCache(name, flags); |
326 if (code->IsUndefined()) { | 338 if (code->IsUndefined()) { |
327 KeyedLoadStubCompiler compiler; | 339 HandleScope scope(isolate_); |
340 KeyedLoadStubCompiler compiler(isolate_); | |
328 { MaybeObject* maybe_code = | 341 { MaybeObject* maybe_code = |
329 compiler.CompileLoadConstant(name, receiver, holder, value); | 342 compiler.CompileLoadConstant(name, receiver, holder, value); |
330 if (!maybe_code->ToObject(&code)) return maybe_code; | 343 if (!maybe_code->ToObject(&code)) return maybe_code; |
331 } | 344 } |
332 PROFILE(isolate_, | 345 PROFILE(isolate_, |
333 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 346 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
334 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 347 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
335 Object* result; | 348 Object* result; |
336 { MaybeObject* maybe_result = | 349 { MaybeObject* maybe_result = |
337 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 350 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
338 if (!maybe_result->ToObject(&result)) return maybe_result; | 351 if (!maybe_result->ToObject(&result)) return maybe_result; |
339 } | 352 } |
340 } | 353 } |
341 return code; | 354 return code; |
342 } | 355 } |
343 | 356 |
344 | 357 |
345 MaybeObject* StubCache::ComputeKeyedLoadInterceptor(String* name, | 358 MaybeObject* StubCache::ComputeKeyedLoadInterceptor(String* name, |
346 JSObject* receiver, | 359 JSObject* receiver, |
347 JSObject* holder) { | 360 JSObject* holder) { |
348 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 361 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
349 Code::Flags flags = | 362 Code::Flags flags = |
350 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, INTERCEPTOR); | 363 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, INTERCEPTOR); |
351 Object* code = receiver->map()->FindInCodeCache(name, flags); | 364 Object* code = receiver->map()->FindInCodeCache(name, flags); |
352 if (code->IsUndefined()) { | 365 if (code->IsUndefined()) { |
353 KeyedLoadStubCompiler compiler; | 366 HandleScope scope(isolate_); |
367 KeyedLoadStubCompiler compiler(isolate_); | |
354 { MaybeObject* maybe_code = | 368 { MaybeObject* maybe_code = |
355 compiler.CompileLoadInterceptor(receiver, holder, name); | 369 compiler.CompileLoadInterceptor(receiver, holder, name); |
356 if (!maybe_code->ToObject(&code)) return maybe_code; | 370 if (!maybe_code->ToObject(&code)) return maybe_code; |
357 } | 371 } |
358 PROFILE(isolate_, | 372 PROFILE(isolate_, |
359 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 373 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
360 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 374 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
361 Object* result; | 375 Object* result; |
362 { MaybeObject* maybe_result = | 376 { MaybeObject* maybe_result = |
363 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 377 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
364 if (!maybe_result->ToObject(&result)) return maybe_result; | 378 if (!maybe_result->ToObject(&result)) return maybe_result; |
365 } | 379 } |
366 } | 380 } |
367 return code; | 381 return code; |
368 } | 382 } |
369 | 383 |
370 | 384 |
371 MaybeObject* StubCache::ComputeKeyedLoadCallback(String* name, | 385 MaybeObject* StubCache::ComputeKeyedLoadCallback(String* name, |
372 JSObject* receiver, | 386 JSObject* receiver, |
373 JSObject* holder, | 387 JSObject* holder, |
374 AccessorInfo* callback) { | 388 AccessorInfo* callback) { |
375 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 389 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
376 Code::Flags flags = | 390 Code::Flags flags = |
377 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); | 391 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); |
378 Object* code = receiver->map()->FindInCodeCache(name, flags); | 392 Object* code = receiver->map()->FindInCodeCache(name, flags); |
379 if (code->IsUndefined()) { | 393 if (code->IsUndefined()) { |
380 KeyedLoadStubCompiler compiler; | 394 HandleScope scope(isolate_); |
395 KeyedLoadStubCompiler compiler(isolate_); | |
381 { MaybeObject* maybe_code = | 396 { MaybeObject* maybe_code = |
382 compiler.CompileLoadCallback(name, receiver, holder, callback); | 397 compiler.CompileLoadCallback(name, receiver, holder, callback); |
383 if (!maybe_code->ToObject(&code)) return maybe_code; | 398 if (!maybe_code->ToObject(&code)) return maybe_code; |
384 } | 399 } |
385 PROFILE(isolate_, | 400 PROFILE(isolate_, |
386 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 401 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
387 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 402 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
388 Object* result; | 403 Object* result; |
389 { MaybeObject* maybe_result = | 404 { MaybeObject* maybe_result = |
390 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 405 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
391 if (!maybe_result->ToObject(&result)) return maybe_result; | 406 if (!maybe_result->ToObject(&result)) return maybe_result; |
392 } | 407 } |
393 } | 408 } |
394 return code; | 409 return code; |
395 } | 410 } |
396 | 411 |
397 | 412 |
398 | 413 |
399 MaybeObject* StubCache::ComputeKeyedLoadArrayLength(String* name, | 414 MaybeObject* StubCache::ComputeKeyedLoadArrayLength(String* name, |
400 JSArray* receiver) { | 415 JSArray* receiver) { |
401 Code::Flags flags = | 416 Code::Flags flags = |
402 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); | 417 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); |
403 ASSERT(receiver->IsJSObject()); | 418 ASSERT(receiver->IsJSObject()); |
404 Object* code = receiver->map()->FindInCodeCache(name, flags); | 419 Object* code = receiver->map()->FindInCodeCache(name, flags); |
405 if (code->IsUndefined()) { | 420 if (code->IsUndefined()) { |
406 KeyedLoadStubCompiler compiler; | 421 HandleScope scope(isolate_); |
422 KeyedLoadStubCompiler compiler(isolate_); | |
407 { MaybeObject* maybe_code = compiler.CompileLoadArrayLength(name); | 423 { MaybeObject* maybe_code = compiler.CompileLoadArrayLength(name); |
408 if (!maybe_code->ToObject(&code)) return maybe_code; | 424 if (!maybe_code->ToObject(&code)) return maybe_code; |
409 } | 425 } |
410 PROFILE(isolate_, | 426 PROFILE(isolate_, |
411 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 427 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
412 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 428 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
413 Object* result; | 429 Object* result; |
414 { MaybeObject* maybe_result = | 430 { MaybeObject* maybe_result = |
415 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 431 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
416 if (!maybe_result->ToObject(&result)) return maybe_result; | 432 if (!maybe_result->ToObject(&result)) return maybe_result; |
417 } | 433 } |
418 } | 434 } |
419 return code; | 435 return code; |
420 } | 436 } |
421 | 437 |
422 | 438 |
423 MaybeObject* StubCache::ComputeKeyedLoadStringLength(String* name, | 439 MaybeObject* StubCache::ComputeKeyedLoadStringLength(String* name, |
424 String* receiver) { | 440 String* receiver) { |
425 Code::Flags flags = | 441 Code::Flags flags = |
426 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); | 442 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); |
427 Map* map = receiver->map(); | 443 Map* map = receiver->map(); |
428 Object* code = map->FindInCodeCache(name, flags); | 444 Object* code = map->FindInCodeCache(name, flags); |
429 if (code->IsUndefined()) { | 445 if (code->IsUndefined()) { |
430 KeyedLoadStubCompiler compiler; | 446 HandleScope scope(isolate_); |
447 KeyedLoadStubCompiler compiler(isolate_); | |
431 { MaybeObject* maybe_code = compiler.CompileLoadStringLength(name); | 448 { MaybeObject* maybe_code = compiler.CompileLoadStringLength(name); |
432 if (!maybe_code->ToObject(&code)) return maybe_code; | 449 if (!maybe_code->ToObject(&code)) return maybe_code; |
433 } | 450 } |
434 PROFILE(isolate_, | 451 PROFILE(isolate_, |
435 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 452 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
436 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 453 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
437 Object* result; | 454 Object* result; |
438 { MaybeObject* maybe_result = map->UpdateCodeCache(name, Code::cast(code)); | 455 { MaybeObject* maybe_result = map->UpdateCodeCache(name, Code::cast(code)); |
439 if (!maybe_result->ToObject(&result)) return maybe_result; | 456 if (!maybe_result->ToObject(&result)) return maybe_result; |
440 } | 457 } |
441 } | 458 } |
442 return code; | 459 return code; |
443 } | 460 } |
444 | 461 |
445 | 462 |
446 MaybeObject* StubCache::ComputeKeyedLoadFunctionPrototype( | 463 MaybeObject* StubCache::ComputeKeyedLoadFunctionPrototype( |
447 String* name, | 464 String* name, |
448 JSFunction* receiver) { | 465 JSFunction* receiver) { |
449 Code::Flags flags = | 466 Code::Flags flags = |
450 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); | 467 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); |
451 Object* code = receiver->map()->FindInCodeCache(name, flags); | 468 Object* code = receiver->map()->FindInCodeCache(name, flags); |
452 if (code->IsUndefined()) { | 469 if (code->IsUndefined()) { |
453 KeyedLoadStubCompiler compiler; | 470 HandleScope scope(isolate_); |
471 KeyedLoadStubCompiler compiler(isolate_); | |
454 { MaybeObject* maybe_code = compiler.CompileLoadFunctionPrototype(name); | 472 { MaybeObject* maybe_code = compiler.CompileLoadFunctionPrototype(name); |
455 if (!maybe_code->ToObject(&code)) return maybe_code; | 473 if (!maybe_code->ToObject(&code)) return maybe_code; |
456 } | 474 } |
457 PROFILE(isolate_, | 475 PROFILE(isolate_, |
458 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 476 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
459 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 477 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
460 Object* result; | 478 Object* result; |
461 { MaybeObject* maybe_result = | 479 { MaybeObject* maybe_result = |
462 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 480 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
463 if (!maybe_result->ToObject(&result)) return maybe_result; | 481 if (!maybe_result->ToObject(&result)) return maybe_result; |
464 } | 482 } |
465 } | 483 } |
466 return code; | 484 return code; |
467 } | 485 } |
468 | 486 |
469 | 487 |
470 MaybeObject* StubCache::ComputeStoreField(String* name, | 488 MaybeObject* StubCache::ComputeStoreField(String* name, |
471 JSObject* receiver, | 489 JSObject* receiver, |
472 int field_index, | 490 int field_index, |
473 Map* transition, | 491 Map* transition, |
474 StrictModeFlag strict_mode) { | 492 StrictModeFlag strict_mode) { |
475 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; | 493 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; |
476 Code::Flags flags = Code::ComputeMonomorphicFlags( | 494 Code::Flags flags = Code::ComputeMonomorphicFlags( |
477 Code::STORE_IC, type, strict_mode); | 495 Code::STORE_IC, type, strict_mode); |
478 Object* code = receiver->map()->FindInCodeCache(name, flags); | 496 Object* code = receiver->map()->FindInCodeCache(name, flags); |
479 if (code->IsUndefined()) { | 497 if (code->IsUndefined()) { |
480 StoreStubCompiler compiler(strict_mode); | 498 HandleScope scope(isolate_); |
499 StoreStubCompiler compiler(isolate_, strict_mode); | |
481 { MaybeObject* maybe_code = | 500 { MaybeObject* maybe_code = |
482 compiler.CompileStoreField(receiver, field_index, transition, name); | 501 compiler.CompileStoreField(receiver, field_index, transition, name); |
483 if (!maybe_code->ToObject(&code)) return maybe_code; | 502 if (!maybe_code->ToObject(&code)) return maybe_code; |
484 } | 503 } |
485 PROFILE(isolate_, | 504 PROFILE(isolate_, |
486 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); | 505 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); |
487 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); | 506 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); |
488 Object* result; | 507 Object* result; |
489 { MaybeObject* maybe_result = | 508 { MaybeObject* maybe_result = |
490 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 509 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
(...skipping 26 matching lines...) Expand all Loading... | |
517 UNREACHABLE(); | 536 UNREACHABLE(); |
518 break; | 537 break; |
519 } | 538 } |
520 Object* maybe_code = receiver->map()->FindInCodeCache(name, flags); | 539 Object* maybe_code = receiver->map()->FindInCodeCache(name, flags); |
521 if (!maybe_code->IsUndefined()) return Code::cast(maybe_code); | 540 if (!maybe_code->IsUndefined()) return Code::cast(maybe_code); |
522 | 541 |
523 Map* receiver_map = receiver->map(); | 542 Map* receiver_map = receiver->map(); |
524 MaybeObject* maybe_new_code = NULL; | 543 MaybeObject* maybe_new_code = NULL; |
525 switch (stub_kind) { | 544 switch (stub_kind) { |
526 case KeyedIC::LOAD: { | 545 case KeyedIC::LOAD: { |
527 KeyedLoadStubCompiler compiler; | 546 HandleScope scope(isolate_); |
547 KeyedLoadStubCompiler compiler(isolate_); | |
528 maybe_new_code = compiler.CompileLoadElement(receiver_map); | 548 maybe_new_code = compiler.CompileLoadElement(receiver_map); |
529 break; | 549 break; |
530 } | 550 } |
531 case KeyedIC::STORE_NO_TRANSITION: { | 551 case KeyedIC::STORE_NO_TRANSITION: { |
532 KeyedStoreStubCompiler compiler(strict_mode); | 552 HandleScope scope(isolate_); |
553 KeyedStoreStubCompiler compiler(isolate_, strict_mode); | |
533 maybe_new_code = compiler.CompileStoreElement(receiver_map); | 554 maybe_new_code = compiler.CompileStoreElement(receiver_map); |
534 break; | 555 break; |
535 } | 556 } |
536 default: | 557 default: |
537 UNREACHABLE(); | 558 UNREACHABLE(); |
538 break; | 559 break; |
539 } | 560 } |
540 Code* code = NULL; | 561 Code* code = NULL; |
541 if (!maybe_new_code->To(&code)) return maybe_new_code; | 562 if (!maybe_new_code->To(&code)) return maybe_new_code; |
542 | 563 |
(...skipping 24 matching lines...) Expand all Loading... | |
567 | 588 |
568 | 589 |
569 MaybeObject* StubCache::ComputeStoreGlobal(String* name, | 590 MaybeObject* StubCache::ComputeStoreGlobal(String* name, |
570 GlobalObject* receiver, | 591 GlobalObject* receiver, |
571 JSGlobalPropertyCell* cell, | 592 JSGlobalPropertyCell* cell, |
572 StrictModeFlag strict_mode) { | 593 StrictModeFlag strict_mode) { |
573 Code::Flags flags = Code::ComputeMonomorphicFlags( | 594 Code::Flags flags = Code::ComputeMonomorphicFlags( |
574 Code::STORE_IC, NORMAL, strict_mode); | 595 Code::STORE_IC, NORMAL, strict_mode); |
575 Object* code = receiver->map()->FindInCodeCache(name, flags); | 596 Object* code = receiver->map()->FindInCodeCache(name, flags); |
576 if (code->IsUndefined()) { | 597 if (code->IsUndefined()) { |
577 StoreStubCompiler compiler(strict_mode); | 598 HandleScope scope(isolate_); |
599 StoreStubCompiler compiler(isolate_, strict_mode); | |
578 { MaybeObject* maybe_code = | 600 { MaybeObject* maybe_code = |
579 compiler.CompileStoreGlobal(receiver, cell, name); | 601 compiler.CompileStoreGlobal(receiver, cell, name); |
580 if (!maybe_code->ToObject(&code)) return maybe_code; | 602 if (!maybe_code->ToObject(&code)) return maybe_code; |
581 } | 603 } |
582 PROFILE(isolate_, | 604 PROFILE(isolate_, |
583 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); | 605 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); |
584 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); | 606 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); |
585 Object* result; | 607 Object* result; |
586 { MaybeObject* maybe_result = | 608 { MaybeObject* maybe_result = |
587 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 609 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
588 if (!maybe_result->ToObject(&result)) return maybe_result; | 610 if (!maybe_result->ToObject(&result)) return maybe_result; |
589 } | 611 } |
590 } | 612 } |
591 return code; | 613 return code; |
592 } | 614 } |
593 | 615 |
594 | 616 |
595 MaybeObject* StubCache::ComputeStoreCallback( | 617 MaybeObject* StubCache::ComputeStoreCallback( |
596 String* name, | 618 String* name, |
597 JSObject* receiver, | 619 JSObject* receiver, |
598 AccessorInfo* callback, | 620 AccessorInfo* callback, |
599 StrictModeFlag strict_mode) { | 621 StrictModeFlag strict_mode) { |
600 ASSERT(v8::ToCData<Address>(callback->setter()) != 0); | 622 ASSERT(v8::ToCData<Address>(callback->setter()) != 0); |
601 Code::Flags flags = Code::ComputeMonomorphicFlags( | 623 Code::Flags flags = Code::ComputeMonomorphicFlags( |
602 Code::STORE_IC, CALLBACKS, strict_mode); | 624 Code::STORE_IC, CALLBACKS, strict_mode); |
603 Object* code = receiver->map()->FindInCodeCache(name, flags); | 625 Object* code = receiver->map()->FindInCodeCache(name, flags); |
604 if (code->IsUndefined()) { | 626 if (code->IsUndefined()) { |
605 StoreStubCompiler compiler(strict_mode); | 627 HandleScope scope(isolate_); |
628 StoreStubCompiler compiler(isolate_, strict_mode); | |
606 { MaybeObject* maybe_code = | 629 { MaybeObject* maybe_code = |
607 compiler.CompileStoreCallback(receiver, callback, name); | 630 compiler.CompileStoreCallback(receiver, callback, name); |
608 if (!maybe_code->ToObject(&code)) return maybe_code; | 631 if (!maybe_code->ToObject(&code)) return maybe_code; |
609 } | 632 } |
610 PROFILE(isolate_, | 633 PROFILE(isolate_, |
611 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); | 634 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); |
612 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); | 635 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); |
613 Object* result; | 636 Object* result; |
614 { MaybeObject* maybe_result = | 637 { MaybeObject* maybe_result = |
615 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 638 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
616 if (!maybe_result->ToObject(&result)) return maybe_result; | 639 if (!maybe_result->ToObject(&result)) return maybe_result; |
617 } | 640 } |
618 } | 641 } |
619 return code; | 642 return code; |
620 } | 643 } |
621 | 644 |
622 | 645 |
623 MaybeObject* StubCache::ComputeStoreInterceptor( | 646 MaybeObject* StubCache::ComputeStoreInterceptor( |
624 String* name, | 647 String* name, |
625 JSObject* receiver, | 648 JSObject* receiver, |
626 StrictModeFlag strict_mode) { | 649 StrictModeFlag strict_mode) { |
627 Code::Flags flags = Code::ComputeMonomorphicFlags( | 650 Code::Flags flags = Code::ComputeMonomorphicFlags( |
628 Code::STORE_IC, INTERCEPTOR, strict_mode); | 651 Code::STORE_IC, INTERCEPTOR, strict_mode); |
629 Object* code = receiver->map()->FindInCodeCache(name, flags); | 652 Object* code = receiver->map()->FindInCodeCache(name, flags); |
630 if (code->IsUndefined()) { | 653 if (code->IsUndefined()) { |
631 StoreStubCompiler compiler(strict_mode); | 654 HandleScope scope(isolate_); |
655 StoreStubCompiler compiler(isolate_, strict_mode); | |
632 { MaybeObject* maybe_code = | 656 { MaybeObject* maybe_code = |
633 compiler.CompileStoreInterceptor(receiver, name); | 657 compiler.CompileStoreInterceptor(receiver, name); |
634 if (!maybe_code->ToObject(&code)) return maybe_code; | 658 if (!maybe_code->ToObject(&code)) return maybe_code; |
635 } | 659 } |
636 PROFILE(isolate_, | 660 PROFILE(isolate_, |
637 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); | 661 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); |
638 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); | 662 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); |
639 Object* result; | 663 Object* result; |
640 { MaybeObject* maybe_result = | 664 { MaybeObject* maybe_result = |
641 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 665 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
642 if (!maybe_result->ToObject(&result)) return maybe_result; | 666 if (!maybe_result->ToObject(&result)) return maybe_result; |
643 } | 667 } |
644 } | 668 } |
645 return code; | 669 return code; |
646 } | 670 } |
647 | 671 |
648 | 672 |
649 MaybeObject* StubCache::ComputeKeyedStoreField(String* name, | 673 MaybeObject* StubCache::ComputeKeyedStoreField(String* name, |
650 JSObject* receiver, | 674 JSObject* receiver, |
651 int field_index, | 675 int field_index, |
652 Map* transition, | 676 Map* transition, |
653 StrictModeFlag strict_mode) { | 677 StrictModeFlag strict_mode) { |
654 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; | 678 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; |
655 Code::Flags flags = Code::ComputeMonomorphicFlags( | 679 Code::Flags flags = Code::ComputeMonomorphicFlags( |
656 Code::KEYED_STORE_IC, type, strict_mode); | 680 Code::KEYED_STORE_IC, type, strict_mode); |
657 Object* code = receiver->map()->FindInCodeCache(name, flags); | 681 Object* code = receiver->map()->FindInCodeCache(name, flags); |
658 if (code->IsUndefined()) { | 682 if (code->IsUndefined()) { |
659 KeyedStoreStubCompiler compiler(strict_mode); | 683 HandleScope scope(isolate()); |
684 KeyedStoreStubCompiler compiler(isolate(), strict_mode); | |
660 { MaybeObject* maybe_code = | 685 { MaybeObject* maybe_code = |
661 compiler.CompileStoreField(receiver, field_index, transition, name); | 686 compiler.CompileStoreField(receiver, field_index, transition, name); |
662 if (!maybe_code->ToObject(&code)) return maybe_code; | 687 if (!maybe_code->ToObject(&code)) return maybe_code; |
663 } | 688 } |
664 PROFILE(isolate(), | 689 PROFILE(isolate(), |
665 CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, | 690 CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, |
666 Code::cast(code), name)); | 691 Code::cast(code), name)); |
667 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, name, Code::cast(code))); | 692 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, name, Code::cast(code))); |
668 Object* result; | 693 Object* result; |
669 { MaybeObject* maybe_result = | 694 { MaybeObject* maybe_result = |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
705 cache_holder, | 730 cache_holder, |
706 argc); | 731 argc); |
707 Object* code = map_holder->map()->FindInCodeCache(name, flags); | 732 Object* code = map_holder->map()->FindInCodeCache(name, flags); |
708 if (code->IsUndefined()) { | 733 if (code->IsUndefined()) { |
709 // If the function hasn't been compiled yet, we cannot do it now | 734 // If the function hasn't been compiled yet, we cannot do it now |
710 // because it may cause GC. To avoid this issue, we return an | 735 // because it may cause GC. To avoid this issue, we return an |
711 // internal error which will make sure we do not update any | 736 // internal error which will make sure we do not update any |
712 // caches. | 737 // caches. |
713 if (!function->is_compiled()) return Failure::InternalError(); | 738 if (!function->is_compiled()) return Failure::InternalError(); |
714 // Compile the stub - only create stubs for fully compiled functions. | 739 // Compile the stub - only create stubs for fully compiled functions. |
715 CallStubCompiler compiler(argc, kind, extra_ic_state, cache_holder); | 740 HandleScope scope(isolate_); |
741 CallStubCompiler compiler(isolate_, | |
742 argc, | |
743 kind, | |
744 extra_ic_state, | |
745 cache_holder); | |
716 { MaybeObject* maybe_code = | 746 { MaybeObject* maybe_code = |
717 compiler.CompileCallConstant(object, holder, function, name, check); | 747 compiler.CompileCallConstant(object, holder, function, name, check); |
718 if (!maybe_code->ToObject(&code)) return maybe_code; | 748 if (!maybe_code->ToObject(&code)) return maybe_code; |
719 } | 749 } |
720 Code::cast(code)->set_check_type(check); | 750 Code::cast(code)->set_check_type(check); |
721 ASSERT_EQ(flags, Code::cast(code)->flags()); | 751 ASSERT_EQ(flags, Code::cast(code)->flags()); |
722 PROFILE(isolate_, | 752 PROFILE(isolate_, |
723 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), | 753 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), |
724 Code::cast(code), name)); | 754 Code::cast(code), name)); |
725 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); | 755 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); |
(...skipping 26 matching lines...) Expand all Loading... | |
752 object = holder; | 782 object = holder; |
753 } | 783 } |
754 | 784 |
755 Code::Flags flags = Code::ComputeMonomorphicFlags(kind, | 785 Code::Flags flags = Code::ComputeMonomorphicFlags(kind, |
756 FIELD, | 786 FIELD, |
757 extra_ic_state, | 787 extra_ic_state, |
758 cache_holder, | 788 cache_holder, |
759 argc); | 789 argc); |
760 Object* code = map_holder->map()->FindInCodeCache(name, flags); | 790 Object* code = map_holder->map()->FindInCodeCache(name, flags); |
761 if (code->IsUndefined()) { | 791 if (code->IsUndefined()) { |
762 CallStubCompiler compiler(argc, kind, extra_ic_state, cache_holder); | 792 HandleScope scope(isolate_); |
793 CallStubCompiler compiler(isolate_, | |
794 argc, | |
795 kind, | |
796 extra_ic_state, | |
797 cache_holder); | |
763 { MaybeObject* maybe_code = | 798 { MaybeObject* maybe_code = |
764 compiler.CompileCallField(JSObject::cast(object), | 799 compiler.CompileCallField(JSObject::cast(object), |
765 holder, | 800 holder, |
766 index, | 801 index, |
767 name); | 802 name); |
768 if (!maybe_code->ToObject(&code)) return maybe_code; | 803 if (!maybe_code->ToObject(&code)) return maybe_code; |
769 } | 804 } |
770 ASSERT_EQ(flags, Code::cast(code)->flags()); | 805 ASSERT_EQ(flags, Code::cast(code)->flags()); |
771 PROFILE(isolate_, | 806 PROFILE(isolate_, |
772 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), | 807 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), |
(...skipping 28 matching lines...) Expand all Loading... | |
801 object = holder; | 836 object = holder; |
802 } | 837 } |
803 | 838 |
804 Code::Flags flags = Code::ComputeMonomorphicFlags(kind, | 839 Code::Flags flags = Code::ComputeMonomorphicFlags(kind, |
805 INTERCEPTOR, | 840 INTERCEPTOR, |
806 extra_ic_state, | 841 extra_ic_state, |
807 cache_holder, | 842 cache_holder, |
808 argc); | 843 argc); |
809 Object* code = map_holder->map()->FindInCodeCache(name, flags); | 844 Object* code = map_holder->map()->FindInCodeCache(name, flags); |
810 if (code->IsUndefined()) { | 845 if (code->IsUndefined()) { |
811 CallStubCompiler compiler(argc, kind, extra_ic_state, cache_holder); | 846 HandleScope scope(isolate()); |
847 CallStubCompiler compiler(isolate(), | |
848 argc, | |
849 kind, | |
850 extra_ic_state, | |
851 cache_holder); | |
812 { MaybeObject* maybe_code = | 852 { MaybeObject* maybe_code = |
813 compiler.CompileCallInterceptor(JSObject::cast(object), holder, name); | 853 compiler.CompileCallInterceptor(JSObject::cast(object), holder, name); |
814 if (!maybe_code->ToObject(&code)) return maybe_code; | 854 if (!maybe_code->ToObject(&code)) return maybe_code; |
815 } | 855 } |
816 ASSERT_EQ(flags, Code::cast(code)->flags()); | 856 ASSERT_EQ(flags, Code::cast(code)->flags()); |
817 PROFILE(isolate(), | 857 PROFILE(isolate(), |
818 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), | 858 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), |
819 Code::cast(code), name)); | 859 Code::cast(code), name)); |
820 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); | 860 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); |
821 Object* result; | 861 Object* result; |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
857 extra_ic_state, | 897 extra_ic_state, |
858 cache_holder, | 898 cache_holder, |
859 argc); | 899 argc); |
860 Object* code = map_holder->map()->FindInCodeCache(name, flags); | 900 Object* code = map_holder->map()->FindInCodeCache(name, flags); |
861 if (code->IsUndefined()) { | 901 if (code->IsUndefined()) { |
862 // If the function hasn't been compiled yet, we cannot do it now | 902 // If the function hasn't been compiled yet, we cannot do it now |
863 // because it may cause GC. To avoid this issue, we return an | 903 // because it may cause GC. To avoid this issue, we return an |
864 // internal error which will make sure we do not update any | 904 // internal error which will make sure we do not update any |
865 // caches. | 905 // caches. |
866 if (!function->is_compiled()) return Failure::InternalError(); | 906 if (!function->is_compiled()) return Failure::InternalError(); |
867 CallStubCompiler compiler(argc, kind, extra_ic_state, cache_holder); | 907 HandleScope scope(isolate()); |
908 CallStubCompiler compiler(isolate(), | |
909 argc, | |
910 kind, | |
911 extra_ic_state, | |
912 cache_holder); | |
868 { MaybeObject* maybe_code = | 913 { MaybeObject* maybe_code = |
869 compiler.CompileCallGlobal(receiver, holder, cell, function, name); | 914 compiler.CompileCallGlobal(receiver, holder, cell, function, name); |
870 if (!maybe_code->ToObject(&code)) return maybe_code; | 915 if (!maybe_code->ToObject(&code)) return maybe_code; |
871 } | 916 } |
872 ASSERT_EQ(flags, Code::cast(code)->flags()); | 917 ASSERT_EQ(flags, Code::cast(code)->flags()); |
873 PROFILE(isolate(), | 918 PROFILE(isolate(), |
874 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), | 919 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), |
875 Code::cast(code), name)); | 920 Code::cast(code), name)); |
876 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); | 921 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); |
877 Object* result; | 922 Object* result; |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
960 Code::Flags flags = Code::ComputeFlags(kind, | 1005 Code::Flags flags = Code::ComputeFlags(kind, |
961 UNINITIALIZED, | 1006 UNINITIALIZED, |
962 extra_state, | 1007 extra_state, |
963 NORMAL, | 1008 NORMAL, |
964 argc); | 1009 argc); |
965 Object* probe; | 1010 Object* probe; |
966 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); | 1011 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); |
967 if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 1012 if (!maybe_probe->ToObject(&probe)) return maybe_probe; |
968 } | 1013 } |
969 if (!probe->IsUndefined()) return probe; | 1014 if (!probe->IsUndefined()) return probe; |
970 StubCompiler compiler; | 1015 HandleScope scope(isolate_); |
1016 StubCompiler compiler(isolate_); | |
971 return FillCache(isolate_, compiler.CompileCallInitialize(flags)); | 1017 return FillCache(isolate_, compiler.CompileCallInitialize(flags)); |
972 } | 1018 } |
973 | 1019 |
974 | 1020 |
975 Handle<Code> StubCache::ComputeCallInitialize(int argc, | 1021 Handle<Code> StubCache::ComputeCallInitialize(int argc, |
976 RelocInfo::Mode mode) { | 1022 RelocInfo::Mode mode) { |
977 CALL_HEAP_FUNCTION(isolate_, | 1023 CALL_HEAP_FUNCTION(isolate_, |
978 ComputeCallInitialize(argc, mode, Code::CALL_IC), | 1024 ComputeCallInitialize(argc, mode, Code::CALL_IC), |
979 Code); | 1025 Code); |
980 } | 1026 } |
(...skipping 14 matching lines...) Expand all Loading... | |
995 Code::Flags flags = Code::ComputeFlags(kind, | 1041 Code::Flags flags = Code::ComputeFlags(kind, |
996 PREMONOMORPHIC, | 1042 PREMONOMORPHIC, |
997 extra_ic_state, | 1043 extra_ic_state, |
998 NORMAL, | 1044 NORMAL, |
999 argc); | 1045 argc); |
1000 Object* probe; | 1046 Object* probe; |
1001 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); | 1047 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); |
1002 if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 1048 if (!maybe_probe->ToObject(&probe)) return maybe_probe; |
1003 } | 1049 } |
1004 if (!probe->IsUndefined()) return probe; | 1050 if (!probe->IsUndefined()) return probe; |
1005 StubCompiler compiler; | 1051 HandleScope scope(isolate_); |
1052 StubCompiler compiler(isolate_); | |
1006 return FillCache(isolate_, compiler.CompileCallPreMonomorphic(flags)); | 1053 return FillCache(isolate_, compiler.CompileCallPreMonomorphic(flags)); |
1007 } | 1054 } |
1008 | 1055 |
1009 | 1056 |
1010 MaybeObject* StubCache::ComputeCallNormal(int argc, | 1057 MaybeObject* StubCache::ComputeCallNormal(int argc, |
1011 Code::Kind kind, | 1058 Code::Kind kind, |
1012 Code::ExtraICState extra_ic_state) { | 1059 Code::ExtraICState extra_ic_state) { |
1013 Code::Flags flags = Code::ComputeFlags(kind, | 1060 Code::Flags flags = Code::ComputeFlags(kind, |
1014 MONOMORPHIC, | 1061 MONOMORPHIC, |
1015 extra_ic_state, | 1062 extra_ic_state, |
1016 NORMAL, | 1063 NORMAL, |
1017 argc); | 1064 argc); |
1018 Object* probe; | 1065 Object* probe; |
1019 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); | 1066 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); |
1020 if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 1067 if (!maybe_probe->ToObject(&probe)) return maybe_probe; |
1021 } | 1068 } |
1022 if (!probe->IsUndefined()) return probe; | 1069 if (!probe->IsUndefined()) return probe; |
1023 StubCompiler compiler; | 1070 HandleScope scope(isolate_); |
1071 StubCompiler compiler(isolate_); | |
1024 return FillCache(isolate_, compiler.CompileCallNormal(flags)); | 1072 return FillCache(isolate_, compiler.CompileCallNormal(flags)); |
1025 } | 1073 } |
1026 | 1074 |
1027 | 1075 |
1028 MaybeObject* StubCache::ComputeCallArguments(int argc, Code::Kind kind) { | 1076 MaybeObject* StubCache::ComputeCallArguments(int argc, Code::Kind kind) { |
1029 ASSERT(kind == Code::KEYED_CALL_IC); | 1077 ASSERT(kind == Code::KEYED_CALL_IC); |
1030 Code::Flags flags = Code::ComputeFlags(kind, | 1078 Code::Flags flags = Code::ComputeFlags(kind, |
1031 MEGAMORPHIC, | 1079 MEGAMORPHIC, |
1032 Code::kNoExtraICState, | 1080 Code::kNoExtraICState, |
1033 NORMAL, | 1081 NORMAL, |
1034 argc); | 1082 argc); |
1035 Object* probe; | 1083 Object* probe; |
1036 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); | 1084 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); |
1037 if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 1085 if (!maybe_probe->ToObject(&probe)) return maybe_probe; |
1038 } | 1086 } |
1039 if (!probe->IsUndefined()) return probe; | 1087 if (!probe->IsUndefined()) return probe; |
1040 StubCompiler compiler; | 1088 HandleScope scope(isolate_); |
1089 StubCompiler compiler(isolate_); | |
1041 return FillCache(isolate_, compiler.CompileCallArguments(flags)); | 1090 return FillCache(isolate_, compiler.CompileCallArguments(flags)); |
1042 } | 1091 } |
1043 | 1092 |
1044 | 1093 |
1045 MaybeObject* StubCache::ComputeCallMegamorphic( | 1094 MaybeObject* StubCache::ComputeCallMegamorphic( |
1046 int argc, | 1095 int argc, |
1047 Code::Kind kind, | 1096 Code::Kind kind, |
1048 Code::ExtraICState extra_ic_state) { | 1097 Code::ExtraICState extra_ic_state) { |
1049 Code::Flags flags = Code::ComputeFlags(kind, | 1098 Code::Flags flags = Code::ComputeFlags(kind, |
1050 MEGAMORPHIC, | 1099 MEGAMORPHIC, |
1051 extra_ic_state, | 1100 extra_ic_state, |
1052 NORMAL, | 1101 NORMAL, |
1053 argc); | 1102 argc); |
1054 Object* probe; | 1103 Object* probe; |
1055 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); | 1104 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); |
1056 if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 1105 if (!maybe_probe->ToObject(&probe)) return maybe_probe; |
1057 } | 1106 } |
1058 if (!probe->IsUndefined()) return probe; | 1107 if (!probe->IsUndefined()) return probe; |
1059 StubCompiler compiler; | 1108 HandleScope scope(isolate_); |
1109 StubCompiler compiler(isolate_); | |
1060 return FillCache(isolate_, compiler.CompileCallMegamorphic(flags)); | 1110 return FillCache(isolate_, compiler.CompileCallMegamorphic(flags)); |
1061 } | 1111 } |
1062 | 1112 |
1063 | 1113 |
1064 MaybeObject* StubCache::ComputeCallMiss(int argc, | 1114 MaybeObject* StubCache::ComputeCallMiss(int argc, |
1065 Code::Kind kind, | 1115 Code::Kind kind, |
1066 Code::ExtraICState extra_ic_state) { | 1116 Code::ExtraICState extra_ic_state) { |
1067 // MONOMORPHIC_PROTOTYPE_FAILURE state is used to make sure that miss stubs | 1117 // MONOMORPHIC_PROTOTYPE_FAILURE state is used to make sure that miss stubs |
1068 // and monomorphic stubs are not mixed up together in the stub cache. | 1118 // and monomorphic stubs are not mixed up together in the stub cache. |
1069 Code::Flags flags = Code::ComputeFlags(kind, | 1119 Code::Flags flags = Code::ComputeFlags(kind, |
1070 MONOMORPHIC_PROTOTYPE_FAILURE, | 1120 MONOMORPHIC_PROTOTYPE_FAILURE, |
1071 extra_ic_state, | 1121 extra_ic_state, |
1072 NORMAL, | 1122 NORMAL, |
1073 argc, | 1123 argc, |
1074 OWN_MAP); | 1124 OWN_MAP); |
1075 Object* probe; | 1125 Object* probe; |
1076 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); | 1126 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); |
1077 if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 1127 if (!maybe_probe->ToObject(&probe)) return maybe_probe; |
1078 } | 1128 } |
1079 if (!probe->IsUndefined()) return probe; | 1129 if (!probe->IsUndefined()) return probe; |
1080 StubCompiler compiler; | 1130 HandleScope scope(isolate_); |
1131 StubCompiler compiler(isolate_); | |
1081 return FillCache(isolate_, compiler.CompileCallMiss(flags)); | 1132 return FillCache(isolate_, compiler.CompileCallMiss(flags)); |
1082 } | 1133 } |
1083 | 1134 |
1084 | 1135 |
1085 #ifdef ENABLE_DEBUGGER_SUPPORT | 1136 #ifdef ENABLE_DEBUGGER_SUPPORT |
1086 MaybeObject* StubCache::ComputeCallDebugBreak( | 1137 MaybeObject* StubCache::ComputeCallDebugBreak( |
1087 int argc, | 1138 int argc, |
1088 Code::Kind kind) { | 1139 Code::Kind kind) { |
1089 // Extra IC state is irrelevant for debug break ICs. They jump to | 1140 // Extra IC state is irrelevant for debug break ICs. They jump to |
1090 // the actual call ic to carry out the work. | 1141 // the actual call ic to carry out the work. |
1091 Code::Flags flags = Code::ComputeFlags(kind, | 1142 Code::Flags flags = Code::ComputeFlags(kind, |
1092 DEBUG_BREAK, | 1143 DEBUG_BREAK, |
1093 Code::kNoExtraICState, | 1144 Code::kNoExtraICState, |
1094 NORMAL, | 1145 NORMAL, |
1095 argc); | 1146 argc); |
1096 Object* probe; | 1147 Object* probe; |
1097 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); | 1148 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); |
1098 if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 1149 if (!maybe_probe->ToObject(&probe)) return maybe_probe; |
1099 } | 1150 } |
1100 if (!probe->IsUndefined()) return probe; | 1151 if (!probe->IsUndefined()) return probe; |
1101 StubCompiler compiler; | 1152 HandleScope scope(isolate_); |
1153 StubCompiler compiler(isolate_); | |
1102 return FillCache(isolate_, compiler.CompileCallDebugBreak(flags)); | 1154 return FillCache(isolate_, compiler.CompileCallDebugBreak(flags)); |
1103 } | 1155 } |
1104 | 1156 |
1105 | 1157 |
1106 MaybeObject* StubCache::ComputeCallDebugPrepareStepIn( | 1158 MaybeObject* StubCache::ComputeCallDebugPrepareStepIn( |
1107 int argc, | 1159 int argc, |
1108 Code::Kind kind) { | 1160 Code::Kind kind) { |
1109 // Extra IC state is irrelevant for debug break ICs. They jump to | 1161 // Extra IC state is irrelevant for debug break ICs. They jump to |
1110 // the actual call ic to carry out the work. | 1162 // the actual call ic to carry out the work. |
1111 Code::Flags flags = Code::ComputeFlags(kind, | 1163 Code::Flags flags = Code::ComputeFlags(kind, |
1112 DEBUG_PREPARE_STEP_IN, | 1164 DEBUG_PREPARE_STEP_IN, |
1113 Code::kNoExtraICState, | 1165 Code::kNoExtraICState, |
1114 NORMAL, | 1166 NORMAL, |
1115 argc); | 1167 argc); |
1116 Object* probe; | 1168 Object* probe; |
1117 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); | 1169 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); |
1118 if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 1170 if (!maybe_probe->ToObject(&probe)) return maybe_probe; |
1119 } | 1171 } |
1120 if (!probe->IsUndefined()) return probe; | 1172 if (!probe->IsUndefined()) return probe; |
1121 StubCompiler compiler; | 1173 HandleScope scope(isolate_); |
1174 StubCompiler compiler(isolate_); | |
1122 return FillCache(isolate_, compiler.CompileCallDebugPrepareStepIn(flags)); | 1175 return FillCache(isolate_, compiler.CompileCallDebugPrepareStepIn(flags)); |
1123 } | 1176 } |
1124 #endif | 1177 #endif |
1125 | 1178 |
1126 | 1179 |
1127 void StubCache::Clear() { | 1180 void StubCache::Clear() { |
1128 Code* empty = isolate_->builtins()->builtin(Builtins::kIllegal); | 1181 Code* empty = isolate_->builtins()->builtin(Builtins::kIllegal); |
1129 for (int i = 0; i < kPrimaryTableSize; i++) { | 1182 for (int i = 0; i < kPrimaryTableSize; i++) { |
1130 primary_[i].key = heap()->empty_string(); | 1183 primary_[i].key = heap()->empty_string(); |
1131 primary_[i].value = empty; | 1184 primary_[i].value = empty; |
(...skipping 565 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1697 return result; | 1750 return result; |
1698 } | 1751 } |
1699 | 1752 |
1700 | 1753 |
1701 void KeyedStoreStubCompiler::GenerateStoreDictionaryElement( | 1754 void KeyedStoreStubCompiler::GenerateStoreDictionaryElement( |
1702 MacroAssembler* masm) { | 1755 MacroAssembler* masm) { |
1703 KeyedStoreIC::GenerateSlow(masm); | 1756 KeyedStoreIC::GenerateSlow(masm); |
1704 } | 1757 } |
1705 | 1758 |
1706 | 1759 |
1707 CallStubCompiler::CallStubCompiler(int argc, | 1760 CallStubCompiler::CallStubCompiler(Isolate* isolate, |
1761 int argc, | |
1708 Code::Kind kind, | 1762 Code::Kind kind, |
1709 Code::ExtraICState extra_ic_state, | 1763 Code::ExtraICState extra_ic_state, |
1710 InlineCacheHolderFlag cache_holder) | 1764 InlineCacheHolderFlag cache_holder) |
1711 : arguments_(argc), | 1765 : StubCompiler(isolate), |
1766 arguments_(argc), | |
1712 kind_(kind), | 1767 kind_(kind), |
1713 extra_ic_state_(extra_ic_state), | 1768 extra_ic_state_(extra_ic_state), |
1714 cache_holder_(cache_holder) { | 1769 cache_holder_(cache_holder) { |
1715 } | 1770 } |
1716 | 1771 |
1717 | 1772 |
1718 bool CallStubCompiler::HasCustomCallGenerator(JSFunction* function) { | 1773 bool CallStubCompiler::HasCustomCallGenerator(JSFunction* function) { |
1719 SharedFunctionInfo* info = function->shared(); | 1774 SharedFunctionInfo* info = function->shared(); |
1720 if (info->HasBuiltinFunctionId()) { | 1775 if (info->HasBuiltinFunctionId()) { |
1721 BuiltinFunctionId id = info->builtin_function_id(); | 1776 BuiltinFunctionId id = info->builtin_function_id(); |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1858 expected_receiver_type_ = | 1913 expected_receiver_type_ = |
1859 FunctionTemplateInfo::cast(signature->receiver()); | 1914 FunctionTemplateInfo::cast(signature->receiver()); |
1860 } | 1915 } |
1861 } | 1916 } |
1862 | 1917 |
1863 is_simple_api_call_ = true; | 1918 is_simple_api_call_ = true; |
1864 } | 1919 } |
1865 | 1920 |
1866 | 1921 |
1867 } } // namespace v8::internal | 1922 } } // namespace v8::internal |
OLD | NEW |