| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 #include "v8.h" | 28 #include "v8.h" |
| 29 | 29 |
| 30 #include "api.h" | 30 #include "api.h" |
| 31 #include "arguments.h" | 31 #include "arguments.h" |
| 32 #include "ast.h" | 32 #include "ast.h" |
| 33 #include "code-stubs.h" | 33 #include "code-stubs.h" |
| 34 #include "gdb-jit.h" | 34 #include "gdb-jit.h" |
| 35 #include "ic-inl.h" | 35 #include "ic-inl.h" |
| 36 #include "stub-cache.h" | 36 #include "stub-cache.h" |
| 37 #include "vm-state-inl.h" | 37 #include "vm-state-inl.h" |
| 38 #include "third_party/vtune/vtune-jit.h" |
| 38 | 39 |
| 39 namespace v8 { | 40 namespace v8 { |
| 40 namespace internal { | 41 namespace internal { |
| 41 | 42 |
| 42 // ----------------------------------------------------------------------- | 43 // ----------------------------------------------------------------------- |
| 43 // StubCache implementation. | 44 // StubCache implementation. |
| 44 | 45 |
| 45 | 46 |
| 46 StubCache::StubCache(Isolate* isolate, Zone* zone) | 47 StubCache::StubCache(Isolate* isolate, Zone* zone) |
| 47 : isolate_(isolate) { | 48 : isolate_(isolate) { |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 89 int secondary_offset = SecondaryOffset(primary->key, old_flags, seed); | 90 int secondary_offset = SecondaryOffset(primary->key, old_flags, seed); |
| 90 Entry* secondary = entry(secondary_, secondary_offset); | 91 Entry* secondary = entry(secondary_, secondary_offset); |
| 91 *secondary = *primary; | 92 *secondary = *primary; |
| 92 } | 93 } |
| 93 | 94 |
| 94 // Update primary cache. | 95 // Update primary cache. |
| 95 primary->key = name; | 96 primary->key = name; |
| 96 primary->value = code; | 97 primary->value = code; |
| 97 primary->map = map; | 98 primary->map = map; |
| 98 isolate()->counters()->megamorphic_stub_cache_updates()->Increment(); | 99 isolate()->counters()->megamorphic_stub_cache_updates()->Increment(); |
| 100 VTUNEJIT(AddCode(name, code)); |
| 99 return code; | 101 return code; |
| 100 } | 102 } |
| 101 | 103 |
| 102 | 104 |
| 103 Handle<Code> StubCache::ComputeLoadNonexistent(Handle<String> name, | 105 Handle<Code> StubCache::ComputeLoadNonexistent(Handle<String> name, |
| 104 Handle<JSObject> receiver) { | 106 Handle<JSObject> receiver) { |
| 105 ASSERT(receiver->IsGlobalObject() || receiver->HasFastProperties()); | 107 ASSERT(receiver->IsGlobalObject() || receiver->HasFastProperties()); |
| 106 // If no global objects are present in the prototype chain, the load | 108 // If no global objects are present in the prototype chain, the load |
| 107 // nonexistent IC stub can be shared for all names for a given map | 109 // nonexistent IC stub can be shared for all names for a given map |
| 108 // and we use the empty string for the map cache in that case. If | 110 // and we use the empty string for the map cache in that case. If |
| (...skipping 12 matching lines...) Expand all Loading... |
| 121 Code::Flags flags = | 123 Code::Flags flags = |
| 122 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::NONEXISTENT); | 124 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::NONEXISTENT); |
| 123 Handle<Object> probe(receiver->map()->FindInCodeCache(*cache_name, flags)); | 125 Handle<Object> probe(receiver->map()->FindInCodeCache(*cache_name, flags)); |
| 124 if (probe->IsCode()) return Handle<Code>::cast(probe); | 126 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 125 | 127 |
| 126 LoadStubCompiler compiler(isolate_); | 128 LoadStubCompiler compiler(isolate_); |
| 127 Handle<Code> code = | 129 Handle<Code> code = |
| 128 compiler.CompileLoadNonexistent(cache_name, receiver, last); | 130 compiler.CompileLoadNonexistent(cache_name, receiver, last); |
| 129 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *cache_name)); | 131 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *cache_name)); |
| 130 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *cache_name, *code)); | 132 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *cache_name, *code)); |
| 133 VTUNEJIT(AddCode(cache_name, code)); |
| 131 JSObject::UpdateMapCodeCache(receiver, cache_name, code); | 134 JSObject::UpdateMapCodeCache(receiver, cache_name, code); |
| 132 return code; | 135 return code; |
| 133 } | 136 } |
| 134 | 137 |
| 135 | 138 |
| 136 Handle<Code> StubCache::ComputeLoadField(Handle<String> name, | 139 Handle<Code> StubCache::ComputeLoadField(Handle<String> name, |
| 137 Handle<JSObject> receiver, | 140 Handle<JSObject> receiver, |
| 138 Handle<JSObject> holder, | 141 Handle<JSObject> holder, |
| 139 int field_index) { | 142 int field_index) { |
| 140 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | 143 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
| 141 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::FIELD); | 144 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::FIELD); |
| 142 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 145 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
| 143 if (probe->IsCode()) return Handle<Code>::cast(probe); | 146 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 144 | 147 |
| 145 LoadStubCompiler compiler(isolate_); | 148 LoadStubCompiler compiler(isolate_); |
| 146 Handle<Code> code = | 149 Handle<Code> code = |
| 147 compiler.CompileLoadField(receiver, holder, field_index, name); | 150 compiler.CompileLoadField(receiver, holder, field_index, name); |
| 148 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); | 151 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
| 149 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); | 152 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
| 153 VTUNEJIT(AddCode(name, code)); |
| 150 JSObject::UpdateMapCodeCache(receiver, name, code); | 154 JSObject::UpdateMapCodeCache(receiver, name, code); |
| 151 return code; | 155 return code; |
| 152 } | 156 } |
| 153 | 157 |
| 154 | 158 |
| 155 Handle<Code> StubCache::ComputeLoadCallback(Handle<String> name, | 159 Handle<Code> StubCache::ComputeLoadCallback(Handle<String> name, |
| 156 Handle<JSObject> receiver, | 160 Handle<JSObject> receiver, |
| 157 Handle<JSObject> holder, | 161 Handle<JSObject> holder, |
| 158 Handle<AccessorInfo> callback) { | 162 Handle<AccessorInfo> callback) { |
| 159 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); | 163 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); |
| 160 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | 164 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
| 161 Code::Flags flags = | 165 Code::Flags flags = |
| 162 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::CALLBACKS); | 166 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::CALLBACKS); |
| 163 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 167 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
| 164 if (probe->IsCode()) return Handle<Code>::cast(probe); | 168 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 165 | 169 |
| 166 LoadStubCompiler compiler(isolate_); | 170 LoadStubCompiler compiler(isolate_); |
| 167 Handle<Code> code = | 171 Handle<Code> code = |
| 168 compiler.CompileLoadCallback(name, receiver, holder, callback); | 172 compiler.CompileLoadCallback(name, receiver, holder, callback); |
| 169 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); | 173 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
| 170 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); | 174 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
| 175 VTUNEJIT(AddCode(name, code)); |
| 171 JSObject::UpdateMapCodeCache(receiver, name, code); | 176 JSObject::UpdateMapCodeCache(receiver, name, code); |
| 172 return code; | 177 return code; |
| 173 } | 178 } |
| 174 | 179 |
| 175 | 180 |
| 176 Handle<Code> StubCache::ComputeLoadViaGetter(Handle<String> name, | 181 Handle<Code> StubCache::ComputeLoadViaGetter(Handle<String> name, |
| 177 Handle<JSObject> receiver, | 182 Handle<JSObject> receiver, |
| 178 Handle<JSObject> holder, | 183 Handle<JSObject> holder, |
| 179 Handle<JSFunction> getter) { | 184 Handle<JSFunction> getter) { |
| 180 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | 185 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 201 Code::Flags flags = | 206 Code::Flags flags = |
| 202 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::CONSTANT_FUNCTION); | 207 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::CONSTANT_FUNCTION); |
| 203 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 208 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
| 204 if (probe->IsCode()) return Handle<Code>::cast(probe); | 209 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 205 | 210 |
| 206 LoadStubCompiler compiler(isolate_); | 211 LoadStubCompiler compiler(isolate_); |
| 207 Handle<Code> code = | 212 Handle<Code> code = |
| 208 compiler.CompileLoadConstant(receiver, holder, value, name); | 213 compiler.CompileLoadConstant(receiver, holder, value, name); |
| 209 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); | 214 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
| 210 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); | 215 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
| 216 VTUNEJIT(AddCode(name, code)); |
| 211 JSObject::UpdateMapCodeCache(receiver, name, code); | 217 JSObject::UpdateMapCodeCache(receiver, name, code); |
| 212 return code; | 218 return code; |
| 213 } | 219 } |
| 214 | 220 |
| 215 | 221 |
| 216 Handle<Code> StubCache::ComputeLoadInterceptor(Handle<String> name, | 222 Handle<Code> StubCache::ComputeLoadInterceptor(Handle<String> name, |
| 217 Handle<JSObject> receiver, | 223 Handle<JSObject> receiver, |
| 218 Handle<JSObject> holder) { | 224 Handle<JSObject> holder) { |
| 219 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | 225 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
| 220 Code::Flags flags = | 226 Code::Flags flags = |
| 221 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::INTERCEPTOR); | 227 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::INTERCEPTOR); |
| 222 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 228 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
| 223 if (probe->IsCode()) return Handle<Code>::cast(probe); | 229 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 224 | 230 |
| 225 LoadStubCompiler compiler(isolate_); | 231 LoadStubCompiler compiler(isolate_); |
| 226 Handle<Code> code = | 232 Handle<Code> code = |
| 227 compiler.CompileLoadInterceptor(receiver, holder, name); | 233 compiler.CompileLoadInterceptor(receiver, holder, name); |
| 228 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); | 234 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
| 229 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); | 235 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
| 236 VTUNEJIT(AddCode(name, code)); |
| 230 JSObject::UpdateMapCodeCache(receiver, name, code); | 237 JSObject::UpdateMapCodeCache(receiver, name, code); |
| 231 return code; | 238 return code; |
| 232 } | 239 } |
| 233 | 240 |
| 234 | 241 |
| 235 Handle<Code> StubCache::ComputeLoadNormal() { | 242 Handle<Code> StubCache::ComputeLoadNormal() { |
| 236 return isolate_->builtins()->LoadIC_Normal(); | 243 return isolate_->builtins()->LoadIC_Normal(); |
| 237 } | 244 } |
| 238 | 245 |
| 239 | 246 |
| 240 Handle<Code> StubCache::ComputeLoadGlobal(Handle<String> name, | 247 Handle<Code> StubCache::ComputeLoadGlobal(Handle<String> name, |
| 241 Handle<JSObject> receiver, | 248 Handle<JSObject> receiver, |
| 242 Handle<GlobalObject> holder, | 249 Handle<GlobalObject> holder, |
| 243 Handle<JSGlobalPropertyCell> cell, | 250 Handle<JSGlobalPropertyCell> cell, |
| 244 bool is_dont_delete) { | 251 bool is_dont_delete) { |
| 245 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | 252 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
| 246 Code::Flags flags = | 253 Code::Flags flags = |
| 247 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::NORMAL); | 254 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::NORMAL); |
| 248 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 255 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
| 249 if (probe->IsCode()) return Handle<Code>::cast(probe); | 256 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 250 | 257 |
| 251 LoadStubCompiler compiler(isolate_); | 258 LoadStubCompiler compiler(isolate_); |
| 252 Handle<Code> code = | 259 Handle<Code> code = |
| 253 compiler.CompileLoadGlobal(receiver, holder, cell, name, is_dont_delete); | 260 compiler.CompileLoadGlobal(receiver, holder, cell, name, is_dont_delete); |
| 254 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); | 261 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
| 255 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); | 262 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
| 263 VTUNEJIT(AddCode(name, code)); |
| 256 JSObject::UpdateMapCodeCache(receiver, name, code); | 264 JSObject::UpdateMapCodeCache(receiver, name, code); |
| 257 return code; | 265 return code; |
| 258 } | 266 } |
| 259 | 267 |
| 260 | 268 |
| 261 Handle<Code> StubCache::ComputeKeyedLoadField(Handle<String> name, | 269 Handle<Code> StubCache::ComputeKeyedLoadField(Handle<String> name, |
| 262 Handle<JSObject> receiver, | 270 Handle<JSObject> receiver, |
| 263 Handle<JSObject> holder, | 271 Handle<JSObject> holder, |
| 264 int field_index) { | 272 int field_index) { |
| 265 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | 273 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
| 266 Code::Flags flags = | 274 Code::Flags flags = |
| 267 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::FIELD); | 275 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::FIELD); |
| 268 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 276 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
| 269 if (probe->IsCode()) return Handle<Code>::cast(probe); | 277 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 270 | 278 |
| 271 KeyedLoadStubCompiler compiler(isolate_); | 279 KeyedLoadStubCompiler compiler(isolate_); |
| 272 Handle<Code> code = | 280 Handle<Code> code = |
| 273 compiler.CompileLoadField(name, receiver, holder, field_index); | 281 compiler.CompileLoadField(name, receiver, holder, field_index); |
| 274 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); | 282 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
| 275 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); | 283 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
| 284 VTUNEJIT(AddCode(name, code)); |
| 276 JSObject::UpdateMapCodeCache(receiver, name, code); | 285 JSObject::UpdateMapCodeCache(receiver, name, code); |
| 277 return code; | 286 return code; |
| 278 } | 287 } |
| 279 | 288 |
| 280 | 289 |
| 281 Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<String> name, | 290 Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<String> name, |
| 282 Handle<JSObject> receiver, | 291 Handle<JSObject> receiver, |
| 283 Handle<JSObject> holder, | 292 Handle<JSObject> holder, |
| 284 Handle<JSFunction> value) { | 293 Handle<JSFunction> value) { |
| 285 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | 294 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
| 286 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, | 295 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, |
| 287 Code::CONSTANT_FUNCTION); | 296 Code::CONSTANT_FUNCTION); |
| 288 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 297 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
| 289 if (probe->IsCode()) return Handle<Code>::cast(probe); | 298 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 290 | 299 |
| 291 KeyedLoadStubCompiler compiler(isolate_); | 300 KeyedLoadStubCompiler compiler(isolate_); |
| 292 Handle<Code> code = | 301 Handle<Code> code = |
| 293 compiler.CompileLoadConstant(name, receiver, holder, value); | 302 compiler.CompileLoadConstant(name, receiver, holder, value); |
| 294 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); | 303 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
| 295 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); | 304 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
| 305 VTUNEJIT(AddCode(name, code)); |
| 296 JSObject::UpdateMapCodeCache(receiver, name, code); | 306 JSObject::UpdateMapCodeCache(receiver, name, code); |
| 297 return code; | 307 return code; |
| 298 } | 308 } |
| 299 | 309 |
| 300 | 310 |
| 301 Handle<Code> StubCache::ComputeKeyedLoadInterceptor(Handle<String> name, | 311 Handle<Code> StubCache::ComputeKeyedLoadInterceptor(Handle<String> name, |
| 302 Handle<JSObject> receiver, | 312 Handle<JSObject> receiver, |
| 303 Handle<JSObject> holder) { | 313 Handle<JSObject> holder) { |
| 304 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | 314 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
| 305 Code::Flags flags = | 315 Code::Flags flags = |
| 306 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::INTERCEPTOR); | 316 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::INTERCEPTOR); |
| 307 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 317 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
| 308 if (probe->IsCode()) return Handle<Code>::cast(probe); | 318 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 309 | 319 |
| 310 KeyedLoadStubCompiler compiler(isolate_); | 320 KeyedLoadStubCompiler compiler(isolate_); |
| 311 Handle<Code> code = compiler.CompileLoadInterceptor(receiver, holder, name); | 321 Handle<Code> code = compiler.CompileLoadInterceptor(receiver, holder, name); |
| 312 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); | 322 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
| 313 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); | 323 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
| 324 VTUNEJIT(AddCode(name, code)); |
| 314 JSObject::UpdateMapCodeCache(receiver, name, code); | 325 JSObject::UpdateMapCodeCache(receiver, name, code); |
| 315 return code; | 326 return code; |
| 316 } | 327 } |
| 317 | 328 |
| 318 | 329 |
| 319 Handle<Code> StubCache::ComputeKeyedLoadCallback( | 330 Handle<Code> StubCache::ComputeKeyedLoadCallback( |
| 320 Handle<String> name, | 331 Handle<String> name, |
| 321 Handle<JSObject> receiver, | 332 Handle<JSObject> receiver, |
| 322 Handle<JSObject> holder, | 333 Handle<JSObject> holder, |
| 323 Handle<AccessorInfo> callback) { | 334 Handle<AccessorInfo> callback) { |
| 324 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | 335 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
| 325 Code::Flags flags = | 336 Code::Flags flags = |
| 326 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CALLBACKS); | 337 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CALLBACKS); |
| 327 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 338 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
| 328 if (probe->IsCode()) return Handle<Code>::cast(probe); | 339 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 329 | 340 |
| 330 KeyedLoadStubCompiler compiler(isolate_); | 341 KeyedLoadStubCompiler compiler(isolate_); |
| 331 Handle<Code> code = | 342 Handle<Code> code = |
| 332 compiler.CompileLoadCallback(name, receiver, holder, callback); | 343 compiler.CompileLoadCallback(name, receiver, holder, callback); |
| 333 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); | 344 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
| 334 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); | 345 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
| 346 VTUNEJIT(AddCode(name, code)); |
| 335 JSObject::UpdateMapCodeCache(receiver, name, code); | 347 JSObject::UpdateMapCodeCache(receiver, name, code); |
| 336 return code; | 348 return code; |
| 337 } | 349 } |
| 338 | 350 |
| 339 | 351 |
| 340 Handle<Code> StubCache::ComputeKeyedLoadArrayLength(Handle<String> name, | 352 Handle<Code> StubCache::ComputeKeyedLoadArrayLength(Handle<String> name, |
| 341 Handle<JSArray> receiver) { | 353 Handle<JSArray> receiver) { |
| 342 Code::Flags flags = | 354 Code::Flags flags = |
| 343 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CALLBACKS); | 355 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CALLBACKS); |
| 344 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 356 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
| 345 if (probe->IsCode()) return Handle<Code>::cast(probe); | 357 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 346 | 358 |
| 347 KeyedLoadStubCompiler compiler(isolate_); | 359 KeyedLoadStubCompiler compiler(isolate_); |
| 348 Handle<Code> code = compiler.CompileLoadArrayLength(name); | 360 Handle<Code> code = compiler.CompileLoadArrayLength(name); |
| 349 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); | 361 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
| 350 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); | 362 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
| 363 VTUNEJIT(AddCode(name, code)); |
| 351 JSObject::UpdateMapCodeCache(receiver, name, code); | 364 JSObject::UpdateMapCodeCache(receiver, name, code); |
| 352 return code; | 365 return code; |
| 353 } | 366 } |
| 354 | 367 |
| 355 | 368 |
| 356 Handle<Code> StubCache::ComputeKeyedLoadStringLength(Handle<String> name, | 369 Handle<Code> StubCache::ComputeKeyedLoadStringLength(Handle<String> name, |
| 357 Handle<String> receiver) { | 370 Handle<String> receiver) { |
| 358 Code::Flags flags = | 371 Code::Flags flags = |
| 359 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CALLBACKS); | 372 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CALLBACKS); |
| 360 Handle<Map> map(receiver->map()); | 373 Handle<Map> map(receiver->map()); |
| 361 Handle<Object> probe(map->FindInCodeCache(*name, flags)); | 374 Handle<Object> probe(map->FindInCodeCache(*name, flags)); |
| 362 if (probe->IsCode()) return Handle<Code>::cast(probe); | 375 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 363 | 376 |
| 364 KeyedLoadStubCompiler compiler(isolate_); | 377 KeyedLoadStubCompiler compiler(isolate_); |
| 365 Handle<Code> code = compiler.CompileLoadStringLength(name); | 378 Handle<Code> code = compiler.CompileLoadStringLength(name); |
| 366 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); | 379 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
| 367 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); | 380 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
| 381 VTUNEJIT(AddCode(name, code)); |
| 368 Map::UpdateCodeCache(map, name, code); | 382 Map::UpdateCodeCache(map, name, code); |
| 369 return code; | 383 return code; |
| 370 } | 384 } |
| 371 | 385 |
| 372 | 386 |
| 373 Handle<Code> StubCache::ComputeKeyedLoadFunctionPrototype( | 387 Handle<Code> StubCache::ComputeKeyedLoadFunctionPrototype( |
| 374 Handle<String> name, | 388 Handle<String> name, |
| 375 Handle<JSFunction> receiver) { | 389 Handle<JSFunction> receiver) { |
| 376 Code::Flags flags = | 390 Code::Flags flags = |
| 377 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CALLBACKS); | 391 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CALLBACKS); |
| 378 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 392 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
| 379 if (probe->IsCode()) return Handle<Code>::cast(probe); | 393 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 380 | 394 |
| 381 KeyedLoadStubCompiler compiler(isolate_); | 395 KeyedLoadStubCompiler compiler(isolate_); |
| 382 Handle<Code> code = compiler.CompileLoadFunctionPrototype(name); | 396 Handle<Code> code = compiler.CompileLoadFunctionPrototype(name); |
| 383 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); | 397 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
| 384 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); | 398 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
| 399 VTUNEJIT(AddCode(name, code)); |
| 385 JSObject::UpdateMapCodeCache(receiver, name, code); | 400 JSObject::UpdateMapCodeCache(receiver, name, code); |
| 386 return code; | 401 return code; |
| 387 } | 402 } |
| 388 | 403 |
| 389 | 404 |
| 390 Handle<Code> StubCache::ComputeStoreField(Handle<String> name, | 405 Handle<Code> StubCache::ComputeStoreField(Handle<String> name, |
| 391 Handle<JSObject> receiver, | 406 Handle<JSObject> receiver, |
| 392 int field_index, | 407 int field_index, |
| 393 Handle<Map> transition, | 408 Handle<Map> transition, |
| 394 StrictModeFlag strict_mode) { | 409 StrictModeFlag strict_mode) { |
| 395 Code::StubType type = | 410 Code::StubType type = |
| 396 (transition.is_null()) ? Code::FIELD : Code::MAP_TRANSITION; | 411 (transition.is_null()) ? Code::FIELD : Code::MAP_TRANSITION; |
| 397 Code::Flags flags = Code::ComputeMonomorphicFlags( | 412 Code::Flags flags = Code::ComputeMonomorphicFlags( |
| 398 Code::STORE_IC, type, strict_mode); | 413 Code::STORE_IC, type, strict_mode); |
| 399 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 414 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
| 400 if (probe->IsCode()) return Handle<Code>::cast(probe); | 415 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 401 | 416 |
| 402 StoreStubCompiler compiler(isolate_, strict_mode); | 417 StoreStubCompiler compiler(isolate_, strict_mode); |
| 403 Handle<Code> code = | 418 Handle<Code> code = |
| 404 compiler.CompileStoreField(receiver, field_index, transition, name); | 419 compiler.CompileStoreField(receiver, field_index, transition, name); |
| 405 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); | 420 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); |
| 406 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); | 421 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); |
| 422 VTUNEJIT(AddCode(name, code)); |
| 407 JSObject::UpdateMapCodeCache(receiver, name, code); | 423 JSObject::UpdateMapCodeCache(receiver, name, code); |
| 408 return code; | 424 return code; |
| 409 } | 425 } |
| 410 | 426 |
| 411 | 427 |
| 412 Handle<Code> StubCache::ComputeKeyedLoadOrStoreElement( | 428 Handle<Code> StubCache::ComputeKeyedLoadOrStoreElement( |
| 413 Handle<Map> receiver_map, | 429 Handle<Map> receiver_map, |
| 414 KeyedIC::StubKind stub_kind, | 430 KeyedIC::StubKind stub_kind, |
| 415 StrictModeFlag strict_mode) { | 431 StrictModeFlag strict_mode) { |
| 416 KeyedAccessGrowMode grow_mode = | 432 KeyedAccessGrowMode grow_mode = |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 465 break; | 481 break; |
| 466 } | 482 } |
| 467 | 483 |
| 468 ASSERT(!code.is_null()); | 484 ASSERT(!code.is_null()); |
| 469 | 485 |
| 470 if (stub_kind == KeyedIC::LOAD) { | 486 if (stub_kind == KeyedIC::LOAD) { |
| 471 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, 0)); | 487 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, 0)); |
| 472 } else { | 488 } else { |
| 473 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, *code, 0)); | 489 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, *code, 0)); |
| 474 } | 490 } |
| 491 VTUNEJIT(AddCode("Keyed_STR/LD_IC", code)); |
| 475 Map::UpdateCodeCache(receiver_map, name, code); | 492 Map::UpdateCodeCache(receiver_map, name, code); |
| 476 return code; | 493 return code; |
| 477 } | 494 } |
| 478 | 495 |
| 479 | 496 |
| 480 Handle<Code> StubCache::ComputeStoreNormal(StrictModeFlag strict_mode) { | 497 Handle<Code> StubCache::ComputeStoreNormal(StrictModeFlag strict_mode) { |
| 481 return (strict_mode == kStrictMode) | 498 return (strict_mode == kStrictMode) |
| 482 ? isolate_->builtins()->Builtins::StoreIC_Normal_Strict() | 499 ? isolate_->builtins()->Builtins::StoreIC_Normal_Strict() |
| 483 : isolate_->builtins()->Builtins::StoreIC_Normal(); | 500 : isolate_->builtins()->Builtins::StoreIC_Normal(); |
| 484 } | 501 } |
| 485 | 502 |
| 486 | 503 |
| 487 Handle<Code> StubCache::ComputeStoreGlobal(Handle<String> name, | 504 Handle<Code> StubCache::ComputeStoreGlobal(Handle<String> name, |
| 488 Handle<GlobalObject> receiver, | 505 Handle<GlobalObject> receiver, |
| 489 Handle<JSGlobalPropertyCell> cell, | 506 Handle<JSGlobalPropertyCell> cell, |
| 490 StrictModeFlag strict_mode) { | 507 StrictModeFlag strict_mode) { |
| 491 Code::Flags flags = Code::ComputeMonomorphicFlags( | 508 Code::Flags flags = Code::ComputeMonomorphicFlags( |
| 492 Code::STORE_IC, Code::NORMAL, strict_mode); | 509 Code::STORE_IC, Code::NORMAL, strict_mode); |
| 493 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 510 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
| 494 if (probe->IsCode()) return Handle<Code>::cast(probe); | 511 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 495 | 512 |
| 496 StoreStubCompiler compiler(isolate_, strict_mode); | 513 StoreStubCompiler compiler(isolate_, strict_mode); |
| 497 Handle<Code> code = compiler.CompileStoreGlobal(receiver, cell, name); | 514 Handle<Code> code = compiler.CompileStoreGlobal(receiver, cell, name); |
| 498 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); | 515 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); |
| 499 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); | 516 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); |
| 517 VTUNEJIT(AddCode(name, code)); |
| 500 JSObject::UpdateMapCodeCache(receiver, name, code); | 518 JSObject::UpdateMapCodeCache(receiver, name, code); |
| 501 return code; | 519 return code; |
| 502 } | 520 } |
| 503 | 521 |
| 504 | 522 |
| 505 Handle<Code> StubCache::ComputeStoreCallback(Handle<String> name, | 523 Handle<Code> StubCache::ComputeStoreCallback(Handle<String> name, |
| 506 Handle<JSObject> receiver, | 524 Handle<JSObject> receiver, |
| 507 Handle<AccessorInfo> callback, | 525 Handle<AccessorInfo> callback, |
| 508 StrictModeFlag strict_mode) { | 526 StrictModeFlag strict_mode) { |
| 509 ASSERT(v8::ToCData<Address>(callback->setter()) != 0); | 527 ASSERT(v8::ToCData<Address>(callback->setter()) != 0); |
| 510 Code::Flags flags = Code::ComputeMonomorphicFlags( | 528 Code::Flags flags = Code::ComputeMonomorphicFlags( |
| 511 Code::STORE_IC, Code::CALLBACKS, strict_mode); | 529 Code::STORE_IC, Code::CALLBACKS, strict_mode); |
| 512 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 530 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
| 513 if (probe->IsCode()) return Handle<Code>::cast(probe); | 531 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 514 | 532 |
| 515 StoreStubCompiler compiler(isolate_, strict_mode); | 533 StoreStubCompiler compiler(isolate_, strict_mode); |
| 516 Handle<Code> code = compiler.CompileStoreCallback(receiver, callback, name); | 534 Handle<Code> code = compiler.CompileStoreCallback(receiver, callback, name); |
| 517 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); | 535 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); |
| 518 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); | 536 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); |
| 537 VTUNEJIT(AddCode(name, code)); |
| 519 JSObject::UpdateMapCodeCache(receiver, name, code); | 538 JSObject::UpdateMapCodeCache(receiver, name, code); |
| 520 return code; | 539 return code; |
| 521 } | 540 } |
| 522 | 541 |
| 523 | 542 |
| 524 Handle<Code> StubCache::ComputeStoreViaSetter(Handle<String> name, | 543 Handle<Code> StubCache::ComputeStoreViaSetter(Handle<String> name, |
| 525 Handle<JSObject> receiver, | 544 Handle<JSObject> receiver, |
| 526 Handle<JSObject> holder, | 545 Handle<JSObject> holder, |
| 527 Handle<JSFunction> setter, | 546 Handle<JSFunction> setter, |
| 528 StrictModeFlag strict_mode) { | 547 StrictModeFlag strict_mode) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 546 StrictModeFlag strict_mode) { | 565 StrictModeFlag strict_mode) { |
| 547 Code::Flags flags = Code::ComputeMonomorphicFlags( | 566 Code::Flags flags = Code::ComputeMonomorphicFlags( |
| 548 Code::STORE_IC, Code::INTERCEPTOR, strict_mode); | 567 Code::STORE_IC, Code::INTERCEPTOR, strict_mode); |
| 549 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 568 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
| 550 if (probe->IsCode()) return Handle<Code>::cast(probe); | 569 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 551 | 570 |
| 552 StoreStubCompiler compiler(isolate_, strict_mode); | 571 StoreStubCompiler compiler(isolate_, strict_mode); |
| 553 Handle<Code> code = compiler.CompileStoreInterceptor(receiver, name); | 572 Handle<Code> code = compiler.CompileStoreInterceptor(receiver, name); |
| 554 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); | 573 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); |
| 555 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); | 574 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); |
| 575 VTUNEJIT(AddCode(name, code)); |
| 556 JSObject::UpdateMapCodeCache(receiver, name, code); | 576 JSObject::UpdateMapCodeCache(receiver, name, code); |
| 557 return code; | 577 return code; |
| 558 } | 578 } |
| 559 | 579 |
| 560 Handle<Code> StubCache::ComputeKeyedStoreField(Handle<String> name, | 580 Handle<Code> StubCache::ComputeKeyedStoreField(Handle<String> name, |
| 561 Handle<JSObject> receiver, | 581 Handle<JSObject> receiver, |
| 562 int field_index, | 582 int field_index, |
| 563 Handle<Map> transition, | 583 Handle<Map> transition, |
| 564 StrictModeFlag strict_mode) { | 584 StrictModeFlag strict_mode) { |
| 565 Code::StubType type = | 585 Code::StubType type = |
| 566 (transition.is_null()) ? Code::FIELD : Code::MAP_TRANSITION; | 586 (transition.is_null()) ? Code::FIELD : Code::MAP_TRANSITION; |
| 567 Code::Flags flags = Code::ComputeMonomorphicFlags( | 587 Code::Flags flags = Code::ComputeMonomorphicFlags( |
| 568 Code::KEYED_STORE_IC, type, strict_mode); | 588 Code::KEYED_STORE_IC, type, strict_mode); |
| 569 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 589 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
| 570 if (probe->IsCode()) return Handle<Code>::cast(probe); | 590 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 571 | 591 |
| 572 KeyedStoreStubCompiler compiler(isolate(), strict_mode, | 592 KeyedStoreStubCompiler compiler(isolate(), strict_mode, |
| 573 DO_NOT_ALLOW_JSARRAY_GROWTH); | 593 DO_NOT_ALLOW_JSARRAY_GROWTH); |
| 574 Handle<Code> code = | 594 Handle<Code> code = |
| 575 compiler.CompileStoreField(receiver, field_index, transition, name); | 595 compiler.CompileStoreField(receiver, field_index, transition, name); |
| 576 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, *code, *name)); | 596 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, *code, *name)); |
| 577 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, *name, *code)); | 597 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, *name, *code)); |
| 598 VTUNEJIT(AddCode(name, code)); |
| 578 JSObject::UpdateMapCodeCache(receiver, name, code); | 599 JSObject::UpdateMapCodeCache(receiver, name, code); |
| 579 return code; | 600 return code; |
| 580 } | 601 } |
| 581 | 602 |
| 582 | 603 |
| 583 #define CALL_LOGGER_TAG(kind, type) \ | 604 #define CALL_LOGGER_TAG(kind, type) \ |
| 584 (kind == Code::CALL_IC ? Logger::type : Logger::KEYED_##type) | 605 (kind == Code::CALL_IC ? Logger::type : Logger::KEYED_##type) |
| 585 | 606 |
| 586 Handle<Code> StubCache::ComputeCallConstant(int argc, | 607 Handle<Code> StubCache::ComputeCallConstant(int argc, |
| 587 Code::Kind kind, | 608 Code::Kind kind, |
| (...skipping 24 matching lines...) Expand all Loading... |
| 612 if (probe->IsCode()) return Handle<Code>::cast(probe); | 633 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 613 | 634 |
| 614 CallStubCompiler compiler(isolate_, argc, kind, extra_state, cache_holder); | 635 CallStubCompiler compiler(isolate_, argc, kind, extra_state, cache_holder); |
| 615 Handle<Code> code = | 636 Handle<Code> code = |
| 616 compiler.CompileCallConstant(object, holder, function, name, check); | 637 compiler.CompileCallConstant(object, holder, function, name, check); |
| 617 code->set_check_type(check); | 638 code->set_check_type(check); |
| 618 ASSERT_EQ(flags, code->flags()); | 639 ASSERT_EQ(flags, code->flags()); |
| 619 PROFILE(isolate_, | 640 PROFILE(isolate_, |
| 620 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name)); | 641 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name)); |
| 621 GDBJIT(AddCode(GDBJITInterface::CALL_IC, *name, *code)); | 642 GDBJIT(AddCode(GDBJITInterface::CALL_IC, *name, *code)); |
| 643 VTUNEJIT(AddCode(name, code)); |
| 622 JSObject::UpdateMapCodeCache(map_holder, name, code); | 644 JSObject::UpdateMapCodeCache(map_holder, name, code); |
| 623 return code; | 645 return code; |
| 624 } | 646 } |
| 625 | 647 |
| 626 | 648 |
| 627 Handle<Code> StubCache::ComputeCallField(int argc, | 649 Handle<Code> StubCache::ComputeCallField(int argc, |
| 628 Code::Kind kind, | 650 Code::Kind kind, |
| 629 Code::ExtraICState extra_state, | 651 Code::ExtraICState extra_state, |
| 630 Handle<String> name, | 652 Handle<String> name, |
| 631 Handle<Object> object, | 653 Handle<Object> object, |
| (...skipping 18 matching lines...) Expand all Loading... |
| 650 if (probe->IsCode()) return Handle<Code>::cast(probe); | 672 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 651 | 673 |
| 652 CallStubCompiler compiler(isolate_, argc, kind, extra_state, cache_holder); | 674 CallStubCompiler compiler(isolate_, argc, kind, extra_state, cache_holder); |
| 653 Handle<Code> code = | 675 Handle<Code> code = |
| 654 compiler.CompileCallField(Handle<JSObject>::cast(object), | 676 compiler.CompileCallField(Handle<JSObject>::cast(object), |
| 655 holder, index, name); | 677 holder, index, name); |
| 656 ASSERT_EQ(flags, code->flags()); | 678 ASSERT_EQ(flags, code->flags()); |
| 657 PROFILE(isolate_, | 679 PROFILE(isolate_, |
| 658 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name)); | 680 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name)); |
| 659 GDBJIT(AddCode(GDBJITInterface::CALL_IC, *name, *code)); | 681 GDBJIT(AddCode(GDBJITInterface::CALL_IC, *name, *code)); |
| 682 VTUNEJIT(AddCode(name, code)); |
| 660 JSObject::UpdateMapCodeCache(map_holder, name, code); | 683 JSObject::UpdateMapCodeCache(map_holder, name, code); |
| 661 return code; | 684 return code; |
| 662 } | 685 } |
| 663 | 686 |
| 664 | 687 |
| 665 Handle<Code> StubCache::ComputeCallInterceptor(int argc, | 688 Handle<Code> StubCache::ComputeCallInterceptor(int argc, |
| 666 Code::Kind kind, | 689 Code::Kind kind, |
| 667 Code::ExtraICState extra_state, | 690 Code::ExtraICState extra_state, |
| 668 Handle<String> name, | 691 Handle<String> name, |
| 669 Handle<Object> object, | 692 Handle<Object> object, |
| (...skipping 17 matching lines...) Expand all Loading... |
| 687 if (probe->IsCode()) return Handle<Code>::cast(probe); | 710 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 688 | 711 |
| 689 CallStubCompiler compiler(isolate(), argc, kind, extra_state, cache_holder); | 712 CallStubCompiler compiler(isolate(), argc, kind, extra_state, cache_holder); |
| 690 Handle<Code> code = | 713 Handle<Code> code = |
| 691 compiler.CompileCallInterceptor(Handle<JSObject>::cast(object), | 714 compiler.CompileCallInterceptor(Handle<JSObject>::cast(object), |
| 692 holder, name); | 715 holder, name); |
| 693 ASSERT_EQ(flags, code->flags()); | 716 ASSERT_EQ(flags, code->flags()); |
| 694 PROFILE(isolate(), | 717 PROFILE(isolate(), |
| 695 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name)); | 718 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name)); |
| 696 GDBJIT(AddCode(GDBJITInterface::CALL_IC, *name, *code)); | 719 GDBJIT(AddCode(GDBJITInterface::CALL_IC, *name, *code)); |
| 720 VTUNEJIT(AddCode(name, code)); |
| 697 JSObject::UpdateMapCodeCache(map_holder, name, code); | 721 JSObject::UpdateMapCodeCache(map_holder, name, code); |
| 698 return code; | 722 return code; |
| 699 } | 723 } |
| 700 | 724 |
| 701 | 725 |
| 702 Handle<Code> StubCache::ComputeCallGlobal(int argc, | 726 Handle<Code> StubCache::ComputeCallGlobal(int argc, |
| 703 Code::Kind kind, | 727 Code::Kind kind, |
| 704 Code::ExtraICState extra_state, | 728 Code::ExtraICState extra_state, |
| 705 Handle<String> name, | 729 Handle<String> name, |
| 706 Handle<JSObject> receiver, | 730 Handle<JSObject> receiver, |
| 707 Handle<GlobalObject> holder, | 731 Handle<GlobalObject> holder, |
| 708 Handle<JSGlobalPropertyCell> cell, | 732 Handle<JSGlobalPropertyCell> cell, |
| 709 Handle<JSFunction> function) { | 733 Handle<JSFunction> function) { |
| 710 InlineCacheHolderFlag cache_holder = | 734 InlineCacheHolderFlag cache_holder = |
| 711 IC::GetCodeCacheForObject(*receiver, *holder); | 735 IC::GetCodeCacheForObject(*receiver, *holder); |
| 712 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); | 736 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); |
| 713 Code::Flags flags = | 737 Code::Flags flags = |
| 714 Code::ComputeMonomorphicFlags(kind, Code::NORMAL, extra_state, | 738 Code::ComputeMonomorphicFlags(kind, Code::NORMAL, extra_state, |
| 715 cache_holder, argc); | 739 cache_holder, argc); |
| 716 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags)); | 740 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags)); |
| 717 if (probe->IsCode()) return Handle<Code>::cast(probe); | 741 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 718 | 742 |
| 719 CallStubCompiler compiler(isolate(), argc, kind, extra_state, cache_holder); | 743 CallStubCompiler compiler(isolate(), argc, kind, extra_state, cache_holder); |
| 720 Handle<Code> code = | 744 Handle<Code> code = |
| 721 compiler.CompileCallGlobal(receiver, holder, cell, function, name); | 745 compiler.CompileCallGlobal(receiver, holder, cell, function, name); |
| 722 ASSERT_EQ(flags, code->flags()); | 746 ASSERT_EQ(flags, code->flags()); |
| 723 PROFILE(isolate(), | 747 PROFILE(isolate(), |
| 724 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name)); | 748 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name)); |
| 725 GDBJIT(AddCode(GDBJITInterface::CALL_IC, *name, *code)); | 749 GDBJIT(AddCode(GDBJITInterface::CALL_IC, *name, *code)); |
| 750 VTUNEJIT(AddCode(name, code)); |
| 726 JSObject::UpdateMapCodeCache(map_holder, name, code); | 751 JSObject::UpdateMapCodeCache(map_holder, name, code); |
| 727 return code; | 752 return code; |
| 728 } | 753 } |
| 729 | 754 |
| 730 | 755 |
| 731 static void FillCache(Isolate* isolate, Handle<Code> code) { | 756 static void FillCache(Isolate* isolate, Handle<Code> code) { |
| 732 Handle<UnseededNumberDictionary> dictionary = | 757 Handle<UnseededNumberDictionary> dictionary = |
| 733 UnseededNumberDictionary::Set(isolate->factory()->non_monomorphic_cache(), | 758 UnseededNumberDictionary::Set(isolate->factory()->non_monomorphic_cache(), |
| 734 code->flags(), | 759 code->flags(), |
| 735 code); | 760 code); |
| (...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1196 CallIC::GenerateInitialize(masm(), argc, extra_state); | 1221 CallIC::GenerateInitialize(masm(), argc, extra_state); |
| 1197 } else { | 1222 } else { |
| 1198 KeyedCallIC::GenerateInitialize(masm(), argc); | 1223 KeyedCallIC::GenerateInitialize(masm(), argc); |
| 1199 } | 1224 } |
| 1200 Handle<Code> code = GetCodeWithFlags(flags, "CompileCallInitialize"); | 1225 Handle<Code> code = GetCodeWithFlags(flags, "CompileCallInitialize"); |
| 1201 isolate()->counters()->call_initialize_stubs()->Increment(); | 1226 isolate()->counters()->call_initialize_stubs()->Increment(); |
| 1202 PROFILE(isolate(), | 1227 PROFILE(isolate(), |
| 1203 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_INITIALIZE_TAG), | 1228 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_INITIALIZE_TAG), |
| 1204 *code, code->arguments_count())); | 1229 *code, code->arguments_count())); |
| 1205 GDBJIT(AddCode(GDBJITInterface::CALL_INITIALIZE, *code)); | 1230 GDBJIT(AddCode(GDBJITInterface::CALL_INITIALIZE, *code)); |
| 1231 VTUNEJIT(AddCode("CALL_INITIALIZE", code)); |
| 1206 return code; | 1232 return code; |
| 1207 } | 1233 } |
| 1208 | 1234 |
| 1209 | 1235 |
| 1210 Handle<Code> StubCompiler::CompileCallPreMonomorphic(Code::Flags flags) { | 1236 Handle<Code> StubCompiler::CompileCallPreMonomorphic(Code::Flags flags) { |
| 1211 int argc = Code::ExtractArgumentsCountFromFlags(flags); | 1237 int argc = Code::ExtractArgumentsCountFromFlags(flags); |
| 1212 // The code of the PreMonomorphic stub is the same as the code | 1238 // The code of the PreMonomorphic stub is the same as the code |
| 1213 // of the Initialized stub. They just differ on the code object flags. | 1239 // of the Initialized stub. They just differ on the code object flags. |
| 1214 Code::Kind kind = Code::ExtractKindFromFlags(flags); | 1240 Code::Kind kind = Code::ExtractKindFromFlags(flags); |
| 1215 Code::ExtraICState extra_state = Code::ExtractExtraICStateFromFlags(flags); | 1241 Code::ExtraICState extra_state = Code::ExtractExtraICStateFromFlags(flags); |
| 1216 if (kind == Code::CALL_IC) { | 1242 if (kind == Code::CALL_IC) { |
| 1217 CallIC::GenerateInitialize(masm(), argc, extra_state); | 1243 CallIC::GenerateInitialize(masm(), argc, extra_state); |
| 1218 } else { | 1244 } else { |
| 1219 KeyedCallIC::GenerateInitialize(masm(), argc); | 1245 KeyedCallIC::GenerateInitialize(masm(), argc); |
| 1220 } | 1246 } |
| 1221 Handle<Code> code = GetCodeWithFlags(flags, "CompileCallPreMonomorphic"); | 1247 Handle<Code> code = GetCodeWithFlags(flags, "CompileCallPreMonomorphic"); |
| 1222 isolate()->counters()->call_premonomorphic_stubs()->Increment(); | 1248 isolate()->counters()->call_premonomorphic_stubs()->Increment(); |
| 1223 PROFILE(isolate(), | 1249 PROFILE(isolate(), |
| 1224 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_PRE_MONOMORPHIC_TAG), | 1250 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_PRE_MONOMORPHIC_TAG), |
| 1225 *code, code->arguments_count())); | 1251 *code, code->arguments_count())); |
| 1226 GDBJIT(AddCode(GDBJITInterface::CALL_PRE_MONOMORPHIC, *code)); | 1252 GDBJIT(AddCode(GDBJITInterface::CALL_PRE_MONOMORPHIC, *code)); |
| 1253 VTUNEJIT(AddCode("CALL_PRE_MONOMORPHIC", code)); |
| 1227 return code; | 1254 return code; |
| 1228 } | 1255 } |
| 1229 | 1256 |
| 1230 | 1257 |
| 1231 Handle<Code> StubCompiler::CompileCallNormal(Code::Flags flags) { | 1258 Handle<Code> StubCompiler::CompileCallNormal(Code::Flags flags) { |
| 1232 int argc = Code::ExtractArgumentsCountFromFlags(flags); | 1259 int argc = Code::ExtractArgumentsCountFromFlags(flags); |
| 1233 Code::Kind kind = Code::ExtractKindFromFlags(flags); | 1260 Code::Kind kind = Code::ExtractKindFromFlags(flags); |
| 1234 if (kind == Code::CALL_IC) { | 1261 if (kind == Code::CALL_IC) { |
| 1235 // Call normal is always with a explict receiver. | 1262 // Call normal is always with a explict receiver. |
| 1236 ASSERT(!CallIC::Contextual::decode( | 1263 ASSERT(!CallIC::Contextual::decode( |
| 1237 Code::ExtractExtraICStateFromFlags(flags))); | 1264 Code::ExtractExtraICStateFromFlags(flags))); |
| 1238 CallIC::GenerateNormal(masm(), argc); | 1265 CallIC::GenerateNormal(masm(), argc); |
| 1239 } else { | 1266 } else { |
| 1240 KeyedCallIC::GenerateNormal(masm(), argc); | 1267 KeyedCallIC::GenerateNormal(masm(), argc); |
| 1241 } | 1268 } |
| 1242 Handle<Code> code = GetCodeWithFlags(flags, "CompileCallNormal"); | 1269 Handle<Code> code = GetCodeWithFlags(flags, "CompileCallNormal"); |
| 1243 isolate()->counters()->call_normal_stubs()->Increment(); | 1270 isolate()->counters()->call_normal_stubs()->Increment(); |
| 1244 PROFILE(isolate(), | 1271 PROFILE(isolate(), |
| 1245 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_NORMAL_TAG), | 1272 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_NORMAL_TAG), |
| 1246 *code, code->arguments_count())); | 1273 *code, code->arguments_count())); |
| 1247 GDBJIT(AddCode(GDBJITInterface::CALL_NORMAL, *code)); | 1274 GDBJIT(AddCode(GDBJITInterface::CALL_NORMAL, *code)); |
| 1275 VTUNEJIT(AddCode("CALL_NORMAL", code)); |
| 1248 return code; | 1276 return code; |
| 1249 } | 1277 } |
| 1250 | 1278 |
| 1251 | 1279 |
| 1252 Handle<Code> StubCompiler::CompileCallMegamorphic(Code::Flags flags) { | 1280 Handle<Code> StubCompiler::CompileCallMegamorphic(Code::Flags flags) { |
| 1253 int argc = Code::ExtractArgumentsCountFromFlags(flags); | 1281 int argc = Code::ExtractArgumentsCountFromFlags(flags); |
| 1254 Code::Kind kind = Code::ExtractKindFromFlags(flags); | 1282 Code::Kind kind = Code::ExtractKindFromFlags(flags); |
| 1255 Code::ExtraICState extra_state = Code::ExtractExtraICStateFromFlags(flags); | 1283 Code::ExtraICState extra_state = Code::ExtractExtraICStateFromFlags(flags); |
| 1256 if (kind == Code::CALL_IC) { | 1284 if (kind == Code::CALL_IC) { |
| 1257 CallIC::GenerateMegamorphic(masm(), argc, extra_state); | 1285 CallIC::GenerateMegamorphic(masm(), argc, extra_state); |
| 1258 } else { | 1286 } else { |
| 1259 KeyedCallIC::GenerateMegamorphic(masm(), argc); | 1287 KeyedCallIC::GenerateMegamorphic(masm(), argc); |
| 1260 } | 1288 } |
| 1261 Handle<Code> code = GetCodeWithFlags(flags, "CompileCallMegamorphic"); | 1289 Handle<Code> code = GetCodeWithFlags(flags, "CompileCallMegamorphic"); |
| 1262 isolate()->counters()->call_megamorphic_stubs()->Increment(); | 1290 isolate()->counters()->call_megamorphic_stubs()->Increment(); |
| 1263 PROFILE(isolate(), | 1291 PROFILE(isolate(), |
| 1264 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_MEGAMORPHIC_TAG), | 1292 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_MEGAMORPHIC_TAG), |
| 1265 *code, code->arguments_count())); | 1293 *code, code->arguments_count())); |
| 1266 GDBJIT(AddCode(GDBJITInterface::CALL_MEGAMORPHIC, *code)); | 1294 GDBJIT(AddCode(GDBJITInterface::CALL_MEGAMORPHIC, *code)); |
| 1295 VTUNEJIT(AddCode("CALL_MEGAMORPHIC", code)); |
| 1267 return code; | 1296 return code; |
| 1268 } | 1297 } |
| 1269 | 1298 |
| 1270 | 1299 |
| 1271 Handle<Code> StubCompiler::CompileCallArguments(Code::Flags flags) { | 1300 Handle<Code> StubCompiler::CompileCallArguments(Code::Flags flags) { |
| 1272 int argc = Code::ExtractArgumentsCountFromFlags(flags); | 1301 int argc = Code::ExtractArgumentsCountFromFlags(flags); |
| 1273 KeyedCallIC::GenerateNonStrictArguments(masm(), argc); | 1302 KeyedCallIC::GenerateNonStrictArguments(masm(), argc); |
| 1274 Handle<Code> code = GetCodeWithFlags(flags, "CompileCallArguments"); | 1303 Handle<Code> code = GetCodeWithFlags(flags, "CompileCallArguments"); |
| 1275 PROFILE(isolate(), | 1304 PROFILE(isolate(), |
| 1276 CodeCreateEvent(CALL_LOGGER_TAG(Code::ExtractKindFromFlags(flags), | 1305 CodeCreateEvent(CALL_LOGGER_TAG(Code::ExtractKindFromFlags(flags), |
| 1277 CALL_MEGAMORPHIC_TAG), | 1306 CALL_MEGAMORPHIC_TAG), |
| 1278 *code, code->arguments_count())); | 1307 *code, code->arguments_count())); |
| 1279 GDBJIT(AddCode(GDBJITInterface::CALL_MEGAMORPHIC, *code)); | 1308 GDBJIT(AddCode(GDBJITInterface::CALL_MEGAMORPHIC, *code)); |
| 1309 VTUNEJIT(AddCode("CALL_MEGAMORPHIC", code)); |
| 1280 return code; | 1310 return code; |
| 1281 } | 1311 } |
| 1282 | 1312 |
| 1283 | 1313 |
| 1284 Handle<Code> StubCompiler::CompileCallMiss(Code::Flags flags) { | 1314 Handle<Code> StubCompiler::CompileCallMiss(Code::Flags flags) { |
| 1285 int argc = Code::ExtractArgumentsCountFromFlags(flags); | 1315 int argc = Code::ExtractArgumentsCountFromFlags(flags); |
| 1286 Code::Kind kind = Code::ExtractKindFromFlags(flags); | 1316 Code::Kind kind = Code::ExtractKindFromFlags(flags); |
| 1287 Code::ExtraICState extra_state = Code::ExtractExtraICStateFromFlags(flags); | 1317 Code::ExtraICState extra_state = Code::ExtractExtraICStateFromFlags(flags); |
| 1288 if (kind == Code::CALL_IC) { | 1318 if (kind == Code::CALL_IC) { |
| 1289 CallIC::GenerateMiss(masm(), argc, extra_state); | 1319 CallIC::GenerateMiss(masm(), argc, extra_state); |
| 1290 } else { | 1320 } else { |
| 1291 KeyedCallIC::GenerateMiss(masm(), argc); | 1321 KeyedCallIC::GenerateMiss(masm(), argc); |
| 1292 } | 1322 } |
| 1293 Handle<Code> code = GetCodeWithFlags(flags, "CompileCallMiss"); | 1323 Handle<Code> code = GetCodeWithFlags(flags, "CompileCallMiss"); |
| 1294 isolate()->counters()->call_megamorphic_stubs()->Increment(); | 1324 isolate()->counters()->call_megamorphic_stubs()->Increment(); |
| 1295 PROFILE(isolate(), | 1325 PROFILE(isolate(), |
| 1296 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_MISS_TAG), | 1326 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_MISS_TAG), |
| 1297 *code, code->arguments_count())); | 1327 *code, code->arguments_count())); |
| 1298 GDBJIT(AddCode(GDBJITInterface::CALL_MISS, *code)); | 1328 GDBJIT(AddCode(GDBJITInterface::CALL_MISS, *code)); |
| 1329 VTUNEJIT(AddCode("CALL_MISS", code)); |
| 1299 return code; | 1330 return code; |
| 1300 } | 1331 } |
| 1301 | 1332 |
| 1302 | 1333 |
| 1303 #ifdef ENABLE_DEBUGGER_SUPPORT | 1334 #ifdef ENABLE_DEBUGGER_SUPPORT |
| 1304 Handle<Code> StubCompiler::CompileCallDebugBreak(Code::Flags flags) { | 1335 Handle<Code> StubCompiler::CompileCallDebugBreak(Code::Flags flags) { |
| 1305 Debug::GenerateCallICDebugBreak(masm()); | 1336 Debug::GenerateCallICDebugBreak(masm()); |
| 1306 Handle<Code> code = GetCodeWithFlags(flags, "CompileCallDebugBreak"); | 1337 Handle<Code> code = GetCodeWithFlags(flags, "CompileCallDebugBreak"); |
| 1307 PROFILE(isolate(), | 1338 PROFILE(isolate(), |
| 1308 CodeCreateEvent(CALL_LOGGER_TAG(Code::ExtractKindFromFlags(flags), | 1339 CodeCreateEvent(CALL_LOGGER_TAG(Code::ExtractKindFromFlags(flags), |
| 1309 CALL_DEBUG_BREAK_TAG), | 1340 CALL_DEBUG_BREAK_TAG), |
| 1310 *code, code->arguments_count())); | 1341 *code, code->arguments_count())); |
| 1342 VTUNEJIT(AddCode("call_debug_prepare", code)); |
| 1311 return code; | 1343 return code; |
| 1312 } | 1344 } |
| 1313 | 1345 |
| 1314 | 1346 |
| 1315 Handle<Code> StubCompiler::CompileCallDebugPrepareStepIn(Code::Flags flags) { | 1347 Handle<Code> StubCompiler::CompileCallDebugPrepareStepIn(Code::Flags flags) { |
| 1316 // Use the same code for the the step in preparations as we do for the | 1348 // Use the same code for the the step in preparations as we do for the |
| 1317 // miss case. | 1349 // miss case. |
| 1318 int argc = Code::ExtractArgumentsCountFromFlags(flags); | 1350 int argc = Code::ExtractArgumentsCountFromFlags(flags); |
| 1319 Code::Kind kind = Code::ExtractKindFromFlags(flags); | 1351 Code::Kind kind = Code::ExtractKindFromFlags(flags); |
| 1320 if (kind == Code::CALL_IC) { | 1352 if (kind == Code::CALL_IC) { |
| 1321 // For the debugger extra ic state is irrelevant. | 1353 // For the debugger extra ic state is irrelevant. |
| 1322 CallIC::GenerateMiss(masm(), argc, Code::kNoExtraICState); | 1354 CallIC::GenerateMiss(masm(), argc, Code::kNoExtraICState); |
| 1323 } else { | 1355 } else { |
| 1324 KeyedCallIC::GenerateMiss(masm(), argc); | 1356 KeyedCallIC::GenerateMiss(masm(), argc); |
| 1325 } | 1357 } |
| 1326 Handle<Code> code = GetCodeWithFlags(flags, "CompileCallDebugPrepareStepIn"); | 1358 Handle<Code> code = GetCodeWithFlags(flags, "CompileCallDebugPrepareStepIn"); |
| 1327 PROFILE(isolate(), | 1359 PROFILE(isolate(), |
| 1328 CodeCreateEvent( | 1360 CodeCreateEvent( |
| 1329 CALL_LOGGER_TAG(kind, CALL_DEBUG_PREPARE_STEP_IN_TAG), | 1361 CALL_LOGGER_TAG(kind, CALL_DEBUG_PREPARE_STEP_IN_TAG), |
| 1330 *code, | 1362 *code, |
| 1331 code->arguments_count())); | 1363 code->arguments_count())); |
| 1364 VTUNEJIT(AddCode("call_debug_prepare", code)); |
| 1332 return code; | 1365 return code; |
| 1333 } | 1366 } |
| 1334 #endif // ENABLE_DEBUGGER_SUPPORT | 1367 #endif // ENABLE_DEBUGGER_SUPPORT |
| 1335 | 1368 |
| 1336 #undef CALL_LOGGER_TAG | 1369 #undef CALL_LOGGER_TAG |
| 1337 | 1370 |
| 1338 | 1371 |
| 1339 Handle<Code> StubCompiler::GetCodeWithFlags(Code::Flags flags, | 1372 Handle<Code> StubCompiler::GetCodeWithFlags(Code::Flags flags, |
| 1340 const char* name) { | 1373 const char* name) { |
| 1341 // Create code object in the heap. | 1374 // Create code object in the heap. |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1366 holder->GetPrototype()->Lookup(*name, lookup); | 1399 holder->GetPrototype()->Lookup(*name, lookup); |
| 1367 } | 1400 } |
| 1368 | 1401 |
| 1369 | 1402 |
| 1370 Handle<Code> LoadStubCompiler::GetCode(Code::StubType type, | 1403 Handle<Code> LoadStubCompiler::GetCode(Code::StubType type, |
| 1371 Handle<String> name) { | 1404 Handle<String> name) { |
| 1372 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, type); | 1405 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, type); |
| 1373 Handle<Code> code = GetCodeWithFlags(flags, name); | 1406 Handle<Code> code = GetCodeWithFlags(flags, name); |
| 1374 PROFILE(isolate(), CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); | 1407 PROFILE(isolate(), CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
| 1375 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); | 1408 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
| 1409 VTUNEJIT(AddCode(name, code)); |
| 1376 return code; | 1410 return code; |
| 1377 } | 1411 } |
| 1378 | 1412 |
| 1379 | 1413 |
| 1380 Handle<Code> KeyedLoadStubCompiler::GetCode(Code::StubType type, | 1414 Handle<Code> KeyedLoadStubCompiler::GetCode(Code::StubType type, |
| 1381 Handle<String> name, | 1415 Handle<String> name, |
| 1382 InlineCacheState state) { | 1416 InlineCacheState state) { |
| 1383 Code::Flags flags = Code::ComputeFlags( | 1417 Code::Flags flags = Code::ComputeFlags( |
| 1384 Code::KEYED_LOAD_IC, state, Code::kNoExtraICState, type); | 1418 Code::KEYED_LOAD_IC, state, Code::kNoExtraICState, type); |
| 1385 Handle<Code> code = GetCodeWithFlags(flags, name); | 1419 Handle<Code> code = GetCodeWithFlags(flags, name); |
| 1386 PROFILE(isolate(), CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); | 1420 PROFILE(isolate(), CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
| 1387 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); | 1421 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
| 1422 VTUNEJIT(AddCode(name, code)); |
| 1388 return code; | 1423 return code; |
| 1389 } | 1424 } |
| 1390 | 1425 |
| 1391 | 1426 |
| 1392 Handle<Code> StoreStubCompiler::GetCode(Code::StubType type, | 1427 Handle<Code> StoreStubCompiler::GetCode(Code::StubType type, |
| 1393 Handle<String> name) { | 1428 Handle<String> name) { |
| 1394 Code::Flags flags = | 1429 Code::Flags flags = |
| 1395 Code::ComputeMonomorphicFlags(Code::STORE_IC, type, strict_mode_); | 1430 Code::ComputeMonomorphicFlags(Code::STORE_IC, type, strict_mode_); |
| 1396 Handle<Code> code = GetCodeWithFlags(flags, name); | 1431 Handle<Code> code = GetCodeWithFlags(flags, name); |
| 1397 PROFILE(isolate(), CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); | 1432 PROFILE(isolate(), CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); |
| 1398 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); | 1433 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); |
| 1434 VTUNEJIT(AddCode(name, code)); |
| 1399 return code; | 1435 return code; |
| 1400 } | 1436 } |
| 1401 | 1437 |
| 1402 | 1438 |
| 1403 Handle<Code> KeyedStoreStubCompiler::GetCode(Code::StubType type, | 1439 Handle<Code> KeyedStoreStubCompiler::GetCode(Code::StubType type, |
| 1404 Handle<String> name, | 1440 Handle<String> name, |
| 1405 InlineCacheState state) { | 1441 InlineCacheState state) { |
| 1406 Code::ExtraICState extra_state = | 1442 Code::ExtraICState extra_state = |
| 1407 Code::ComputeExtraICState(grow_mode_, strict_mode_); | 1443 Code::ComputeExtraICState(grow_mode_, strict_mode_); |
| 1408 Code::Flags flags = | 1444 Code::Flags flags = |
| 1409 Code::ComputeFlags(Code::KEYED_STORE_IC, state, extra_state, type); | 1445 Code::ComputeFlags(Code::KEYED_STORE_IC, state, extra_state, type); |
| 1410 Handle<Code> code = GetCodeWithFlags(flags, name); | 1446 Handle<Code> code = GetCodeWithFlags(flags, name); |
| 1411 PROFILE(isolate(), CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, *code, *name)); | 1447 PROFILE(isolate(), CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, *code, *name)); |
| 1412 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, *name, *code)); | 1448 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, *name, *code)); |
| 1449 VTUNEJIT(AddCode(name, code)); |
| 1413 return code; | 1450 return code; |
| 1414 } | 1451 } |
| 1415 | 1452 |
| 1416 | 1453 |
| 1417 void KeyedStoreStubCompiler::GenerateStoreDictionaryElement( | 1454 void KeyedStoreStubCompiler::GenerateStoreDictionaryElement( |
| 1418 MacroAssembler* masm) { | 1455 MacroAssembler* masm) { |
| 1419 KeyedStoreIC::GenerateSlow(masm); | 1456 KeyedStoreIC::GenerateSlow(masm); |
| 1420 } | 1457 } |
| 1421 | 1458 |
| 1422 | 1459 |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1497 } | 1534 } |
| 1498 return GetCode(Code::CONSTANT_FUNCTION, function_name); | 1535 return GetCode(Code::CONSTANT_FUNCTION, function_name); |
| 1499 } | 1536 } |
| 1500 | 1537 |
| 1501 | 1538 |
| 1502 Handle<Code> ConstructStubCompiler::GetCode() { | 1539 Handle<Code> ConstructStubCompiler::GetCode() { |
| 1503 Code::Flags flags = Code::ComputeFlags(Code::STUB); | 1540 Code::Flags flags = Code::ComputeFlags(Code::STUB); |
| 1504 Handle<Code> code = GetCodeWithFlags(flags, "ConstructStub"); | 1541 Handle<Code> code = GetCodeWithFlags(flags, "ConstructStub"); |
| 1505 PROFILE(isolate(), CodeCreateEvent(Logger::STUB_TAG, *code, "ConstructStub")); | 1542 PROFILE(isolate(), CodeCreateEvent(Logger::STUB_TAG, *code, "ConstructStub")); |
| 1506 GDBJIT(AddCode(GDBJITInterface::STUB, "ConstructStub", *code)); | 1543 GDBJIT(AddCode(GDBJITInterface::STUB, "ConstructStub", *code)); |
| 1544 VTUNEJIT(AddCode("ConstructStub", code)); |
| 1507 return code; | 1545 return code; |
| 1508 } | 1546 } |
| 1509 | 1547 |
| 1510 | 1548 |
| 1511 CallOptimization::CallOptimization(LookupResult* lookup) { | 1549 CallOptimization::CallOptimization(LookupResult* lookup) { |
| 1512 if (lookup->IsFound() && | 1550 if (lookup->IsFound() && |
| 1513 lookup->IsCacheable() && | 1551 lookup->IsCacheable() && |
| 1514 lookup->type() == CONSTANT_FUNCTION) { | 1552 lookup->type() == CONSTANT_FUNCTION) { |
| 1515 // We only optimize constant function calls. | 1553 // We only optimize constant function calls. |
| 1516 Initialize(Handle<JSFunction>(lookup->GetConstantFunction())); | 1554 Initialize(Handle<JSFunction>(lookup->GetConstantFunction())); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1573 Handle<FunctionTemplateInfo>( | 1611 Handle<FunctionTemplateInfo>( |
| 1574 FunctionTemplateInfo::cast(signature->receiver())); | 1612 FunctionTemplateInfo::cast(signature->receiver())); |
| 1575 } | 1613 } |
| 1576 } | 1614 } |
| 1577 | 1615 |
| 1578 is_simple_api_call_ = true; | 1616 is_simple_api_call_ = true; |
| 1579 } | 1617 } |
| 1580 | 1618 |
| 1581 | 1619 |
| 1582 } } // namespace v8::internal | 1620 } } // namespace v8::internal |
| OLD | NEW |