Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(55)

Side by Side Diff: src/stub-cache.cc

Issue 10656018: Separate stub types from property types. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Also moving all other bits to the left Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/stub-cache.h ('k') | src/type-info.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « src/stub-cache.h ('k') | src/type-info.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698