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

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

Issue 119304: Add log compression ability. (Closed)
Patch Set: Created 11 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
OLDNEW
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. 1 // Copyright 2006-2009 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
96 Object* StubCache::ComputeLoadField(String* name, 96 Object* StubCache::ComputeLoadField(String* name,
97 JSObject* receiver, 97 JSObject* receiver,
98 JSObject* holder, 98 JSObject* holder,
99 int field_index) { 99 int field_index) {
100 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, FIELD); 100 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, FIELD);
101 Object* code = receiver->map()->FindInCodeCache(name, flags); 101 Object* code = receiver->map()->FindInCodeCache(name, flags);
102 if (code->IsUndefined()) { 102 if (code->IsUndefined()) {
103 LoadStubCompiler compiler; 103 LoadStubCompiler compiler;
104 code = compiler.CompileLoadField(receiver, holder, field_index, name); 104 code = compiler.CompileLoadField(receiver, holder, field_index, name);
105 if (code->IsFailure()) return code; 105 if (code->IsFailure()) return code;
106 LOG(CodeCreateEvent("LoadIC", Code::cast(code), name)); 106 LOG(CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name));
107 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code)); 107 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code));
108 if (result->IsFailure()) return code; 108 if (result->IsFailure()) return code;
109 } 109 }
110 return Set(name, receiver->map(), Code::cast(code)); 110 return Set(name, receiver->map(), Code::cast(code));
111 } 111 }
112 112
113 113
114 Object* StubCache::ComputeLoadCallback(String* name, 114 Object* StubCache::ComputeLoadCallback(String* name,
115 JSObject* receiver, 115 JSObject* receiver,
116 JSObject* holder, 116 JSObject* holder,
117 AccessorInfo* callback) { 117 AccessorInfo* callback) {
118 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); 118 ASSERT(v8::ToCData<Address>(callback->getter()) != 0);
119 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, CALLBACKS); 119 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, CALLBACKS);
120 Object* code = receiver->map()->FindInCodeCache(name, flags); 120 Object* code = receiver->map()->FindInCodeCache(name, flags);
121 if (code->IsUndefined()) { 121 if (code->IsUndefined()) {
122 LoadStubCompiler compiler; 122 LoadStubCompiler compiler;
123 code = compiler.CompileLoadCallback(receiver, holder, callback, name); 123 code = compiler.CompileLoadCallback(receiver, holder, callback, name);
124 if (code->IsFailure()) return code; 124 if (code->IsFailure()) return code;
125 LOG(CodeCreateEvent("LoadIC", Code::cast(code), name)); 125 LOG(CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name));
126 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code)); 126 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code));
127 if (result->IsFailure()) return code; 127 if (result->IsFailure()) return code;
128 } 128 }
129 return Set(name, receiver->map(), Code::cast(code)); 129 return Set(name, receiver->map(), Code::cast(code));
130 } 130 }
131 131
132 132
133 Object* StubCache::ComputeLoadConstant(String* name, 133 Object* StubCache::ComputeLoadConstant(String* name,
134 JSObject* receiver, 134 JSObject* receiver,
135 JSObject* holder, 135 JSObject* holder,
136 Object* value) { 136 Object* value) {
137 Code::Flags flags = 137 Code::Flags flags =
138 Code::ComputeMonomorphicFlags(Code::LOAD_IC, CONSTANT_FUNCTION); 138 Code::ComputeMonomorphicFlags(Code::LOAD_IC, CONSTANT_FUNCTION);
139 Object* code = receiver->map()->FindInCodeCache(name, flags); 139 Object* code = receiver->map()->FindInCodeCache(name, flags);
140 if (code->IsUndefined()) { 140 if (code->IsUndefined()) {
141 LoadStubCompiler compiler; 141 LoadStubCompiler compiler;
142 code = compiler.CompileLoadConstant(receiver, holder, value, name); 142 code = compiler.CompileLoadConstant(receiver, holder, value, name);
143 if (code->IsFailure()) return code; 143 if (code->IsFailure()) return code;
144 LOG(CodeCreateEvent("LoadIC", Code::cast(code), name)); 144 LOG(CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name));
145 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code)); 145 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code));
146 if (result->IsFailure()) return code; 146 if (result->IsFailure()) return code;
147 } 147 }
148 return Set(name, receiver->map(), Code::cast(code)); 148 return Set(name, receiver->map(), Code::cast(code));
149 } 149 }
150 150
151 151
152 Object* StubCache::ComputeLoadInterceptor(String* name, 152 Object* StubCache::ComputeLoadInterceptor(String* name,
153 JSObject* receiver, 153 JSObject* receiver,
154 JSObject* holder) { 154 JSObject* holder) {
155 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, INTERCEPTOR); 155 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, INTERCEPTOR);
156 Object* code = receiver->map()->FindInCodeCache(name, flags); 156 Object* code = receiver->map()->FindInCodeCache(name, flags);
157 if (code->IsUndefined()) { 157 if (code->IsUndefined()) {
158 LoadStubCompiler compiler; 158 LoadStubCompiler compiler;
159 code = compiler.CompileLoadInterceptor(receiver, holder, name); 159 code = compiler.CompileLoadInterceptor(receiver, holder, name);
160 if (code->IsFailure()) return code; 160 if (code->IsFailure()) return code;
161 LOG(CodeCreateEvent("LoadIC", Code::cast(code), name)); 161 LOG(CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name));
162 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code)); 162 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code));
163 if (result->IsFailure()) return code; 163 if (result->IsFailure()) return code;
164 } 164 }
165 return Set(name, receiver->map(), Code::cast(code)); 165 return Set(name, receiver->map(), Code::cast(code));
166 } 166 }
167 167
168 168
169 Object* StubCache::ComputeLoadNormal(String* name, JSObject* receiver) { 169 Object* StubCache::ComputeLoadNormal(String* name, JSObject* receiver) {
170 Code* code = Builtins::builtin(Builtins::LoadIC_Normal); 170 Code* code = Builtins::builtin(Builtins::LoadIC_Normal);
171 return Set(name, receiver->map(), code); 171 return Set(name, receiver->map(), code);
172 } 172 }
173 173
174 174
175 Object* StubCache::ComputeKeyedLoadField(String* name, 175 Object* StubCache::ComputeKeyedLoadField(String* name,
176 JSObject* receiver, 176 JSObject* receiver,
177 JSObject* holder, 177 JSObject* holder,
178 int field_index) { 178 int field_index) {
179 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, FIELD); 179 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, FIELD);
180 Object* code = receiver->map()->FindInCodeCache(name, flags); 180 Object* code = receiver->map()->FindInCodeCache(name, flags);
181 if (code->IsUndefined()) { 181 if (code->IsUndefined()) {
182 KeyedLoadStubCompiler compiler; 182 KeyedLoadStubCompiler compiler;
183 code = compiler.CompileLoadField(name, receiver, holder, field_index); 183 code = compiler.CompileLoadField(name, receiver, holder, field_index);
184 if (code->IsFailure()) return code; 184 if (code->IsFailure()) return code;
185 LOG(CodeCreateEvent("KeyedLoadIC", Code::cast(code), name)); 185 LOG(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name));
186 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code)); 186 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code));
187 if (result->IsFailure()) return result; 187 if (result->IsFailure()) return result;
188 } 188 }
189 return code; 189 return code;
190 } 190 }
191 191
192 192
193 Object* StubCache::ComputeKeyedLoadConstant(String* name, 193 Object* StubCache::ComputeKeyedLoadConstant(String* name,
194 JSObject* receiver, 194 JSObject* receiver,
195 JSObject* holder, 195 JSObject* holder,
196 Object* value) { 196 Object* value) {
197 Code::Flags flags = 197 Code::Flags flags =
198 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CONSTANT_FUNCTION); 198 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CONSTANT_FUNCTION);
199 Object* code = receiver->map()->FindInCodeCache(name, flags); 199 Object* code = receiver->map()->FindInCodeCache(name, flags);
200 if (code->IsUndefined()) { 200 if (code->IsUndefined()) {
201 KeyedLoadStubCompiler compiler; 201 KeyedLoadStubCompiler compiler;
202 code = compiler.CompileLoadConstant(name, receiver, holder, value); 202 code = compiler.CompileLoadConstant(name, receiver, holder, value);
203 if (code->IsFailure()) return code; 203 if (code->IsFailure()) return code;
204 LOG(CodeCreateEvent("KeyedLoadIC", Code::cast(code), name)); 204 LOG(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name));
205 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code)); 205 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code));
206 if (result->IsFailure()) return result; 206 if (result->IsFailure()) return result;
207 } 207 }
208 return code; 208 return code;
209 } 209 }
210 210
211 211
212 Object* StubCache::ComputeKeyedLoadInterceptor(String* name, 212 Object* StubCache::ComputeKeyedLoadInterceptor(String* name,
213 JSObject* receiver, 213 JSObject* receiver,
214 JSObject* holder) { 214 JSObject* holder) {
215 Code::Flags flags = 215 Code::Flags flags =
216 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, INTERCEPTOR); 216 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, INTERCEPTOR);
217 Object* code = receiver->map()->FindInCodeCache(name, flags); 217 Object* code = receiver->map()->FindInCodeCache(name, flags);
218 if (code->IsUndefined()) { 218 if (code->IsUndefined()) {
219 KeyedLoadStubCompiler compiler; 219 KeyedLoadStubCompiler compiler;
220 code = compiler.CompileLoadInterceptor(receiver, holder, name); 220 code = compiler.CompileLoadInterceptor(receiver, holder, name);
221 if (code->IsFailure()) return code; 221 if (code->IsFailure()) return code;
222 LOG(CodeCreateEvent("KeyedLoadIC", Code::cast(code), name)); 222 LOG(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name));
223 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code)); 223 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code));
224 if (result->IsFailure()) return result; 224 if (result->IsFailure()) return result;
225 } 225 }
226 return code; 226 return code;
227 } 227 }
228 228
229 229
230 Object* StubCache::ComputeKeyedLoadCallback(String* name, 230 Object* StubCache::ComputeKeyedLoadCallback(String* name,
231 JSObject* receiver, 231 JSObject* receiver,
232 JSObject* holder, 232 JSObject* holder,
233 AccessorInfo* callback) { 233 AccessorInfo* callback) {
234 Code::Flags flags = 234 Code::Flags flags =
235 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); 235 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS);
236 Object* code = receiver->map()->FindInCodeCache(name, flags); 236 Object* code = receiver->map()->FindInCodeCache(name, flags);
237 if (code->IsUndefined()) { 237 if (code->IsUndefined()) {
238 KeyedLoadStubCompiler compiler; 238 KeyedLoadStubCompiler compiler;
239 code = compiler.CompileLoadCallback(name, receiver, holder, callback); 239 code = compiler.CompileLoadCallback(name, receiver, holder, callback);
240 if (code->IsFailure()) return code; 240 if (code->IsFailure()) return code;
241 LOG(CodeCreateEvent("KeyedLoadIC", Code::cast(code), name)); 241 LOG(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name));
242 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code)); 242 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code));
243 if (result->IsFailure()) return result; 243 if (result->IsFailure()) return result;
244 } 244 }
245 return code; 245 return code;
246 } 246 }
247 247
248 248
249 249
250 Object* StubCache::ComputeKeyedLoadArrayLength(String* name, 250 Object* StubCache::ComputeKeyedLoadArrayLength(String* name,
251 JSArray* receiver) { 251 JSArray* receiver) {
252 Code::Flags flags = 252 Code::Flags flags =
253 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); 253 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS);
254 Object* code = receiver->map()->FindInCodeCache(name, flags); 254 Object* code = receiver->map()->FindInCodeCache(name, flags);
255 if (code->IsUndefined()) { 255 if (code->IsUndefined()) {
256 KeyedLoadStubCompiler compiler; 256 KeyedLoadStubCompiler compiler;
257 code = compiler.CompileLoadArrayLength(name); 257 code = compiler.CompileLoadArrayLength(name);
258 if (code->IsFailure()) return code; 258 if (code->IsFailure()) return code;
259 LOG(CodeCreateEvent("KeyedLoadIC", Code::cast(code), name)); 259 LOG(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name));
260 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code)); 260 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code));
261 if (result->IsFailure()) return result; 261 if (result->IsFailure()) return result;
262 } 262 }
263 return code; 263 return code;
264 } 264 }
265 265
266 266
267 Object* StubCache::ComputeKeyedLoadStringLength(String* name, 267 Object* StubCache::ComputeKeyedLoadStringLength(String* name,
268 String* receiver) { 268 String* receiver) {
269 Code::Flags flags = 269 Code::Flags flags =
270 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); 270 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS);
271 Object* code = receiver->map()->FindInCodeCache(name, flags); 271 Object* code = receiver->map()->FindInCodeCache(name, flags);
272 if (code->IsUndefined()) { 272 if (code->IsUndefined()) {
273 KeyedLoadStubCompiler compiler; 273 KeyedLoadStubCompiler compiler;
274 code = compiler.CompileLoadStringLength(name); 274 code = compiler.CompileLoadStringLength(name);
275 if (code->IsFailure()) return code; 275 if (code->IsFailure()) return code;
276 LOG(CodeCreateEvent("KeyedLoadIC", Code::cast(code), name)); 276 LOG(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name));
277 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code)); 277 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code));
278 if (result->IsFailure()) return result; 278 if (result->IsFailure()) return result;
279 } 279 }
280 return code; 280 return code;
281 } 281 }
282 282
283 283
284 Object* StubCache::ComputeKeyedLoadFunctionPrototype(String* name, 284 Object* StubCache::ComputeKeyedLoadFunctionPrototype(String* name,
285 JSFunction* receiver) { 285 JSFunction* receiver) {
286 Code::Flags flags = 286 Code::Flags flags =
287 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); 287 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS);
288 Object* code = receiver->map()->FindInCodeCache(name, flags); 288 Object* code = receiver->map()->FindInCodeCache(name, flags);
289 if (code->IsUndefined()) { 289 if (code->IsUndefined()) {
290 KeyedLoadStubCompiler compiler; 290 KeyedLoadStubCompiler compiler;
291 code = compiler.CompileLoadFunctionPrototype(name); 291 code = compiler.CompileLoadFunctionPrototype(name);
292 if (code->IsFailure()) return code; 292 if (code->IsFailure()) return code;
293 LOG(CodeCreateEvent("KeyedLoadIC", Code::cast(code), name)); 293 LOG(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name));
294 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code)); 294 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code));
295 if (result->IsFailure()) return result; 295 if (result->IsFailure()) return result;
296 } 296 }
297 return code; 297 return code;
298 } 298 }
299 299
300 300
301 Object* StubCache::ComputeStoreField(String* name, 301 Object* StubCache::ComputeStoreField(String* name,
302 JSObject* receiver, 302 JSObject* receiver,
303 int field_index, 303 int field_index,
304 Map* transition) { 304 Map* transition) {
305 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; 305 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION;
306 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::STORE_IC, type); 306 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::STORE_IC, type);
307 Object* code = receiver->map()->FindInCodeCache(name, flags); 307 Object* code = receiver->map()->FindInCodeCache(name, flags);
308 if (code->IsUndefined()) { 308 if (code->IsUndefined()) {
309 StoreStubCompiler compiler; 309 StoreStubCompiler compiler;
310 code = compiler.CompileStoreField(receiver, field_index, transition, name); 310 code = compiler.CompileStoreField(receiver, field_index, transition, name);
311 if (code->IsFailure()) return code; 311 if (code->IsFailure()) return code;
312 LOG(CodeCreateEvent("StoreIC", Code::cast(code), name)); 312 LOG(CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name));
313 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code)); 313 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code));
314 if (result->IsFailure()) return result; 314 if (result->IsFailure()) return result;
315 } 315 }
316 return Set(name, receiver->map(), Code::cast(code)); 316 return Set(name, receiver->map(), Code::cast(code));
317 } 317 }
318 318
319 319
320 Object* StubCache::ComputeStoreCallback(String* name, 320 Object* StubCache::ComputeStoreCallback(String* name,
321 JSObject* receiver, 321 JSObject* receiver,
322 AccessorInfo* callback) { 322 AccessorInfo* callback) {
323 ASSERT(v8::ToCData<Address>(callback->setter()) != 0); 323 ASSERT(v8::ToCData<Address>(callback->setter()) != 0);
324 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::STORE_IC, CALLBACKS); 324 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::STORE_IC, CALLBACKS);
325 Object* code = receiver->map()->FindInCodeCache(name, flags); 325 Object* code = receiver->map()->FindInCodeCache(name, flags);
326 if (code->IsUndefined()) { 326 if (code->IsUndefined()) {
327 StoreStubCompiler compiler; 327 StoreStubCompiler compiler;
328 code = compiler.CompileStoreCallback(receiver, callback, name); 328 code = compiler.CompileStoreCallback(receiver, callback, name);
329 if (code->IsFailure()) return code; 329 if (code->IsFailure()) return code;
330 LOG(CodeCreateEvent("StoreIC", Code::cast(code), name)); 330 LOG(CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name));
331 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code)); 331 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code));
332 if (result->IsFailure()) return result; 332 if (result->IsFailure()) return result;
333 } 333 }
334 return Set(name, receiver->map(), Code::cast(code)); 334 return Set(name, receiver->map(), Code::cast(code));
335 } 335 }
336 336
337 337
338 Object* StubCache::ComputeStoreInterceptor(String* name, 338 Object* StubCache::ComputeStoreInterceptor(String* name,
339 JSObject* receiver) { 339 JSObject* receiver) {
340 Code::Flags flags = 340 Code::Flags flags =
341 Code::ComputeMonomorphicFlags(Code::STORE_IC, INTERCEPTOR); 341 Code::ComputeMonomorphicFlags(Code::STORE_IC, INTERCEPTOR);
342 Object* code = receiver->map()->FindInCodeCache(name, flags); 342 Object* code = receiver->map()->FindInCodeCache(name, flags);
343 if (code->IsUndefined()) { 343 if (code->IsUndefined()) {
344 StoreStubCompiler compiler; 344 StoreStubCompiler compiler;
345 code = compiler.CompileStoreInterceptor(receiver, name); 345 code = compiler.CompileStoreInterceptor(receiver, name);
346 if (code->IsFailure()) return code; 346 if (code->IsFailure()) return code;
347 LOG(CodeCreateEvent("StoreIC", Code::cast(code), name)); 347 LOG(CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name));
348 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code)); 348 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code));
349 if (result->IsFailure()) return result; 349 if (result->IsFailure()) return result;
350 } 350 }
351 return Set(name, receiver->map(), Code::cast(code)); 351 return Set(name, receiver->map(), Code::cast(code));
352 } 352 }
353 353
354 354
355 Object* StubCache::ComputeKeyedStoreField(String* name, JSObject* receiver, 355 Object* StubCache::ComputeKeyedStoreField(String* name, JSObject* receiver,
356 int field_index, Map* transition) { 356 int field_index, Map* transition) {
357 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; 357 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION;
358 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_STORE_IC, type); 358 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_STORE_IC, type);
359 Object* code = receiver->map()->FindInCodeCache(name, flags); 359 Object* code = receiver->map()->FindInCodeCache(name, flags);
360 if (code->IsUndefined()) { 360 if (code->IsUndefined()) {
361 KeyedStoreStubCompiler compiler; 361 KeyedStoreStubCompiler compiler;
362 code = compiler.CompileStoreField(receiver, field_index, transition, name); 362 code = compiler.CompileStoreField(receiver, field_index, transition, name);
363 if (code->IsFailure()) return code; 363 if (code->IsFailure()) return code;
364 LOG(CodeCreateEvent("KeyedStoreIC", Code::cast(code), name)); 364 LOG(CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, Code::cast(code), name));
365 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code)); 365 Object* result = receiver->map()->UpdateCodeCache(name, Code::cast(code));
366 if (result->IsFailure()) return result; 366 if (result->IsFailure()) return result;
367 } 367 }
368 return code; 368 return code;
369 } 369 }
370 370
371 371
372 Object* StubCache::ComputeCallConstant(int argc, 372 Object* StubCache::ComputeCallConstant(int argc,
373 InLoopFlag in_loop, 373 InLoopFlag in_loop,
374 String* name, 374 String* name,
(...skipping 30 matching lines...) Expand all
405 } 405 }
406 // If the function hasn't been compiled yet, we cannot do it now 406 // If the function hasn't been compiled yet, we cannot do it now
407 // because it may cause GC. To avoid this issue, we return an 407 // because it may cause GC. To avoid this issue, we return an
408 // internal error which will make sure we do not update any 408 // internal error which will make sure we do not update any
409 // caches. 409 // caches.
410 if (!function->is_compiled()) return Failure::InternalError(); 410 if (!function->is_compiled()) return Failure::InternalError();
411 // Compile the stub - only create stubs for fully compiled functions. 411 // Compile the stub - only create stubs for fully compiled functions.
412 CallStubCompiler compiler(argc); 412 CallStubCompiler compiler(argc);
413 code = compiler.CompileCallConstant(object, holder, function, check, flags); 413 code = compiler.CompileCallConstant(object, holder, function, check, flags);
414 if (code->IsFailure()) return code; 414 if (code->IsFailure()) return code;
415 LOG(CodeCreateEvent("CallIC", Code::cast(code), name)); 415 LOG(CodeCreateEvent(Logger::CALL_IC_TAG, Code::cast(code), name));
416 Object* result = map->UpdateCodeCache(name, Code::cast(code)); 416 Object* result = map->UpdateCodeCache(name, Code::cast(code));
417 if (result->IsFailure()) return result; 417 if (result->IsFailure()) return result;
418 } 418 }
419 return Set(name, map, Code::cast(code)); 419 return Set(name, map, Code::cast(code));
420 } 420 }
421 421
422 422
423 Object* StubCache::ComputeCallField(int argc, 423 Object* StubCache::ComputeCallField(int argc,
424 InLoopFlag in_loop, 424 InLoopFlag in_loop,
425 String* name, 425 String* name,
(...skipping 12 matching lines...) Expand all
438 438
439 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::CALL_IC, 439 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::CALL_IC,
440 FIELD, 440 FIELD,
441 in_loop, 441 in_loop,
442 argc); 442 argc);
443 Object* code = map->FindInCodeCache(name, flags); 443 Object* code = map->FindInCodeCache(name, flags);
444 if (code->IsUndefined()) { 444 if (code->IsUndefined()) {
445 CallStubCompiler compiler(argc); 445 CallStubCompiler compiler(argc);
446 code = compiler.CompileCallField(object, holder, index, name, flags); 446 code = compiler.CompileCallField(object, holder, index, name, flags);
447 if (code->IsFailure()) return code; 447 if (code->IsFailure()) return code;
448 LOG(CodeCreateEvent("CallIC", Code::cast(code), name)); 448 LOG(CodeCreateEvent(Logger::CALL_IC_TAG, Code::cast(code), name));
449 Object* result = map->UpdateCodeCache(name, Code::cast(code)); 449 Object* result = map->UpdateCodeCache(name, Code::cast(code));
450 if (result->IsFailure()) return result; 450 if (result->IsFailure()) return result;
451 } 451 }
452 return Set(name, map, Code::cast(code)); 452 return Set(name, map, Code::cast(code));
453 } 453 }
454 454
455 455
456 Object* StubCache::ComputeCallInterceptor(int argc, 456 Object* StubCache::ComputeCallInterceptor(int argc,
457 String* name, 457 String* name,
458 Object* object, 458 Object* object,
(...skipping 12 matching lines...) Expand all
471 Code::Flags flags = 471 Code::Flags flags =
472 Code::ComputeMonomorphicFlags(Code::CALL_IC, 472 Code::ComputeMonomorphicFlags(Code::CALL_IC,
473 INTERCEPTOR, 473 INTERCEPTOR,
474 NOT_IN_LOOP, 474 NOT_IN_LOOP,
475 argc); 475 argc);
476 Object* code = map->FindInCodeCache(name, flags); 476 Object* code = map->FindInCodeCache(name, flags);
477 if (code->IsUndefined()) { 477 if (code->IsUndefined()) {
478 CallStubCompiler compiler(argc); 478 CallStubCompiler compiler(argc);
479 code = compiler.CompileCallInterceptor(object, holder, name); 479 code = compiler.CompileCallInterceptor(object, holder, name);
480 if (code->IsFailure()) return code; 480 if (code->IsFailure()) return code;
481 LOG(CodeCreateEvent("CallIC", Code::cast(code), name)); 481 LOG(CodeCreateEvent(Logger::CALL_IC_TAG, Code::cast(code), name));
482 Object* result = map->UpdateCodeCache(name, Code::cast(code)); 482 Object* result = map->UpdateCodeCache(name, Code::cast(code));
483 if (result->IsFailure()) return result; 483 if (result->IsFailure()) return result;
484 } 484 }
485 return Set(name, map, Code::cast(code)); 485 return Set(name, map, Code::cast(code));
486 } 486 }
487 487
488 488
489 Object* StubCache::ComputeCallNormal(int argc, 489 Object* StubCache::ComputeCallNormal(int argc,
490 InLoopFlag in_loop, 490 InLoopFlag in_loop,
491 String* name, 491 String* name,
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
625 Object* StubCache::ComputeLazyCompile(int argc) { 625 Object* StubCache::ComputeLazyCompile(int argc) {
626 Code::Flags flags = 626 Code::Flags flags =
627 Code::ComputeFlags(Code::STUB, NOT_IN_LOOP, UNINITIALIZED, NORMAL, argc); 627 Code::ComputeFlags(Code::STUB, NOT_IN_LOOP, UNINITIALIZED, NORMAL, argc);
628 Object* probe = ProbeCache(flags); 628 Object* probe = ProbeCache(flags);
629 if (!probe->IsUndefined()) return probe; 629 if (!probe->IsUndefined()) return probe;
630 StubCompiler compiler; 630 StubCompiler compiler;
631 Object* result = FillCache(compiler.CompileLazyCompile(flags)); 631 Object* result = FillCache(compiler.CompileLazyCompile(flags));
632 if (result->IsCode()) { 632 if (result->IsCode()) {
633 Code* code = Code::cast(result); 633 Code* code = Code::cast(result);
634 USE(code); 634 USE(code);
635 LOG(CodeCreateEvent("LazyCompile", code, code->arguments_count())); 635 LOG(CodeCreateEvent(Logger::LAZY_COMPILE_TAG,
636 code, code->arguments_count()));
636 } 637 }
637 return result; 638 return result;
638 } 639 }
639 640
640 641
641 void StubCache::Clear() { 642 void StubCache::Clear() {
642 for (int i = 0; i < kPrimaryTableSize; i++) { 643 for (int i = 0; i < kPrimaryTableSize; i++) {
643 primary_[i].key = Heap::empty_string(); 644 primary_[i].key = Heap::empty_string();
644 primary_[i].value = Builtins::builtin(Builtins::Illegal); 645 primary_[i].value = Builtins::builtin(Builtins::Illegal);
645 } 646 }
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
773 774
774 Object* StubCompiler::CompileCallInitialize(Code::Flags flags) { 775 Object* StubCompiler::CompileCallInitialize(Code::Flags flags) {
775 HandleScope scope; 776 HandleScope scope;
776 int argc = Code::ExtractArgumentsCountFromFlags(flags); 777 int argc = Code::ExtractArgumentsCountFromFlags(flags);
777 CallIC::GenerateInitialize(masm(), argc); 778 CallIC::GenerateInitialize(masm(), argc);
778 Object* result = GetCodeWithFlags(flags, "CompileCallInitialize"); 779 Object* result = GetCodeWithFlags(flags, "CompileCallInitialize");
779 if (!result->IsFailure()) { 780 if (!result->IsFailure()) {
780 Counters::call_initialize_stubs.Increment(); 781 Counters::call_initialize_stubs.Increment();
781 Code* code = Code::cast(result); 782 Code* code = Code::cast(result);
782 USE(code); 783 USE(code);
783 LOG(CodeCreateEvent("CallInitialize", code, code->arguments_count())); 784 LOG(CodeCreateEvent(Logger::CALL_INITIALIZE_TAG,
785 code, code->arguments_count()));
784 } 786 }
785 return result; 787 return result;
786 } 788 }
787 789
788 790
789 Object* StubCompiler::CompileCallPreMonomorphic(Code::Flags flags) { 791 Object* StubCompiler::CompileCallPreMonomorphic(Code::Flags flags) {
790 HandleScope scope; 792 HandleScope scope;
791 int argc = Code::ExtractArgumentsCountFromFlags(flags); 793 int argc = Code::ExtractArgumentsCountFromFlags(flags);
792 CallIC::GenerateInitialize(masm(), argc); 794 CallIC::GenerateInitialize(masm(), argc);
793 Object* result = GetCodeWithFlags(flags, "CompileCallPreMonomorphic"); 795 Object* result = GetCodeWithFlags(flags, "CompileCallPreMonomorphic");
794 if (!result->IsFailure()) { 796 if (!result->IsFailure()) {
795 Counters::call_premonomorphic_stubs.Increment(); 797 Counters::call_premonomorphic_stubs.Increment();
796 Code* code = Code::cast(result); 798 Code* code = Code::cast(result);
797 USE(code); 799 USE(code);
798 LOG(CodeCreateEvent("CallPreMonomorphic", code, code->arguments_count())); 800 LOG(CodeCreateEvent(Logger::CALL_PRE_MONOMORPHIC_TAG,
801 code, code->arguments_count()));
799 } 802 }
800 return result; 803 return result;
801 } 804 }
802 805
803 806
804 Object* StubCompiler::CompileCallNormal(Code::Flags flags) { 807 Object* StubCompiler::CompileCallNormal(Code::Flags flags) {
805 HandleScope scope; 808 HandleScope scope;
806 int argc = Code::ExtractArgumentsCountFromFlags(flags); 809 int argc = Code::ExtractArgumentsCountFromFlags(flags);
807 CallIC::GenerateNormal(masm(), argc); 810 CallIC::GenerateNormal(masm(), argc);
808 Object* result = GetCodeWithFlags(flags, "CompileCallNormal"); 811 Object* result = GetCodeWithFlags(flags, "CompileCallNormal");
809 if (!result->IsFailure()) { 812 if (!result->IsFailure()) {
810 Counters::call_normal_stubs.Increment(); 813 Counters::call_normal_stubs.Increment();
811 Code* code = Code::cast(result); 814 Code* code = Code::cast(result);
812 USE(code); 815 USE(code);
813 LOG(CodeCreateEvent("CallNormal", code, code->arguments_count())); 816 LOG(CodeCreateEvent(
Søren Thygesen Gjesse 2009/06/08 12:28:47 Please format this call like the others: LOG(Code
Mikhail Naganov 2009/06/08 13:39:09 Done.
817 Logger::CALL_NORMAL_TAG, code, code->arguments_count()));
814 } 818 }
815 return result; 819 return result;
816 } 820 }
817 821
818 822
819 Object* StubCompiler::CompileCallMegamorphic(Code::Flags flags) { 823 Object* StubCompiler::CompileCallMegamorphic(Code::Flags flags) {
820 HandleScope scope; 824 HandleScope scope;
821 int argc = Code::ExtractArgumentsCountFromFlags(flags); 825 int argc = Code::ExtractArgumentsCountFromFlags(flags);
822 CallIC::GenerateMegamorphic(masm(), argc); 826 CallIC::GenerateMegamorphic(masm(), argc);
823 Object* result = GetCodeWithFlags(flags, "CompileCallMegamorphic"); 827 Object* result = GetCodeWithFlags(flags, "CompileCallMegamorphic");
824 if (!result->IsFailure()) { 828 if (!result->IsFailure()) {
825 Counters::call_megamorphic_stubs.Increment(); 829 Counters::call_megamorphic_stubs.Increment();
826 Code* code = Code::cast(result); 830 Code* code = Code::cast(result);
827 USE(code); 831 USE(code);
828 LOG(CodeCreateEvent("CallMegamorphic", code, code->arguments_count())); 832 LOG(CodeCreateEvent(Logger::CALL_MEGAMORPHIC_TAG,
833 code, code->arguments_count()));
829 } 834 }
830 return result; 835 return result;
831 } 836 }
832 837
833 838
834 Object* StubCompiler::CompileCallMiss(Code::Flags flags) { 839 Object* StubCompiler::CompileCallMiss(Code::Flags flags) {
835 HandleScope scope; 840 HandleScope scope;
836 int argc = Code::ExtractArgumentsCountFromFlags(flags); 841 int argc = Code::ExtractArgumentsCountFromFlags(flags);
837 CallIC::GenerateMiss(masm(), argc); 842 CallIC::GenerateMiss(masm(), argc);
838 Object* result = GetCodeWithFlags(flags, "CompileCallMiss"); 843 Object* result = GetCodeWithFlags(flags, "CompileCallMiss");
839 if (!result->IsFailure()) { 844 if (!result->IsFailure()) {
840 Counters::call_megamorphic_stubs.Increment(); 845 Counters::call_megamorphic_stubs.Increment();
841 Code* code = Code::cast(result); 846 Code* code = Code::cast(result);
842 USE(code); 847 USE(code);
843 LOG(CodeCreateEvent("CallMiss", code, code->arguments_count())); 848 LOG(CodeCreateEvent(Logger::CALL_MISS_TAG, code, code->arguments_count()));
844 } 849 }
845 return result; 850 return result;
846 } 851 }
847 852
848 853
849 #ifdef ENABLE_DEBUGGER_SUPPORT 854 #ifdef ENABLE_DEBUGGER_SUPPORT
850 Object* StubCompiler::CompileCallDebugBreak(Code::Flags flags) { 855 Object* StubCompiler::CompileCallDebugBreak(Code::Flags flags) {
851 HandleScope scope; 856 HandleScope scope;
852 Debug::GenerateCallICDebugBreak(masm()); 857 Debug::GenerateCallICDebugBreak(masm());
853 Object* result = GetCodeWithFlags(flags, "CompileCallDebugBreak"); 858 Object* result = GetCodeWithFlags(flags, "CompileCallDebugBreak");
854 if (!result->IsFailure()) { 859 if (!result->IsFailure()) {
855 Code* code = Code::cast(result); 860 Code* code = Code::cast(result);
856 USE(code); 861 USE(code);
857 LOG(CodeCreateEvent("CallDebugBreak", code, code->arguments_count())); 862 LOG(CodeCreateEvent(Logger::CALL_DEBUG_BREAK_TAG,
863 code, code->arguments_count()));
858 } 864 }
859 return result; 865 return result;
860 } 866 }
861 867
862 868
863 Object* StubCompiler::CompileCallDebugPrepareStepIn(Code::Flags flags) { 869 Object* StubCompiler::CompileCallDebugPrepareStepIn(Code::Flags flags) {
864 HandleScope scope; 870 HandleScope scope;
865 // Use the same code for the the step in preparations as we do for 871 // Use the same code for the the step in preparations as we do for
866 // the miss case. 872 // the miss case.
867 int argc = Code::ExtractArgumentsCountFromFlags(flags); 873 int argc = Code::ExtractArgumentsCountFromFlags(flags);
868 CallIC::GenerateMiss(masm(), argc); 874 CallIC::GenerateMiss(masm(), argc);
869 Object* result = GetCodeWithFlags(flags, "CompileCallDebugPrepareStepIn"); 875 Object* result = GetCodeWithFlags(flags, "CompileCallDebugPrepareStepIn");
870 if (!result->IsFailure()) { 876 if (!result->IsFailure()) {
871 Code* code = Code::cast(result); 877 Code* code = Code::cast(result);
872 USE(code); 878 USE(code);
873 LOG(CodeCreateEvent("CallDebugPrepareStepIn", code, 879 LOG(CodeCreateEvent(Logger::CALL_DEBUG_PREPARE_STEP_IN_TAG, code,
874 code->arguments_count())); 880 code->arguments_count()));
875 } 881 }
876 return result; 882 return result;
877 } 883 }
878 #endif 884 #endif
879 885
880 886
881 Object* StubCompiler::GetCodeWithFlags(Code::Flags flags, const char* name) { 887 Object* StubCompiler::GetCodeWithFlags(Code::Flags flags, const char* name) {
882 CodeDesc desc; 888 CodeDesc desc;
883 masm_.GetCode(&desc); 889 masm_.GetCode(&desc);
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
927 int argc = arguments_.immediate(); 933 int argc = arguments_.immediate();
928 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::CALL_IC, 934 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::CALL_IC,
929 type, 935 type,
930 NOT_IN_LOOP, 936 NOT_IN_LOOP,
931 argc); 937 argc);
932 return GetCodeWithFlags(flags, name); 938 return GetCodeWithFlags(flags, name);
933 } 939 }
934 940
935 941
936 } } // namespace v8::internal 942 } } // namespace v8::internal
OLDNEW
« src/log.cc ('K') | « src/log.cc ('k') | src/x64/assembler-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698