OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
112 Handle<String> cache_name = factory()->empty_string(); | 112 Handle<String> cache_name = factory()->empty_string(); |
113 if (receiver->IsGlobalObject()) cache_name = name; | 113 if (receiver->IsGlobalObject()) cache_name = name; |
114 Handle<JSObject> last = receiver; | 114 Handle<JSObject> last = receiver; |
115 while (last->GetPrototype() != heap()->null_value()) { | 115 while (last->GetPrototype() != heap()->null_value()) { |
116 last = Handle<JSObject>(JSObject::cast(last->GetPrototype())); | 116 last = Handle<JSObject>(JSObject::cast(last->GetPrototype())); |
117 if (last->IsGlobalObject()) cache_name = name; | 117 if (last->IsGlobalObject()) cache_name = name; |
118 } | 118 } |
119 // Compile the stub that is either shared for all names or | 119 // Compile the stub that is either shared for all names or |
120 // name specific if there are global objects involved. | 120 // name specific if there are global objects involved. |
121 Code::Flags flags = | 121 Code::Flags flags = |
122 Code::ComputeMonomorphicFlags(Code::LOAD_IC, NONEXISTENT); | 122 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::NONEXISTENT); |
123 Handle<Object> probe(receiver->map()->FindInCodeCache(*cache_name, flags)); | 123 Handle<Object> probe(receiver->map()->FindInCodeCache(*cache_name, flags)); |
124 if (probe->IsCode()) return Handle<Code>::cast(probe); | 124 if (probe->IsCode()) return Handle<Code>::cast(probe); |
125 | 125 |
126 LoadStubCompiler compiler(isolate_); | 126 LoadStubCompiler compiler(isolate_); |
127 Handle<Code> code = | 127 Handle<Code> code = |
128 compiler.CompileLoadNonexistent(cache_name, receiver, last); | 128 compiler.CompileLoadNonexistent(cache_name, receiver, last); |
129 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *cache_name)); | 129 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *cache_name)); |
130 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *cache_name, *code)); | 130 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *cache_name, *code)); |
131 JSObject::UpdateMapCodeCache(receiver, cache_name, code); | 131 JSObject::UpdateMapCodeCache(receiver, cache_name, code); |
132 return code; | 132 return code; |
133 } | 133 } |
134 | 134 |
135 | 135 |
136 Handle<Code> StubCache::ComputeLoadField(Handle<String> name, | 136 Handle<Code> StubCache::ComputeLoadField(Handle<String> name, |
137 Handle<JSObject> receiver, | 137 Handle<JSObject> receiver, |
138 Handle<JSObject> holder, | 138 Handle<JSObject> holder, |
139 int field_index) { | 139 int field_index) { |
140 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | 140 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
141 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, FIELD); | 141 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::FIELD); |
142 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 142 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
143 if (probe->IsCode()) return Handle<Code>::cast(probe); | 143 if (probe->IsCode()) return Handle<Code>::cast(probe); |
144 | 144 |
145 LoadStubCompiler compiler(isolate_); | 145 LoadStubCompiler compiler(isolate_); |
146 Handle<Code> code = | 146 Handle<Code> code = |
147 compiler.CompileLoadField(receiver, holder, field_index, name); | 147 compiler.CompileLoadField(receiver, holder, field_index, name); |
148 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); | 148 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
149 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); | 149 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
150 JSObject::UpdateMapCodeCache(receiver, name, code); | 150 JSObject::UpdateMapCodeCache(receiver, name, code); |
151 return code; | 151 return code; |
152 } | 152 } |
153 | 153 |
154 | 154 |
155 Handle<Code> StubCache::ComputeLoadCallback(Handle<String> name, | 155 Handle<Code> StubCache::ComputeLoadCallback(Handle<String> name, |
156 Handle<JSObject> receiver, | 156 Handle<JSObject> receiver, |
157 Handle<JSObject> holder, | 157 Handle<JSObject> holder, |
158 Handle<AccessorInfo> callback) { | 158 Handle<AccessorInfo> callback) { |
159 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); | 159 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); |
160 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | 160 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
161 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, CALLBACKS); | 161 Code::Flags flags = |
| 162 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::CALLBACKS); |
162 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 163 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
163 if (probe->IsCode()) return Handle<Code>::cast(probe); | 164 if (probe->IsCode()) return Handle<Code>::cast(probe); |
164 | 165 |
165 LoadStubCompiler compiler(isolate_); | 166 LoadStubCompiler compiler(isolate_); |
166 Handle<Code> code = | 167 Handle<Code> code = |
167 compiler.CompileLoadCallback(name, receiver, holder, callback); | 168 compiler.CompileLoadCallback(name, receiver, holder, callback); |
168 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); | 169 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
169 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); | 170 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
170 JSObject::UpdateMapCodeCache(receiver, name, code); | 171 JSObject::UpdateMapCodeCache(receiver, name, code); |
171 return code; | 172 return code; |
172 } | 173 } |
173 | 174 |
174 | 175 |
175 Handle<Code> StubCache::ComputeLoadViaGetter(Handle<String> name, | 176 Handle<Code> StubCache::ComputeLoadViaGetter(Handle<String> name, |
176 Handle<JSObject> receiver, | 177 Handle<JSObject> receiver, |
177 Handle<JSObject> holder, | 178 Handle<JSObject> holder, |
178 Handle<JSFunction> getter) { | 179 Handle<JSFunction> getter) { |
179 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | 180 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
180 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, CALLBACKS); | 181 Code::Flags flags = |
| 182 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::CALLBACKS); |
181 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 183 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
182 if (probe->IsCode()) return Handle<Code>::cast(probe); | 184 if (probe->IsCode()) return Handle<Code>::cast(probe); |
183 | 185 |
184 LoadStubCompiler compiler(isolate_); | 186 LoadStubCompiler compiler(isolate_); |
185 Handle<Code> code = | 187 Handle<Code> code = |
186 compiler.CompileLoadViaGetter(name, receiver, holder, getter); | 188 compiler.CompileLoadViaGetter(name, receiver, holder, getter); |
187 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); | 189 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
188 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); | 190 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
189 JSObject::UpdateMapCodeCache(receiver, name, code); | 191 JSObject::UpdateMapCodeCache(receiver, name, code); |
190 return code; | 192 return code; |
191 } | 193 } |
192 | 194 |
193 | 195 |
194 Handle<Code> StubCache::ComputeLoadConstant(Handle<String> name, | 196 Handle<Code> StubCache::ComputeLoadConstant(Handle<String> name, |
195 Handle<JSObject> receiver, | 197 Handle<JSObject> receiver, |
196 Handle<JSObject> holder, | 198 Handle<JSObject> holder, |
197 Handle<JSFunction> value) { | 199 Handle<JSFunction> value) { |
198 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | 200 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
199 Code::Flags flags = | 201 Code::Flags flags = |
200 Code::ComputeMonomorphicFlags(Code::LOAD_IC, CONSTANT_FUNCTION); | 202 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::CONSTANT_FUNCTION); |
201 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 203 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
202 if (probe->IsCode()) return Handle<Code>::cast(probe); | 204 if (probe->IsCode()) return Handle<Code>::cast(probe); |
203 | 205 |
204 LoadStubCompiler compiler(isolate_); | 206 LoadStubCompiler compiler(isolate_); |
205 Handle<Code> code = | 207 Handle<Code> code = |
206 compiler.CompileLoadConstant(receiver, holder, value, name); | 208 compiler.CompileLoadConstant(receiver, holder, value, name); |
207 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); | 209 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
208 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); | 210 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
209 JSObject::UpdateMapCodeCache(receiver, name, code); | 211 JSObject::UpdateMapCodeCache(receiver, name, code); |
210 return code; | 212 return code; |
211 } | 213 } |
212 | 214 |
213 | 215 |
214 Handle<Code> StubCache::ComputeLoadInterceptor(Handle<String> name, | 216 Handle<Code> StubCache::ComputeLoadInterceptor(Handle<String> name, |
215 Handle<JSObject> receiver, | 217 Handle<JSObject> receiver, |
216 Handle<JSObject> holder) { | 218 Handle<JSObject> holder) { |
217 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | 219 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
218 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, INTERCEPTOR); | 220 Code::Flags flags = |
| 221 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::INTERCEPTOR); |
219 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 222 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
220 if (probe->IsCode()) return Handle<Code>::cast(probe); | 223 if (probe->IsCode()) return Handle<Code>::cast(probe); |
221 | 224 |
222 LoadStubCompiler compiler(isolate_); | 225 LoadStubCompiler compiler(isolate_); |
223 Handle<Code> code = | 226 Handle<Code> code = |
224 compiler.CompileLoadInterceptor(receiver, holder, name); | 227 compiler.CompileLoadInterceptor(receiver, holder, name); |
225 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); | 228 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
226 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); | 229 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
227 JSObject::UpdateMapCodeCache(receiver, name, code); | 230 JSObject::UpdateMapCodeCache(receiver, name, code); |
228 return code; | 231 return code; |
229 } | 232 } |
230 | 233 |
231 | 234 |
232 Handle<Code> StubCache::ComputeLoadNormal() { | 235 Handle<Code> StubCache::ComputeLoadNormal() { |
233 return isolate_->builtins()->LoadIC_Normal(); | 236 return isolate_->builtins()->LoadIC_Normal(); |
234 } | 237 } |
235 | 238 |
236 | 239 |
237 Handle<Code> StubCache::ComputeLoadGlobal(Handle<String> name, | 240 Handle<Code> StubCache::ComputeLoadGlobal(Handle<String> name, |
238 Handle<JSObject> receiver, | 241 Handle<JSObject> receiver, |
239 Handle<GlobalObject> holder, | 242 Handle<GlobalObject> holder, |
240 Handle<JSGlobalPropertyCell> cell, | 243 Handle<JSGlobalPropertyCell> cell, |
241 bool is_dont_delete) { | 244 bool is_dont_delete) { |
242 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | 245 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
243 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, NORMAL); | 246 Code::Flags flags = |
| 247 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::NORMAL); |
244 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 248 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
245 if (probe->IsCode()) return Handle<Code>::cast(probe); | 249 if (probe->IsCode()) return Handle<Code>::cast(probe); |
246 | 250 |
247 LoadStubCompiler compiler(isolate_); | 251 LoadStubCompiler compiler(isolate_); |
248 Handle<Code> code = | 252 Handle<Code> code = |
249 compiler.CompileLoadGlobal(receiver, holder, cell, name, is_dont_delete); | 253 compiler.CompileLoadGlobal(receiver, holder, cell, name, is_dont_delete); |
250 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); | 254 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
251 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); | 255 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
252 JSObject::UpdateMapCodeCache(receiver, name, code); | 256 JSObject::UpdateMapCodeCache(receiver, name, code); |
253 return code; | 257 return code; |
254 } | 258 } |
255 | 259 |
256 | 260 |
257 Handle<Code> StubCache::ComputeKeyedLoadField(Handle<String> name, | 261 Handle<Code> StubCache::ComputeKeyedLoadField(Handle<String> name, |
258 Handle<JSObject> receiver, | 262 Handle<JSObject> receiver, |
259 Handle<JSObject> holder, | 263 Handle<JSObject> holder, |
260 int field_index) { | 264 int field_index) { |
261 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | 265 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
262 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, FIELD); | 266 Code::Flags flags = |
| 267 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::FIELD); |
263 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 268 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
264 if (probe->IsCode()) return Handle<Code>::cast(probe); | 269 if (probe->IsCode()) return Handle<Code>::cast(probe); |
265 | 270 |
266 KeyedLoadStubCompiler compiler(isolate_); | 271 KeyedLoadStubCompiler compiler(isolate_); |
267 Handle<Code> code = | 272 Handle<Code> code = |
268 compiler.CompileLoadField(name, receiver, holder, field_index); | 273 compiler.CompileLoadField(name, receiver, holder, field_index); |
269 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); | 274 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
270 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); | 275 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
271 JSObject::UpdateMapCodeCache(receiver, name, code); | 276 JSObject::UpdateMapCodeCache(receiver, name, code); |
272 return code; | 277 return code; |
273 } | 278 } |
274 | 279 |
275 | 280 |
276 Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<String> name, | 281 Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<String> name, |
277 Handle<JSObject> receiver, | 282 Handle<JSObject> receiver, |
278 Handle<JSObject> holder, | 283 Handle<JSObject> holder, |
279 Handle<JSFunction> value) { | 284 Handle<JSFunction> value) { |
280 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | 285 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
281 Code::Flags flags = | 286 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, |
282 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CONSTANT_FUNCTION); | 287 Code::CONSTANT_FUNCTION); |
283 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 288 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
284 if (probe->IsCode()) return Handle<Code>::cast(probe); | 289 if (probe->IsCode()) return Handle<Code>::cast(probe); |
285 | 290 |
286 KeyedLoadStubCompiler compiler(isolate_); | 291 KeyedLoadStubCompiler compiler(isolate_); |
287 Handle<Code> code = | 292 Handle<Code> code = |
288 compiler.CompileLoadConstant(name, receiver, holder, value); | 293 compiler.CompileLoadConstant(name, receiver, holder, value); |
289 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); | 294 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
290 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); | 295 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
291 JSObject::UpdateMapCodeCache(receiver, name, code); | 296 JSObject::UpdateMapCodeCache(receiver, name, code); |
292 return code; | 297 return code; |
293 } | 298 } |
294 | 299 |
295 | 300 |
296 Handle<Code> StubCache::ComputeKeyedLoadInterceptor(Handle<String> name, | 301 Handle<Code> StubCache::ComputeKeyedLoadInterceptor(Handle<String> name, |
297 Handle<JSObject> receiver, | 302 Handle<JSObject> receiver, |
298 Handle<JSObject> holder) { | 303 Handle<JSObject> holder) { |
299 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | 304 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
300 Code::Flags flags = | 305 Code::Flags flags = |
301 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, INTERCEPTOR); | 306 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::INTERCEPTOR); |
302 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 307 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
303 if (probe->IsCode()) return Handle<Code>::cast(probe); | 308 if (probe->IsCode()) return Handle<Code>::cast(probe); |
304 | 309 |
305 KeyedLoadStubCompiler compiler(isolate_); | 310 KeyedLoadStubCompiler compiler(isolate_); |
306 Handle<Code> code = compiler.CompileLoadInterceptor(receiver, holder, name); | 311 Handle<Code> code = compiler.CompileLoadInterceptor(receiver, holder, name); |
307 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); | 312 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
308 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); | 313 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
309 JSObject::UpdateMapCodeCache(receiver, name, code); | 314 JSObject::UpdateMapCodeCache(receiver, name, code); |
310 return code; | 315 return code; |
311 } | 316 } |
312 | 317 |
313 | 318 |
314 Handle<Code> StubCache::ComputeKeyedLoadCallback( | 319 Handle<Code> StubCache::ComputeKeyedLoadCallback( |
315 Handle<String> name, | 320 Handle<String> name, |
316 Handle<JSObject> receiver, | 321 Handle<JSObject> receiver, |
317 Handle<JSObject> holder, | 322 Handle<JSObject> holder, |
318 Handle<AccessorInfo> callback) { | 323 Handle<AccessorInfo> callback) { |
319 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | 324 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
320 Code::Flags flags = | 325 Code::Flags flags = |
321 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); | 326 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CALLBACKS); |
322 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 327 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
323 if (probe->IsCode()) return Handle<Code>::cast(probe); | 328 if (probe->IsCode()) return Handle<Code>::cast(probe); |
324 | 329 |
325 KeyedLoadStubCompiler compiler(isolate_); | 330 KeyedLoadStubCompiler compiler(isolate_); |
326 Handle<Code> code = | 331 Handle<Code> code = |
327 compiler.CompileLoadCallback(name, receiver, holder, callback); | 332 compiler.CompileLoadCallback(name, receiver, holder, callback); |
328 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); | 333 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
329 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); | 334 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
330 JSObject::UpdateMapCodeCache(receiver, name, code); | 335 JSObject::UpdateMapCodeCache(receiver, name, code); |
331 return code; | 336 return code; |
332 } | 337 } |
333 | 338 |
334 | 339 |
335 Handle<Code> StubCache::ComputeKeyedLoadArrayLength(Handle<String> name, | 340 Handle<Code> StubCache::ComputeKeyedLoadArrayLength(Handle<String> name, |
336 Handle<JSArray> receiver) { | 341 Handle<JSArray> receiver) { |
337 Code::Flags flags = | 342 Code::Flags flags = |
338 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); | 343 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CALLBACKS); |
339 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 344 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
340 if (probe->IsCode()) return Handle<Code>::cast(probe); | 345 if (probe->IsCode()) return Handle<Code>::cast(probe); |
341 | 346 |
342 KeyedLoadStubCompiler compiler(isolate_); | 347 KeyedLoadStubCompiler compiler(isolate_); |
343 Handle<Code> code = compiler.CompileLoadArrayLength(name); | 348 Handle<Code> code = compiler.CompileLoadArrayLength(name); |
344 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); | 349 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
345 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); | 350 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
346 JSObject::UpdateMapCodeCache(receiver, name, code); | 351 JSObject::UpdateMapCodeCache(receiver, name, code); |
347 return code; | 352 return code; |
348 } | 353 } |
349 | 354 |
350 | 355 |
351 Handle<Code> StubCache::ComputeKeyedLoadStringLength(Handle<String> name, | 356 Handle<Code> StubCache::ComputeKeyedLoadStringLength(Handle<String> name, |
352 Handle<String> receiver) { | 357 Handle<String> receiver) { |
353 Code::Flags flags = | 358 Code::Flags flags = |
354 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); | 359 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CALLBACKS); |
355 Handle<Map> map(receiver->map()); | 360 Handle<Map> map(receiver->map()); |
356 Handle<Object> probe(map->FindInCodeCache(*name, flags)); | 361 Handle<Object> probe(map->FindInCodeCache(*name, flags)); |
357 if (probe->IsCode()) return Handle<Code>::cast(probe); | 362 if (probe->IsCode()) return Handle<Code>::cast(probe); |
358 | 363 |
359 KeyedLoadStubCompiler compiler(isolate_); | 364 KeyedLoadStubCompiler compiler(isolate_); |
360 Handle<Code> code = compiler.CompileLoadStringLength(name); | 365 Handle<Code> code = compiler.CompileLoadStringLength(name); |
361 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); | 366 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
362 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); | 367 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
363 Map::UpdateCodeCache(map, name, code); | 368 Map::UpdateCodeCache(map, name, code); |
364 return code; | 369 return code; |
365 } | 370 } |
366 | 371 |
367 | 372 |
368 Handle<Code> StubCache::ComputeKeyedLoadFunctionPrototype( | 373 Handle<Code> StubCache::ComputeKeyedLoadFunctionPrototype( |
369 Handle<String> name, | 374 Handle<String> name, |
370 Handle<JSFunction> receiver) { | 375 Handle<JSFunction> receiver) { |
371 Code::Flags flags = | 376 Code::Flags flags = |
372 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); | 377 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CALLBACKS); |
373 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 378 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
374 if (probe->IsCode()) return Handle<Code>::cast(probe); | 379 if (probe->IsCode()) return Handle<Code>::cast(probe); |
375 | 380 |
376 KeyedLoadStubCompiler compiler(isolate_); | 381 KeyedLoadStubCompiler compiler(isolate_); |
377 Handle<Code> code = compiler.CompileLoadFunctionPrototype(name); | 382 Handle<Code> code = compiler.CompileLoadFunctionPrototype(name); |
378 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); | 383 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
379 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); | 384 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
380 JSObject::UpdateMapCodeCache(receiver, name, code); | 385 JSObject::UpdateMapCodeCache(receiver, name, code); |
381 return code; | 386 return code; |
382 } | 387 } |
383 | 388 |
384 | 389 |
385 Handle<Code> StubCache::ComputeStoreField(Handle<String> name, | 390 Handle<Code> StubCache::ComputeStoreField(Handle<String> name, |
386 Handle<JSObject> receiver, | 391 Handle<JSObject> receiver, |
387 int field_index, | 392 int field_index, |
388 Handle<Map> transition, | 393 Handle<Map> transition, |
389 StrictModeFlag strict_mode) { | 394 StrictModeFlag strict_mode) { |
390 PropertyType type = (transition.is_null()) ? FIELD : MAP_TRANSITION; | 395 Code::StubType type = |
| 396 (transition.is_null()) ? Code::FIELD : Code::MAP_TRANSITION; |
391 Code::Flags flags = Code::ComputeMonomorphicFlags( | 397 Code::Flags flags = Code::ComputeMonomorphicFlags( |
392 Code::STORE_IC, type, strict_mode); | 398 Code::STORE_IC, type, strict_mode); |
393 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 399 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
394 if (probe->IsCode()) return Handle<Code>::cast(probe); | 400 if (probe->IsCode()) return Handle<Code>::cast(probe); |
395 | 401 |
396 StoreStubCompiler compiler(isolate_, strict_mode); | 402 StoreStubCompiler compiler(isolate_, strict_mode); |
397 Handle<Code> code = | 403 Handle<Code> code = |
398 compiler.CompileStoreField(receiver, field_index, transition, name); | 404 compiler.CompileStoreField(receiver, field_index, transition, name); |
399 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); | 405 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); |
400 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); | 406 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); |
401 JSObject::UpdateMapCodeCache(receiver, name, code); | 407 JSObject::UpdateMapCodeCache(receiver, name, code); |
402 return code; | 408 return code; |
403 } | 409 } |
404 | 410 |
405 | 411 |
406 Handle<Code> StubCache::ComputeKeyedLoadOrStoreElement( | 412 Handle<Code> StubCache::ComputeKeyedLoadOrStoreElement( |
407 Handle<Map> receiver_map, | 413 Handle<Map> receiver_map, |
408 KeyedIC::StubKind stub_kind, | 414 KeyedIC::StubKind stub_kind, |
409 StrictModeFlag strict_mode) { | 415 StrictModeFlag strict_mode) { |
410 KeyedAccessGrowMode grow_mode = | 416 KeyedAccessGrowMode grow_mode = |
411 KeyedIC::GetGrowModeFromStubKind(stub_kind); | 417 KeyedIC::GetGrowModeFromStubKind(stub_kind); |
412 Code::ExtraICState extra_state = | 418 Code::ExtraICState extra_state = |
413 Code::ComputeExtraICState(grow_mode, strict_mode); | 419 Code::ComputeExtraICState(grow_mode, strict_mode); |
414 Code::Flags flags = | 420 Code::Flags flags = |
415 Code::ComputeMonomorphicFlags( | 421 Code::ComputeMonomorphicFlags( |
416 stub_kind == KeyedIC::LOAD ? Code::KEYED_LOAD_IC | 422 stub_kind == KeyedIC::LOAD ? Code::KEYED_LOAD_IC |
417 : Code::KEYED_STORE_IC, | 423 : Code::KEYED_STORE_IC, |
418 NORMAL, | 424 Code::NORMAL, |
419 extra_state); | 425 extra_state); |
420 Handle<String> name; | 426 Handle<String> name; |
421 switch (stub_kind) { | 427 switch (stub_kind) { |
422 case KeyedIC::LOAD: | 428 case KeyedIC::LOAD: |
423 name = isolate()->factory()->KeyedLoadElementMonomorphic_symbol(); | 429 name = isolate()->factory()->KeyedLoadElementMonomorphic_symbol(); |
424 break; | 430 break; |
425 case KeyedIC::STORE_NO_TRANSITION: | 431 case KeyedIC::STORE_NO_TRANSITION: |
426 name = isolate()->factory()->KeyedStoreElementMonomorphic_symbol(); | 432 name = isolate()->factory()->KeyedStoreElementMonomorphic_symbol(); |
427 break; | 433 break; |
428 case KeyedIC::STORE_AND_GROW_NO_TRANSITION: | 434 case KeyedIC::STORE_AND_GROW_NO_TRANSITION: |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
476 ? isolate_->builtins()->Builtins::StoreIC_Normal_Strict() | 482 ? isolate_->builtins()->Builtins::StoreIC_Normal_Strict() |
477 : isolate_->builtins()->Builtins::StoreIC_Normal(); | 483 : isolate_->builtins()->Builtins::StoreIC_Normal(); |
478 } | 484 } |
479 | 485 |
480 | 486 |
481 Handle<Code> StubCache::ComputeStoreGlobal(Handle<String> name, | 487 Handle<Code> StubCache::ComputeStoreGlobal(Handle<String> name, |
482 Handle<GlobalObject> receiver, | 488 Handle<GlobalObject> receiver, |
483 Handle<JSGlobalPropertyCell> cell, | 489 Handle<JSGlobalPropertyCell> cell, |
484 StrictModeFlag strict_mode) { | 490 StrictModeFlag strict_mode) { |
485 Code::Flags flags = Code::ComputeMonomorphicFlags( | 491 Code::Flags flags = Code::ComputeMonomorphicFlags( |
486 Code::STORE_IC, NORMAL, strict_mode); | 492 Code::STORE_IC, Code::NORMAL, strict_mode); |
487 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 493 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
488 if (probe->IsCode()) return Handle<Code>::cast(probe); | 494 if (probe->IsCode()) return Handle<Code>::cast(probe); |
489 | 495 |
490 StoreStubCompiler compiler(isolate_, strict_mode); | 496 StoreStubCompiler compiler(isolate_, strict_mode); |
491 Handle<Code> code = compiler.CompileStoreGlobal(receiver, cell, name); | 497 Handle<Code> code = compiler.CompileStoreGlobal(receiver, cell, name); |
492 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); | 498 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); |
493 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); | 499 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); |
494 JSObject::UpdateMapCodeCache(receiver, name, code); | 500 JSObject::UpdateMapCodeCache(receiver, name, code); |
495 return code; | 501 return code; |
496 } | 502 } |
497 | 503 |
498 | 504 |
499 Handle<Code> StubCache::ComputeStoreCallback(Handle<String> name, | 505 Handle<Code> StubCache::ComputeStoreCallback(Handle<String> name, |
500 Handle<JSObject> receiver, | 506 Handle<JSObject> receiver, |
501 Handle<AccessorInfo> callback, | 507 Handle<AccessorInfo> callback, |
502 StrictModeFlag strict_mode) { | 508 StrictModeFlag strict_mode) { |
503 ASSERT(v8::ToCData<Address>(callback->setter()) != 0); | 509 ASSERT(v8::ToCData<Address>(callback->setter()) != 0); |
504 Code::Flags flags = Code::ComputeMonomorphicFlags( | 510 Code::Flags flags = Code::ComputeMonomorphicFlags( |
505 Code::STORE_IC, CALLBACKS, strict_mode); | 511 Code::STORE_IC, Code::CALLBACKS, strict_mode); |
506 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 512 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
507 if (probe->IsCode()) return Handle<Code>::cast(probe); | 513 if (probe->IsCode()) return Handle<Code>::cast(probe); |
508 | 514 |
509 StoreStubCompiler compiler(isolate_, strict_mode); | 515 StoreStubCompiler compiler(isolate_, strict_mode); |
510 Handle<Code> code = compiler.CompileStoreCallback(receiver, callback, name); | 516 Handle<Code> code = compiler.CompileStoreCallback(receiver, callback, name); |
511 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); | 517 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); |
512 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); | 518 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); |
513 JSObject::UpdateMapCodeCache(receiver, name, code); | 519 JSObject::UpdateMapCodeCache(receiver, name, code); |
514 return code; | 520 return code; |
515 } | 521 } |
516 | 522 |
517 | 523 |
518 Handle<Code> StubCache::ComputeStoreViaSetter(Handle<String> name, | 524 Handle<Code> StubCache::ComputeStoreViaSetter(Handle<String> name, |
519 Handle<JSObject> receiver, | 525 Handle<JSObject> receiver, |
520 Handle<JSFunction> setter, | 526 Handle<JSFunction> setter, |
521 StrictModeFlag strict_mode) { | 527 StrictModeFlag strict_mode) { |
522 Code::Flags flags = Code::ComputeMonomorphicFlags( | 528 Code::Flags flags = Code::ComputeMonomorphicFlags( |
523 Code::STORE_IC, CALLBACKS, strict_mode); | 529 Code::STORE_IC, Code::CALLBACKS, strict_mode); |
524 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 530 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
525 if (probe->IsCode()) return Handle<Code>::cast(probe); | 531 if (probe->IsCode()) return Handle<Code>::cast(probe); |
526 | 532 |
527 StoreStubCompiler compiler(isolate_, strict_mode); | 533 StoreStubCompiler compiler(isolate_, strict_mode); |
528 Handle<Code> code = compiler.CompileStoreViaSetter(receiver, setter, name); | 534 Handle<Code> code = compiler.CompileStoreViaSetter(receiver, setter, name); |
529 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); | 535 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); |
530 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); | 536 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); |
531 JSObject::UpdateMapCodeCache(receiver, name, code); | 537 JSObject::UpdateMapCodeCache(receiver, name, code); |
532 return code; | 538 return code; |
533 } | 539 } |
534 | 540 |
535 | 541 |
536 Handle<Code> StubCache::ComputeStoreInterceptor(Handle<String> name, | 542 Handle<Code> StubCache::ComputeStoreInterceptor(Handle<String> name, |
537 Handle<JSObject> receiver, | 543 Handle<JSObject> receiver, |
538 StrictModeFlag strict_mode) { | 544 StrictModeFlag strict_mode) { |
539 Code::Flags flags = Code::ComputeMonomorphicFlags( | 545 Code::Flags flags = Code::ComputeMonomorphicFlags( |
540 Code::STORE_IC, INTERCEPTOR, strict_mode); | 546 Code::STORE_IC, Code::INTERCEPTOR, strict_mode); |
541 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 547 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
542 if (probe->IsCode()) return Handle<Code>::cast(probe); | 548 if (probe->IsCode()) return Handle<Code>::cast(probe); |
543 | 549 |
544 StoreStubCompiler compiler(isolate_, strict_mode); | 550 StoreStubCompiler compiler(isolate_, strict_mode); |
545 Handle<Code> code = compiler.CompileStoreInterceptor(receiver, name); | 551 Handle<Code> code = compiler.CompileStoreInterceptor(receiver, name); |
546 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); | 552 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); |
547 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); | 553 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); |
548 JSObject::UpdateMapCodeCache(receiver, name, code); | 554 JSObject::UpdateMapCodeCache(receiver, name, code); |
549 return code; | 555 return code; |
550 } | 556 } |
551 | 557 |
552 Handle<Code> StubCache::ComputeKeyedStoreField(Handle<String> name, | 558 Handle<Code> StubCache::ComputeKeyedStoreField(Handle<String> name, |
553 Handle<JSObject> receiver, | 559 Handle<JSObject> receiver, |
554 int field_index, | 560 int field_index, |
555 Handle<Map> transition, | 561 Handle<Map> transition, |
556 StrictModeFlag strict_mode) { | 562 StrictModeFlag strict_mode) { |
557 PropertyType type = (transition.is_null()) ? FIELD : MAP_TRANSITION; | 563 Code::StubType type = |
| 564 (transition.is_null()) ? Code::FIELD : Code::MAP_TRANSITION; |
558 Code::Flags flags = Code::ComputeMonomorphicFlags( | 565 Code::Flags flags = Code::ComputeMonomorphicFlags( |
559 Code::KEYED_STORE_IC, type, strict_mode); | 566 Code::KEYED_STORE_IC, type, strict_mode); |
560 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 567 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
561 if (probe->IsCode()) return Handle<Code>::cast(probe); | 568 if (probe->IsCode()) return Handle<Code>::cast(probe); |
562 | 569 |
563 KeyedStoreStubCompiler compiler(isolate(), strict_mode, | 570 KeyedStoreStubCompiler compiler(isolate(), strict_mode, |
564 DO_NOT_ALLOW_JSARRAY_GROWTH); | 571 DO_NOT_ALLOW_JSARRAY_GROWTH); |
565 Handle<Code> code = | 572 Handle<Code> code = |
566 compiler.CompileStoreField(receiver, field_index, transition, name); | 573 compiler.CompileStoreField(receiver, field_index, transition, name); |
567 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, *code, *name)); | 574 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, *code, *name)); |
(...skipping 22 matching lines...) Expand all Loading... |
590 CheckType check = RECEIVER_MAP_CHECK; | 597 CheckType check = RECEIVER_MAP_CHECK; |
591 if (object->IsString()) { | 598 if (object->IsString()) { |
592 check = STRING_CHECK; | 599 check = STRING_CHECK; |
593 } else if (object->IsNumber()) { | 600 } else if (object->IsNumber()) { |
594 check = NUMBER_CHECK; | 601 check = NUMBER_CHECK; |
595 } else if (object->IsBoolean()) { | 602 } else if (object->IsBoolean()) { |
596 check = BOOLEAN_CHECK; | 603 check = BOOLEAN_CHECK; |
597 } | 604 } |
598 | 605 |
599 Code::Flags flags = | 606 Code::Flags flags = |
600 Code::ComputeMonomorphicFlags(kind, CONSTANT_FUNCTION, extra_state, | 607 Code::ComputeMonomorphicFlags(kind, Code::CONSTANT_FUNCTION, extra_state, |
601 cache_holder, argc); | 608 cache_holder, argc); |
602 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags)); | 609 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags)); |
603 if (probe->IsCode()) return Handle<Code>::cast(probe); | 610 if (probe->IsCode()) return Handle<Code>::cast(probe); |
604 | 611 |
605 CallStubCompiler compiler(isolate_, argc, kind, extra_state, cache_holder); | 612 CallStubCompiler compiler(isolate_, argc, kind, extra_state, cache_holder); |
606 Handle<Code> code = | 613 Handle<Code> code = |
607 compiler.CompileCallConstant(object, holder, function, name, check); | 614 compiler.CompileCallConstant(object, holder, function, name, check); |
608 code->set_check_type(check); | 615 code->set_check_type(check); |
609 ASSERT_EQ(flags, code->flags()); | 616 ASSERT_EQ(flags, code->flags()); |
610 PROFILE(isolate_, | 617 PROFILE(isolate_, |
(...skipping 17 matching lines...) Expand all Loading... |
628 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*object, cache_holder)); | 635 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*object, cache_holder)); |
629 | 636 |
630 // TODO(1233596): We cannot do receiver map check for non-JS objects | 637 // TODO(1233596): We cannot do receiver map check for non-JS objects |
631 // because they may be represented as immediates without a | 638 // because they may be represented as immediates without a |
632 // map. Instead, we check against the map in the holder. | 639 // map. Instead, we check against the map in the holder. |
633 if (object->IsNumber() || object->IsBoolean() || object->IsString()) { | 640 if (object->IsNumber() || object->IsBoolean() || object->IsString()) { |
634 object = holder; | 641 object = holder; |
635 } | 642 } |
636 | 643 |
637 Code::Flags flags = | 644 Code::Flags flags = |
638 Code::ComputeMonomorphicFlags(kind, FIELD, extra_state, | 645 Code::ComputeMonomorphicFlags(kind, Code::FIELD, extra_state, |
639 cache_holder, argc); | 646 cache_holder, argc); |
640 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags)); | 647 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags)); |
641 if (probe->IsCode()) return Handle<Code>::cast(probe); | 648 if (probe->IsCode()) return Handle<Code>::cast(probe); |
642 | 649 |
643 CallStubCompiler compiler(isolate_, argc, kind, extra_state, cache_holder); | 650 CallStubCompiler compiler(isolate_, argc, kind, extra_state, cache_holder); |
644 Handle<Code> code = | 651 Handle<Code> code = |
645 compiler.CompileCallField(Handle<JSObject>::cast(object), | 652 compiler.CompileCallField(Handle<JSObject>::cast(object), |
646 holder, index, name); | 653 holder, index, name); |
647 ASSERT_EQ(flags, code->flags()); | 654 ASSERT_EQ(flags, code->flags()); |
648 PROFILE(isolate_, | 655 PROFILE(isolate_, |
(...skipping 16 matching lines...) Expand all Loading... |
665 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*object, cache_holder)); | 672 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*object, cache_holder)); |
666 | 673 |
667 // TODO(1233596): We cannot do receiver map check for non-JS objects | 674 // TODO(1233596): We cannot do receiver map check for non-JS objects |
668 // because they may be represented as immediates without a | 675 // because they may be represented as immediates without a |
669 // map. Instead, we check against the map in the holder. | 676 // map. Instead, we check against the map in the holder. |
670 if (object->IsNumber() || object->IsBoolean() || object->IsString()) { | 677 if (object->IsNumber() || object->IsBoolean() || object->IsString()) { |
671 object = holder; | 678 object = holder; |
672 } | 679 } |
673 | 680 |
674 Code::Flags flags = | 681 Code::Flags flags = |
675 Code::ComputeMonomorphicFlags(kind, INTERCEPTOR, extra_state, | 682 Code::ComputeMonomorphicFlags(kind, Code::INTERCEPTOR, extra_state, |
676 cache_holder, argc); | 683 cache_holder, argc); |
677 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags)); | 684 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags)); |
678 if (probe->IsCode()) return Handle<Code>::cast(probe); | 685 if (probe->IsCode()) return Handle<Code>::cast(probe); |
679 | 686 |
680 CallStubCompiler compiler(isolate(), argc, kind, extra_state, cache_holder); | 687 CallStubCompiler compiler(isolate(), argc, kind, extra_state, cache_holder); |
681 Handle<Code> code = | 688 Handle<Code> code = |
682 compiler.CompileCallInterceptor(Handle<JSObject>::cast(object), | 689 compiler.CompileCallInterceptor(Handle<JSObject>::cast(object), |
683 holder, name); | 690 holder, name); |
684 ASSERT_EQ(flags, code->flags()); | 691 ASSERT_EQ(flags, code->flags()); |
685 PROFILE(isolate(), | 692 PROFILE(isolate(), |
686 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name)); | 693 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name)); |
687 GDBJIT(AddCode(GDBJITInterface::CALL_IC, *name, *code)); | 694 GDBJIT(AddCode(GDBJITInterface::CALL_IC, *name, *code)); |
688 JSObject::UpdateMapCodeCache(map_holder, name, code); | 695 JSObject::UpdateMapCodeCache(map_holder, name, code); |
689 return code; | 696 return code; |
690 } | 697 } |
691 | 698 |
692 | 699 |
693 Handle<Code> StubCache::ComputeCallGlobal(int argc, | 700 Handle<Code> StubCache::ComputeCallGlobal(int argc, |
694 Code::Kind kind, | 701 Code::Kind kind, |
695 Code::ExtraICState extra_state, | 702 Code::ExtraICState extra_state, |
696 Handle<String> name, | 703 Handle<String> name, |
697 Handle<JSObject> receiver, | 704 Handle<JSObject> receiver, |
698 Handle<GlobalObject> holder, | 705 Handle<GlobalObject> holder, |
699 Handle<JSGlobalPropertyCell> cell, | 706 Handle<JSGlobalPropertyCell> cell, |
700 Handle<JSFunction> function) { | 707 Handle<JSFunction> function) { |
701 InlineCacheHolderFlag cache_holder = | 708 InlineCacheHolderFlag cache_holder = |
702 IC::GetCodeCacheForObject(*receiver, *holder); | 709 IC::GetCodeCacheForObject(*receiver, *holder); |
703 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); | 710 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); |
704 Code::Flags flags = | 711 Code::Flags flags = |
705 Code::ComputeMonomorphicFlags(kind, NORMAL, extra_state, | 712 Code::ComputeMonomorphicFlags(kind, Code::NORMAL, extra_state, |
706 cache_holder, argc); | 713 cache_holder, argc); |
707 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags)); | 714 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags)); |
708 if (probe->IsCode()) return Handle<Code>::cast(probe); | 715 if (probe->IsCode()) return Handle<Code>::cast(probe); |
709 | 716 |
710 CallStubCompiler compiler(isolate(), argc, kind, extra_state, cache_holder); | 717 CallStubCompiler compiler(isolate(), argc, kind, extra_state, cache_holder); |
711 Handle<Code> code = | 718 Handle<Code> code = |
712 compiler.CompileCallGlobal(receiver, holder, cell, function, name); | 719 compiler.CompileCallGlobal(receiver, holder, cell, function, name); |
713 ASSERT_EQ(flags, code->flags()); | 720 ASSERT_EQ(flags, code->flags()); |
714 PROFILE(isolate(), | 721 PROFILE(isolate(), |
715 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name)); | 722 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name)); |
(...skipping 12 matching lines...) Expand all Loading... |
728 } | 735 } |
729 | 736 |
730 | 737 |
731 Code* StubCache::FindCallInitialize(int argc, | 738 Code* StubCache::FindCallInitialize(int argc, |
732 RelocInfo::Mode mode, | 739 RelocInfo::Mode mode, |
733 Code::Kind kind) { | 740 Code::Kind kind) { |
734 Code::ExtraICState extra_state = | 741 Code::ExtraICState extra_state = |
735 CallICBase::StringStubState::encode(DEFAULT_STRING_STUB) | | 742 CallICBase::StringStubState::encode(DEFAULT_STRING_STUB) | |
736 CallICBase::Contextual::encode(mode == RelocInfo::CODE_TARGET_CONTEXT); | 743 CallICBase::Contextual::encode(mode == RelocInfo::CODE_TARGET_CONTEXT); |
737 Code::Flags flags = | 744 Code::Flags flags = |
738 Code::ComputeFlags(kind, UNINITIALIZED, extra_state, NORMAL, argc); | 745 Code::ComputeFlags(kind, UNINITIALIZED, extra_state, Code::NORMAL, argc); |
739 | 746 |
740 // Use raw_unchecked... so we don't get assert failures during GC. | 747 // Use raw_unchecked... so we don't get assert failures during GC. |
741 UnseededNumberDictionary* dictionary = | 748 UnseededNumberDictionary* dictionary = |
742 isolate()->heap()->raw_unchecked_non_monomorphic_cache(); | 749 isolate()->heap()->raw_unchecked_non_monomorphic_cache(); |
743 int entry = dictionary->FindEntry(isolate(), flags); | 750 int entry = dictionary->FindEntry(isolate(), flags); |
744 ASSERT(entry != -1); | 751 ASSERT(entry != -1); |
745 Object* code = dictionary->ValueAt(entry); | 752 Object* code = dictionary->ValueAt(entry); |
746 // This might be called during the marking phase of the collector | 753 // This might be called during the marking phase of the collector |
747 // hence the unchecked cast. | 754 // hence the unchecked cast. |
748 return reinterpret_cast<Code*>(code); | 755 return reinterpret_cast<Code*>(code); |
749 } | 756 } |
750 | 757 |
751 | 758 |
752 Handle<Code> StubCache::ComputeCallInitialize(int argc, | 759 Handle<Code> StubCache::ComputeCallInitialize(int argc, |
753 RelocInfo::Mode mode, | 760 RelocInfo::Mode mode, |
754 Code::Kind kind) { | 761 Code::Kind kind) { |
755 Code::ExtraICState extra_state = | 762 Code::ExtraICState extra_state = |
756 CallICBase::StringStubState::encode(DEFAULT_STRING_STUB) | | 763 CallICBase::StringStubState::encode(DEFAULT_STRING_STUB) | |
757 CallICBase::Contextual::encode(mode == RelocInfo::CODE_TARGET_CONTEXT); | 764 CallICBase::Contextual::encode(mode == RelocInfo::CODE_TARGET_CONTEXT); |
758 Code::Flags flags = | 765 Code::Flags flags = |
759 Code::ComputeFlags(kind, UNINITIALIZED, extra_state, NORMAL, argc); | 766 Code::ComputeFlags(kind, UNINITIALIZED, extra_state, Code::NORMAL, argc); |
760 Handle<UnseededNumberDictionary> cache = | 767 Handle<UnseededNumberDictionary> cache = |
761 isolate_->factory()->non_monomorphic_cache(); | 768 isolate_->factory()->non_monomorphic_cache(); |
762 int entry = cache->FindEntry(isolate_, flags); | 769 int entry = cache->FindEntry(isolate_, flags); |
763 if (entry != -1) return Handle<Code>(Code::cast(cache->ValueAt(entry))); | 770 if (entry != -1) return Handle<Code>(Code::cast(cache->ValueAt(entry))); |
764 | 771 |
765 StubCompiler compiler(isolate_); | 772 StubCompiler compiler(isolate_); |
766 Handle<Code> code = compiler.CompileCallInitialize(flags); | 773 Handle<Code> code = compiler.CompileCallInitialize(flags); |
767 FillCache(isolate_, code); | 774 FillCache(isolate_, code); |
768 return code; | 775 return code; |
769 } | 776 } |
770 | 777 |
771 | 778 |
772 Handle<Code> StubCache::ComputeCallInitialize(int argc, RelocInfo::Mode mode) { | 779 Handle<Code> StubCache::ComputeCallInitialize(int argc, RelocInfo::Mode mode) { |
773 return ComputeCallInitialize(argc, mode, Code::CALL_IC); | 780 return ComputeCallInitialize(argc, mode, Code::CALL_IC); |
774 } | 781 } |
775 | 782 |
776 | 783 |
777 Handle<Code> StubCache::ComputeKeyedCallInitialize(int argc) { | 784 Handle<Code> StubCache::ComputeKeyedCallInitialize(int argc) { |
778 return ComputeCallInitialize(argc, RelocInfo::CODE_TARGET, | 785 return ComputeCallInitialize(argc, RelocInfo::CODE_TARGET, |
779 Code::KEYED_CALL_IC); | 786 Code::KEYED_CALL_IC); |
780 } | 787 } |
781 | 788 |
782 | 789 |
783 Handle<Code> StubCache::ComputeCallPreMonomorphic( | 790 Handle<Code> StubCache::ComputeCallPreMonomorphic( |
784 int argc, | 791 int argc, |
785 Code::Kind kind, | 792 Code::Kind kind, |
786 Code::ExtraICState extra_state) { | 793 Code::ExtraICState extra_state) { |
787 Code::Flags flags = | 794 Code::Flags flags = |
788 Code::ComputeFlags(kind, PREMONOMORPHIC, extra_state, NORMAL, argc); | 795 Code::ComputeFlags(kind, PREMONOMORPHIC, extra_state, Code::NORMAL, argc); |
789 Handle<UnseededNumberDictionary> cache = | 796 Handle<UnseededNumberDictionary> cache = |
790 isolate_->factory()->non_monomorphic_cache(); | 797 isolate_->factory()->non_monomorphic_cache(); |
791 int entry = cache->FindEntry(isolate_, flags); | 798 int entry = cache->FindEntry(isolate_, flags); |
792 if (entry != -1) return Handle<Code>(Code::cast(cache->ValueAt(entry))); | 799 if (entry != -1) return Handle<Code>(Code::cast(cache->ValueAt(entry))); |
793 | 800 |
794 StubCompiler compiler(isolate_); | 801 StubCompiler compiler(isolate_); |
795 Handle<Code> code = compiler.CompileCallPreMonomorphic(flags); | 802 Handle<Code> code = compiler.CompileCallPreMonomorphic(flags); |
796 FillCache(isolate_, code); | 803 FillCache(isolate_, code); |
797 return code; | 804 return code; |
798 } | 805 } |
799 | 806 |
800 | 807 |
801 Handle<Code> StubCache::ComputeCallNormal(int argc, | 808 Handle<Code> StubCache::ComputeCallNormal(int argc, |
802 Code::Kind kind, | 809 Code::Kind kind, |
803 Code::ExtraICState extra_state) { | 810 Code::ExtraICState extra_state) { |
804 Code::Flags flags = | 811 Code::Flags flags = |
805 Code::ComputeFlags(kind, MONOMORPHIC, extra_state, NORMAL, argc); | 812 Code::ComputeFlags(kind, MONOMORPHIC, extra_state, Code::NORMAL, argc); |
806 Handle<UnseededNumberDictionary> cache = | 813 Handle<UnseededNumberDictionary> cache = |
807 isolate_->factory()->non_monomorphic_cache(); | 814 isolate_->factory()->non_monomorphic_cache(); |
808 int entry = cache->FindEntry(isolate_, flags); | 815 int entry = cache->FindEntry(isolate_, flags); |
809 if (entry != -1) return Handle<Code>(Code::cast(cache->ValueAt(entry))); | 816 if (entry != -1) return Handle<Code>(Code::cast(cache->ValueAt(entry))); |
810 | 817 |
811 StubCompiler compiler(isolate_); | 818 StubCompiler compiler(isolate_); |
812 Handle<Code> code = compiler.CompileCallNormal(flags); | 819 Handle<Code> code = compiler.CompileCallNormal(flags); |
813 FillCache(isolate_, code); | 820 FillCache(isolate_, code); |
814 return code; | 821 return code; |
815 } | 822 } |
816 | 823 |
817 | 824 |
818 Handle<Code> StubCache::ComputeCallArguments(int argc, Code::Kind kind) { | 825 Handle<Code> StubCache::ComputeCallArguments(int argc, Code::Kind kind) { |
819 ASSERT(kind == Code::KEYED_CALL_IC); | 826 ASSERT(kind == Code::KEYED_CALL_IC); |
820 Code::Flags flags = | 827 Code::Flags flags = |
821 Code::ComputeFlags(kind, MEGAMORPHIC, Code::kNoExtraICState, | 828 Code::ComputeFlags(kind, MEGAMORPHIC, Code::kNoExtraICState, |
822 NORMAL, argc); | 829 Code::NORMAL, argc); |
823 Handle<UnseededNumberDictionary> cache = | 830 Handle<UnseededNumberDictionary> cache = |
824 isolate_->factory()->non_monomorphic_cache(); | 831 isolate_->factory()->non_monomorphic_cache(); |
825 int entry = cache->FindEntry(isolate_, flags); | 832 int entry = cache->FindEntry(isolate_, flags); |
826 if (entry != -1) return Handle<Code>(Code::cast(cache->ValueAt(entry))); | 833 if (entry != -1) return Handle<Code>(Code::cast(cache->ValueAt(entry))); |
827 | 834 |
828 StubCompiler compiler(isolate_); | 835 StubCompiler compiler(isolate_); |
829 Handle<Code> code = compiler.CompileCallArguments(flags); | 836 Handle<Code> code = compiler.CompileCallArguments(flags); |
830 FillCache(isolate_, code); | 837 FillCache(isolate_, code); |
831 return code; | 838 return code; |
832 } | 839 } |
833 | 840 |
834 | 841 |
835 Handle<Code> StubCache::ComputeCallMegamorphic( | 842 Handle<Code> StubCache::ComputeCallMegamorphic( |
836 int argc, | 843 int argc, |
837 Code::Kind kind, | 844 Code::Kind kind, |
838 Code::ExtraICState extra_state) { | 845 Code::ExtraICState extra_state) { |
839 Code::Flags flags = | 846 Code::Flags flags = |
840 Code::ComputeFlags(kind, MEGAMORPHIC, extra_state, | 847 Code::ComputeFlags(kind, MEGAMORPHIC, extra_state, |
841 NORMAL, argc); | 848 Code::NORMAL, argc); |
842 Handle<UnseededNumberDictionary> cache = | 849 Handle<UnseededNumberDictionary> cache = |
843 isolate_->factory()->non_monomorphic_cache(); | 850 isolate_->factory()->non_monomorphic_cache(); |
844 int entry = cache->FindEntry(isolate_, flags); | 851 int entry = cache->FindEntry(isolate_, flags); |
845 if (entry != -1) return Handle<Code>(Code::cast(cache->ValueAt(entry))); | 852 if (entry != -1) return Handle<Code>(Code::cast(cache->ValueAt(entry))); |
846 | 853 |
847 StubCompiler compiler(isolate_); | 854 StubCompiler compiler(isolate_); |
848 Handle<Code> code = compiler.CompileCallMegamorphic(flags); | 855 Handle<Code> code = compiler.CompileCallMegamorphic(flags); |
849 FillCache(isolate_, code); | 856 FillCache(isolate_, code); |
850 return code; | 857 return code; |
851 } | 858 } |
852 | 859 |
853 | 860 |
854 Handle<Code> StubCache::ComputeCallMiss(int argc, | 861 Handle<Code> StubCache::ComputeCallMiss(int argc, |
855 Code::Kind kind, | 862 Code::Kind kind, |
856 Code::ExtraICState extra_state) { | 863 Code::ExtraICState extra_state) { |
857 // MONOMORPHIC_PROTOTYPE_FAILURE state is used to make sure that miss stubs | 864 // MONOMORPHIC_PROTOTYPE_FAILURE state is used to make sure that miss stubs |
858 // and monomorphic stubs are not mixed up together in the stub cache. | 865 // and monomorphic stubs are not mixed up together in the stub cache. |
859 Code::Flags flags = | 866 Code::Flags flags = |
860 Code::ComputeFlags(kind, MONOMORPHIC_PROTOTYPE_FAILURE, extra_state, | 867 Code::ComputeFlags(kind, MONOMORPHIC_PROTOTYPE_FAILURE, extra_state, |
861 NORMAL, argc, OWN_MAP); | 868 Code::NORMAL, argc, OWN_MAP); |
862 Handle<UnseededNumberDictionary> cache = | 869 Handle<UnseededNumberDictionary> cache = |
863 isolate_->factory()->non_monomorphic_cache(); | 870 isolate_->factory()->non_monomorphic_cache(); |
864 int entry = cache->FindEntry(isolate_, flags); | 871 int entry = cache->FindEntry(isolate_, flags); |
865 if (entry != -1) return Handle<Code>(Code::cast(cache->ValueAt(entry))); | 872 if (entry != -1) return Handle<Code>(Code::cast(cache->ValueAt(entry))); |
866 | 873 |
867 StubCompiler compiler(isolate_); | 874 StubCompiler compiler(isolate_); |
868 Handle<Code> code = compiler.CompileCallMiss(flags); | 875 Handle<Code> code = compiler.CompileCallMiss(flags); |
869 FillCache(isolate_, code); | 876 FillCache(isolate_, code); |
870 return code; | 877 return code; |
871 } | 878 } |
872 | 879 |
873 | 880 |
874 #ifdef ENABLE_DEBUGGER_SUPPORT | 881 #ifdef ENABLE_DEBUGGER_SUPPORT |
875 Handle<Code> StubCache::ComputeCallDebugBreak(int argc, | 882 Handle<Code> StubCache::ComputeCallDebugBreak(int argc, |
876 Code::Kind kind) { | 883 Code::Kind kind) { |
877 // Extra IC state is irrelevant for debug break ICs. They jump to | 884 // Extra IC state is irrelevant for debug break ICs. They jump to |
878 // the actual call ic to carry out the work. | 885 // the actual call ic to carry out the work. |
879 Code::Flags flags = | 886 Code::Flags flags = |
880 Code::ComputeFlags(kind, DEBUG_BREAK, Code::kNoExtraICState, | 887 Code::ComputeFlags(kind, DEBUG_BREAK, Code::kNoExtraICState, |
881 NORMAL, argc); | 888 Code::NORMAL, argc); |
882 Handle<UnseededNumberDictionary> cache = | 889 Handle<UnseededNumberDictionary> cache = |
883 isolate_->factory()->non_monomorphic_cache(); | 890 isolate_->factory()->non_monomorphic_cache(); |
884 int entry = cache->FindEntry(isolate_, flags); | 891 int entry = cache->FindEntry(isolate_, flags); |
885 if (entry != -1) return Handle<Code>(Code::cast(cache->ValueAt(entry))); | 892 if (entry != -1) return Handle<Code>(Code::cast(cache->ValueAt(entry))); |
886 | 893 |
887 StubCompiler compiler(isolate_); | 894 StubCompiler compiler(isolate_); |
888 Handle<Code> code = compiler.CompileCallDebugBreak(flags); | 895 Handle<Code> code = compiler.CompileCallDebugBreak(flags); |
889 FillCache(isolate_, code); | 896 FillCache(isolate_, code); |
890 return code; | 897 return code; |
891 } | 898 } |
892 | 899 |
893 | 900 |
894 Handle<Code> StubCache::ComputeCallDebugPrepareStepIn(int argc, | 901 Handle<Code> StubCache::ComputeCallDebugPrepareStepIn(int argc, |
895 Code::Kind kind) { | 902 Code::Kind kind) { |
896 // Extra IC state is irrelevant for debug break ICs. They jump to | 903 // Extra IC state is irrelevant for debug break ICs. They jump to |
897 // the actual call ic to carry out the work. | 904 // the actual call ic to carry out the work. |
898 Code::Flags flags = | 905 Code::Flags flags = |
899 Code::ComputeFlags(kind, DEBUG_PREPARE_STEP_IN, Code::kNoExtraICState, | 906 Code::ComputeFlags(kind, DEBUG_PREPARE_STEP_IN, Code::kNoExtraICState, |
900 NORMAL, argc); | 907 Code::NORMAL, argc); |
901 Handle<UnseededNumberDictionary> cache = | 908 Handle<UnseededNumberDictionary> cache = |
902 isolate_->factory()->non_monomorphic_cache(); | 909 isolate_->factory()->non_monomorphic_cache(); |
903 int entry = cache->FindEntry(isolate_, flags); | 910 int entry = cache->FindEntry(isolate_, flags); |
904 if (entry != -1) return Handle<Code>(Code::cast(cache->ValueAt(entry))); | 911 if (entry != -1) return Handle<Code>(Code::cast(cache->ValueAt(entry))); |
905 | 912 |
906 StubCompiler compiler(isolate_); | 913 StubCompiler compiler(isolate_); |
907 Handle<Code> code = compiler.CompileCallDebugPrepareStepIn(flags); | 914 Handle<Code> code = compiler.CompileCallDebugPrepareStepIn(flags); |
908 FillCache(isolate_, code); | 915 FillCache(isolate_, code); |
909 return code; | 916 return code; |
910 } | 917 } |
(...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1354 holder->LocalLookupRealNamedProperty(*name, lookup); | 1361 holder->LocalLookupRealNamedProperty(*name, lookup); |
1355 if (lookup->IsProperty()) return; | 1362 if (lookup->IsProperty()) return; |
1356 | 1363 |
1357 lookup->NotFound(); | 1364 lookup->NotFound(); |
1358 if (holder->GetPrototype()->IsNull()) return; | 1365 if (holder->GetPrototype()->IsNull()) return; |
1359 | 1366 |
1360 holder->GetPrototype()->Lookup(*name, lookup); | 1367 holder->GetPrototype()->Lookup(*name, lookup); |
1361 } | 1368 } |
1362 | 1369 |
1363 | 1370 |
1364 Handle<Code> LoadStubCompiler::GetCode(PropertyType type, Handle<String> name) { | 1371 Handle<Code> LoadStubCompiler::GetCode(Code::StubType type, |
| 1372 Handle<String> name) { |
1365 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, type); | 1373 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, type); |
1366 Handle<Code> code = GetCodeWithFlags(flags, name); | 1374 Handle<Code> code = GetCodeWithFlags(flags, name); |
1367 PROFILE(isolate(), CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); | 1375 PROFILE(isolate(), CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
1368 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); | 1376 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
1369 return code; | 1377 return code; |
1370 } | 1378 } |
1371 | 1379 |
1372 | 1380 |
1373 Handle<Code> KeyedLoadStubCompiler::GetCode(PropertyType type, | 1381 Handle<Code> KeyedLoadStubCompiler::GetCode(Code::StubType type, |
1374 Handle<String> name, | 1382 Handle<String> name, |
1375 InlineCacheState state) { | 1383 InlineCacheState state) { |
1376 Code::Flags flags = Code::ComputeFlags( | 1384 Code::Flags flags = Code::ComputeFlags( |
1377 Code::KEYED_LOAD_IC, state, Code::kNoExtraICState, type); | 1385 Code::KEYED_LOAD_IC, state, Code::kNoExtraICState, type); |
1378 Handle<Code> code = GetCodeWithFlags(flags, name); | 1386 Handle<Code> code = GetCodeWithFlags(flags, name); |
1379 PROFILE(isolate(), CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); | 1387 PROFILE(isolate(), CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
1380 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); | 1388 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
1381 return code; | 1389 return code; |
1382 } | 1390 } |
1383 | 1391 |
1384 | 1392 |
1385 Handle<Code> StoreStubCompiler::GetCode(PropertyType type, | 1393 Handle<Code> StoreStubCompiler::GetCode(Code::StubType type, |
1386 Handle<String> name) { | 1394 Handle<String> name) { |
1387 Code::Flags flags = | 1395 Code::Flags flags = |
1388 Code::ComputeMonomorphicFlags(Code::STORE_IC, type, strict_mode_); | 1396 Code::ComputeMonomorphicFlags(Code::STORE_IC, type, strict_mode_); |
1389 Handle<Code> code = GetCodeWithFlags(flags, name); | 1397 Handle<Code> code = GetCodeWithFlags(flags, name); |
1390 PROFILE(isolate(), CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); | 1398 PROFILE(isolate(), CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); |
1391 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); | 1399 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); |
1392 return code; | 1400 return code; |
1393 } | 1401 } |
1394 | 1402 |
1395 | 1403 |
1396 Handle<Code> KeyedStoreStubCompiler::GetCode(PropertyType type, | 1404 Handle<Code> KeyedStoreStubCompiler::GetCode(Code::StubType type, |
1397 Handle<String> name, | 1405 Handle<String> name, |
1398 InlineCacheState state) { | 1406 InlineCacheState state) { |
1399 Code::ExtraICState extra_state = | 1407 Code::ExtraICState extra_state = |
1400 Code::ComputeExtraICState(grow_mode_, strict_mode_); | 1408 Code::ComputeExtraICState(grow_mode_, strict_mode_); |
1401 Code::Flags flags = | 1409 Code::Flags flags = |
1402 Code::ComputeFlags(Code::KEYED_STORE_IC, state, extra_state, type); | 1410 Code::ComputeFlags(Code::KEYED_STORE_IC, state, extra_state, type); |
1403 Handle<Code> code = GetCodeWithFlags(flags, name); | 1411 Handle<Code> code = GetCodeWithFlags(flags, name); |
1404 PROFILE(isolate(), CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, *code, *name)); | 1412 PROFILE(isolate(), CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, *code, *name)); |
1405 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, *name, *code)); | 1413 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, *name, *code)); |
1406 return code; | 1414 return code; |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1464 ASSERT(optimization.is_simple_api_call()); | 1472 ASSERT(optimization.is_simple_api_call()); |
1465 return CompileFastApiCall(optimization, | 1473 return CompileFastApiCall(optimization, |
1466 object, | 1474 object, |
1467 holder, | 1475 holder, |
1468 cell, | 1476 cell, |
1469 function, | 1477 function, |
1470 fname); | 1478 fname); |
1471 } | 1479 } |
1472 | 1480 |
1473 | 1481 |
1474 Handle<Code> CallStubCompiler::GetCode(PropertyType type, Handle<String> name) { | 1482 Handle<Code> CallStubCompiler::GetCode(Code::StubType type, |
| 1483 Handle<String> name) { |
1475 int argc = arguments_.immediate(); | 1484 int argc = arguments_.immediate(); |
1476 Code::Flags flags = Code::ComputeMonomorphicFlags(kind_, | 1485 Code::Flags flags = Code::ComputeMonomorphicFlags(kind_, |
1477 type, | 1486 type, |
1478 extra_state_, | 1487 extra_state_, |
1479 cache_holder_, | 1488 cache_holder_, |
1480 argc); | 1489 argc); |
1481 return GetCodeWithFlags(flags, name); | 1490 return GetCodeWithFlags(flags, name); |
1482 } | 1491 } |
1483 | 1492 |
1484 | 1493 |
1485 Handle<Code> CallStubCompiler::GetCode(Handle<JSFunction> function) { | 1494 Handle<Code> CallStubCompiler::GetCode(Handle<JSFunction> function) { |
1486 Handle<String> function_name; | 1495 Handle<String> function_name; |
1487 if (function->shared()->name()->IsString()) { | 1496 if (function->shared()->name()->IsString()) { |
1488 function_name = Handle<String>(String::cast(function->shared()->name())); | 1497 function_name = Handle<String>(String::cast(function->shared()->name())); |
1489 } | 1498 } |
1490 return GetCode(CONSTANT_FUNCTION, function_name); | 1499 return GetCode(Code::CONSTANT_FUNCTION, function_name); |
1491 } | 1500 } |
1492 | 1501 |
1493 | 1502 |
1494 Handle<Code> ConstructStubCompiler::GetCode() { | 1503 Handle<Code> ConstructStubCompiler::GetCode() { |
1495 Code::Flags flags = Code::ComputeFlags(Code::STUB); | 1504 Code::Flags flags = Code::ComputeFlags(Code::STUB); |
1496 Handle<Code> code = GetCodeWithFlags(flags, "ConstructStub"); | 1505 Handle<Code> code = GetCodeWithFlags(flags, "ConstructStub"); |
1497 PROFILE(isolate(), CodeCreateEvent(Logger::STUB_TAG, *code, "ConstructStub")); | 1506 PROFILE(isolate(), CodeCreateEvent(Logger::STUB_TAG, *code, "ConstructStub")); |
1498 GDBJIT(AddCode(GDBJITInterface::STUB, "ConstructStub", *code)); | 1507 GDBJIT(AddCode(GDBJITInterface::STUB, "ConstructStub", *code)); |
1499 return code; | 1508 return code; |
1500 } | 1509 } |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1565 Handle<FunctionTemplateInfo>( | 1574 Handle<FunctionTemplateInfo>( |
1566 FunctionTemplateInfo::cast(signature->receiver())); | 1575 FunctionTemplateInfo::cast(signature->receiver())); |
1567 } | 1576 } |
1568 } | 1577 } |
1569 | 1578 |
1570 is_simple_api_call_ = true; | 1579 is_simple_api_call_ = true; |
1571 } | 1580 } |
1572 | 1581 |
1573 | 1582 |
1574 } } // namespace v8::internal | 1583 } } // namespace v8::internal |
OLD | NEW |