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 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
118 if (current->IsGlobalObject()) { | 118 if (current->IsGlobalObject()) { |
119 global = Handle<GlobalObject>::cast(current); | 119 global = Handle<GlobalObject>::cast(current); |
120 cache_name = name; | 120 cache_name = name; |
121 } else if (!current->HasFastProperties()) { | 121 } else if (!current->HasFastProperties()) { |
122 cache_name = name; | 122 cache_name = name; |
123 } | 123 } |
124 } while (!next->IsNull()); | 124 } while (!next->IsNull()); |
125 | 125 |
126 // Compile the stub that is either shared for all names or | 126 // Compile the stub that is either shared for all names or |
127 // name specific if there are global objects involved. | 127 // name specific if there are global objects involved. |
128 Code::Flags flags = | 128 Code::Flags flags = Code::ComputeMonomorphicFlags( |
129 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::NONEXISTENT); | 129 Code::LOAD_IC, Code::kNoExtraICState, Code::NONEXISTENT); |
130 Handle<Object> probe(receiver->map()->FindInCodeCache(*cache_name, flags), | 130 Handle<Object> probe(receiver->map()->FindInCodeCache(*cache_name, flags), |
131 isolate_); | 131 isolate_); |
132 if (probe->IsCode()) return Handle<Code>::cast(probe); | 132 if (probe->IsCode()) return Handle<Code>::cast(probe); |
133 | 133 |
134 LoadStubCompiler compiler(isolate_); | 134 LoadStubCompiler compiler(isolate_); |
135 Handle<Code> code = | 135 Handle<Code> code = |
136 compiler.CompileLoadNonexistent(receiver, current, cache_name, global); | 136 compiler.CompileLoadNonexistent(receiver, current, cache_name, global); |
137 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *cache_name)); | 137 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *cache_name)); |
138 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *cache_name, *code)); | 138 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *cache_name, *code)); |
139 JSObject::UpdateMapCodeCache(receiver, cache_name, code); | 139 JSObject::UpdateMapCodeCache(receiver, cache_name, code); |
140 return code; | 140 return code; |
141 } | 141 } |
142 | 142 |
143 | 143 |
144 Handle<Code> StubCache::ComputeLoadField(Handle<String> name, | 144 Handle<Code> StubCache::ComputeLoadField(Handle<String> name, |
145 Handle<JSObject> receiver, | 145 Handle<JSObject> receiver, |
146 Handle<JSObject> holder, | 146 Handle<JSObject> holder, |
147 PropertyIndex field) { | 147 PropertyIndex field) { |
148 InlineCacheHolderFlag cache_holder = | 148 InlineCacheHolderFlag cache_holder = |
149 IC::GetCodeCacheForObject(*receiver, *holder); | 149 IC::GetCodeCacheForObject(*receiver, *holder); |
150 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); | 150 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); |
151 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::FIELD); | 151 Code::Flags flags = Code::ComputeMonomorphicFlags( |
| 152 Code::LOAD_IC, Code::kNoExtraICState, Code::FIELD); |
152 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), | 153 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), |
153 isolate_); | 154 isolate_); |
154 if (probe->IsCode()) return Handle<Code>::cast(probe); | 155 if (probe->IsCode()) return Handle<Code>::cast(probe); |
155 | 156 |
156 LoadStubCompiler compiler(isolate_); | 157 LoadStubCompiler compiler(isolate_); |
157 Handle<Code> code = compiler.CompileLoadField(receiver, holder, name, field); | 158 Handle<Code> code = compiler.CompileLoadField(receiver, holder, name, field); |
158 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); | 159 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
159 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); | 160 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
160 JSObject::UpdateMapCodeCache(map_holder, name, code); | 161 JSObject::UpdateMapCodeCache(map_holder, name, code); |
161 return code; | 162 return code; |
162 } | 163 } |
163 | 164 |
164 | 165 |
165 Handle<Code> StubCache::ComputeLoadCallback(Handle<String> name, | 166 Handle<Code> StubCache::ComputeLoadCallback(Handle<String> name, |
166 Handle<JSObject> receiver, | 167 Handle<JSObject> receiver, |
167 Handle<JSObject> holder, | 168 Handle<JSObject> holder, |
168 Handle<AccessorInfo> callback) { | 169 Handle<AccessorInfo> callback) { |
169 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); | 170 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); |
170 InlineCacheHolderFlag cache_holder = | 171 InlineCacheHolderFlag cache_holder = |
171 IC::GetCodeCacheForObject(*receiver, *holder); | 172 IC::GetCodeCacheForObject(*receiver, *holder); |
172 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); | 173 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); |
173 Code::Flags flags = | 174 Code::Flags flags = Code::ComputeMonomorphicFlags( |
174 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::CALLBACKS); | 175 Code::LOAD_IC, Code::kNoExtraICState, Code::CALLBACKS); |
175 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), | 176 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), |
176 isolate_); | 177 isolate_); |
177 if (probe->IsCode()) return Handle<Code>::cast(probe); | 178 if (probe->IsCode()) return Handle<Code>::cast(probe); |
178 | 179 |
179 LoadStubCompiler compiler(isolate_); | 180 LoadStubCompiler compiler(isolate_); |
180 Handle<Code> code = | 181 Handle<Code> code = |
181 compiler.CompileLoadCallback(receiver, holder, name, callback); | 182 compiler.CompileLoadCallback(receiver, holder, name, callback); |
182 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); | 183 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
183 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); | 184 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
184 JSObject::UpdateMapCodeCache(map_holder, name, code); | 185 JSObject::UpdateMapCodeCache(map_holder, name, code); |
185 return code; | 186 return code; |
186 } | 187 } |
187 | 188 |
188 | 189 |
189 Handle<Code> StubCache::ComputeLoadViaGetter(Handle<String> name, | 190 Handle<Code> StubCache::ComputeLoadViaGetter(Handle<String> name, |
190 Handle<JSObject> receiver, | 191 Handle<JSObject> receiver, |
191 Handle<JSObject> holder, | 192 Handle<JSObject> holder, |
192 Handle<JSFunction> getter) { | 193 Handle<JSFunction> getter) { |
193 InlineCacheHolderFlag cache_holder = | 194 InlineCacheHolderFlag cache_holder = |
194 IC::GetCodeCacheForObject(*receiver, *holder); | 195 IC::GetCodeCacheForObject(*receiver, *holder); |
195 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); | 196 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); |
196 Code::Flags flags = | 197 Code::Flags flags = Code::ComputeMonomorphicFlags( |
197 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::CALLBACKS); | 198 Code::LOAD_IC, Code::kNoExtraICState, Code::CALLBACKS); |
198 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), | 199 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), |
199 isolate_); | 200 isolate_); |
200 if (probe->IsCode()) return Handle<Code>::cast(probe); | 201 if (probe->IsCode()) return Handle<Code>::cast(probe); |
201 | 202 |
202 LoadStubCompiler compiler(isolate_); | 203 LoadStubCompiler compiler(isolate_); |
203 Handle<Code> code = | 204 Handle<Code> code = |
204 compiler.CompileLoadViaGetter(receiver, holder, name, getter); | 205 compiler.CompileLoadViaGetter(receiver, holder, name, getter); |
205 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); | 206 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
206 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); | 207 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
207 JSObject::UpdateMapCodeCache(map_holder, name, code); | 208 JSObject::UpdateMapCodeCache(map_holder, name, code); |
208 return code; | 209 return code; |
209 } | 210 } |
210 | 211 |
211 | 212 |
212 Handle<Code> StubCache::ComputeLoadConstant(Handle<String> name, | 213 Handle<Code> StubCache::ComputeLoadConstant(Handle<String> name, |
213 Handle<JSObject> receiver, | 214 Handle<JSObject> receiver, |
214 Handle<JSObject> holder, | 215 Handle<JSObject> holder, |
215 Handle<JSFunction> value) { | 216 Handle<JSFunction> value) { |
216 InlineCacheHolderFlag cache_holder = | 217 InlineCacheHolderFlag cache_holder = |
217 IC::GetCodeCacheForObject(*receiver, *holder); | 218 IC::GetCodeCacheForObject(*receiver, *holder); |
218 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); | 219 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); |
219 Code::Flags flags = | 220 Code::Flags flags = Code::ComputeMonomorphicFlags( |
220 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::CONSTANT_FUNCTION); | 221 Code::LOAD_IC, Code::kNoExtraICState, Code::CONSTANT_FUNCTION); |
221 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), | 222 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), |
222 isolate_); | 223 isolate_); |
223 if (probe->IsCode()) return Handle<Code>::cast(probe); | 224 if (probe->IsCode()) return Handle<Code>::cast(probe); |
224 | 225 |
225 LoadStubCompiler compiler(isolate_); | 226 LoadStubCompiler compiler(isolate_); |
226 Handle<Code> code = | 227 Handle<Code> code = |
227 compiler.CompileLoadConstant(receiver, holder, name, value); | 228 compiler.CompileLoadConstant(receiver, holder, name, value); |
228 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); | 229 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
229 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); | 230 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
230 JSObject::UpdateMapCodeCache(map_holder, name, code); | 231 JSObject::UpdateMapCodeCache(map_holder, name, code); |
231 return code; | 232 return code; |
232 } | 233 } |
233 | 234 |
234 | 235 |
235 Handle<Code> StubCache::ComputeLoadInterceptor(Handle<String> name, | 236 Handle<Code> StubCache::ComputeLoadInterceptor(Handle<String> name, |
236 Handle<JSObject> receiver, | 237 Handle<JSObject> receiver, |
237 Handle<JSObject> holder) { | 238 Handle<JSObject> holder) { |
238 InlineCacheHolderFlag cache_holder = | 239 InlineCacheHolderFlag cache_holder = |
239 IC::GetCodeCacheForObject(*receiver, *holder); | 240 IC::GetCodeCacheForObject(*receiver, *holder); |
240 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); | 241 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); |
241 Code::Flags flags = | 242 Code::Flags flags = Code::ComputeMonomorphicFlags( |
242 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::INTERCEPTOR); | 243 Code::LOAD_IC, Code::kNoExtraICState, Code::INTERCEPTOR); |
243 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), | 244 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), |
244 isolate_); | 245 isolate_); |
245 if (probe->IsCode()) return Handle<Code>::cast(probe); | 246 if (probe->IsCode()) return Handle<Code>::cast(probe); |
246 | 247 |
247 LoadStubCompiler compiler(isolate_); | 248 LoadStubCompiler compiler(isolate_); |
248 Handle<Code> code = | 249 Handle<Code> code = |
249 compiler.CompileLoadInterceptor(receiver, holder, name); | 250 compiler.CompileLoadInterceptor(receiver, holder, name); |
250 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); | 251 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
251 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); | 252 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
252 JSObject::UpdateMapCodeCache(map_holder, name, code); | 253 JSObject::UpdateMapCodeCache(map_holder, name, code); |
253 return code; | 254 return code; |
254 } | 255 } |
255 | 256 |
256 | 257 |
257 Handle<Code> StubCache::ComputeLoadNormal() { | 258 Handle<Code> StubCache::ComputeLoadNormal() { |
258 return isolate_->builtins()->LoadIC_Normal(); | 259 return isolate_->builtins()->LoadIC_Normal(); |
259 } | 260 } |
260 | 261 |
261 | 262 |
262 Handle<Code> StubCache::ComputeLoadGlobal(Handle<String> name, | 263 Handle<Code> StubCache::ComputeLoadGlobal(Handle<String> name, |
263 Handle<JSObject> receiver, | 264 Handle<JSObject> receiver, |
264 Handle<GlobalObject> holder, | 265 Handle<GlobalObject> holder, |
265 Handle<JSGlobalPropertyCell> cell, | 266 Handle<JSGlobalPropertyCell> cell, |
266 bool is_dont_delete) { | 267 bool is_dont_delete) { |
267 InlineCacheHolderFlag cache_holder = | 268 InlineCacheHolderFlag cache_holder = |
268 IC::GetCodeCacheForObject(*receiver, *holder); | 269 IC::GetCodeCacheForObject(*receiver, *holder); |
269 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); | 270 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); |
270 Code::Flags flags = | 271 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC); |
271 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::NORMAL); | |
272 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), | 272 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), |
273 isolate_); | 273 isolate_); |
274 if (probe->IsCode()) return Handle<Code>::cast(probe); | 274 if (probe->IsCode()) return Handle<Code>::cast(probe); |
275 | 275 |
276 LoadStubCompiler compiler(isolate_); | 276 LoadStubCompiler compiler(isolate_); |
277 Handle<Code> code = | 277 Handle<Code> code = |
278 compiler.CompileLoadGlobal(receiver, holder, cell, name, is_dont_delete); | 278 compiler.CompileLoadGlobal(receiver, holder, cell, name, is_dont_delete); |
279 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); | 279 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
280 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); | 280 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
281 JSObject::UpdateMapCodeCache(map_holder, name, code); | 281 JSObject::UpdateMapCodeCache(map_holder, name, code); |
282 return code; | 282 return code; |
283 } | 283 } |
284 | 284 |
285 | 285 |
286 Handle<Code> StubCache::ComputeKeyedLoadField(Handle<String> name, | 286 Handle<Code> StubCache::ComputeKeyedLoadField(Handle<String> name, |
287 Handle<JSObject> receiver, | 287 Handle<JSObject> receiver, |
288 Handle<JSObject> holder, | 288 Handle<JSObject> holder, |
289 PropertyIndex field) { | 289 PropertyIndex field) { |
290 InlineCacheHolderFlag cache_holder = | 290 InlineCacheHolderFlag cache_holder = |
291 IC::GetCodeCacheForObject(*receiver, *holder); | 291 IC::GetCodeCacheForObject(*receiver, *holder); |
292 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); | 292 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); |
293 Code::Flags flags = | 293 Code::Flags flags = Code::ComputeMonomorphicFlags( |
294 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::FIELD); | 294 Code::KEYED_LOAD_IC, Code::kNoExtraICState, Code::FIELD); |
295 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), | 295 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), |
296 isolate_); | 296 isolate_); |
297 if (probe->IsCode()) return Handle<Code>::cast(probe); | 297 if (probe->IsCode()) return Handle<Code>::cast(probe); |
298 | 298 |
299 KeyedLoadStubCompiler compiler(isolate_); | 299 KeyedLoadStubCompiler compiler(isolate_); |
300 Handle<Code> code = compiler.CompileLoadField(receiver, holder, name, field); | 300 Handle<Code> code = compiler.CompileLoadField(receiver, holder, name, field); |
301 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); | 301 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
302 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); | 302 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
303 JSObject::UpdateMapCodeCache(map_holder, name, code); | 303 JSObject::UpdateMapCodeCache(map_holder, name, code); |
304 return code; | 304 return code; |
305 } | 305 } |
306 | 306 |
307 | 307 |
308 Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<String> name, | 308 Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<String> name, |
309 Handle<JSObject> receiver, | 309 Handle<JSObject> receiver, |
310 Handle<JSObject> holder, | 310 Handle<JSObject> holder, |
311 Handle<JSFunction> value) { | 311 Handle<JSFunction> value) { |
312 InlineCacheHolderFlag cache_holder = | 312 InlineCacheHolderFlag cache_holder = |
313 IC::GetCodeCacheForObject(*receiver, *holder); | 313 IC::GetCodeCacheForObject(*receiver, *holder); |
314 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); | 314 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); |
315 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, | 315 Code::Flags flags = Code::ComputeMonomorphicFlags( |
316 Code::CONSTANT_FUNCTION); | 316 Code::KEYED_LOAD_IC, Code::kNoExtraICState, Code::CONSTANT_FUNCTION); |
317 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), | 317 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), |
318 isolate_); | 318 isolate_); |
319 if (probe->IsCode()) return Handle<Code>::cast(probe); | 319 if (probe->IsCode()) return Handle<Code>::cast(probe); |
320 | 320 |
321 KeyedLoadStubCompiler compiler(isolate_); | 321 KeyedLoadStubCompiler compiler(isolate_); |
322 Handle<Code> code = | 322 Handle<Code> code = |
323 compiler.CompileLoadConstant(receiver, holder, name, value); | 323 compiler.CompileLoadConstant(receiver, holder, name, value); |
324 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); | 324 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
325 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); | 325 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
326 JSObject::UpdateMapCodeCache(map_holder, name, code); | 326 JSObject::UpdateMapCodeCache(map_holder, name, code); |
327 return code; | 327 return code; |
328 } | 328 } |
329 | 329 |
330 | 330 |
331 Handle<Code> StubCache::ComputeKeyedLoadInterceptor(Handle<String> name, | 331 Handle<Code> StubCache::ComputeKeyedLoadInterceptor(Handle<String> name, |
332 Handle<JSObject> receiver, | 332 Handle<JSObject> receiver, |
333 Handle<JSObject> holder) { | 333 Handle<JSObject> holder) { |
334 InlineCacheHolderFlag cache_holder = | 334 InlineCacheHolderFlag cache_holder = |
335 IC::GetCodeCacheForObject(*receiver, *holder); | 335 IC::GetCodeCacheForObject(*receiver, *holder); |
336 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); | 336 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); |
337 Code::Flags flags = | 337 Code::Flags flags = Code::ComputeMonomorphicFlags( |
338 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::INTERCEPTOR); | 338 Code::KEYED_LOAD_IC, Code::kNoExtraICState, Code::INTERCEPTOR); |
339 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), | 339 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), |
340 isolate_); | 340 isolate_); |
341 if (probe->IsCode()) return Handle<Code>::cast(probe); | 341 if (probe->IsCode()) return Handle<Code>::cast(probe); |
342 | 342 |
343 KeyedLoadStubCompiler compiler(isolate_); | 343 KeyedLoadStubCompiler compiler(isolate_); |
344 Handle<Code> code = compiler.CompileLoadInterceptor(receiver, holder, name); | 344 Handle<Code> code = compiler.CompileLoadInterceptor(receiver, holder, name); |
345 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); | 345 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
346 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); | 346 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
347 JSObject::UpdateMapCodeCache(map_holder, name, code); | 347 JSObject::UpdateMapCodeCache(map_holder, name, code); |
348 return code; | 348 return code; |
349 } | 349 } |
350 | 350 |
351 | 351 |
352 Handle<Code> StubCache::ComputeKeyedLoadCallback( | 352 Handle<Code> StubCache::ComputeKeyedLoadCallback( |
353 Handle<String> name, | 353 Handle<String> name, |
354 Handle<JSObject> receiver, | 354 Handle<JSObject> receiver, |
355 Handle<JSObject> holder, | 355 Handle<JSObject> holder, |
356 Handle<AccessorInfo> callback) { | 356 Handle<AccessorInfo> callback) { |
357 InlineCacheHolderFlag cache_holder = | 357 InlineCacheHolderFlag cache_holder = |
358 IC::GetCodeCacheForObject(*receiver, *holder); | 358 IC::GetCodeCacheForObject(*receiver, *holder); |
359 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); | 359 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); |
360 Code::Flags flags = | 360 Code::Flags flags = Code::ComputeMonomorphicFlags( |
361 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CALLBACKS); | 361 Code::KEYED_LOAD_IC, Code::kNoExtraICState, Code::CALLBACKS); |
362 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), | 362 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), |
363 isolate_); | 363 isolate_); |
364 if (probe->IsCode()) return Handle<Code>::cast(probe); | 364 if (probe->IsCode()) return Handle<Code>::cast(probe); |
365 | 365 |
366 KeyedLoadStubCompiler compiler(isolate_); | 366 KeyedLoadStubCompiler compiler(isolate_); |
367 Handle<Code> code = | 367 Handle<Code> code = |
368 compiler.CompileLoadCallback(receiver, holder, name, callback); | 368 compiler.CompileLoadCallback(receiver, holder, name, callback); |
369 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); | 369 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
370 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); | 370 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
371 JSObject::UpdateMapCodeCache(map_holder, name, code); | 371 JSObject::UpdateMapCodeCache(map_holder, name, code); |
372 return code; | 372 return code; |
373 } | 373 } |
374 | 374 |
375 | 375 |
376 Handle<Code> StubCache::ComputeStoreField(Handle<String> name, | 376 Handle<Code> StubCache::ComputeStoreField(Handle<String> name, |
377 Handle<JSObject> receiver, | 377 Handle<JSObject> receiver, |
378 int field_index, | 378 int field_index, |
379 Handle<Map> transition, | 379 Handle<Map> transition, |
380 StrictModeFlag strict_mode) { | 380 StrictModeFlag strict_mode) { |
381 Code::StubType type = | 381 Code::StubType type = |
382 (transition.is_null()) ? Code::FIELD : Code::MAP_TRANSITION; | 382 (transition.is_null()) ? Code::FIELD : Code::MAP_TRANSITION; |
383 Code::Flags flags = Code::ComputeMonomorphicFlags( | 383 Code::Flags flags = Code::ComputeMonomorphicFlags( |
384 Code::STORE_IC, type, strict_mode); | 384 Code::STORE_IC, strict_mode, type); |
385 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), | 385 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), |
386 isolate_); | 386 isolate_); |
387 if (probe->IsCode()) return Handle<Code>::cast(probe); | 387 if (probe->IsCode()) return Handle<Code>::cast(probe); |
388 | 388 |
389 StoreStubCompiler compiler(isolate_, strict_mode); | 389 StoreStubCompiler compiler(isolate_, strict_mode); |
390 Handle<Code> code = | 390 Handle<Code> code = |
391 compiler.CompileStoreField(receiver, field_index, transition, name); | 391 compiler.CompileStoreField(receiver, field_index, transition, name); |
392 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); | 392 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); |
393 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); | 393 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); |
394 JSObject::UpdateMapCodeCache(receiver, name, code); | 394 JSObject::UpdateMapCodeCache(receiver, name, code); |
395 return code; | 395 return code; |
396 } | 396 } |
397 | 397 |
398 | 398 |
399 Handle<Code> StubCache::ComputeKeyedLoadElement(Handle<Map> receiver_map) { | 399 Handle<Code> StubCache::ComputeKeyedLoadElement(Handle<Map> receiver_map) { |
400 Code::Flags flags = | 400 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC); |
401 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::NORMAL); | |
402 Handle<String> name = | 401 Handle<String> name = |
403 isolate()->factory()->KeyedLoadElementMonomorphic_symbol(); | 402 isolate()->factory()->KeyedLoadElementMonomorphic_symbol(); |
404 | 403 |
405 Handle<Object> probe(receiver_map->FindInCodeCache(*name, flags), isolate_); | 404 Handle<Object> probe(receiver_map->FindInCodeCache(*name, flags), isolate_); |
406 if (probe->IsCode()) return Handle<Code>::cast(probe); | 405 if (probe->IsCode()) return Handle<Code>::cast(probe); |
407 | 406 |
408 KeyedLoadStubCompiler compiler(isolate()); | 407 KeyedLoadStubCompiler compiler(isolate()); |
409 Handle<Code> code = compiler.CompileLoadElement(receiver_map); | 408 Handle<Code> code = compiler.CompileLoadElement(receiver_map); |
410 | 409 |
411 PROFILE(isolate(), CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, 0)); | 410 PROFILE(isolate(), CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, 0)); |
412 Map::UpdateCodeCache(receiver_map, name, code); | 411 Map::UpdateCodeCache(receiver_map, name, code); |
413 return code; | 412 return code; |
414 } | 413 } |
415 | 414 |
416 | 415 |
417 Handle<Code> StubCache::ComputeKeyedStoreElement( | 416 Handle<Code> StubCache::ComputeKeyedStoreElement( |
418 Handle<Map> receiver_map, | 417 Handle<Map> receiver_map, |
419 KeyedStoreIC::StubKind stub_kind, | 418 KeyedStoreIC::StubKind stub_kind, |
420 StrictModeFlag strict_mode, | 419 StrictModeFlag strict_mode, |
421 KeyedAccessGrowMode grow_mode) { | 420 KeyedAccessGrowMode grow_mode) { |
422 Code::ExtraICState extra_state = | 421 Code::ExtraICState extra_state = |
423 Code::ComputeExtraICState(grow_mode, strict_mode); | 422 Code::ComputeExtraICState(grow_mode, strict_mode); |
424 Code::Flags flags = Code::ComputeMonomorphicFlags( | 423 Code::Flags flags = Code::ComputeMonomorphicFlags( |
425 Code::KEYED_STORE_IC, Code::NORMAL, extra_state); | 424 Code::KEYED_STORE_IC, extra_state); |
426 | 425 |
427 ASSERT(stub_kind == KeyedStoreIC::STORE_NO_TRANSITION || | 426 ASSERT(stub_kind == KeyedStoreIC::STORE_NO_TRANSITION || |
428 stub_kind == KeyedStoreIC::STORE_AND_GROW_NO_TRANSITION); | 427 stub_kind == KeyedStoreIC::STORE_AND_GROW_NO_TRANSITION); |
429 | 428 |
430 Handle<String> name = stub_kind == KeyedStoreIC::STORE_NO_TRANSITION | 429 Handle<String> name = stub_kind == KeyedStoreIC::STORE_NO_TRANSITION |
431 ? isolate()->factory()->KeyedStoreElementMonomorphic_symbol() | 430 ? isolate()->factory()->KeyedStoreElementMonomorphic_symbol() |
432 : isolate()->factory()->KeyedStoreAndGrowElementMonomorphic_symbol(); | 431 : isolate()->factory()->KeyedStoreAndGrowElementMonomorphic_symbol(); |
433 | 432 |
434 Handle<Object> probe(receiver_map->FindInCodeCache(*name, flags), isolate_); | 433 Handle<Object> probe(receiver_map->FindInCodeCache(*name, flags), isolate_); |
435 if (probe->IsCode()) return Handle<Code>::cast(probe); | 434 if (probe->IsCode()) return Handle<Code>::cast(probe); |
(...skipping 12 matching lines...) Expand all Loading... |
448 ? isolate_->builtins()->Builtins::StoreIC_Normal_Strict() | 447 ? isolate_->builtins()->Builtins::StoreIC_Normal_Strict() |
449 : isolate_->builtins()->Builtins::StoreIC_Normal(); | 448 : isolate_->builtins()->Builtins::StoreIC_Normal(); |
450 } | 449 } |
451 | 450 |
452 | 451 |
453 Handle<Code> StubCache::ComputeStoreGlobal(Handle<String> name, | 452 Handle<Code> StubCache::ComputeStoreGlobal(Handle<String> name, |
454 Handle<GlobalObject> receiver, | 453 Handle<GlobalObject> receiver, |
455 Handle<JSGlobalPropertyCell> cell, | 454 Handle<JSGlobalPropertyCell> cell, |
456 StrictModeFlag strict_mode) { | 455 StrictModeFlag strict_mode) { |
457 Code::Flags flags = Code::ComputeMonomorphicFlags( | 456 Code::Flags flags = Code::ComputeMonomorphicFlags( |
458 Code::STORE_IC, Code::NORMAL, strict_mode); | 457 Code::STORE_IC, strict_mode); |
459 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), | 458 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), |
460 isolate_); | 459 isolate_); |
461 if (probe->IsCode()) return Handle<Code>::cast(probe); | 460 if (probe->IsCode()) return Handle<Code>::cast(probe); |
462 | 461 |
463 StoreStubCompiler compiler(isolate_, strict_mode); | 462 StoreStubCompiler compiler(isolate_, strict_mode); |
464 Handle<Code> code = compiler.CompileStoreGlobal(receiver, cell, name); | 463 Handle<Code> code = compiler.CompileStoreGlobal(receiver, cell, name); |
465 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); | 464 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); |
466 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); | 465 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); |
467 JSObject::UpdateMapCodeCache(receiver, name, code); | 466 JSObject::UpdateMapCodeCache(receiver, name, code); |
468 return code; | 467 return code; |
469 } | 468 } |
470 | 469 |
471 | 470 |
472 Handle<Code> StubCache::ComputeStoreCallback(Handle<String> name, | 471 Handle<Code> StubCache::ComputeStoreCallback(Handle<String> name, |
473 Handle<JSObject> receiver, | 472 Handle<JSObject> receiver, |
474 Handle<JSObject> holder, | 473 Handle<JSObject> holder, |
475 Handle<AccessorInfo> callback, | 474 Handle<AccessorInfo> callback, |
476 StrictModeFlag strict_mode) { | 475 StrictModeFlag strict_mode) { |
477 ASSERT(v8::ToCData<Address>(callback->setter()) != 0); | 476 ASSERT(v8::ToCData<Address>(callback->setter()) != 0); |
478 Code::Flags flags = Code::ComputeMonomorphicFlags( | 477 Code::Flags flags = Code::ComputeMonomorphicFlags( |
479 Code::STORE_IC, Code::CALLBACKS, strict_mode); | 478 Code::STORE_IC, strict_mode, Code::CALLBACKS); |
480 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), | 479 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), |
481 isolate_); | 480 isolate_); |
482 if (probe->IsCode()) return Handle<Code>::cast(probe); | 481 if (probe->IsCode()) return Handle<Code>::cast(probe); |
483 | 482 |
484 StoreStubCompiler compiler(isolate_, strict_mode); | 483 StoreStubCompiler compiler(isolate_, strict_mode); |
485 Handle<Code> code = | 484 Handle<Code> code = |
486 compiler.CompileStoreCallback(name, receiver, holder, callback); | 485 compiler.CompileStoreCallback(name, receiver, holder, callback); |
487 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); | 486 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); |
488 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); | 487 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); |
489 JSObject::UpdateMapCodeCache(receiver, name, code); | 488 JSObject::UpdateMapCodeCache(receiver, name, code); |
490 return code; | 489 return code; |
491 } | 490 } |
492 | 491 |
493 | 492 |
494 Handle<Code> StubCache::ComputeStoreViaSetter(Handle<String> name, | 493 Handle<Code> StubCache::ComputeStoreViaSetter(Handle<String> name, |
495 Handle<JSObject> receiver, | 494 Handle<JSObject> receiver, |
496 Handle<JSObject> holder, | 495 Handle<JSObject> holder, |
497 Handle<JSFunction> setter, | 496 Handle<JSFunction> setter, |
498 StrictModeFlag strict_mode) { | 497 StrictModeFlag strict_mode) { |
499 Code::Flags flags = Code::ComputeMonomorphicFlags( | 498 Code::Flags flags = Code::ComputeMonomorphicFlags( |
500 Code::STORE_IC, Code::CALLBACKS, strict_mode); | 499 Code::STORE_IC, strict_mode, Code::CALLBACKS); |
501 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), | 500 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), |
502 isolate_); | 501 isolate_); |
503 if (probe->IsCode()) return Handle<Code>::cast(probe); | 502 if (probe->IsCode()) return Handle<Code>::cast(probe); |
504 | 503 |
505 StoreStubCompiler compiler(isolate_, strict_mode); | 504 StoreStubCompiler compiler(isolate_, strict_mode); |
506 Handle<Code> code = | 505 Handle<Code> code = |
507 compiler.CompileStoreViaSetter(name, receiver, holder, setter); | 506 compiler.CompileStoreViaSetter(name, receiver, holder, setter); |
508 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); | 507 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); |
509 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); | 508 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); |
510 JSObject::UpdateMapCodeCache(receiver, name, code); | 509 JSObject::UpdateMapCodeCache(receiver, name, code); |
511 return code; | 510 return code; |
512 } | 511 } |
513 | 512 |
514 | 513 |
515 Handle<Code> StubCache::ComputeStoreInterceptor(Handle<String> name, | 514 Handle<Code> StubCache::ComputeStoreInterceptor(Handle<String> name, |
516 Handle<JSObject> receiver, | 515 Handle<JSObject> receiver, |
517 StrictModeFlag strict_mode) { | 516 StrictModeFlag strict_mode) { |
518 Code::Flags flags = Code::ComputeMonomorphicFlags( | 517 Code::Flags flags = Code::ComputeMonomorphicFlags( |
519 Code::STORE_IC, Code::INTERCEPTOR, strict_mode); | 518 Code::STORE_IC, strict_mode, Code::INTERCEPTOR); |
520 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), | 519 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), |
521 isolate_); | 520 isolate_); |
522 if (probe->IsCode()) return Handle<Code>::cast(probe); | 521 if (probe->IsCode()) return Handle<Code>::cast(probe); |
523 | 522 |
524 StoreStubCompiler compiler(isolate_, strict_mode); | 523 StoreStubCompiler compiler(isolate_, strict_mode); |
525 Handle<Code> code = compiler.CompileStoreInterceptor(receiver, name); | 524 Handle<Code> code = compiler.CompileStoreInterceptor(receiver, name); |
526 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); | 525 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); |
527 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); | 526 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); |
528 JSObject::UpdateMapCodeCache(receiver, name, code); | 527 JSObject::UpdateMapCodeCache(receiver, name, code); |
529 return code; | 528 return code; |
530 } | 529 } |
531 | 530 |
532 Handle<Code> StubCache::ComputeKeyedStoreField(Handle<String> name, | 531 Handle<Code> StubCache::ComputeKeyedStoreField(Handle<String> name, |
533 Handle<JSObject> receiver, | 532 Handle<JSObject> receiver, |
534 int field_index, | 533 int field_index, |
535 Handle<Map> transition, | 534 Handle<Map> transition, |
536 StrictModeFlag strict_mode) { | 535 StrictModeFlag strict_mode) { |
537 Code::StubType type = | 536 Code::StubType type = |
538 (transition.is_null()) ? Code::FIELD : Code::MAP_TRANSITION; | 537 (transition.is_null()) ? Code::FIELD : Code::MAP_TRANSITION; |
539 Code::Flags flags = Code::ComputeMonomorphicFlags( | 538 Code::Flags flags = Code::ComputeMonomorphicFlags( |
540 Code::KEYED_STORE_IC, type, strict_mode); | 539 Code::KEYED_STORE_IC, strict_mode, type); |
541 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), | 540 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), |
542 isolate_); | 541 isolate_); |
543 if (probe->IsCode()) return Handle<Code>::cast(probe); | 542 if (probe->IsCode()) return Handle<Code>::cast(probe); |
544 | 543 |
545 KeyedStoreStubCompiler compiler(isolate(), strict_mode, | 544 KeyedStoreStubCompiler compiler(isolate(), strict_mode, |
546 DO_NOT_ALLOW_JSARRAY_GROWTH); | 545 DO_NOT_ALLOW_JSARRAY_GROWTH); |
547 Handle<Code> code = | 546 Handle<Code> code = |
548 compiler.CompileStoreField(receiver, field_index, transition, name); | 547 compiler.CompileStoreField(receiver, field_index, transition, name); |
549 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, *code, *name)); | 548 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, *code, *name)); |
550 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, *name, *code)); | 549 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, *name, *code)); |
(...skipping 28 matching lines...) Expand all Loading... |
579 } | 578 } |
580 | 579 |
581 if (check != RECEIVER_MAP_CHECK && | 580 if (check != RECEIVER_MAP_CHECK && |
582 !function->IsBuiltin() && | 581 !function->IsBuiltin() && |
583 function->shared()->is_classic_mode()) { | 582 function->shared()->is_classic_mode()) { |
584 // Calling non-strict non-builtins with a value as the receiver | 583 // Calling non-strict non-builtins with a value as the receiver |
585 // requires boxing. | 584 // requires boxing. |
586 return Handle<Code>::null(); | 585 return Handle<Code>::null(); |
587 } | 586 } |
588 | 587 |
589 Code::Flags flags = | 588 Code::Flags flags = Code::ComputeMonomorphicFlags( |
590 Code::ComputeMonomorphicFlags(kind, Code::CONSTANT_FUNCTION, extra_state, | 589 kind, extra_state, Code::CONSTANT_FUNCTION, argc, cache_holder); |
591 cache_holder, argc); | |
592 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), | 590 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), |
593 isolate_); | 591 isolate_); |
594 if (probe->IsCode()) return Handle<Code>::cast(probe); | 592 if (probe->IsCode()) return Handle<Code>::cast(probe); |
595 | 593 |
596 CallStubCompiler compiler(isolate_, argc, kind, extra_state, cache_holder); | 594 CallStubCompiler compiler(isolate_, argc, kind, extra_state, cache_holder); |
597 Handle<Code> code = | 595 Handle<Code> code = |
598 compiler.CompileCallConstant(object, holder, name, check, function); | 596 compiler.CompileCallConstant(object, holder, name, check, function); |
599 code->set_check_type(check); | 597 code->set_check_type(check); |
600 ASSERT_EQ(flags, code->flags()); | 598 ASSERT_EQ(flags, code->flags()); |
601 PROFILE(isolate_, | 599 PROFILE(isolate_, |
(...skipping 16 matching lines...) Expand all Loading... |
618 IC::GetCodeCacheForObject(*object, *holder); | 616 IC::GetCodeCacheForObject(*object, *holder); |
619 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*object, cache_holder)); | 617 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*object, cache_holder)); |
620 | 618 |
621 // TODO(1233596): We cannot do receiver map check for non-JS objects | 619 // TODO(1233596): We cannot do receiver map check for non-JS objects |
622 // because they may be represented as immediates without a | 620 // because they may be represented as immediates without a |
623 // map. Instead, we check against the map in the holder. | 621 // map. Instead, we check against the map in the holder. |
624 if (object->IsNumber() || object->IsBoolean() || object->IsString()) { | 622 if (object->IsNumber() || object->IsBoolean() || object->IsString()) { |
625 object = holder; | 623 object = holder; |
626 } | 624 } |
627 | 625 |
628 Code::Flags flags = | 626 Code::Flags flags = Code::ComputeMonomorphicFlags( |
629 Code::ComputeMonomorphicFlags(kind, Code::FIELD, extra_state, | 627 kind, extra_state, Code::FIELD, argc, cache_holder); |
630 cache_holder, argc); | |
631 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), | 628 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), |
632 isolate_); | 629 isolate_); |
633 if (probe->IsCode()) return Handle<Code>::cast(probe); | 630 if (probe->IsCode()) return Handle<Code>::cast(probe); |
634 | 631 |
635 CallStubCompiler compiler(isolate_, argc, kind, extra_state, cache_holder); | 632 CallStubCompiler compiler(isolate_, argc, kind, extra_state, cache_holder); |
636 Handle<Code> code = | 633 Handle<Code> code = |
637 compiler.CompileCallField(Handle<JSObject>::cast(object), | 634 compiler.CompileCallField(Handle<JSObject>::cast(object), |
638 holder, index, name); | 635 holder, index, name); |
639 ASSERT_EQ(flags, code->flags()); | 636 ASSERT_EQ(flags, code->flags()); |
640 PROFILE(isolate_, | 637 PROFILE(isolate_, |
(...skipping 15 matching lines...) Expand all Loading... |
656 IC::GetCodeCacheForObject(*object, *holder); | 653 IC::GetCodeCacheForObject(*object, *holder); |
657 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*object, cache_holder)); | 654 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*object, cache_holder)); |
658 | 655 |
659 // TODO(1233596): We cannot do receiver map check for non-JS objects | 656 // TODO(1233596): We cannot do receiver map check for non-JS objects |
660 // because they may be represented as immediates without a | 657 // because they may be represented as immediates without a |
661 // map. Instead, we check against the map in the holder. | 658 // map. Instead, we check against the map in the holder. |
662 if (object->IsNumber() || object->IsBoolean() || object->IsString()) { | 659 if (object->IsNumber() || object->IsBoolean() || object->IsString()) { |
663 object = holder; | 660 object = holder; |
664 } | 661 } |
665 | 662 |
666 Code::Flags flags = | 663 Code::Flags flags = Code::ComputeMonomorphicFlags( |
667 Code::ComputeMonomorphicFlags(kind, Code::INTERCEPTOR, extra_state, | 664 kind, extra_state, Code::INTERCEPTOR, argc, cache_holder); |
668 cache_holder, argc); | |
669 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), | 665 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), |
670 isolate_); | 666 isolate_); |
671 if (probe->IsCode()) return Handle<Code>::cast(probe); | 667 if (probe->IsCode()) return Handle<Code>::cast(probe); |
672 | 668 |
673 CallStubCompiler compiler(isolate(), argc, kind, extra_state, cache_holder); | 669 CallStubCompiler compiler(isolate(), argc, kind, extra_state, cache_holder); |
674 Handle<Code> code = | 670 Handle<Code> code = |
675 compiler.CompileCallInterceptor(Handle<JSObject>::cast(object), | 671 compiler.CompileCallInterceptor(Handle<JSObject>::cast(object), |
676 holder, name); | 672 holder, name); |
677 ASSERT_EQ(flags, code->flags()); | 673 ASSERT_EQ(flags, code->flags()); |
678 PROFILE(isolate(), | 674 PROFILE(isolate(), |
679 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name)); | 675 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name)); |
680 GDBJIT(AddCode(GDBJITInterface::CALL_IC, *name, *code)); | 676 GDBJIT(AddCode(GDBJITInterface::CALL_IC, *name, *code)); |
681 JSObject::UpdateMapCodeCache(map_holder, name, code); | 677 JSObject::UpdateMapCodeCache(map_holder, name, code); |
682 return code; | 678 return code; |
683 } | 679 } |
684 | 680 |
685 | 681 |
686 Handle<Code> StubCache::ComputeCallGlobal(int argc, | 682 Handle<Code> StubCache::ComputeCallGlobal(int argc, |
687 Code::Kind kind, | 683 Code::Kind kind, |
688 Code::ExtraICState extra_state, | 684 Code::ExtraICState extra_state, |
689 Handle<String> name, | 685 Handle<String> name, |
690 Handle<JSObject> receiver, | 686 Handle<JSObject> receiver, |
691 Handle<GlobalObject> holder, | 687 Handle<GlobalObject> holder, |
692 Handle<JSGlobalPropertyCell> cell, | 688 Handle<JSGlobalPropertyCell> cell, |
693 Handle<JSFunction> function) { | 689 Handle<JSFunction> function) { |
694 InlineCacheHolderFlag cache_holder = | 690 InlineCacheHolderFlag cache_holder = |
695 IC::GetCodeCacheForObject(*receiver, *holder); | 691 IC::GetCodeCacheForObject(*receiver, *holder); |
696 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); | 692 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); |
697 Code::Flags flags = | 693 Code::Flags flags = Code::ComputeMonomorphicFlags( |
698 Code::ComputeMonomorphicFlags(kind, Code::NORMAL, extra_state, | 694 kind, extra_state, Code::NORMAL, argc, cache_holder); |
699 cache_holder, argc); | |
700 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), | 695 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags), |
701 isolate_); | 696 isolate_); |
702 if (probe->IsCode()) return Handle<Code>::cast(probe); | 697 if (probe->IsCode()) return Handle<Code>::cast(probe); |
703 | 698 |
704 CallStubCompiler compiler(isolate(), argc, kind, extra_state, cache_holder); | 699 CallStubCompiler compiler(isolate(), argc, kind, extra_state, cache_holder); |
705 Handle<Code> code = | 700 Handle<Code> code = |
706 compiler.CompileCallGlobal(receiver, holder, cell, function, name); | 701 compiler.CompileCallGlobal(receiver, holder, cell, function, name); |
707 ASSERT_EQ(flags, code->flags()); | 702 ASSERT_EQ(flags, code->flags()); |
708 PROFILE(isolate(), | 703 PROFILE(isolate(), |
709 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name)); | 704 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name)); |
(...skipping 809 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1519 return GetCode(Code::CALLBACKS, name); | 1514 return GetCode(Code::CALLBACKS, name); |
1520 } | 1515 } |
1521 | 1516 |
1522 | 1517 |
1523 #undef __ | 1518 #undef __ |
1524 | 1519 |
1525 | 1520 |
1526 Handle<Code> LoadStubCompiler::GetCode(Code::StubType type, | 1521 Handle<Code> LoadStubCompiler::GetCode(Code::StubType type, |
1527 Handle<String> name, | 1522 Handle<String> name, |
1528 InlineCacheState state) { | 1523 InlineCacheState state) { |
1529 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, type); | 1524 Code::Flags flags = Code::ComputeMonomorphicFlags( |
| 1525 Code::LOAD_IC, Code::kNoExtraICState, type); |
1530 Handle<Code> code = GetCodeWithFlags(flags, name); | 1526 Handle<Code> code = GetCodeWithFlags(flags, name); |
1531 PROFILE(isolate(), CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); | 1527 PROFILE(isolate(), CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
1532 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); | 1528 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
1533 return code; | 1529 return code; |
1534 } | 1530 } |
1535 | 1531 |
1536 | 1532 |
1537 Handle<Code> KeyedLoadStubCompiler::GetCode(Code::StubType type, | 1533 Handle<Code> KeyedLoadStubCompiler::GetCode(Code::StubType type, |
1538 Handle<String> name, | 1534 Handle<String> name, |
1539 InlineCacheState state) { | 1535 InlineCacheState state) { |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1575 isolate()->counters()->keyed_load_polymorphic_stubs()->Increment(); | 1571 isolate()->counters()->keyed_load_polymorphic_stubs()->Increment(); |
1576 PROFILE(isolate(), | 1572 PROFILE(isolate(), |
1577 CodeCreateEvent(Logger::KEYED_LOAD_POLYMORPHIC_IC_TAG, *code, 0)); | 1573 CodeCreateEvent(Logger::KEYED_LOAD_POLYMORPHIC_IC_TAG, *code, 0)); |
1578 return code; | 1574 return code; |
1579 } | 1575 } |
1580 | 1576 |
1581 | 1577 |
1582 | 1578 |
1583 Handle<Code> StoreStubCompiler::GetCode(Code::StubType type, | 1579 Handle<Code> StoreStubCompiler::GetCode(Code::StubType type, |
1584 Handle<String> name) { | 1580 Handle<String> name) { |
1585 Code::Flags flags = | 1581 Code::Flags flags = Code::ComputeMonomorphicFlags( |
1586 Code::ComputeMonomorphicFlags(Code::STORE_IC, type, strict_mode_); | 1582 Code::STORE_IC, strict_mode_, type); |
1587 Handle<Code> code = GetCodeWithFlags(flags, name); | 1583 Handle<Code> code = GetCodeWithFlags(flags, name); |
1588 PROFILE(isolate(), CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); | 1584 PROFILE(isolate(), CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); |
1589 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); | 1585 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); |
1590 return code; | 1586 return code; |
1591 } | 1587 } |
1592 | 1588 |
1593 | 1589 |
1594 Handle<Code> KeyedStoreStubCompiler::GetCode(Code::StubType type, | 1590 Handle<Code> KeyedStoreStubCompiler::GetCode(Code::StubType type, |
1595 Handle<String> name, | 1591 Handle<String> name, |
1596 InlineCacheState state) { | 1592 InlineCacheState state) { |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1710 cell, | 1706 cell, |
1711 function, | 1707 function, |
1712 fname); | 1708 fname); |
1713 } | 1709 } |
1714 | 1710 |
1715 | 1711 |
1716 Handle<Code> CallStubCompiler::GetCode(Code::StubType type, | 1712 Handle<Code> CallStubCompiler::GetCode(Code::StubType type, |
1717 Handle<String> name) { | 1713 Handle<String> name) { |
1718 int argc = arguments_.immediate(); | 1714 int argc = arguments_.immediate(); |
1719 Code::Flags flags = Code::ComputeMonomorphicFlags(kind_, | 1715 Code::Flags flags = Code::ComputeMonomorphicFlags(kind_, |
| 1716 extra_state_, |
1720 type, | 1717 type, |
1721 extra_state_, | 1718 argc, |
1722 cache_holder_, | 1719 cache_holder_); |
1723 argc); | |
1724 return GetCodeWithFlags(flags, name); | 1720 return GetCodeWithFlags(flags, name); |
1725 } | 1721 } |
1726 | 1722 |
1727 | 1723 |
1728 Handle<Code> CallStubCompiler::GetCode(Handle<JSFunction> function) { | 1724 Handle<Code> CallStubCompiler::GetCode(Handle<JSFunction> function) { |
1729 Handle<String> function_name; | 1725 Handle<String> function_name; |
1730 if (function->shared()->name()->IsString()) { | 1726 if (function->shared()->name()->IsString()) { |
1731 function_name = Handle<String>(String::cast(function->shared()->name())); | 1727 function_name = Handle<String>(String::cast(function->shared()->name())); |
1732 } | 1728 } |
1733 return GetCode(Code::CONSTANT_FUNCTION, function_name); | 1729 return GetCode(Code::CONSTANT_FUNCTION, function_name); |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1809 Handle<FunctionTemplateInfo>( | 1805 Handle<FunctionTemplateInfo>( |
1810 FunctionTemplateInfo::cast(signature->receiver())); | 1806 FunctionTemplateInfo::cast(signature->receiver())); |
1811 } | 1807 } |
1812 } | 1808 } |
1813 | 1809 |
1814 is_simple_api_call_ = true; | 1810 is_simple_api_call_ = true; |
1815 } | 1811 } |
1816 | 1812 |
1817 | 1813 |
1818 } } // namespace v8::internal | 1814 } } // namespace v8::internal |
OLD | NEW |