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