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