OLD | NEW |
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2009 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 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 // name specific if there are global objects involved. | 119 // name specific if there are global objects involved. |
120 Code::Flags flags = | 120 Code::Flags flags = |
121 Code::ComputeMonomorphicFlags(Code::LOAD_IC, NONEXISTENT); | 121 Code::ComputeMonomorphicFlags(Code::LOAD_IC, NONEXISTENT); |
122 Object* code = receiver->map()->FindInCodeCache(cache_name, flags); | 122 Object* code = receiver->map()->FindInCodeCache(cache_name, flags); |
123 if (code->IsUndefined()) { | 123 if (code->IsUndefined()) { |
124 LoadStubCompiler compiler; | 124 LoadStubCompiler compiler; |
125 { MaybeObject* maybe_code = | 125 { MaybeObject* maybe_code = |
126 compiler.CompileLoadNonexistent(cache_name, receiver, last); | 126 compiler.CompileLoadNonexistent(cache_name, receiver, last); |
127 if (!maybe_code->ToObject(&code)) return maybe_code; | 127 if (!maybe_code->ToObject(&code)) return maybe_code; |
128 } | 128 } |
129 PROFILE(CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), cache_name)); | 129 PROFILE(isolate_, |
| 130 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), cache_name)); |
130 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, cache_name, Code::cast(code))); | 131 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, cache_name, Code::cast(code))); |
131 Object* result; | 132 Object* result; |
132 { MaybeObject* maybe_result = | 133 { MaybeObject* maybe_result = |
133 receiver->UpdateMapCodeCache(cache_name, Code::cast(code)); | 134 receiver->UpdateMapCodeCache(cache_name, Code::cast(code)); |
134 if (!maybe_result->ToObject(&result)) return maybe_result; | 135 if (!maybe_result->ToObject(&result)) return maybe_result; |
135 } | 136 } |
136 } | 137 } |
137 return code; | 138 return code; |
138 } | 139 } |
139 | 140 |
140 | 141 |
141 MaybeObject* StubCache::ComputeLoadField(String* name, | 142 MaybeObject* StubCache::ComputeLoadField(String* name, |
142 JSObject* receiver, | 143 JSObject* receiver, |
143 JSObject* holder, | 144 JSObject* holder, |
144 int field_index) { | 145 int field_index) { |
145 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 146 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
146 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, FIELD); | 147 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, FIELD); |
147 Object* code = receiver->map()->FindInCodeCache(name, flags); | 148 Object* code = receiver->map()->FindInCodeCache(name, flags); |
148 if (code->IsUndefined()) { | 149 if (code->IsUndefined()) { |
149 LoadStubCompiler compiler; | 150 LoadStubCompiler compiler; |
150 { MaybeObject* maybe_code = | 151 { MaybeObject* maybe_code = |
151 compiler.CompileLoadField(receiver, holder, field_index, name); | 152 compiler.CompileLoadField(receiver, holder, field_index, name); |
152 if (!maybe_code->ToObject(&code)) return maybe_code; | 153 if (!maybe_code->ToObject(&code)) return maybe_code; |
153 } | 154 } |
154 PROFILE(CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); | 155 PROFILE(isolate_, |
| 156 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); |
155 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); | 157 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); |
156 Object* result; | 158 Object* result; |
157 { MaybeObject* maybe_result = | 159 { MaybeObject* maybe_result = |
158 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 160 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
159 if (!maybe_result->ToObject(&result)) return maybe_result; | 161 if (!maybe_result->ToObject(&result)) return maybe_result; |
160 } | 162 } |
161 } | 163 } |
162 return code; | 164 return code; |
163 } | 165 } |
164 | 166 |
165 | 167 |
166 MaybeObject* StubCache::ComputeLoadCallback(String* name, | 168 MaybeObject* StubCache::ComputeLoadCallback(String* name, |
167 JSObject* receiver, | 169 JSObject* receiver, |
168 JSObject* holder, | 170 JSObject* holder, |
169 AccessorInfo* callback) { | 171 AccessorInfo* callback) { |
170 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); | 172 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); |
171 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 173 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
172 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, CALLBACKS); | 174 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, CALLBACKS); |
173 Object* code = receiver->map()->FindInCodeCache(name, flags); | 175 Object* code = receiver->map()->FindInCodeCache(name, flags); |
174 if (code->IsUndefined()) { | 176 if (code->IsUndefined()) { |
175 LoadStubCompiler compiler; | 177 LoadStubCompiler compiler; |
176 { MaybeObject* maybe_code = | 178 { MaybeObject* maybe_code = |
177 compiler.CompileLoadCallback(name, receiver, holder, callback); | 179 compiler.CompileLoadCallback(name, receiver, holder, callback); |
178 if (!maybe_code->ToObject(&code)) return maybe_code; | 180 if (!maybe_code->ToObject(&code)) return maybe_code; |
179 } | 181 } |
180 PROFILE(CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); | 182 PROFILE(isolate_, |
| 183 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); |
181 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); | 184 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); |
182 Object* result; | 185 Object* result; |
183 { MaybeObject* maybe_result = | 186 { MaybeObject* maybe_result = |
184 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 187 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
185 if (!maybe_result->ToObject(&result)) return maybe_result; | 188 if (!maybe_result->ToObject(&result)) return maybe_result; |
186 } | 189 } |
187 } | 190 } |
188 return code; | 191 return code; |
189 } | 192 } |
190 | 193 |
191 | 194 |
192 MaybeObject* StubCache::ComputeLoadConstant(String* name, | 195 MaybeObject* StubCache::ComputeLoadConstant(String* name, |
193 JSObject* receiver, | 196 JSObject* receiver, |
194 JSObject* holder, | 197 JSObject* holder, |
195 Object* value) { | 198 Object* value) { |
196 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 199 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
197 Code::Flags flags = | 200 Code::Flags flags = |
198 Code::ComputeMonomorphicFlags(Code::LOAD_IC, CONSTANT_FUNCTION); | 201 Code::ComputeMonomorphicFlags(Code::LOAD_IC, CONSTANT_FUNCTION); |
199 Object* code = receiver->map()->FindInCodeCache(name, flags); | 202 Object* code = receiver->map()->FindInCodeCache(name, flags); |
200 if (code->IsUndefined()) { | 203 if (code->IsUndefined()) { |
201 LoadStubCompiler compiler; | 204 LoadStubCompiler compiler; |
202 { MaybeObject* maybe_code = | 205 { MaybeObject* maybe_code = |
203 compiler.CompileLoadConstant(receiver, holder, value, name); | 206 compiler.CompileLoadConstant(receiver, holder, value, name); |
204 if (!maybe_code->ToObject(&code)) return maybe_code; | 207 if (!maybe_code->ToObject(&code)) return maybe_code; |
205 } | 208 } |
206 PROFILE(CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); | 209 PROFILE(isolate_, |
| 210 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); |
207 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); | 211 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); |
208 Object* result; | 212 Object* result; |
209 { MaybeObject* maybe_result = | 213 { MaybeObject* maybe_result = |
210 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 214 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
211 if (!maybe_result->ToObject(&result)) return maybe_result; | 215 if (!maybe_result->ToObject(&result)) return maybe_result; |
212 } | 216 } |
213 } | 217 } |
214 return code; | 218 return code; |
215 } | 219 } |
216 | 220 |
217 | 221 |
218 MaybeObject* StubCache::ComputeLoadInterceptor(String* name, | 222 MaybeObject* StubCache::ComputeLoadInterceptor(String* name, |
219 JSObject* receiver, | 223 JSObject* receiver, |
220 JSObject* holder) { | 224 JSObject* holder) { |
221 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 225 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
222 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, INTERCEPTOR); | 226 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, INTERCEPTOR); |
223 Object* code = receiver->map()->FindInCodeCache(name, flags); | 227 Object* code = receiver->map()->FindInCodeCache(name, flags); |
224 if (code->IsUndefined()) { | 228 if (code->IsUndefined()) { |
225 LoadStubCompiler compiler; | 229 LoadStubCompiler compiler; |
226 { MaybeObject* maybe_code = | 230 { MaybeObject* maybe_code = |
227 compiler.CompileLoadInterceptor(receiver, holder, name); | 231 compiler.CompileLoadInterceptor(receiver, holder, name); |
228 if (!maybe_code->ToObject(&code)) return maybe_code; | 232 if (!maybe_code->ToObject(&code)) return maybe_code; |
229 } | 233 } |
230 PROFILE(CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); | 234 PROFILE(isolate_, |
| 235 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); |
231 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); | 236 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); |
232 Object* result; | 237 Object* result; |
233 { MaybeObject* maybe_result = | 238 { MaybeObject* maybe_result = |
234 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 239 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
235 if (!maybe_result->ToObject(&result)) return maybe_result; | 240 if (!maybe_result->ToObject(&result)) return maybe_result; |
236 } | 241 } |
237 } | 242 } |
238 return code; | 243 return code; |
239 } | 244 } |
240 | 245 |
(...skipping 13 matching lines...) Expand all Loading... |
254 Object* code = receiver->map()->FindInCodeCache(name, flags); | 259 Object* code = receiver->map()->FindInCodeCache(name, flags); |
255 if (code->IsUndefined()) { | 260 if (code->IsUndefined()) { |
256 LoadStubCompiler compiler; | 261 LoadStubCompiler compiler; |
257 { MaybeObject* maybe_code = compiler.CompileLoadGlobal(receiver, | 262 { MaybeObject* maybe_code = compiler.CompileLoadGlobal(receiver, |
258 holder, | 263 holder, |
259 cell, | 264 cell, |
260 name, | 265 name, |
261 is_dont_delete); | 266 is_dont_delete); |
262 if (!maybe_code->ToObject(&code)) return maybe_code; | 267 if (!maybe_code->ToObject(&code)) return maybe_code; |
263 } | 268 } |
264 PROFILE(CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); | 269 PROFILE(isolate_, |
| 270 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); |
265 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); | 271 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); |
266 Object* result; | 272 Object* result; |
267 { MaybeObject* maybe_result = | 273 { MaybeObject* maybe_result = |
268 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 274 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
269 if (!maybe_result->ToObject(&result)) return maybe_result; | 275 if (!maybe_result->ToObject(&result)) return maybe_result; |
270 } | 276 } |
271 } | 277 } |
272 return code; | 278 return code; |
273 } | 279 } |
274 | 280 |
275 | 281 |
276 MaybeObject* StubCache::ComputeKeyedLoadField(String* name, | 282 MaybeObject* StubCache::ComputeKeyedLoadField(String* name, |
277 JSObject* receiver, | 283 JSObject* receiver, |
278 JSObject* holder, | 284 JSObject* holder, |
279 int field_index) { | 285 int field_index) { |
280 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 286 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
281 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, FIELD); | 287 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, FIELD); |
282 Object* code = receiver->map()->FindInCodeCache(name, flags); | 288 Object* code = receiver->map()->FindInCodeCache(name, flags); |
283 if (code->IsUndefined()) { | 289 if (code->IsUndefined()) { |
284 KeyedLoadStubCompiler compiler; | 290 KeyedLoadStubCompiler compiler; |
285 { MaybeObject* maybe_code = | 291 { MaybeObject* maybe_code = |
286 compiler.CompileLoadField(name, receiver, holder, field_index); | 292 compiler.CompileLoadField(name, receiver, holder, field_index); |
287 if (!maybe_code->ToObject(&code)) return maybe_code; | 293 if (!maybe_code->ToObject(&code)) return maybe_code; |
288 } | 294 } |
289 PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 295 PROFILE(isolate_, |
| 296 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
290 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 297 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
291 Object* result; | 298 Object* result; |
292 { MaybeObject* maybe_result = | 299 { MaybeObject* maybe_result = |
293 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 300 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
294 if (!maybe_result->ToObject(&result)) return maybe_result; | 301 if (!maybe_result->ToObject(&result)) return maybe_result; |
295 } | 302 } |
296 } | 303 } |
297 return code; | 304 return code; |
298 } | 305 } |
299 | 306 |
300 | 307 |
301 MaybeObject* StubCache::ComputeKeyedLoadConstant(String* name, | 308 MaybeObject* StubCache::ComputeKeyedLoadConstant(String* name, |
302 JSObject* receiver, | 309 JSObject* receiver, |
303 JSObject* holder, | 310 JSObject* holder, |
304 Object* value) { | 311 Object* value) { |
305 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 312 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
306 Code::Flags flags = | 313 Code::Flags flags = |
307 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CONSTANT_FUNCTION); | 314 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CONSTANT_FUNCTION); |
308 Object* code = receiver->map()->FindInCodeCache(name, flags); | 315 Object* code = receiver->map()->FindInCodeCache(name, flags); |
309 if (code->IsUndefined()) { | 316 if (code->IsUndefined()) { |
310 KeyedLoadStubCompiler compiler; | 317 KeyedLoadStubCompiler compiler; |
311 { MaybeObject* maybe_code = | 318 { MaybeObject* maybe_code = |
312 compiler.CompileLoadConstant(name, receiver, holder, value); | 319 compiler.CompileLoadConstant(name, receiver, holder, value); |
313 if (!maybe_code->ToObject(&code)) return maybe_code; | 320 if (!maybe_code->ToObject(&code)) return maybe_code; |
314 } | 321 } |
315 PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 322 PROFILE(isolate_, |
| 323 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
316 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 324 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
317 Object* result; | 325 Object* result; |
318 { MaybeObject* maybe_result = | 326 { MaybeObject* maybe_result = |
319 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 327 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
320 if (!maybe_result->ToObject(&result)) return maybe_result; | 328 if (!maybe_result->ToObject(&result)) return maybe_result; |
321 } | 329 } |
322 } | 330 } |
323 return code; | 331 return code; |
324 } | 332 } |
325 | 333 |
326 | 334 |
327 MaybeObject* StubCache::ComputeKeyedLoadInterceptor(String* name, | 335 MaybeObject* StubCache::ComputeKeyedLoadInterceptor(String* name, |
328 JSObject* receiver, | 336 JSObject* receiver, |
329 JSObject* holder) { | 337 JSObject* holder) { |
330 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 338 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
331 Code::Flags flags = | 339 Code::Flags flags = |
332 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, INTERCEPTOR); | 340 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, INTERCEPTOR); |
333 Object* code = receiver->map()->FindInCodeCache(name, flags); | 341 Object* code = receiver->map()->FindInCodeCache(name, flags); |
334 if (code->IsUndefined()) { | 342 if (code->IsUndefined()) { |
335 KeyedLoadStubCompiler compiler; | 343 KeyedLoadStubCompiler compiler; |
336 { MaybeObject* maybe_code = | 344 { MaybeObject* maybe_code = |
337 compiler.CompileLoadInterceptor(receiver, holder, name); | 345 compiler.CompileLoadInterceptor(receiver, holder, name); |
338 if (!maybe_code->ToObject(&code)) return maybe_code; | 346 if (!maybe_code->ToObject(&code)) return maybe_code; |
339 } | 347 } |
340 PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 348 PROFILE(isolate_, |
| 349 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
341 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 350 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
342 Object* result; | 351 Object* result; |
343 { MaybeObject* maybe_result = | 352 { MaybeObject* maybe_result = |
344 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 353 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
345 if (!maybe_result->ToObject(&result)) return maybe_result; | 354 if (!maybe_result->ToObject(&result)) return maybe_result; |
346 } | 355 } |
347 } | 356 } |
348 return code; | 357 return code; |
349 } | 358 } |
350 | 359 |
351 | 360 |
352 MaybeObject* StubCache::ComputeKeyedLoadCallback(String* name, | 361 MaybeObject* StubCache::ComputeKeyedLoadCallback(String* name, |
353 JSObject* receiver, | 362 JSObject* receiver, |
354 JSObject* holder, | 363 JSObject* holder, |
355 AccessorInfo* callback) { | 364 AccessorInfo* callback) { |
356 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 365 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
357 Code::Flags flags = | 366 Code::Flags flags = |
358 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); | 367 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); |
359 Object* code = receiver->map()->FindInCodeCache(name, flags); | 368 Object* code = receiver->map()->FindInCodeCache(name, flags); |
360 if (code->IsUndefined()) { | 369 if (code->IsUndefined()) { |
361 KeyedLoadStubCompiler compiler; | 370 KeyedLoadStubCompiler compiler; |
362 { MaybeObject* maybe_code = | 371 { MaybeObject* maybe_code = |
363 compiler.CompileLoadCallback(name, receiver, holder, callback); | 372 compiler.CompileLoadCallback(name, receiver, holder, callback); |
364 if (!maybe_code->ToObject(&code)) return maybe_code; | 373 if (!maybe_code->ToObject(&code)) return maybe_code; |
365 } | 374 } |
366 PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 375 PROFILE(isolate_, |
| 376 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
367 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 377 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
368 Object* result; | 378 Object* result; |
369 { MaybeObject* maybe_result = | 379 { MaybeObject* maybe_result = |
370 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 380 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
371 if (!maybe_result->ToObject(&result)) return maybe_result; | 381 if (!maybe_result->ToObject(&result)) return maybe_result; |
372 } | 382 } |
373 } | 383 } |
374 return code; | 384 return code; |
375 } | 385 } |
376 | 386 |
377 | 387 |
378 | 388 |
379 MaybeObject* StubCache::ComputeKeyedLoadArrayLength(String* name, | 389 MaybeObject* StubCache::ComputeKeyedLoadArrayLength(String* name, |
380 JSArray* receiver) { | 390 JSArray* receiver) { |
381 Code::Flags flags = | 391 Code::Flags flags = |
382 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); | 392 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); |
383 ASSERT(receiver->IsJSObject()); | 393 ASSERT(receiver->IsJSObject()); |
384 Object* code = receiver->map()->FindInCodeCache(name, flags); | 394 Object* code = receiver->map()->FindInCodeCache(name, flags); |
385 if (code->IsUndefined()) { | 395 if (code->IsUndefined()) { |
386 KeyedLoadStubCompiler compiler; | 396 KeyedLoadStubCompiler compiler; |
387 { MaybeObject* maybe_code = compiler.CompileLoadArrayLength(name); | 397 { MaybeObject* maybe_code = compiler.CompileLoadArrayLength(name); |
388 if (!maybe_code->ToObject(&code)) return maybe_code; | 398 if (!maybe_code->ToObject(&code)) return maybe_code; |
389 } | 399 } |
390 PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 400 PROFILE(isolate_, |
| 401 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
391 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 402 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
392 Object* result; | 403 Object* result; |
393 { MaybeObject* maybe_result = | 404 { MaybeObject* maybe_result = |
394 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 405 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
395 if (!maybe_result->ToObject(&result)) return maybe_result; | 406 if (!maybe_result->ToObject(&result)) return maybe_result; |
396 } | 407 } |
397 } | 408 } |
398 return code; | 409 return code; |
399 } | 410 } |
400 | 411 |
401 | 412 |
402 MaybeObject* StubCache::ComputeKeyedLoadStringLength(String* name, | 413 MaybeObject* StubCache::ComputeKeyedLoadStringLength(String* name, |
403 String* receiver) { | 414 String* receiver) { |
404 Code::Flags flags = | 415 Code::Flags flags = |
405 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); | 416 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); |
406 Map* map = receiver->map(); | 417 Map* map = receiver->map(); |
407 Object* code = map->FindInCodeCache(name, flags); | 418 Object* code = map->FindInCodeCache(name, flags); |
408 if (code->IsUndefined()) { | 419 if (code->IsUndefined()) { |
409 KeyedLoadStubCompiler compiler; | 420 KeyedLoadStubCompiler compiler; |
410 { MaybeObject* maybe_code = compiler.CompileLoadStringLength(name); | 421 { MaybeObject* maybe_code = compiler.CompileLoadStringLength(name); |
411 if (!maybe_code->ToObject(&code)) return maybe_code; | 422 if (!maybe_code->ToObject(&code)) return maybe_code; |
412 } | 423 } |
413 PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 424 PROFILE(isolate_, |
| 425 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
414 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 426 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
415 Object* result; | 427 Object* result; |
416 { MaybeObject* maybe_result = map->UpdateCodeCache(name, Code::cast(code)); | 428 { MaybeObject* maybe_result = map->UpdateCodeCache(name, Code::cast(code)); |
417 if (!maybe_result->ToObject(&result)) return maybe_result; | 429 if (!maybe_result->ToObject(&result)) return maybe_result; |
418 } | 430 } |
419 } | 431 } |
420 return code; | 432 return code; |
421 } | 433 } |
422 | 434 |
423 | 435 |
424 MaybeObject* StubCache::ComputeKeyedLoadFunctionPrototype( | 436 MaybeObject* StubCache::ComputeKeyedLoadFunctionPrototype( |
425 String* name, | 437 String* name, |
426 JSFunction* receiver) { | 438 JSFunction* receiver) { |
427 Code::Flags flags = | 439 Code::Flags flags = |
428 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); | 440 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); |
429 Object* code = receiver->map()->FindInCodeCache(name, flags); | 441 Object* code = receiver->map()->FindInCodeCache(name, flags); |
430 if (code->IsUndefined()) { | 442 if (code->IsUndefined()) { |
431 KeyedLoadStubCompiler compiler; | 443 KeyedLoadStubCompiler compiler; |
432 { MaybeObject* maybe_code = compiler.CompileLoadFunctionPrototype(name); | 444 { MaybeObject* maybe_code = compiler.CompileLoadFunctionPrototype(name); |
433 if (!maybe_code->ToObject(&code)) return maybe_code; | 445 if (!maybe_code->ToObject(&code)) return maybe_code; |
434 } | 446 } |
435 PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 447 PROFILE(isolate_, |
| 448 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
436 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 449 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
437 Object* result; | 450 Object* result; |
438 { MaybeObject* maybe_result = | 451 { MaybeObject* maybe_result = |
439 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 452 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
440 if (!maybe_result->ToObject(&result)) return maybe_result; | 453 if (!maybe_result->ToObject(&result)) return maybe_result; |
441 } | 454 } |
442 } | 455 } |
443 return code; | 456 return code; |
444 } | 457 } |
445 | 458 |
446 | 459 |
447 MaybeObject* StubCache::ComputeKeyedLoadSpecialized(JSObject* receiver) { | 460 MaybeObject* StubCache::ComputeKeyedLoadSpecialized(JSObject* receiver) { |
448 // Using NORMAL as the PropertyType for array element loads is a misuse. The | 461 // Using NORMAL as the PropertyType for array element loads is a misuse. The |
449 // generated stub always accesses fast elements, not slow-mode fields, but | 462 // generated stub always accesses fast elements, not slow-mode fields, but |
450 // some property type is required for the stub lookup. Note that overloading | 463 // some property type is required for the stub lookup. Note that overloading |
451 // the NORMAL PropertyType is only safe as long as no stubs are generated for | 464 // the NORMAL PropertyType is only safe as long as no stubs are generated for |
452 // other keyed field loads. This is guaranteed to be the case since all field | 465 // other keyed field loads. This is guaranteed to be the case since all field |
453 // keyed loads that are not array elements go through a generic builtin stub. | 466 // keyed loads that are not array elements go through a generic builtin stub. |
454 Code::Flags flags = | 467 Code::Flags flags = |
455 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, NORMAL); | 468 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, NORMAL); |
456 String* name = isolate_->heap()->KeyedLoadSpecialized_symbol(); | 469 String* name = isolate_->heap()->KeyedLoadSpecialized_symbol(); |
457 Object* code = receiver->map()->FindInCodeCache(name, flags); | 470 Object* code = receiver->map()->FindInCodeCache(name, flags); |
458 if (code->IsUndefined()) { | 471 if (code->IsUndefined()) { |
459 KeyedLoadStubCompiler compiler; | 472 KeyedLoadStubCompiler compiler; |
460 { MaybeObject* maybe_code = compiler.CompileLoadSpecialized(receiver); | 473 { MaybeObject* maybe_code = compiler.CompileLoadSpecialized(receiver); |
461 if (!maybe_code->ToObject(&code)) return maybe_code; | 474 if (!maybe_code->ToObject(&code)) return maybe_code; |
462 } | 475 } |
463 PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), 0)); | 476 PROFILE(isolate_, |
| 477 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), 0)); |
464 Object* result; | 478 Object* result; |
465 { MaybeObject* maybe_result = | 479 { MaybeObject* maybe_result = |
466 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 480 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
467 if (!maybe_result->ToObject(&result)) return maybe_result; | 481 if (!maybe_result->ToObject(&result)) return maybe_result; |
468 } | 482 } |
469 } | 483 } |
470 return code; | 484 return code; |
471 } | 485 } |
472 | 486 |
473 | 487 |
474 MaybeObject* StubCache::ComputeStoreField(String* name, | 488 MaybeObject* StubCache::ComputeStoreField(String* name, |
475 JSObject* receiver, | 489 JSObject* receiver, |
476 int field_index, | 490 int field_index, |
477 Map* transition, | 491 Map* transition, |
478 StrictModeFlag strict_mode) { | 492 StrictModeFlag strict_mode) { |
479 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; | 493 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; |
480 Code::Flags flags = Code::ComputeMonomorphicFlags( | 494 Code::Flags flags = Code::ComputeMonomorphicFlags( |
481 Code::STORE_IC, type, strict_mode); | 495 Code::STORE_IC, type, strict_mode); |
482 Object* code = receiver->map()->FindInCodeCache(name, flags); | 496 Object* code = receiver->map()->FindInCodeCache(name, flags); |
483 if (code->IsUndefined()) { | 497 if (code->IsUndefined()) { |
484 StoreStubCompiler compiler(strict_mode); | 498 StoreStubCompiler compiler(strict_mode); |
485 { MaybeObject* maybe_code = | 499 { MaybeObject* maybe_code = |
486 compiler.CompileStoreField(receiver, field_index, transition, name); | 500 compiler.CompileStoreField(receiver, field_index, transition, name); |
487 if (!maybe_code->ToObject(&code)) return maybe_code; | 501 if (!maybe_code->ToObject(&code)) return maybe_code; |
488 } | 502 } |
489 PROFILE(CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); | 503 PROFILE(isolate_, |
| 504 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); |
490 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); | 505 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); |
491 Object* result; | 506 Object* result; |
492 { MaybeObject* maybe_result = | 507 { MaybeObject* maybe_result = |
493 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 508 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
494 if (!maybe_result->ToObject(&result)) return maybe_result; | 509 if (!maybe_result->ToObject(&result)) return maybe_result; |
495 } | 510 } |
496 } | 511 } |
497 return code; | 512 return code; |
498 } | 513 } |
499 | 514 |
500 | 515 |
501 MaybeObject* StubCache::ComputeKeyedStoreSpecialized( | 516 MaybeObject* StubCache::ComputeKeyedStoreSpecialized( |
502 JSObject* receiver, | 517 JSObject* receiver, |
503 StrictModeFlag strict_mode) { | 518 StrictModeFlag strict_mode) { |
504 Code::Flags flags = | 519 Code::Flags flags = |
505 Code::ComputeMonomorphicFlags(Code::KEYED_STORE_IC, NORMAL, strict_mode); | 520 Code::ComputeMonomorphicFlags(Code::KEYED_STORE_IC, NORMAL, strict_mode); |
506 String* name = isolate_->heap()->KeyedStoreSpecialized_symbol(); | 521 String* name = isolate_->heap()->KeyedStoreSpecialized_symbol(); |
507 Object* code = receiver->map()->FindInCodeCache(name, flags); | 522 Object* code = receiver->map()->FindInCodeCache(name, flags); |
508 if (code->IsUndefined()) { | 523 if (code->IsUndefined()) { |
509 KeyedStoreStubCompiler compiler(strict_mode); | 524 KeyedStoreStubCompiler compiler(strict_mode); |
510 { MaybeObject* maybe_code = compiler.CompileStoreSpecialized(receiver); | 525 { MaybeObject* maybe_code = compiler.CompileStoreSpecialized(receiver); |
511 if (!maybe_code->ToObject(&code)) return maybe_code; | 526 if (!maybe_code->ToObject(&code)) return maybe_code; |
512 } | 527 } |
513 PROFILE(CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, Code::cast(code), 0)); | 528 PROFILE(isolate_, |
| 529 CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, Code::cast(code), 0)); |
514 Object* result; | 530 Object* result; |
515 { MaybeObject* maybe_result = | 531 { MaybeObject* maybe_result = |
516 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 532 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
517 if (!maybe_result->ToObject(&result)) return maybe_result; | 533 if (!maybe_result->ToObject(&result)) return maybe_result; |
518 } | 534 } |
519 } | 535 } |
520 return code; | 536 return code; |
521 } | 537 } |
522 | 538 |
523 | 539 |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
616 if (code->IsUndefined()) { | 632 if (code->IsUndefined()) { |
617 ExternalArrayStubCompiler compiler; | 633 ExternalArrayStubCompiler compiler; |
618 { MaybeObject* maybe_code = | 634 { MaybeObject* maybe_code = |
619 is_store ? | 635 is_store ? |
620 compiler.CompileKeyedStoreStub(receiver, array_type, flags) : | 636 compiler.CompileKeyedStoreStub(receiver, array_type, flags) : |
621 compiler.CompileKeyedLoadStub(receiver, array_type, flags); | 637 compiler.CompileKeyedLoadStub(receiver, array_type, flags); |
622 if (!maybe_code->ToObject(&code)) return maybe_code; | 638 if (!maybe_code->ToObject(&code)) return maybe_code; |
623 } | 639 } |
624 Code::cast(code)->set_external_array_type(array_type); | 640 Code::cast(code)->set_external_array_type(array_type); |
625 if (is_store) { | 641 if (is_store) { |
626 PROFILE( | 642 PROFILE(isolate_, |
627 CodeCreateEvent(Logger::KEYED_EXTERNAL_ARRAY_STORE_IC_TAG, | 643 CodeCreateEvent(Logger::KEYED_EXTERNAL_ARRAY_STORE_IC_TAG, |
628 Code::cast(code), 0)); | 644 Code::cast(code), 0)); |
629 } else { | 645 } else { |
630 PROFILE( | 646 PROFILE(isolate_, |
631 CodeCreateEvent(Logger::KEYED_EXTERNAL_ARRAY_LOAD_IC_TAG, | 647 CodeCreateEvent(Logger::KEYED_EXTERNAL_ARRAY_LOAD_IC_TAG, |
632 Code::cast(code), 0)); | 648 Code::cast(code), 0)); |
633 } | 649 } |
634 Object* result; | 650 Object* result; |
635 { MaybeObject* maybe_result = | 651 { MaybeObject* maybe_result = |
636 receiver->map()->UpdateCodeCache(name, Code::cast(code)); | 652 receiver->map()->UpdateCodeCache(name, Code::cast(code)); |
637 if (!maybe_result->ToObject(&result)) return maybe_result; | 653 if (!maybe_result->ToObject(&result)) return maybe_result; |
638 } | 654 } |
639 } | 655 } |
640 return code; | 656 return code; |
(...skipping 13 matching lines...) Expand all Loading... |
654 StrictModeFlag strict_mode) { | 670 StrictModeFlag strict_mode) { |
655 Code::Flags flags = Code::ComputeMonomorphicFlags( | 671 Code::Flags flags = Code::ComputeMonomorphicFlags( |
656 Code::STORE_IC, NORMAL, strict_mode); | 672 Code::STORE_IC, NORMAL, strict_mode); |
657 Object* code = receiver->map()->FindInCodeCache(name, flags); | 673 Object* code = receiver->map()->FindInCodeCache(name, flags); |
658 if (code->IsUndefined()) { | 674 if (code->IsUndefined()) { |
659 StoreStubCompiler compiler(strict_mode); | 675 StoreStubCompiler compiler(strict_mode); |
660 { MaybeObject* maybe_code = | 676 { MaybeObject* maybe_code = |
661 compiler.CompileStoreGlobal(receiver, cell, name); | 677 compiler.CompileStoreGlobal(receiver, cell, name); |
662 if (!maybe_code->ToObject(&code)) return maybe_code; | 678 if (!maybe_code->ToObject(&code)) return maybe_code; |
663 } | 679 } |
664 PROFILE(CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); | 680 PROFILE(isolate_, |
| 681 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); |
665 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); | 682 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); |
666 Object* result; | 683 Object* result; |
667 { MaybeObject* maybe_result = | 684 { MaybeObject* maybe_result = |
668 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 685 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
669 if (!maybe_result->ToObject(&result)) return maybe_result; | 686 if (!maybe_result->ToObject(&result)) return maybe_result; |
670 } | 687 } |
671 } | 688 } |
672 return code; | 689 return code; |
673 } | 690 } |
674 | 691 |
675 | 692 |
676 MaybeObject* StubCache::ComputeStoreCallback( | 693 MaybeObject* StubCache::ComputeStoreCallback( |
677 String* name, | 694 String* name, |
678 JSObject* receiver, | 695 JSObject* receiver, |
679 AccessorInfo* callback, | 696 AccessorInfo* callback, |
680 StrictModeFlag strict_mode) { | 697 StrictModeFlag strict_mode) { |
681 ASSERT(v8::ToCData<Address>(callback->setter()) != 0); | 698 ASSERT(v8::ToCData<Address>(callback->setter()) != 0); |
682 Code::Flags flags = Code::ComputeMonomorphicFlags( | 699 Code::Flags flags = Code::ComputeMonomorphicFlags( |
683 Code::STORE_IC, CALLBACKS, strict_mode); | 700 Code::STORE_IC, CALLBACKS, strict_mode); |
684 Object* code = receiver->map()->FindInCodeCache(name, flags); | 701 Object* code = receiver->map()->FindInCodeCache(name, flags); |
685 if (code->IsUndefined()) { | 702 if (code->IsUndefined()) { |
686 StoreStubCompiler compiler(strict_mode); | 703 StoreStubCompiler compiler(strict_mode); |
687 { MaybeObject* maybe_code = | 704 { MaybeObject* maybe_code = |
688 compiler.CompileStoreCallback(receiver, callback, name); | 705 compiler.CompileStoreCallback(receiver, callback, name); |
689 if (!maybe_code->ToObject(&code)) return maybe_code; | 706 if (!maybe_code->ToObject(&code)) return maybe_code; |
690 } | 707 } |
691 PROFILE(CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); | 708 PROFILE(isolate_, |
| 709 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); |
692 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); | 710 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); |
693 Object* result; | 711 Object* result; |
694 { MaybeObject* maybe_result = | 712 { MaybeObject* maybe_result = |
695 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 713 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
696 if (!maybe_result->ToObject(&result)) return maybe_result; | 714 if (!maybe_result->ToObject(&result)) return maybe_result; |
697 } | 715 } |
698 } | 716 } |
699 return code; | 717 return code; |
700 } | 718 } |
701 | 719 |
702 | 720 |
703 MaybeObject* StubCache::ComputeStoreInterceptor( | 721 MaybeObject* StubCache::ComputeStoreInterceptor( |
704 String* name, | 722 String* name, |
705 JSObject* receiver, | 723 JSObject* receiver, |
706 StrictModeFlag strict_mode) { | 724 StrictModeFlag strict_mode) { |
707 Code::Flags flags = Code::ComputeMonomorphicFlags( | 725 Code::Flags flags = Code::ComputeMonomorphicFlags( |
708 Code::STORE_IC, INTERCEPTOR, strict_mode); | 726 Code::STORE_IC, INTERCEPTOR, strict_mode); |
709 Object* code = receiver->map()->FindInCodeCache(name, flags); | 727 Object* code = receiver->map()->FindInCodeCache(name, flags); |
710 if (code->IsUndefined()) { | 728 if (code->IsUndefined()) { |
711 StoreStubCompiler compiler(strict_mode); | 729 StoreStubCompiler compiler(strict_mode); |
712 { MaybeObject* maybe_code = | 730 { MaybeObject* maybe_code = |
713 compiler.CompileStoreInterceptor(receiver, name); | 731 compiler.CompileStoreInterceptor(receiver, name); |
714 if (!maybe_code->ToObject(&code)) return maybe_code; | 732 if (!maybe_code->ToObject(&code)) return maybe_code; |
715 } | 733 } |
716 PROFILE(CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); | 734 PROFILE(isolate_, |
| 735 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); |
717 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); | 736 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); |
718 Object* result; | 737 Object* result; |
719 { MaybeObject* maybe_result = | 738 { MaybeObject* maybe_result = |
720 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 739 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
721 if (!maybe_result->ToObject(&result)) return maybe_result; | 740 if (!maybe_result->ToObject(&result)) return maybe_result; |
722 } | 741 } |
723 } | 742 } |
724 return code; | 743 return code; |
725 } | 744 } |
726 | 745 |
727 | 746 |
728 MaybeObject* StubCache::ComputeKeyedStoreField(String* name, | 747 MaybeObject* StubCache::ComputeKeyedStoreField(String* name, |
729 JSObject* receiver, | 748 JSObject* receiver, |
730 int field_index, | 749 int field_index, |
731 Map* transition, | 750 Map* transition, |
732 StrictModeFlag strict_mode) { | 751 StrictModeFlag strict_mode) { |
733 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; | 752 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; |
734 Code::Flags flags = Code::ComputeMonomorphicFlags( | 753 Code::Flags flags = Code::ComputeMonomorphicFlags( |
735 Code::KEYED_STORE_IC, type, strict_mode); | 754 Code::KEYED_STORE_IC, type, strict_mode); |
736 Object* code = receiver->map()->FindInCodeCache(name, flags); | 755 Object* code = receiver->map()->FindInCodeCache(name, flags); |
737 if (code->IsUndefined()) { | 756 if (code->IsUndefined()) { |
738 KeyedStoreStubCompiler compiler(strict_mode); | 757 KeyedStoreStubCompiler compiler(strict_mode); |
739 { MaybeObject* maybe_code = | 758 { MaybeObject* maybe_code = |
740 compiler.CompileStoreField(receiver, field_index, transition, name); | 759 compiler.CompileStoreField(receiver, field_index, transition, name); |
741 if (!maybe_code->ToObject(&code)) return maybe_code; | 760 if (!maybe_code->ToObject(&code)) return maybe_code; |
742 } | 761 } |
743 PROFILE(CodeCreateEvent( | 762 PROFILE(isolate_, |
744 Logger::KEYED_STORE_IC_TAG, Code::cast(code), name)); | 763 CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, |
| 764 Code::cast(code), name)); |
745 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, name, Code::cast(code))); | 765 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, name, Code::cast(code))); |
746 Object* result; | 766 Object* result; |
747 { MaybeObject* maybe_result = | 767 { MaybeObject* maybe_result = |
748 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 768 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
749 if (!maybe_result->ToObject(&result)) return maybe_result; | 769 if (!maybe_result->ToObject(&result)) return maybe_result; |
750 } | 770 } |
751 } | 771 } |
752 return code; | 772 return code; |
753 } | 773 } |
754 | 774 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
793 if (!function->is_compiled()) return Failure::InternalError(); | 813 if (!function->is_compiled()) return Failure::InternalError(); |
794 // Compile the stub - only create stubs for fully compiled functions. | 814 // Compile the stub - only create stubs for fully compiled functions. |
795 CallStubCompiler compiler( | 815 CallStubCompiler compiler( |
796 argc, in_loop, kind, extra_ic_state, cache_holder); | 816 argc, in_loop, kind, extra_ic_state, cache_holder); |
797 { MaybeObject* maybe_code = | 817 { MaybeObject* maybe_code = |
798 compiler.CompileCallConstant(object, holder, function, name, check); | 818 compiler.CompileCallConstant(object, holder, function, name, check); |
799 if (!maybe_code->ToObject(&code)) return maybe_code; | 819 if (!maybe_code->ToObject(&code)) return maybe_code; |
800 } | 820 } |
801 Code::cast(code)->set_check_type(check); | 821 Code::cast(code)->set_check_type(check); |
802 ASSERT_EQ(flags, Code::cast(code)->flags()); | 822 ASSERT_EQ(flags, Code::cast(code)->flags()); |
803 PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), | 823 PROFILE(isolate_, |
| 824 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), |
804 Code::cast(code), name)); | 825 Code::cast(code), name)); |
805 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); | 826 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); |
806 Object* result; | 827 Object* result; |
807 { MaybeObject* maybe_result = | 828 { MaybeObject* maybe_result = |
808 map_holder->UpdateMapCodeCache(name, Code::cast(code)); | 829 map_holder->UpdateMapCodeCache(name, Code::cast(code)); |
809 if (!maybe_result->ToObject(&result)) return maybe_result; | 830 if (!maybe_result->ToObject(&result)) return maybe_result; |
810 } | 831 } |
811 } | 832 } |
812 return code; | 833 return code; |
813 } | 834 } |
(...skipping 29 matching lines...) Expand all Loading... |
843 CallStubCompiler compiler( | 864 CallStubCompiler compiler( |
844 argc, in_loop, kind, Code::kNoExtraICState, cache_holder); | 865 argc, in_loop, kind, Code::kNoExtraICState, cache_holder); |
845 { MaybeObject* maybe_code = | 866 { MaybeObject* maybe_code = |
846 compiler.CompileCallField(JSObject::cast(object), | 867 compiler.CompileCallField(JSObject::cast(object), |
847 holder, | 868 holder, |
848 index, | 869 index, |
849 name); | 870 name); |
850 if (!maybe_code->ToObject(&code)) return maybe_code; | 871 if (!maybe_code->ToObject(&code)) return maybe_code; |
851 } | 872 } |
852 ASSERT_EQ(flags, Code::cast(code)->flags()); | 873 ASSERT_EQ(flags, Code::cast(code)->flags()); |
853 PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), | 874 PROFILE(isolate_, |
| 875 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), |
854 Code::cast(code), name)); | 876 Code::cast(code), name)); |
855 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); | 877 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); |
856 Object* result; | 878 Object* result; |
857 { MaybeObject* maybe_result = | 879 { MaybeObject* maybe_result = |
858 map_holder->UpdateMapCodeCache(name, Code::cast(code)); | 880 map_holder->UpdateMapCodeCache(name, Code::cast(code)); |
859 if (!maybe_result->ToObject(&result)) return maybe_result; | 881 if (!maybe_result->ToObject(&result)) return maybe_result; |
860 } | 882 } |
861 } | 883 } |
862 return code; | 884 return code; |
863 } | 885 } |
(...skipping 24 matching lines...) Expand all Loading... |
888 argc); | 910 argc); |
889 Object* code = map_holder->map()->FindInCodeCache(name, flags); | 911 Object* code = map_holder->map()->FindInCodeCache(name, flags); |
890 if (code->IsUndefined()) { | 912 if (code->IsUndefined()) { |
891 CallStubCompiler compiler( | 913 CallStubCompiler compiler( |
892 argc, NOT_IN_LOOP, kind, Code::kNoExtraICState, cache_holder); | 914 argc, NOT_IN_LOOP, kind, Code::kNoExtraICState, cache_holder); |
893 { MaybeObject* maybe_code = | 915 { MaybeObject* maybe_code = |
894 compiler.CompileCallInterceptor(JSObject::cast(object), holder, name); | 916 compiler.CompileCallInterceptor(JSObject::cast(object), holder, name); |
895 if (!maybe_code->ToObject(&code)) return maybe_code; | 917 if (!maybe_code->ToObject(&code)) return maybe_code; |
896 } | 918 } |
897 ASSERT_EQ(flags, Code::cast(code)->flags()); | 919 ASSERT_EQ(flags, Code::cast(code)->flags()); |
898 PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), | 920 PROFILE(isolate_, |
| 921 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), |
899 Code::cast(code), name)); | 922 Code::cast(code), name)); |
900 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); | 923 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); |
901 Object* result; | 924 Object* result; |
902 { MaybeObject* maybe_result = | 925 { MaybeObject* maybe_result = |
903 map_holder->UpdateMapCodeCache(name, Code::cast(code)); | 926 map_holder->UpdateMapCodeCache(name, Code::cast(code)); |
904 if (!maybe_result->ToObject(&result)) return maybe_result; | 927 if (!maybe_result->ToObject(&result)) return maybe_result; |
905 } | 928 } |
906 } | 929 } |
907 return code; | 930 return code; |
908 } | 931 } |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
945 // internal error which will make sure we do not update any | 968 // internal error which will make sure we do not update any |
946 // caches. | 969 // caches. |
947 if (!function->is_compiled()) return Failure::InternalError(); | 970 if (!function->is_compiled()) return Failure::InternalError(); |
948 CallStubCompiler compiler( | 971 CallStubCompiler compiler( |
949 argc, in_loop, kind, Code::kNoExtraICState, cache_holder); | 972 argc, in_loop, kind, Code::kNoExtraICState, cache_holder); |
950 { MaybeObject* maybe_code = | 973 { MaybeObject* maybe_code = |
951 compiler.CompileCallGlobal(receiver, holder, cell, function, name); | 974 compiler.CompileCallGlobal(receiver, holder, cell, function, name); |
952 if (!maybe_code->ToObject(&code)) return maybe_code; | 975 if (!maybe_code->ToObject(&code)) return maybe_code; |
953 } | 976 } |
954 ASSERT_EQ(flags, Code::cast(code)->flags()); | 977 ASSERT_EQ(flags, Code::cast(code)->flags()); |
955 PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), | 978 PROFILE(isolate_, |
| 979 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), |
956 Code::cast(code), name)); | 980 Code::cast(code), name)); |
957 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); | 981 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); |
958 Object* result; | 982 Object* result; |
959 { MaybeObject* maybe_result = | 983 { MaybeObject* maybe_result = |
960 map_holder->UpdateMapCodeCache(name, Code::cast(code)); | 984 map_holder->UpdateMapCodeCache(name, Code::cast(code)); |
961 if (!maybe_result->ToObject(&result)) return maybe_result; | 985 if (!maybe_result->ToObject(&result)) return maybe_result; |
962 } | 986 } |
963 } | 987 } |
964 return code; | 988 return code; |
965 } | 989 } |
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1279 MaybeObject* StoreCallbackProperty(RUNTIME_CALLING_CONVENTION) { | 1303 MaybeObject* StoreCallbackProperty(RUNTIME_CALLING_CONVENTION) { |
1280 RUNTIME_GET_ISOLATE; | 1304 RUNTIME_GET_ISOLATE; |
1281 JSObject* recv = JSObject::cast(args[0]); | 1305 JSObject* recv = JSObject::cast(args[0]); |
1282 AccessorInfo* callback = AccessorInfo::cast(args[1]); | 1306 AccessorInfo* callback = AccessorInfo::cast(args[1]); |
1283 Address setter_address = v8::ToCData<Address>(callback->setter()); | 1307 Address setter_address = v8::ToCData<Address>(callback->setter()); |
1284 v8::AccessorSetter fun = FUNCTION_CAST<v8::AccessorSetter>(setter_address); | 1308 v8::AccessorSetter fun = FUNCTION_CAST<v8::AccessorSetter>(setter_address); |
1285 ASSERT(fun != NULL); | 1309 ASSERT(fun != NULL); |
1286 Handle<String> name = args.at<String>(2); | 1310 Handle<String> name = args.at<String>(2); |
1287 Handle<Object> value = args.at<Object>(3); | 1311 Handle<Object> value = args.at<Object>(3); |
1288 HandleScope scope(isolate); | 1312 HandleScope scope(isolate); |
1289 LOG(ApiNamedPropertyAccess("store", recv, *name)); | 1313 LOG(isolate, ApiNamedPropertyAccess("store", recv, *name)); |
1290 CustomArguments custom_args(isolate, callback->data(), recv, recv); | 1314 CustomArguments custom_args(isolate, callback->data(), recv, recv); |
1291 v8::AccessorInfo info(custom_args.end()); | 1315 v8::AccessorInfo info(custom_args.end()); |
1292 { | 1316 { |
1293 // Leaving JavaScript. | 1317 // Leaving JavaScript. |
1294 VMState state(isolate, EXTERNAL); | 1318 VMState state(isolate, EXTERNAL); |
1295 ExternalCallbackScope call_scope(isolate, setter_address); | 1319 ExternalCallbackScope call_scope(isolate, setter_address); |
1296 fun(v8::Utils::ToLocal(name), v8::Utils::ToLocal(value), info); | 1320 fun(v8::Utils::ToLocal(name), v8::Utils::ToLocal(value), info); |
1297 } | 1321 } |
1298 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 1322 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
1299 return *value; | 1323 return *value; |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1456 MaybeObject* KeyedLoadPropertyWithInterceptor(RUNTIME_CALLING_CONVENTION) { | 1480 MaybeObject* KeyedLoadPropertyWithInterceptor(RUNTIME_CALLING_CONVENTION) { |
1457 RUNTIME_GET_ISOLATE; | 1481 RUNTIME_GET_ISOLATE; |
1458 JSObject* receiver = JSObject::cast(args[0]); | 1482 JSObject* receiver = JSObject::cast(args[0]); |
1459 ASSERT(Smi::cast(args[1])->value() >= 0); | 1483 ASSERT(Smi::cast(args[1])->value() >= 0); |
1460 uint32_t index = Smi::cast(args[1])->value(); | 1484 uint32_t index = Smi::cast(args[1])->value(); |
1461 return receiver->GetElementWithInterceptor(receiver, index); | 1485 return receiver->GetElementWithInterceptor(receiver, index); |
1462 } | 1486 } |
1463 | 1487 |
1464 | 1488 |
1465 MaybeObject* StubCompiler::CompileCallInitialize(Code::Flags flags) { | 1489 MaybeObject* StubCompiler::CompileCallInitialize(Code::Flags flags) { |
1466 HandleScope scope; | 1490 HandleScope scope(isolate()); |
1467 int argc = Code::ExtractArgumentsCountFromFlags(flags); | 1491 int argc = Code::ExtractArgumentsCountFromFlags(flags); |
1468 Code::Kind kind = Code::ExtractKindFromFlags(flags); | 1492 Code::Kind kind = Code::ExtractKindFromFlags(flags); |
1469 if (kind == Code::CALL_IC) { | 1493 if (kind == Code::CALL_IC) { |
1470 CallIC::GenerateInitialize(masm(), argc); | 1494 CallIC::GenerateInitialize(masm(), argc); |
1471 } else { | 1495 } else { |
1472 KeyedCallIC::GenerateInitialize(masm(), argc); | 1496 KeyedCallIC::GenerateInitialize(masm(), argc); |
1473 } | 1497 } |
1474 Object* result; | 1498 Object* result; |
1475 { MaybeObject* maybe_result = | 1499 { MaybeObject* maybe_result = |
1476 GetCodeWithFlags(flags, "CompileCallInitialize"); | 1500 GetCodeWithFlags(flags, "CompileCallInitialize"); |
1477 if (!maybe_result->ToObject(&result)) return maybe_result; | 1501 if (!maybe_result->ToObject(&result)) return maybe_result; |
1478 } | 1502 } |
1479 COUNTERS->call_initialize_stubs()->Increment(); | 1503 COUNTERS->call_initialize_stubs()->Increment(); |
1480 Code* code = Code::cast(result); | 1504 Code* code = Code::cast(result); |
1481 USE(code); | 1505 USE(code); |
1482 PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_INITIALIZE_TAG), | 1506 PROFILE(isolate(), |
| 1507 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_INITIALIZE_TAG), |
1483 code, code->arguments_count())); | 1508 code, code->arguments_count())); |
1484 GDBJIT(AddCode(GDBJITInterface::CALL_INITIALIZE, Code::cast(code))); | 1509 GDBJIT(AddCode(GDBJITInterface::CALL_INITIALIZE, Code::cast(code))); |
1485 return result; | 1510 return result; |
1486 } | 1511 } |
1487 | 1512 |
1488 | 1513 |
1489 MaybeObject* StubCompiler::CompileCallPreMonomorphic(Code::Flags flags) { | 1514 MaybeObject* StubCompiler::CompileCallPreMonomorphic(Code::Flags flags) { |
1490 HandleScope scope; | 1515 HandleScope scope(isolate()); |
1491 int argc = Code::ExtractArgumentsCountFromFlags(flags); | 1516 int argc = Code::ExtractArgumentsCountFromFlags(flags); |
1492 // The code of the PreMonomorphic stub is the same as the code | 1517 // The code of the PreMonomorphic stub is the same as the code |
1493 // of the Initialized stub. They just differ on the code object flags. | 1518 // of the Initialized stub. They just differ on the code object flags. |
1494 Code::Kind kind = Code::ExtractKindFromFlags(flags); | 1519 Code::Kind kind = Code::ExtractKindFromFlags(flags); |
1495 if (kind == Code::CALL_IC) { | 1520 if (kind == Code::CALL_IC) { |
1496 CallIC::GenerateInitialize(masm(), argc); | 1521 CallIC::GenerateInitialize(masm(), argc); |
1497 } else { | 1522 } else { |
1498 KeyedCallIC::GenerateInitialize(masm(), argc); | 1523 KeyedCallIC::GenerateInitialize(masm(), argc); |
1499 } | 1524 } |
1500 Object* result; | 1525 Object* result; |
1501 { MaybeObject* maybe_result = | 1526 { MaybeObject* maybe_result = |
1502 GetCodeWithFlags(flags, "CompileCallPreMonomorphic"); | 1527 GetCodeWithFlags(flags, "CompileCallPreMonomorphic"); |
1503 if (!maybe_result->ToObject(&result)) return maybe_result; | 1528 if (!maybe_result->ToObject(&result)) return maybe_result; |
1504 } | 1529 } |
1505 COUNTERS->call_premonomorphic_stubs()->Increment(); | 1530 COUNTERS->call_premonomorphic_stubs()->Increment(); |
1506 Code* code = Code::cast(result); | 1531 Code* code = Code::cast(result); |
1507 USE(code); | 1532 USE(code); |
1508 PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_PRE_MONOMORPHIC_TAG), | 1533 PROFILE(isolate(), |
| 1534 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_PRE_MONOMORPHIC_TAG), |
1509 code, code->arguments_count())); | 1535 code, code->arguments_count())); |
1510 GDBJIT(AddCode(GDBJITInterface::CALL_PRE_MONOMORPHIC, Code::cast(code))); | 1536 GDBJIT(AddCode(GDBJITInterface::CALL_PRE_MONOMORPHIC, Code::cast(code))); |
1511 return result; | 1537 return result; |
1512 } | 1538 } |
1513 | 1539 |
1514 | 1540 |
1515 MaybeObject* StubCompiler::CompileCallNormal(Code::Flags flags) { | 1541 MaybeObject* StubCompiler::CompileCallNormal(Code::Flags flags) { |
1516 HandleScope scope; | 1542 HandleScope scope(isolate()); |
1517 int argc = Code::ExtractArgumentsCountFromFlags(flags); | 1543 int argc = Code::ExtractArgumentsCountFromFlags(flags); |
1518 Code::Kind kind = Code::ExtractKindFromFlags(flags); | 1544 Code::Kind kind = Code::ExtractKindFromFlags(flags); |
1519 if (kind == Code::CALL_IC) { | 1545 if (kind == Code::CALL_IC) { |
1520 CallIC::GenerateNormal(masm(), argc); | 1546 CallIC::GenerateNormal(masm(), argc); |
1521 } else { | 1547 } else { |
1522 KeyedCallIC::GenerateNormal(masm(), argc); | 1548 KeyedCallIC::GenerateNormal(masm(), argc); |
1523 } | 1549 } |
1524 Object* result; | 1550 Object* result; |
1525 { MaybeObject* maybe_result = GetCodeWithFlags(flags, "CompileCallNormal"); | 1551 { MaybeObject* maybe_result = GetCodeWithFlags(flags, "CompileCallNormal"); |
1526 if (!maybe_result->ToObject(&result)) return maybe_result; | 1552 if (!maybe_result->ToObject(&result)) return maybe_result; |
1527 } | 1553 } |
1528 COUNTERS->call_normal_stubs()->Increment(); | 1554 COUNTERS->call_normal_stubs()->Increment(); |
1529 Code* code = Code::cast(result); | 1555 Code* code = Code::cast(result); |
1530 USE(code); | 1556 USE(code); |
1531 PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_NORMAL_TAG), | 1557 PROFILE(isolate(), |
| 1558 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_NORMAL_TAG), |
1532 code, code->arguments_count())); | 1559 code, code->arguments_count())); |
1533 GDBJIT(AddCode(GDBJITInterface::CALL_NORMAL, Code::cast(code))); | 1560 GDBJIT(AddCode(GDBJITInterface::CALL_NORMAL, Code::cast(code))); |
1534 return result; | 1561 return result; |
1535 } | 1562 } |
1536 | 1563 |
1537 | 1564 |
1538 MaybeObject* StubCompiler::CompileCallMegamorphic(Code::Flags flags) { | 1565 MaybeObject* StubCompiler::CompileCallMegamorphic(Code::Flags flags) { |
1539 HandleScope scope; | 1566 HandleScope scope(isolate()); |
1540 int argc = Code::ExtractArgumentsCountFromFlags(flags); | 1567 int argc = Code::ExtractArgumentsCountFromFlags(flags); |
1541 Code::Kind kind = Code::ExtractKindFromFlags(flags); | 1568 Code::Kind kind = Code::ExtractKindFromFlags(flags); |
1542 if (kind == Code::CALL_IC) { | 1569 if (kind == Code::CALL_IC) { |
1543 CallIC::GenerateMegamorphic(masm(), argc); | 1570 CallIC::GenerateMegamorphic(masm(), argc); |
1544 } else { | 1571 } else { |
1545 KeyedCallIC::GenerateMegamorphic(masm(), argc); | 1572 KeyedCallIC::GenerateMegamorphic(masm(), argc); |
1546 } | 1573 } |
1547 Object* result; | 1574 Object* result; |
1548 { MaybeObject* maybe_result = | 1575 { MaybeObject* maybe_result = |
1549 GetCodeWithFlags(flags, "CompileCallMegamorphic"); | 1576 GetCodeWithFlags(flags, "CompileCallMegamorphic"); |
1550 if (!maybe_result->ToObject(&result)) return maybe_result; | 1577 if (!maybe_result->ToObject(&result)) return maybe_result; |
1551 } | 1578 } |
1552 COUNTERS->call_megamorphic_stubs()->Increment(); | 1579 COUNTERS->call_megamorphic_stubs()->Increment(); |
1553 Code* code = Code::cast(result); | 1580 Code* code = Code::cast(result); |
1554 USE(code); | 1581 USE(code); |
1555 PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_MEGAMORPHIC_TAG), | 1582 PROFILE(isolate(), |
| 1583 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_MEGAMORPHIC_TAG), |
1556 code, code->arguments_count())); | 1584 code, code->arguments_count())); |
1557 GDBJIT(AddCode(GDBJITInterface::CALL_MEGAMORPHIC, Code::cast(code))); | 1585 GDBJIT(AddCode(GDBJITInterface::CALL_MEGAMORPHIC, Code::cast(code))); |
1558 return result; | 1586 return result; |
1559 } | 1587 } |
1560 | 1588 |
1561 | 1589 |
1562 MaybeObject* StubCompiler::CompileCallMiss(Code::Flags flags) { | 1590 MaybeObject* StubCompiler::CompileCallMiss(Code::Flags flags) { |
1563 HandleScope scope; | 1591 HandleScope scope(isolate()); |
1564 int argc = Code::ExtractArgumentsCountFromFlags(flags); | 1592 int argc = Code::ExtractArgumentsCountFromFlags(flags); |
1565 Code::Kind kind = Code::ExtractKindFromFlags(flags); | 1593 Code::Kind kind = Code::ExtractKindFromFlags(flags); |
1566 if (kind == Code::CALL_IC) { | 1594 if (kind == Code::CALL_IC) { |
1567 CallIC::GenerateMiss(masm(), argc); | 1595 CallIC::GenerateMiss(masm(), argc); |
1568 } else { | 1596 } else { |
1569 KeyedCallIC::GenerateMiss(masm(), argc); | 1597 KeyedCallIC::GenerateMiss(masm(), argc); |
1570 } | 1598 } |
1571 Object* result; | 1599 Object* result; |
1572 { MaybeObject* maybe_result = GetCodeWithFlags(flags, "CompileCallMiss"); | 1600 { MaybeObject* maybe_result = GetCodeWithFlags(flags, "CompileCallMiss"); |
1573 if (!maybe_result->ToObject(&result)) return maybe_result; | 1601 if (!maybe_result->ToObject(&result)) return maybe_result; |
1574 } | 1602 } |
1575 COUNTERS->call_megamorphic_stubs()->Increment(); | 1603 COUNTERS->call_megamorphic_stubs()->Increment(); |
1576 Code* code = Code::cast(result); | 1604 Code* code = Code::cast(result); |
1577 USE(code); | 1605 USE(code); |
1578 PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_MISS_TAG), | 1606 PROFILE(isolate(), |
| 1607 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_MISS_TAG), |
1579 code, code->arguments_count())); | 1608 code, code->arguments_count())); |
1580 GDBJIT(AddCode(GDBJITInterface::CALL_MISS, Code::cast(code))); | 1609 GDBJIT(AddCode(GDBJITInterface::CALL_MISS, Code::cast(code))); |
1581 return result; | 1610 return result; |
1582 } | 1611 } |
1583 | 1612 |
1584 | 1613 |
1585 #ifdef ENABLE_DEBUGGER_SUPPORT | 1614 #ifdef ENABLE_DEBUGGER_SUPPORT |
1586 MaybeObject* StubCompiler::CompileCallDebugBreak(Code::Flags flags) { | 1615 MaybeObject* StubCompiler::CompileCallDebugBreak(Code::Flags flags) { |
1587 HandleScope scope; | 1616 HandleScope scope(isolate()); |
1588 Debug::GenerateCallICDebugBreak(masm()); | 1617 Debug::GenerateCallICDebugBreak(masm()); |
1589 Object* result; | 1618 Object* result; |
1590 { MaybeObject* maybe_result = | 1619 { MaybeObject* maybe_result = |
1591 GetCodeWithFlags(flags, "CompileCallDebugBreak"); | 1620 GetCodeWithFlags(flags, "CompileCallDebugBreak"); |
1592 if (!maybe_result->ToObject(&result)) return maybe_result; | 1621 if (!maybe_result->ToObject(&result)) return maybe_result; |
1593 } | 1622 } |
1594 Code* code = Code::cast(result); | 1623 Code* code = Code::cast(result); |
1595 USE(code); | 1624 USE(code); |
1596 Code::Kind kind = Code::ExtractKindFromFlags(flags); | 1625 Code::Kind kind = Code::ExtractKindFromFlags(flags); |
1597 USE(kind); | 1626 USE(kind); |
1598 PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_DEBUG_BREAK_TAG), | 1627 PROFILE(isolate(), |
| 1628 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_DEBUG_BREAK_TAG), |
1599 code, code->arguments_count())); | 1629 code, code->arguments_count())); |
1600 return result; | 1630 return result; |
1601 } | 1631 } |
1602 | 1632 |
1603 | 1633 |
1604 MaybeObject* StubCompiler::CompileCallDebugPrepareStepIn(Code::Flags flags) { | 1634 MaybeObject* StubCompiler::CompileCallDebugPrepareStepIn(Code::Flags flags) { |
1605 HandleScope scope; | 1635 HandleScope scope(isolate()); |
1606 // Use the same code for the the step in preparations as we do for | 1636 // Use the same code for the the step in preparations as we do for |
1607 // the miss case. | 1637 // the miss case. |
1608 int argc = Code::ExtractArgumentsCountFromFlags(flags); | 1638 int argc = Code::ExtractArgumentsCountFromFlags(flags); |
1609 Code::Kind kind = Code::ExtractKindFromFlags(flags); | 1639 Code::Kind kind = Code::ExtractKindFromFlags(flags); |
1610 if (kind == Code::CALL_IC) { | 1640 if (kind == Code::CALL_IC) { |
1611 CallIC::GenerateMiss(masm(), argc); | 1641 CallIC::GenerateMiss(masm(), argc); |
1612 } else { | 1642 } else { |
1613 KeyedCallIC::GenerateMiss(masm(), argc); | 1643 KeyedCallIC::GenerateMiss(masm(), argc); |
1614 } | 1644 } |
1615 Object* result; | 1645 Object* result; |
1616 { MaybeObject* maybe_result = | 1646 { MaybeObject* maybe_result = |
1617 GetCodeWithFlags(flags, "CompileCallDebugPrepareStepIn"); | 1647 GetCodeWithFlags(flags, "CompileCallDebugPrepareStepIn"); |
1618 if (!maybe_result->ToObject(&result)) return maybe_result; | 1648 if (!maybe_result->ToObject(&result)) return maybe_result; |
1619 } | 1649 } |
1620 Code* code = Code::cast(result); | 1650 Code* code = Code::cast(result); |
1621 USE(code); | 1651 USE(code); |
1622 PROFILE(CodeCreateEvent( | 1652 PROFILE(isolate(), |
1623 CALL_LOGGER_TAG(kind, CALL_DEBUG_PREPARE_STEP_IN_TAG), | 1653 CodeCreateEvent( |
1624 code, | 1654 CALL_LOGGER_TAG(kind, CALL_DEBUG_PREPARE_STEP_IN_TAG), |
1625 code->arguments_count())); | 1655 code, |
| 1656 code->arguments_count())); |
1626 return result; | 1657 return result; |
1627 } | 1658 } |
1628 #endif | 1659 #endif |
1629 | 1660 |
1630 #undef CALL_LOGGER_TAG | 1661 #undef CALL_LOGGER_TAG |
1631 | 1662 |
1632 MaybeObject* StubCompiler::GetCodeWithFlags(Code::Flags flags, | 1663 MaybeObject* StubCompiler::GetCodeWithFlags(Code::Flags flags, |
1633 const char* name) { | 1664 const char* name) { |
1634 // Check for allocation failures during stub compilation. | 1665 // Check for allocation failures during stub compilation. |
1635 if (failure_->IsFailure()) return failure_; | 1666 if (failure_->IsFailure()) return failure_; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1667 } | 1698 } |
1668 } | 1699 } |
1669 } | 1700 } |
1670 | 1701 |
1671 | 1702 |
1672 | 1703 |
1673 MaybeObject* LoadStubCompiler::GetCode(PropertyType type, String* name) { | 1704 MaybeObject* LoadStubCompiler::GetCode(PropertyType type, String* name) { |
1674 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, type); | 1705 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, type); |
1675 MaybeObject* result = GetCodeWithFlags(flags, name); | 1706 MaybeObject* result = GetCodeWithFlags(flags, name); |
1676 if (!result->IsFailure()) { | 1707 if (!result->IsFailure()) { |
1677 PROFILE(CodeCreateEvent(Logger::LOAD_IC_TAG, | 1708 PROFILE(isolate(), |
| 1709 CodeCreateEvent(Logger::LOAD_IC_TAG, |
1678 Code::cast(result->ToObjectUnchecked()), | 1710 Code::cast(result->ToObjectUnchecked()), |
1679 name)); | 1711 name)); |
1680 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, | 1712 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, |
1681 name, | 1713 name, |
1682 Code::cast(result->ToObjectUnchecked()))); | 1714 Code::cast(result->ToObjectUnchecked()))); |
1683 } | 1715 } |
1684 return result; | 1716 return result; |
1685 } | 1717 } |
1686 | 1718 |
1687 | 1719 |
1688 MaybeObject* KeyedLoadStubCompiler::GetCode(PropertyType type, String* name) { | 1720 MaybeObject* KeyedLoadStubCompiler::GetCode(PropertyType type, String* name) { |
1689 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, type); | 1721 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, type); |
1690 MaybeObject* result = GetCodeWithFlags(flags, name); | 1722 MaybeObject* result = GetCodeWithFlags(flags, name); |
1691 if (!result->IsFailure()) { | 1723 if (!result->IsFailure()) { |
1692 PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, | 1724 PROFILE(isolate(), |
| 1725 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, |
1693 Code::cast(result->ToObjectUnchecked()), | 1726 Code::cast(result->ToObjectUnchecked()), |
1694 name)); | 1727 name)); |
1695 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, | 1728 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, |
1696 name, | 1729 name, |
1697 Code::cast(result->ToObjectUnchecked()))); | 1730 Code::cast(result->ToObjectUnchecked()))); |
1698 } | 1731 } |
1699 return result; | 1732 return result; |
1700 } | 1733 } |
1701 | 1734 |
1702 | 1735 |
1703 MaybeObject* StoreStubCompiler::GetCode(PropertyType type, String* name) { | 1736 MaybeObject* StoreStubCompiler::GetCode(PropertyType type, String* name) { |
1704 Code::Flags flags = Code::ComputeMonomorphicFlags( | 1737 Code::Flags flags = Code::ComputeMonomorphicFlags( |
1705 Code::STORE_IC, type, strict_mode_); | 1738 Code::STORE_IC, type, strict_mode_); |
1706 MaybeObject* result = GetCodeWithFlags(flags, name); | 1739 MaybeObject* result = GetCodeWithFlags(flags, name); |
1707 if (!result->IsFailure()) { | 1740 if (!result->IsFailure()) { |
1708 PROFILE(CodeCreateEvent(Logger::STORE_IC_TAG, | 1741 PROFILE(isolate(), |
| 1742 CodeCreateEvent(Logger::STORE_IC_TAG, |
1709 Code::cast(result->ToObjectUnchecked()), | 1743 Code::cast(result->ToObjectUnchecked()), |
1710 name)); | 1744 name)); |
1711 GDBJIT(AddCode(GDBJITInterface::STORE_IC, | 1745 GDBJIT(AddCode(GDBJITInterface::STORE_IC, |
1712 name, | 1746 name, |
1713 Code::cast(result->ToObjectUnchecked()))); | 1747 Code::cast(result->ToObjectUnchecked()))); |
1714 } | 1748 } |
1715 return result; | 1749 return result; |
1716 } | 1750 } |
1717 | 1751 |
1718 | 1752 |
1719 MaybeObject* KeyedStoreStubCompiler::GetCode(PropertyType type, String* name) { | 1753 MaybeObject* KeyedStoreStubCompiler::GetCode(PropertyType type, String* name) { |
1720 Code::Flags flags = Code::ComputeMonomorphicFlags( | 1754 Code::Flags flags = Code::ComputeMonomorphicFlags( |
1721 Code::KEYED_STORE_IC, type, strict_mode_); | 1755 Code::KEYED_STORE_IC, type, strict_mode_); |
1722 MaybeObject* result = GetCodeWithFlags(flags, name); | 1756 MaybeObject* result = GetCodeWithFlags(flags, name); |
1723 if (!result->IsFailure()) { | 1757 if (!result->IsFailure()) { |
1724 PROFILE(CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, | 1758 PROFILE(isolate(), |
| 1759 CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, |
1725 Code::cast(result->ToObjectUnchecked()), | 1760 Code::cast(result->ToObjectUnchecked()), |
1726 name)); | 1761 name)); |
1727 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, | 1762 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, |
1728 name, | 1763 name, |
1729 Code::cast(result->ToObjectUnchecked()))); | 1764 Code::cast(result->ToObjectUnchecked()))); |
1730 } | 1765 } |
1731 return result; | 1766 return result; |
1732 } | 1767 } |
1733 | 1768 |
1734 | 1769 |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1796 | 1831 |
1797 | 1832 |
1798 MaybeObject* ConstructStubCompiler::GetCode() { | 1833 MaybeObject* ConstructStubCompiler::GetCode() { |
1799 Code::Flags flags = Code::ComputeFlags(Code::STUB); | 1834 Code::Flags flags = Code::ComputeFlags(Code::STUB); |
1800 Object* result; | 1835 Object* result; |
1801 { MaybeObject* maybe_result = GetCodeWithFlags(flags, "ConstructStub"); | 1836 { MaybeObject* maybe_result = GetCodeWithFlags(flags, "ConstructStub"); |
1802 if (!maybe_result->ToObject(&result)) return maybe_result; | 1837 if (!maybe_result->ToObject(&result)) return maybe_result; |
1803 } | 1838 } |
1804 Code* code = Code::cast(result); | 1839 Code* code = Code::cast(result); |
1805 USE(code); | 1840 USE(code); |
1806 PROFILE(CodeCreateEvent(Logger::STUB_TAG, code, "ConstructStub")); | 1841 PROFILE(isolate(), CodeCreateEvent(Logger::STUB_TAG, code, "ConstructStub")); |
1807 GDBJIT(AddCode(GDBJITInterface::STUB, "ConstructStub", Code::cast(code))); | 1842 GDBJIT(AddCode(GDBJITInterface::STUB, "ConstructStub", Code::cast(code))); |
1808 return result; | 1843 return result; |
1809 } | 1844 } |
1810 | 1845 |
1811 | 1846 |
1812 CallOptimization::CallOptimization(LookupResult* lookup) { | 1847 CallOptimization::CallOptimization(LookupResult* lookup) { |
1813 if (!lookup->IsProperty() || !lookup->IsCacheable() || | 1848 if (!lookup->IsProperty() || !lookup->IsCacheable() || |
1814 lookup->type() != CONSTANT_FUNCTION) { | 1849 lookup->type() != CONSTANT_FUNCTION) { |
1815 Initialize(NULL); | 1850 Initialize(NULL); |
1816 } else { | 1851 } else { |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1876 } | 1911 } |
1877 | 1912 |
1878 | 1913 |
1879 MaybeObject* ExternalArrayStubCompiler::GetCode(Code::Flags flags) { | 1914 MaybeObject* ExternalArrayStubCompiler::GetCode(Code::Flags flags) { |
1880 Object* result; | 1915 Object* result; |
1881 { MaybeObject* maybe_result = GetCodeWithFlags(flags, "ExternalArrayStub"); | 1916 { MaybeObject* maybe_result = GetCodeWithFlags(flags, "ExternalArrayStub"); |
1882 if (!maybe_result->ToObject(&result)) return maybe_result; | 1917 if (!maybe_result->ToObject(&result)) return maybe_result; |
1883 } | 1918 } |
1884 Code* code = Code::cast(result); | 1919 Code* code = Code::cast(result); |
1885 USE(code); | 1920 USE(code); |
1886 PROFILE(CodeCreateEvent(Logger::STUB_TAG, code, "ExternalArrayStub")); | 1921 PROFILE(isolate(), |
| 1922 CodeCreateEvent(Logger::STUB_TAG, code, "ExternalArrayStub")); |
1887 return result; | 1923 return result; |
1888 } | 1924 } |
1889 | 1925 |
1890 | 1926 |
1891 } } // namespace v8::internal | 1927 } } // namespace v8::internal |
OLD | NEW |