Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 102 *secondary = *primary; | 102 *secondary = *primary; |
| 103 } | 103 } |
| 104 | 104 |
| 105 // Update primary cache. | 105 // Update primary cache. |
| 106 primary->key = name; | 106 primary->key = name; |
| 107 primary->value = code; | 107 primary->value = code; |
| 108 return code; | 108 return code; |
| 109 } | 109 } |
| 110 | 110 |
| 111 | 111 |
| 112 MaybeObject* StubCache::ComputeLoadNonexistent(String* name, | 112 Handle<Code> LoadStubCompiler::CompileLoadNonexistent(Handle<String> name, |
| 113 JSObject* receiver) { | 113 Handle<JSObject> object, |
| 114 Handle<JSObject> last) { | |
| 115 CALL_HEAP_FUNCTION(isolate(), | |
| 116 CompileLoadNonexistent(*name, *object, *last), | |
| 117 Code); | |
| 118 } | |
| 119 | |
| 120 | |
| 121 Handle<Code> StubCache::ComputeLoadNonexistent(Handle<String> name, | |
| 122 Handle<JSObject> receiver) { | |
| 114 ASSERT(receiver->IsGlobalObject() || receiver->HasFastProperties()); | 123 ASSERT(receiver->IsGlobalObject() || receiver->HasFastProperties()); |
| 115 // If no global objects are present in the prototype chain, the load | 124 // If no global objects are present in the prototype chain, the load |
| 116 // nonexistent IC stub can be shared for all names for a given map | 125 // nonexistent IC stub can be shared for all names for a given map |
| 117 // and we use the empty string for the map cache in that case. If | 126 // and we use the empty string for the map cache in that case. If |
| 118 // there are global objects involved, we need to check global | 127 // there are global objects involved, we need to check global |
| 119 // property cells in the stub and therefore the stub will be | 128 // property cells in the stub and therefore the stub will be |
| 120 // specific to the name. | 129 // specific to the name. |
| 121 String* cache_name = heap()->empty_string(); | 130 Handle<String> cache_name = factory()->empty_string(); |
| 122 if (receiver->IsGlobalObject()) cache_name = name; | 131 if (receiver->IsGlobalObject()) cache_name = name; |
| 123 JSObject* last = receiver; | 132 Handle<JSObject> last = receiver; |
| 124 while (last->GetPrototype() != heap()->null_value()) { | 133 while (last->GetPrototype() != heap()->null_value()) { |
| 125 last = JSObject::cast(last->GetPrototype()); | 134 last = Handle<JSObject>(JSObject::cast(last->GetPrototype())); |
| 126 if (last->IsGlobalObject()) cache_name = name; | 135 if (last->IsGlobalObject()) cache_name = name; |
| 127 } | 136 } |
| 128 // Compile the stub that is either shared for all names or | 137 // Compile the stub that is either shared for all names or |
| 129 // name specific if there are global objects involved. | 138 // name specific if there are global objects involved. |
| 130 Code::Flags flags = | 139 Code::Flags flags = |
| 131 Code::ComputeMonomorphicFlags(Code::LOAD_IC, NONEXISTENT); | 140 Code::ComputeMonomorphicFlags(Code::LOAD_IC, NONEXISTENT); |
| 132 Object* code = receiver->map()->FindInCodeCache(cache_name, flags); | 141 Handle<Object> probe(receiver->map()->FindInCodeCache(*cache_name, flags)); |
| 133 if (code->IsUndefined()) { | 142 if (probe->IsCode()) return Handle<Code>::cast(probe); |
|
Kevin Millikin (Chromium)
2011/10/18 08:46:47
I like a blank line right after this one, to highl
ulan
2011/10/18 09:31:00
Done.
| |
| 134 LoadStubCompiler compiler; | 143 LoadStubCompiler compiler(isolate_); |
| 135 { MaybeObject* maybe_code = | 144 Handle<Code> code = |
| 136 compiler.CompileLoadNonexistent(cache_name, receiver, last); | 145 compiler.CompileLoadNonexistent(cache_name, receiver, last); |
| 137 if (!maybe_code->ToObject(&code)) return maybe_code; | 146 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *cache_name)); |
| 138 } | 147 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *cache_name, *code)); |
|
Kevin Millikin (Chromium)
2011/10/18 08:46:47
I think that this code is ignored unless we set up
| |
| 139 PROFILE(isolate_, | 148 JSObject::UpdateMapCodeCache(isolate_, receiver, cache_name, code); |
| 140 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), cache_name)); | |
| 141 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, cache_name, Code::cast(code))); | |
| 142 Object* result; | |
| 143 { MaybeObject* maybe_result = | |
| 144 receiver->UpdateMapCodeCache(cache_name, Code::cast(code)); | |
| 145 if (!maybe_result->ToObject(&result)) return maybe_result; | |
| 146 } | |
| 147 } | |
| 148 return code; | 149 return code; |
| 149 } | 150 } |
| 150 | 151 |
| 151 | 152 |
| 152 MaybeObject* StubCache::ComputeLoadField(String* name, | 153 Handle<Code> LoadStubCompiler::CompileLoadField(Handle<JSObject> object, |
| 153 JSObject* receiver, | 154 Handle<JSObject> holder, |
| 154 JSObject* holder, | 155 int index, |
| 156 Handle<String> name) { | |
| 157 CALL_HEAP_FUNCTION(isolate(), | |
| 158 CompileLoadField(*object, *holder, index, *name), | |
| 159 Code); | |
| 160 } | |
| 161 | |
| 162 | |
| 163 Handle<Code> StubCache::ComputeLoadField(Handle<String> name, | |
| 164 Handle<JSObject> receiver, | |
| 165 Handle<JSObject> holder, | |
| 155 int field_index) { | 166 int field_index) { |
| 156 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 167 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
| 157 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, FIELD); | 168 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, FIELD); |
| 158 Object* code = receiver->map()->FindInCodeCache(name, flags); | 169 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
| 159 if (code->IsUndefined()) { | 170 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 160 LoadStubCompiler compiler; | 171 LoadStubCompiler compiler(isolate_); |
| 161 { MaybeObject* maybe_code = | 172 Handle<Code> code = |
| 162 compiler.CompileLoadField(receiver, holder, field_index, name); | 173 compiler.CompileLoadField(receiver, holder, field_index, name); |
| 163 if (!maybe_code->ToObject(&code)) return maybe_code; | 174 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
| 164 } | 175 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
| 165 PROFILE(isolate_, | 176 JSObject::UpdateMapCodeCache(isolate_, receiver, name, code); |
| 166 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); | |
| 167 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); | |
| 168 Object* result; | |
| 169 { MaybeObject* maybe_result = | |
| 170 receiver->UpdateMapCodeCache(name, Code::cast(code)); | |
| 171 if (!maybe_result->ToObject(&result)) return maybe_result; | |
| 172 } | |
| 173 } | |
| 174 return code; | 177 return code; |
| 175 } | 178 } |
| 176 | 179 |
| 177 | 180 |
| 178 MaybeObject* StubCache::ComputeLoadCallback(String* name, | 181 Handle<Code> LoadStubCompiler::CompileLoadCallback( |
| 179 JSObject* receiver, | 182 Handle<String> name, |
| 180 JSObject* holder, | 183 Handle<JSObject> object, |
| 181 AccessorInfo* callback) { | 184 Handle<JSObject> holder, |
| 185 Handle<AccessorInfo> callback) { | |
| 186 CALL_HEAP_FUNCTION(isolate(), | |
| 187 CompileLoadCallback(*name, *object, *holder, *callback), | |
| 188 Code); | |
| 189 } | |
| 190 | |
| 191 | |
| 192 Handle<Code> StubCache::ComputeLoadCallback(Handle<String> name, | |
| 193 Handle<JSObject> receiver, | |
| 194 Handle<JSObject> holder, | |
| 195 Handle<AccessorInfo> callback) { | |
| 182 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); | 196 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); |
| 183 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 197 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
| 184 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, CALLBACKS); | 198 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, CALLBACKS); |
| 185 Object* code = receiver->map()->FindInCodeCache(name, flags); | 199 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
| 186 if (code->IsUndefined()) { | 200 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 187 LoadStubCompiler compiler; | 201 LoadStubCompiler compiler(isolate_); |
| 188 { MaybeObject* maybe_code = | 202 Handle<Code> code = |
| 189 compiler.CompileLoadCallback(name, receiver, holder, callback); | 203 compiler.CompileLoadCallback(name, receiver, holder, callback); |
| 190 if (!maybe_code->ToObject(&code)) return maybe_code; | 204 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
| 191 } | 205 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
| 192 PROFILE(isolate_, | 206 JSObject::UpdateMapCodeCache(isolate_, receiver, name, code); |
| 193 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); | |
| 194 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); | |
| 195 Object* result; | |
| 196 { MaybeObject* maybe_result = | |
| 197 receiver->UpdateMapCodeCache(name, Code::cast(code)); | |
| 198 if (!maybe_result->ToObject(&result)) return maybe_result; | |
| 199 } | |
| 200 } | |
| 201 return code; | 207 return code; |
| 202 } | 208 } |
| 203 | 209 |
| 204 | 210 |
| 205 MaybeObject* StubCache::ComputeLoadConstant(String* name, | 211 Handle<Code> LoadStubCompiler::CompileLoadConstant(Handle<JSObject> object, |
| 206 JSObject* receiver, | 212 Handle<JSObject> holder, |
| 207 JSObject* holder, | 213 Handle<Object> value, |
| 208 Object* value) { | 214 Handle<String> name) { |
| 209 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 215 CALL_HEAP_FUNCTION(isolate(), |
| 216 CompileLoadConstant(*object, *holder, *value, *name), | |
| 217 Code); | |
| 218 } | |
| 219 | |
| 220 | |
| 221 Handle<Code> StubCache::ComputeLoadConstant(Handle<String> name, | |
| 222 Handle<JSObject> receiver, | |
| 223 Handle<JSObject> holder, | |
| 224 Handle<Object> value) { | |
| 225 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | |
| 210 Code::Flags flags = | 226 Code::Flags flags = |
| 211 Code::ComputeMonomorphicFlags(Code::LOAD_IC, CONSTANT_FUNCTION); | 227 Code::ComputeMonomorphicFlags(Code::LOAD_IC, CONSTANT_FUNCTION); |
| 212 Object* code = receiver->map()->FindInCodeCache(name, flags); | 228 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
| 213 if (code->IsUndefined()) { | 229 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 214 LoadStubCompiler compiler; | 230 LoadStubCompiler compiler(isolate_); |
| 215 { MaybeObject* maybe_code = | 231 Handle<Code> code = |
| 216 compiler.CompileLoadConstant(receiver, holder, value, name); | 232 compiler.CompileLoadConstant(receiver, holder, value, name); |
| 217 if (!maybe_code->ToObject(&code)) return maybe_code; | 233 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
| 218 } | 234 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
| 219 PROFILE(isolate_, | 235 JSObject::UpdateMapCodeCache(isolate_, receiver, name, code); |
| 220 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); | |
| 221 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); | |
| 222 Object* result; | |
| 223 { MaybeObject* maybe_result = | |
| 224 receiver->UpdateMapCodeCache(name, Code::cast(code)); | |
| 225 if (!maybe_result->ToObject(&result)) return maybe_result; | |
| 226 } | |
| 227 } | |
| 228 return code; | 236 return code; |
| 229 } | 237 } |
| 230 | 238 |
| 231 | 239 |
| 232 MaybeObject* StubCache::ComputeLoadInterceptor(String* name, | 240 Handle<Code> LoadStubCompiler::CompileLoadInterceptor(Handle<JSObject> object, |
| 233 JSObject* receiver, | 241 Handle<JSObject> holder, |
| 234 JSObject* holder) { | 242 Handle<String> name) { |
| 235 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 243 CALL_HEAP_FUNCTION(isolate(), |
| 244 CompileLoadInterceptor(*object, *holder, *name), | |
| 245 Code); | |
| 246 } | |
| 247 | |
| 248 | |
| 249 Handle<Code> StubCache::ComputeLoadInterceptor(Handle<String> name, | |
| 250 Handle<JSObject> receiver, | |
| 251 Handle<JSObject> holder) { | |
| 252 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | |
| 236 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, INTERCEPTOR); | 253 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, INTERCEPTOR); |
| 237 Object* code = receiver->map()->FindInCodeCache(name, flags); | 254 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
| 238 if (code->IsUndefined()) { | 255 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 239 LoadStubCompiler compiler; | 256 LoadStubCompiler compiler(isolate_); |
| 240 { MaybeObject* maybe_code = | 257 Handle<Code> code = |
| 241 compiler.CompileLoadInterceptor(receiver, holder, name); | 258 compiler.CompileLoadInterceptor(receiver, holder, name); |
| 242 if (!maybe_code->ToObject(&code)) return maybe_code; | 259 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
| 243 } | 260 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
| 244 PROFILE(isolate_, | 261 JSObject::UpdateMapCodeCache(isolate_, receiver, name, code); |
| 245 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); | |
| 246 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); | |
| 247 Object* result; | |
| 248 { MaybeObject* maybe_result = | |
| 249 receiver->UpdateMapCodeCache(name, Code::cast(code)); | |
| 250 if (!maybe_result->ToObject(&result)) return maybe_result; | |
| 251 } | |
| 252 } | |
| 253 return code; | 262 return code; |
| 254 } | 263 } |
| 255 | 264 |
| 256 | 265 |
| 257 MaybeObject* StubCache::ComputeLoadNormal() { | 266 Handle<Code> StubCache::ComputeLoadNormal() { |
| 258 return isolate_->builtins()->builtin(Builtins::kLoadIC_Normal); | 267 return isolate_->builtins()->LoadIC_Normal(); |
| 259 } | 268 } |
| 260 | 269 |
| 261 | 270 Handle<Code> LoadStubCompiler::CompileLoadGlobal( |
| 262 MaybeObject* StubCache::ComputeLoadGlobal(String* name, | 271 Handle<JSObject> object, |
| 263 JSObject* receiver, | 272 Handle<GlobalObject> holder, |
| 264 GlobalObject* holder, | 273 Handle<JSGlobalPropertyCell> cell, |
| 265 JSGlobalPropertyCell* cell, | 274 Handle<String> name, |
| 275 bool is_dont_delete) { | |
| 276 CALL_HEAP_FUNCTION(isolate(), | |
| 277 CompileLoadGlobal(*object, | |
| 278 *holder, | |
| 279 *cell, | |
| 280 *name, | |
| 281 is_dont_delete), | |
| 282 Code); | |
| 283 } | |
| 284 Handle<Code> StubCache::ComputeLoadGlobal(Handle<String> name, | |
| 285 Handle<JSObject> receiver, | |
| 286 Handle<GlobalObject> holder, | |
| 287 Handle<JSGlobalPropertyCell> cell, | |
| 266 bool is_dont_delete) { | 288 bool is_dont_delete) { |
| 267 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 289 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
| 268 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, NORMAL); | 290 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, NORMAL); |
| 269 Object* code = receiver->map()->FindInCodeCache(name, flags); | 291 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
| 270 if (code->IsUndefined()) { | 292 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 271 LoadStubCompiler compiler; | 293 LoadStubCompiler compiler(isolate_); |
| 272 { MaybeObject* maybe_code = compiler.CompileLoadGlobal(receiver, | 294 Handle<Code> code = |
| 273 holder, | 295 compiler.CompileLoadGlobal(receiver, holder, cell, name, is_dont_delete); |
| 274 cell, | 296 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
| 275 name, | 297 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
| 276 is_dont_delete); | 298 JSObject::UpdateMapCodeCache(isolate_, receiver, name, code); |
| 277 if (!maybe_code->ToObject(&code)) return maybe_code; | |
| 278 } | |
| 279 PROFILE(isolate_, | |
| 280 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); | |
| 281 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); | |
| 282 Object* result; | |
| 283 { MaybeObject* maybe_result = | |
| 284 receiver->UpdateMapCodeCache(name, Code::cast(code)); | |
| 285 if (!maybe_result->ToObject(&result)) return maybe_result; | |
| 286 } | |
| 287 } | |
| 288 return code; | 299 return code; |
| 289 } | 300 } |
| 290 | 301 |
| 291 | 302 |
| 292 MaybeObject* StubCache::ComputeKeyedLoadField(String* name, | 303 MaybeObject* StubCache::ComputeKeyedLoadField(String* name, |
| 293 JSObject* receiver, | 304 JSObject* receiver, |
| 294 JSObject* holder, | 305 JSObject* holder, |
| 295 int field_index) { | 306 int field_index) { |
| 296 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 307 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
| 297 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, FIELD); | 308 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, FIELD); |
| 298 Object* code = receiver->map()->FindInCodeCache(name, flags); | 309 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 299 if (code->IsUndefined()) { | 310 if (code->IsUndefined()) { |
| 300 KeyedLoadStubCompiler compiler; | 311 HandleScope scope(isolate_); |
| 312 KeyedLoadStubCompiler compiler(isolate_); | |
| 301 { MaybeObject* maybe_code = | 313 { MaybeObject* maybe_code = |
| 302 compiler.CompileLoadField(name, receiver, holder, field_index); | 314 compiler.CompileLoadField(name, receiver, holder, field_index); |
| 303 if (!maybe_code->ToObject(&code)) return maybe_code; | 315 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 304 } | 316 } |
| 305 PROFILE(isolate_, | 317 PROFILE(isolate_, |
| 306 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 318 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
| 307 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 319 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
| 308 Object* result; | 320 Object* result; |
| 309 { MaybeObject* maybe_result = | 321 { MaybeObject* maybe_result = |
| 310 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 322 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 311 if (!maybe_result->ToObject(&result)) return maybe_result; | 323 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 312 } | 324 } |
| 313 } | 325 } |
| 314 return code; | 326 return code; |
| 315 } | 327 } |
| 316 | 328 |
| 317 | 329 |
| 318 MaybeObject* StubCache::ComputeKeyedLoadConstant(String* name, | 330 MaybeObject* StubCache::ComputeKeyedLoadConstant(String* name, |
| 319 JSObject* receiver, | 331 JSObject* receiver, |
| 320 JSObject* holder, | 332 JSObject* holder, |
| 321 Object* value) { | 333 Object* value) { |
| 322 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 334 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
| 323 Code::Flags flags = | 335 Code::Flags flags = |
| 324 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CONSTANT_FUNCTION); | 336 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CONSTANT_FUNCTION); |
| 325 Object* code = receiver->map()->FindInCodeCache(name, flags); | 337 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 326 if (code->IsUndefined()) { | 338 if (code->IsUndefined()) { |
| 327 KeyedLoadStubCompiler compiler; | 339 HandleScope scope(isolate_); |
| 340 KeyedLoadStubCompiler compiler(isolate_); | |
| 328 { MaybeObject* maybe_code = | 341 { MaybeObject* maybe_code = |
| 329 compiler.CompileLoadConstant(name, receiver, holder, value); | 342 compiler.CompileLoadConstant(name, receiver, holder, value); |
| 330 if (!maybe_code->ToObject(&code)) return maybe_code; | 343 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 331 } | 344 } |
| 332 PROFILE(isolate_, | 345 PROFILE(isolate_, |
| 333 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 346 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
| 334 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 347 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
| 335 Object* result; | 348 Object* result; |
| 336 { MaybeObject* maybe_result = | 349 { MaybeObject* maybe_result = |
| 337 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 350 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 338 if (!maybe_result->ToObject(&result)) return maybe_result; | 351 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 339 } | 352 } |
| 340 } | 353 } |
| 341 return code; | 354 return code; |
| 342 } | 355 } |
| 343 | 356 |
| 344 | 357 |
| 345 MaybeObject* StubCache::ComputeKeyedLoadInterceptor(String* name, | 358 MaybeObject* StubCache::ComputeKeyedLoadInterceptor(String* name, |
| 346 JSObject* receiver, | 359 JSObject* receiver, |
| 347 JSObject* holder) { | 360 JSObject* holder) { |
| 348 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 361 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
| 349 Code::Flags flags = | 362 Code::Flags flags = |
| 350 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, INTERCEPTOR); | 363 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, INTERCEPTOR); |
| 351 Object* code = receiver->map()->FindInCodeCache(name, flags); | 364 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 352 if (code->IsUndefined()) { | 365 if (code->IsUndefined()) { |
| 353 KeyedLoadStubCompiler compiler; | 366 HandleScope scope(isolate_); |
| 367 KeyedLoadStubCompiler compiler(isolate_); | |
| 354 { MaybeObject* maybe_code = | 368 { MaybeObject* maybe_code = |
| 355 compiler.CompileLoadInterceptor(receiver, holder, name); | 369 compiler.CompileLoadInterceptor(receiver, holder, name); |
| 356 if (!maybe_code->ToObject(&code)) return maybe_code; | 370 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 357 } | 371 } |
| 358 PROFILE(isolate_, | 372 PROFILE(isolate_, |
| 359 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 373 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
| 360 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 374 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
| 361 Object* result; | 375 Object* result; |
| 362 { MaybeObject* maybe_result = | 376 { MaybeObject* maybe_result = |
| 363 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 377 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 364 if (!maybe_result->ToObject(&result)) return maybe_result; | 378 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 365 } | 379 } |
| 366 } | 380 } |
| 367 return code; | 381 return code; |
| 368 } | 382 } |
| 369 | 383 |
| 370 | 384 |
| 371 MaybeObject* StubCache::ComputeKeyedLoadCallback(String* name, | 385 MaybeObject* StubCache::ComputeKeyedLoadCallback(String* name, |
| 372 JSObject* receiver, | 386 JSObject* receiver, |
| 373 JSObject* holder, | 387 JSObject* holder, |
| 374 AccessorInfo* callback) { | 388 AccessorInfo* callback) { |
| 375 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 389 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
| 376 Code::Flags flags = | 390 Code::Flags flags = |
| 377 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); | 391 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); |
| 378 Object* code = receiver->map()->FindInCodeCache(name, flags); | 392 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 379 if (code->IsUndefined()) { | 393 if (code->IsUndefined()) { |
| 380 KeyedLoadStubCompiler compiler; | 394 HandleScope scope(isolate_); |
| 395 KeyedLoadStubCompiler compiler(isolate_); | |
| 381 { MaybeObject* maybe_code = | 396 { MaybeObject* maybe_code = |
| 382 compiler.CompileLoadCallback(name, receiver, holder, callback); | 397 compiler.CompileLoadCallback(name, receiver, holder, callback); |
| 383 if (!maybe_code->ToObject(&code)) return maybe_code; | 398 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 384 } | 399 } |
| 385 PROFILE(isolate_, | 400 PROFILE(isolate_, |
| 386 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 401 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
| 387 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 402 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
| 388 Object* result; | 403 Object* result; |
| 389 { MaybeObject* maybe_result = | 404 { MaybeObject* maybe_result = |
| 390 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 405 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 391 if (!maybe_result->ToObject(&result)) return maybe_result; | 406 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 392 } | 407 } |
| 393 } | 408 } |
| 394 return code; | 409 return code; |
| 395 } | 410 } |
| 396 | 411 |
| 397 | 412 |
| 398 | 413 |
| 399 MaybeObject* StubCache::ComputeKeyedLoadArrayLength(String* name, | 414 MaybeObject* StubCache::ComputeKeyedLoadArrayLength(String* name, |
| 400 JSArray* receiver) { | 415 JSArray* receiver) { |
| 401 Code::Flags flags = | 416 Code::Flags flags = |
| 402 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); | 417 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); |
| 403 ASSERT(receiver->IsJSObject()); | 418 ASSERT(receiver->IsJSObject()); |
| 404 Object* code = receiver->map()->FindInCodeCache(name, flags); | 419 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 405 if (code->IsUndefined()) { | 420 if (code->IsUndefined()) { |
| 406 KeyedLoadStubCompiler compiler; | 421 HandleScope scope(isolate_); |
| 422 KeyedLoadStubCompiler compiler(isolate_); | |
| 407 { MaybeObject* maybe_code = compiler.CompileLoadArrayLength(name); | 423 { MaybeObject* maybe_code = compiler.CompileLoadArrayLength(name); |
| 408 if (!maybe_code->ToObject(&code)) return maybe_code; | 424 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 409 } | 425 } |
| 410 PROFILE(isolate_, | 426 PROFILE(isolate_, |
| 411 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 427 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
| 412 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 428 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
| 413 Object* result; | 429 Object* result; |
| 414 { MaybeObject* maybe_result = | 430 { MaybeObject* maybe_result = |
| 415 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 431 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 416 if (!maybe_result->ToObject(&result)) return maybe_result; | 432 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 417 } | 433 } |
| 418 } | 434 } |
| 419 return code; | 435 return code; |
| 420 } | 436 } |
| 421 | 437 |
| 422 | 438 |
| 423 MaybeObject* StubCache::ComputeKeyedLoadStringLength(String* name, | 439 MaybeObject* StubCache::ComputeKeyedLoadStringLength(String* name, |
| 424 String* receiver) { | 440 String* receiver) { |
| 425 Code::Flags flags = | 441 Code::Flags flags = |
| 426 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); | 442 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); |
| 427 Map* map = receiver->map(); | 443 Map* map = receiver->map(); |
| 428 Object* code = map->FindInCodeCache(name, flags); | 444 Object* code = map->FindInCodeCache(name, flags); |
| 429 if (code->IsUndefined()) { | 445 if (code->IsUndefined()) { |
| 430 KeyedLoadStubCompiler compiler; | 446 HandleScope scope(isolate_); |
| 447 KeyedLoadStubCompiler compiler(isolate_); | |
| 431 { MaybeObject* maybe_code = compiler.CompileLoadStringLength(name); | 448 { MaybeObject* maybe_code = compiler.CompileLoadStringLength(name); |
| 432 if (!maybe_code->ToObject(&code)) return maybe_code; | 449 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 433 } | 450 } |
| 434 PROFILE(isolate_, | 451 PROFILE(isolate_, |
| 435 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 452 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
| 436 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 453 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
| 437 Object* result; | 454 Object* result; |
| 438 { MaybeObject* maybe_result = map->UpdateCodeCache(name, Code::cast(code)); | 455 { MaybeObject* maybe_result = map->UpdateCodeCache(name, Code::cast(code)); |
| 439 if (!maybe_result->ToObject(&result)) return maybe_result; | 456 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 440 } | 457 } |
| 441 } | 458 } |
| 442 return code; | 459 return code; |
| 443 } | 460 } |
| 444 | 461 |
| 445 | 462 |
| 446 MaybeObject* StubCache::ComputeKeyedLoadFunctionPrototype( | 463 MaybeObject* StubCache::ComputeKeyedLoadFunctionPrototype( |
| 447 String* name, | 464 String* name, |
| 448 JSFunction* receiver) { | 465 JSFunction* receiver) { |
| 449 Code::Flags flags = | 466 Code::Flags flags = |
| 450 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); | 467 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); |
| 451 Object* code = receiver->map()->FindInCodeCache(name, flags); | 468 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 452 if (code->IsUndefined()) { | 469 if (code->IsUndefined()) { |
| 453 KeyedLoadStubCompiler compiler; | 470 HandleScope scope(isolate_); |
| 471 KeyedLoadStubCompiler compiler(isolate_); | |
| 454 { MaybeObject* maybe_code = compiler.CompileLoadFunctionPrototype(name); | 472 { MaybeObject* maybe_code = compiler.CompileLoadFunctionPrototype(name); |
| 455 if (!maybe_code->ToObject(&code)) return maybe_code; | 473 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 456 } | 474 } |
| 457 PROFILE(isolate_, | 475 PROFILE(isolate_, |
| 458 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 476 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
| 459 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 477 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
| 460 Object* result; | 478 Object* result; |
| 461 { MaybeObject* maybe_result = | 479 { MaybeObject* maybe_result = |
| 462 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 480 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 463 if (!maybe_result->ToObject(&result)) return maybe_result; | 481 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 464 } | 482 } |
| 465 } | 483 } |
| 466 return code; | 484 return code; |
| 467 } | 485 } |
| 468 | 486 |
| 469 | 487 |
| 470 MaybeObject* StubCache::ComputeStoreField(String* name, | 488 MaybeObject* StubCache::ComputeStoreField(String* name, |
| 471 JSObject* receiver, | 489 JSObject* receiver, |
| 472 int field_index, | 490 int field_index, |
| 473 Map* transition, | 491 Map* transition, |
| 474 StrictModeFlag strict_mode) { | 492 StrictModeFlag strict_mode) { |
| 475 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; | 493 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; |
| 476 Code::Flags flags = Code::ComputeMonomorphicFlags( | 494 Code::Flags flags = Code::ComputeMonomorphicFlags( |
| 477 Code::STORE_IC, type, strict_mode); | 495 Code::STORE_IC, type, strict_mode); |
| 478 Object* code = receiver->map()->FindInCodeCache(name, flags); | 496 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 479 if (code->IsUndefined()) { | 497 if (code->IsUndefined()) { |
| 480 StoreStubCompiler compiler(strict_mode); | 498 HandleScope scope(isolate_); |
| 499 StoreStubCompiler compiler(isolate_, strict_mode); | |
| 481 { MaybeObject* maybe_code = | 500 { MaybeObject* maybe_code = |
| 482 compiler.CompileStoreField(receiver, field_index, transition, name); | 501 compiler.CompileStoreField(receiver, field_index, transition, name); |
| 483 if (!maybe_code->ToObject(&code)) return maybe_code; | 502 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 484 } | 503 } |
| 485 PROFILE(isolate_, | 504 PROFILE(isolate_, |
| 486 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); | 505 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); |
| 487 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); | 506 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); |
| 488 Object* result; | 507 Object* result; |
| 489 { MaybeObject* maybe_result = | 508 { MaybeObject* maybe_result = |
| 490 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 509 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 517 UNREACHABLE(); | 536 UNREACHABLE(); |
| 518 break; | 537 break; |
| 519 } | 538 } |
| 520 Object* maybe_code = receiver->map()->FindInCodeCache(name, flags); | 539 Object* maybe_code = receiver->map()->FindInCodeCache(name, flags); |
| 521 if (!maybe_code->IsUndefined()) return Code::cast(maybe_code); | 540 if (!maybe_code->IsUndefined()) return Code::cast(maybe_code); |
| 522 | 541 |
| 523 Map* receiver_map = receiver->map(); | 542 Map* receiver_map = receiver->map(); |
| 524 MaybeObject* maybe_new_code = NULL; | 543 MaybeObject* maybe_new_code = NULL; |
| 525 switch (stub_kind) { | 544 switch (stub_kind) { |
| 526 case KeyedIC::LOAD: { | 545 case KeyedIC::LOAD: { |
| 527 KeyedLoadStubCompiler compiler; | 546 HandleScope scope(isolate_); |
| 547 KeyedLoadStubCompiler compiler(isolate_); | |
| 528 maybe_new_code = compiler.CompileLoadElement(receiver_map); | 548 maybe_new_code = compiler.CompileLoadElement(receiver_map); |
| 529 break; | 549 break; |
| 530 } | 550 } |
| 531 case KeyedIC::STORE_NO_TRANSITION: { | 551 case KeyedIC::STORE_NO_TRANSITION: { |
| 532 KeyedStoreStubCompiler compiler(strict_mode); | 552 HandleScope scope(isolate_); |
| 553 KeyedStoreStubCompiler compiler(isolate_, strict_mode); | |
| 533 maybe_new_code = compiler.CompileStoreElement(receiver_map); | 554 maybe_new_code = compiler.CompileStoreElement(receiver_map); |
| 534 break; | 555 break; |
| 535 } | 556 } |
| 536 default: | 557 default: |
| 537 UNREACHABLE(); | 558 UNREACHABLE(); |
| 538 break; | 559 break; |
| 539 } | 560 } |
| 540 Code* code = NULL; | 561 Code* code = NULL; |
| 541 if (!maybe_new_code->To(&code)) return maybe_new_code; | 562 if (!maybe_new_code->To(&code)) return maybe_new_code; |
| 542 | 563 |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 567 | 588 |
| 568 | 589 |
| 569 MaybeObject* StubCache::ComputeStoreGlobal(String* name, | 590 MaybeObject* StubCache::ComputeStoreGlobal(String* name, |
| 570 GlobalObject* receiver, | 591 GlobalObject* receiver, |
| 571 JSGlobalPropertyCell* cell, | 592 JSGlobalPropertyCell* cell, |
| 572 StrictModeFlag strict_mode) { | 593 StrictModeFlag strict_mode) { |
| 573 Code::Flags flags = Code::ComputeMonomorphicFlags( | 594 Code::Flags flags = Code::ComputeMonomorphicFlags( |
| 574 Code::STORE_IC, NORMAL, strict_mode); | 595 Code::STORE_IC, NORMAL, strict_mode); |
| 575 Object* code = receiver->map()->FindInCodeCache(name, flags); | 596 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 576 if (code->IsUndefined()) { | 597 if (code->IsUndefined()) { |
| 577 StoreStubCompiler compiler(strict_mode); | 598 HandleScope scope(isolate_); |
| 599 StoreStubCompiler compiler(isolate_, strict_mode); | |
| 578 { MaybeObject* maybe_code = | 600 { MaybeObject* maybe_code = |
| 579 compiler.CompileStoreGlobal(receiver, cell, name); | 601 compiler.CompileStoreGlobal(receiver, cell, name); |
| 580 if (!maybe_code->ToObject(&code)) return maybe_code; | 602 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 581 } | 603 } |
| 582 PROFILE(isolate_, | 604 PROFILE(isolate_, |
| 583 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); | 605 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); |
| 584 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); | 606 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); |
| 585 Object* result; | 607 Object* result; |
| 586 { MaybeObject* maybe_result = | 608 { MaybeObject* maybe_result = |
| 587 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 609 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 588 if (!maybe_result->ToObject(&result)) return maybe_result; | 610 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 589 } | 611 } |
| 590 } | 612 } |
| 591 return code; | 613 return code; |
| 592 } | 614 } |
| 593 | 615 |
| 594 | 616 |
| 595 MaybeObject* StubCache::ComputeStoreCallback( | 617 MaybeObject* StubCache::ComputeStoreCallback( |
| 596 String* name, | 618 String* name, |
| 597 JSObject* receiver, | 619 JSObject* receiver, |
| 598 AccessorInfo* callback, | 620 AccessorInfo* callback, |
| 599 StrictModeFlag strict_mode) { | 621 StrictModeFlag strict_mode) { |
| 600 ASSERT(v8::ToCData<Address>(callback->setter()) != 0); | 622 ASSERT(v8::ToCData<Address>(callback->setter()) != 0); |
| 601 Code::Flags flags = Code::ComputeMonomorphicFlags( | 623 Code::Flags flags = Code::ComputeMonomorphicFlags( |
| 602 Code::STORE_IC, CALLBACKS, strict_mode); | 624 Code::STORE_IC, CALLBACKS, strict_mode); |
| 603 Object* code = receiver->map()->FindInCodeCache(name, flags); | 625 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 604 if (code->IsUndefined()) { | 626 if (code->IsUndefined()) { |
| 605 StoreStubCompiler compiler(strict_mode); | 627 HandleScope scope(isolate_); |
| 628 StoreStubCompiler compiler(isolate_, strict_mode); | |
| 606 { MaybeObject* maybe_code = | 629 { MaybeObject* maybe_code = |
| 607 compiler.CompileStoreCallback(receiver, callback, name); | 630 compiler.CompileStoreCallback(receiver, callback, name); |
| 608 if (!maybe_code->ToObject(&code)) return maybe_code; | 631 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 609 } | 632 } |
| 610 PROFILE(isolate_, | 633 PROFILE(isolate_, |
| 611 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); | 634 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); |
| 612 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); | 635 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); |
| 613 Object* result; | 636 Object* result; |
| 614 { MaybeObject* maybe_result = | 637 { MaybeObject* maybe_result = |
| 615 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 638 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 616 if (!maybe_result->ToObject(&result)) return maybe_result; | 639 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 617 } | 640 } |
| 618 } | 641 } |
| 619 return code; | 642 return code; |
| 620 } | 643 } |
| 621 | 644 |
| 622 | 645 |
| 623 MaybeObject* StubCache::ComputeStoreInterceptor( | 646 MaybeObject* StubCache::ComputeStoreInterceptor( |
| 624 String* name, | 647 String* name, |
| 625 JSObject* receiver, | 648 JSObject* receiver, |
| 626 StrictModeFlag strict_mode) { | 649 StrictModeFlag strict_mode) { |
| 627 Code::Flags flags = Code::ComputeMonomorphicFlags( | 650 Code::Flags flags = Code::ComputeMonomorphicFlags( |
| 628 Code::STORE_IC, INTERCEPTOR, strict_mode); | 651 Code::STORE_IC, INTERCEPTOR, strict_mode); |
| 629 Object* code = receiver->map()->FindInCodeCache(name, flags); | 652 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 630 if (code->IsUndefined()) { | 653 if (code->IsUndefined()) { |
| 631 StoreStubCompiler compiler(strict_mode); | 654 HandleScope scope(isolate_); |
| 655 StoreStubCompiler compiler(isolate_, strict_mode); | |
| 632 { MaybeObject* maybe_code = | 656 { MaybeObject* maybe_code = |
| 633 compiler.CompileStoreInterceptor(receiver, name); | 657 compiler.CompileStoreInterceptor(receiver, name); |
| 634 if (!maybe_code->ToObject(&code)) return maybe_code; | 658 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 635 } | 659 } |
| 636 PROFILE(isolate_, | 660 PROFILE(isolate_, |
| 637 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); | 661 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); |
| 638 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); | 662 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); |
| 639 Object* result; | 663 Object* result; |
| 640 { MaybeObject* maybe_result = | 664 { MaybeObject* maybe_result = |
| 641 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 665 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 642 if (!maybe_result->ToObject(&result)) return maybe_result; | 666 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 643 } | 667 } |
| 644 } | 668 } |
| 645 return code; | 669 return code; |
| 646 } | 670 } |
| 647 | 671 |
| 648 | 672 |
| 649 MaybeObject* StubCache::ComputeKeyedStoreField(String* name, | 673 MaybeObject* StubCache::ComputeKeyedStoreField(String* name, |
| 650 JSObject* receiver, | 674 JSObject* receiver, |
| 651 int field_index, | 675 int field_index, |
| 652 Map* transition, | 676 Map* transition, |
| 653 StrictModeFlag strict_mode) { | 677 StrictModeFlag strict_mode) { |
| 654 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; | 678 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; |
| 655 Code::Flags flags = Code::ComputeMonomorphicFlags( | 679 Code::Flags flags = Code::ComputeMonomorphicFlags( |
| 656 Code::KEYED_STORE_IC, type, strict_mode); | 680 Code::KEYED_STORE_IC, type, strict_mode); |
| 657 Object* code = receiver->map()->FindInCodeCache(name, flags); | 681 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 658 if (code->IsUndefined()) { | 682 if (code->IsUndefined()) { |
| 659 KeyedStoreStubCompiler compiler(strict_mode); | 683 HandleScope scope(isolate()); |
| 684 KeyedStoreStubCompiler compiler(isolate(), strict_mode); | |
| 660 { MaybeObject* maybe_code = | 685 { MaybeObject* maybe_code = |
| 661 compiler.CompileStoreField(receiver, field_index, transition, name); | 686 compiler.CompileStoreField(receiver, field_index, transition, name); |
| 662 if (!maybe_code->ToObject(&code)) return maybe_code; | 687 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 663 } | 688 } |
| 664 PROFILE(isolate(), | 689 PROFILE(isolate(), |
| 665 CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, | 690 CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, |
| 666 Code::cast(code), name)); | 691 Code::cast(code), name)); |
| 667 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, name, Code::cast(code))); | 692 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, name, Code::cast(code))); |
| 668 Object* result; | 693 Object* result; |
| 669 { MaybeObject* maybe_result = | 694 { MaybeObject* maybe_result = |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 705 cache_holder, | 730 cache_holder, |
| 706 argc); | 731 argc); |
| 707 Object* code = map_holder->map()->FindInCodeCache(name, flags); | 732 Object* code = map_holder->map()->FindInCodeCache(name, flags); |
| 708 if (code->IsUndefined()) { | 733 if (code->IsUndefined()) { |
| 709 // If the function hasn't been compiled yet, we cannot do it now | 734 // If the function hasn't been compiled yet, we cannot do it now |
| 710 // because it may cause GC. To avoid this issue, we return an | 735 // because it may cause GC. To avoid this issue, we return an |
| 711 // internal error which will make sure we do not update any | 736 // internal error which will make sure we do not update any |
| 712 // caches. | 737 // caches. |
| 713 if (!function->is_compiled()) return Failure::InternalError(); | 738 if (!function->is_compiled()) return Failure::InternalError(); |
| 714 // Compile the stub - only create stubs for fully compiled functions. | 739 // Compile the stub - only create stubs for fully compiled functions. |
| 715 CallStubCompiler compiler(argc, kind, extra_ic_state, cache_holder); | 740 HandleScope scope(isolate_); |
| 741 CallStubCompiler compiler(isolate_, | |
| 742 argc, | |
| 743 kind, | |
| 744 extra_ic_state, | |
| 745 cache_holder); | |
| 716 { MaybeObject* maybe_code = | 746 { MaybeObject* maybe_code = |
| 717 compiler.CompileCallConstant(object, holder, function, name, check); | 747 compiler.CompileCallConstant(object, holder, function, name, check); |
| 718 if (!maybe_code->ToObject(&code)) return maybe_code; | 748 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 719 } | 749 } |
| 720 Code::cast(code)->set_check_type(check); | 750 Code::cast(code)->set_check_type(check); |
| 721 ASSERT_EQ(flags, Code::cast(code)->flags()); | 751 ASSERT_EQ(flags, Code::cast(code)->flags()); |
| 722 PROFILE(isolate_, | 752 PROFILE(isolate_, |
| 723 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), | 753 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), |
| 724 Code::cast(code), name)); | 754 Code::cast(code), name)); |
| 725 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); | 755 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 752 object = holder; | 782 object = holder; |
| 753 } | 783 } |
| 754 | 784 |
| 755 Code::Flags flags = Code::ComputeMonomorphicFlags(kind, | 785 Code::Flags flags = Code::ComputeMonomorphicFlags(kind, |
| 756 FIELD, | 786 FIELD, |
| 757 extra_ic_state, | 787 extra_ic_state, |
| 758 cache_holder, | 788 cache_holder, |
| 759 argc); | 789 argc); |
| 760 Object* code = map_holder->map()->FindInCodeCache(name, flags); | 790 Object* code = map_holder->map()->FindInCodeCache(name, flags); |
| 761 if (code->IsUndefined()) { | 791 if (code->IsUndefined()) { |
| 762 CallStubCompiler compiler(argc, kind, extra_ic_state, cache_holder); | 792 HandleScope scope(isolate_); |
| 793 CallStubCompiler compiler(isolate_, | |
| 794 argc, | |
| 795 kind, | |
| 796 extra_ic_state, | |
| 797 cache_holder); | |
| 763 { MaybeObject* maybe_code = | 798 { MaybeObject* maybe_code = |
| 764 compiler.CompileCallField(JSObject::cast(object), | 799 compiler.CompileCallField(JSObject::cast(object), |
| 765 holder, | 800 holder, |
| 766 index, | 801 index, |
| 767 name); | 802 name); |
| 768 if (!maybe_code->ToObject(&code)) return maybe_code; | 803 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 769 } | 804 } |
| 770 ASSERT_EQ(flags, Code::cast(code)->flags()); | 805 ASSERT_EQ(flags, Code::cast(code)->flags()); |
| 771 PROFILE(isolate_, | 806 PROFILE(isolate_, |
| 772 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), | 807 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 801 object = holder; | 836 object = holder; |
| 802 } | 837 } |
| 803 | 838 |
| 804 Code::Flags flags = Code::ComputeMonomorphicFlags(kind, | 839 Code::Flags flags = Code::ComputeMonomorphicFlags(kind, |
| 805 INTERCEPTOR, | 840 INTERCEPTOR, |
| 806 extra_ic_state, | 841 extra_ic_state, |
| 807 cache_holder, | 842 cache_holder, |
| 808 argc); | 843 argc); |
| 809 Object* code = map_holder->map()->FindInCodeCache(name, flags); | 844 Object* code = map_holder->map()->FindInCodeCache(name, flags); |
| 810 if (code->IsUndefined()) { | 845 if (code->IsUndefined()) { |
| 811 CallStubCompiler compiler(argc, kind, extra_ic_state, cache_holder); | 846 HandleScope scope(isolate()); |
| 847 CallStubCompiler compiler(isolate(), | |
| 848 argc, | |
| 849 kind, | |
| 850 extra_ic_state, | |
| 851 cache_holder); | |
| 812 { MaybeObject* maybe_code = | 852 { MaybeObject* maybe_code = |
| 813 compiler.CompileCallInterceptor(JSObject::cast(object), holder, name); | 853 compiler.CompileCallInterceptor(JSObject::cast(object), holder, name); |
| 814 if (!maybe_code->ToObject(&code)) return maybe_code; | 854 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 815 } | 855 } |
| 816 ASSERT_EQ(flags, Code::cast(code)->flags()); | 856 ASSERT_EQ(flags, Code::cast(code)->flags()); |
| 817 PROFILE(isolate(), | 857 PROFILE(isolate(), |
| 818 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), | 858 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), |
| 819 Code::cast(code), name)); | 859 Code::cast(code), name)); |
| 820 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); | 860 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); |
| 821 Object* result; | 861 Object* result; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 857 extra_ic_state, | 897 extra_ic_state, |
| 858 cache_holder, | 898 cache_holder, |
| 859 argc); | 899 argc); |
| 860 Object* code = map_holder->map()->FindInCodeCache(name, flags); | 900 Object* code = map_holder->map()->FindInCodeCache(name, flags); |
| 861 if (code->IsUndefined()) { | 901 if (code->IsUndefined()) { |
| 862 // If the function hasn't been compiled yet, we cannot do it now | 902 // If the function hasn't been compiled yet, we cannot do it now |
| 863 // because it may cause GC. To avoid this issue, we return an | 903 // because it may cause GC. To avoid this issue, we return an |
| 864 // internal error which will make sure we do not update any | 904 // internal error which will make sure we do not update any |
| 865 // caches. | 905 // caches. |
| 866 if (!function->is_compiled()) return Failure::InternalError(); | 906 if (!function->is_compiled()) return Failure::InternalError(); |
| 867 CallStubCompiler compiler(argc, kind, extra_ic_state, cache_holder); | 907 HandleScope scope(isolate()); |
| 908 CallStubCompiler compiler(isolate(), | |
| 909 argc, | |
| 910 kind, | |
| 911 extra_ic_state, | |
| 912 cache_holder); | |
| 868 { MaybeObject* maybe_code = | 913 { MaybeObject* maybe_code = |
| 869 compiler.CompileCallGlobal(receiver, holder, cell, function, name); | 914 compiler.CompileCallGlobal(receiver, holder, cell, function, name); |
| 870 if (!maybe_code->ToObject(&code)) return maybe_code; | 915 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 871 } | 916 } |
| 872 ASSERT_EQ(flags, Code::cast(code)->flags()); | 917 ASSERT_EQ(flags, Code::cast(code)->flags()); |
| 873 PROFILE(isolate(), | 918 PROFILE(isolate(), |
| 874 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), | 919 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), |
| 875 Code::cast(code), name)); | 920 Code::cast(code), name)); |
| 876 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); | 921 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); |
| 877 Object* result; | 922 Object* result; |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 960 Code::Flags flags = Code::ComputeFlags(kind, | 1005 Code::Flags flags = Code::ComputeFlags(kind, |
| 961 UNINITIALIZED, | 1006 UNINITIALIZED, |
| 962 extra_state, | 1007 extra_state, |
| 963 NORMAL, | 1008 NORMAL, |
| 964 argc); | 1009 argc); |
| 965 Object* probe; | 1010 Object* probe; |
| 966 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); | 1011 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); |
| 967 if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 1012 if (!maybe_probe->ToObject(&probe)) return maybe_probe; |
| 968 } | 1013 } |
| 969 if (!probe->IsUndefined()) return probe; | 1014 if (!probe->IsUndefined()) return probe; |
| 970 StubCompiler compiler; | 1015 HandleScope scope(isolate_); |
| 1016 StubCompiler compiler(isolate_); | |
| 971 return FillCache(isolate_, compiler.CompileCallInitialize(flags)); | 1017 return FillCache(isolate_, compiler.CompileCallInitialize(flags)); |
| 972 } | 1018 } |
| 973 | 1019 |
| 974 | 1020 |
| 975 Handle<Code> StubCache::ComputeCallInitialize(int argc, | 1021 Handle<Code> StubCache::ComputeCallInitialize(int argc, |
| 976 RelocInfo::Mode mode) { | 1022 RelocInfo::Mode mode) { |
| 977 CALL_HEAP_FUNCTION(isolate_, | 1023 CALL_HEAP_FUNCTION(isolate_, |
| 978 ComputeCallInitialize(argc, mode, Code::CALL_IC), | 1024 ComputeCallInitialize(argc, mode, Code::CALL_IC), |
| 979 Code); | 1025 Code); |
| 980 } | 1026 } |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 995 Code::Flags flags = Code::ComputeFlags(kind, | 1041 Code::Flags flags = Code::ComputeFlags(kind, |
| 996 PREMONOMORPHIC, | 1042 PREMONOMORPHIC, |
| 997 extra_ic_state, | 1043 extra_ic_state, |
| 998 NORMAL, | 1044 NORMAL, |
| 999 argc); | 1045 argc); |
| 1000 Object* probe; | 1046 Object* probe; |
| 1001 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); | 1047 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); |
| 1002 if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 1048 if (!maybe_probe->ToObject(&probe)) return maybe_probe; |
| 1003 } | 1049 } |
| 1004 if (!probe->IsUndefined()) return probe; | 1050 if (!probe->IsUndefined()) return probe; |
| 1005 StubCompiler compiler; | 1051 HandleScope scope(isolate_); |
| 1052 StubCompiler compiler(isolate_); | |
| 1006 return FillCache(isolate_, compiler.CompileCallPreMonomorphic(flags)); | 1053 return FillCache(isolate_, compiler.CompileCallPreMonomorphic(flags)); |
| 1007 } | 1054 } |
| 1008 | 1055 |
| 1009 | 1056 |
| 1010 MaybeObject* StubCache::ComputeCallNormal(int argc, | 1057 MaybeObject* StubCache::ComputeCallNormal(int argc, |
| 1011 Code::Kind kind, | 1058 Code::Kind kind, |
| 1012 Code::ExtraICState extra_ic_state) { | 1059 Code::ExtraICState extra_ic_state) { |
| 1013 Code::Flags flags = Code::ComputeFlags(kind, | 1060 Code::Flags flags = Code::ComputeFlags(kind, |
| 1014 MONOMORPHIC, | 1061 MONOMORPHIC, |
| 1015 extra_ic_state, | 1062 extra_ic_state, |
| 1016 NORMAL, | 1063 NORMAL, |
| 1017 argc); | 1064 argc); |
| 1018 Object* probe; | 1065 Object* probe; |
| 1019 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); | 1066 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); |
| 1020 if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 1067 if (!maybe_probe->ToObject(&probe)) return maybe_probe; |
| 1021 } | 1068 } |
| 1022 if (!probe->IsUndefined()) return probe; | 1069 if (!probe->IsUndefined()) return probe; |
| 1023 StubCompiler compiler; | 1070 HandleScope scope(isolate_); |
| 1071 StubCompiler compiler(isolate_); | |
| 1024 return FillCache(isolate_, compiler.CompileCallNormal(flags)); | 1072 return FillCache(isolate_, compiler.CompileCallNormal(flags)); |
| 1025 } | 1073 } |
| 1026 | 1074 |
| 1027 | 1075 |
| 1028 MaybeObject* StubCache::ComputeCallArguments(int argc, Code::Kind kind) { | 1076 MaybeObject* StubCache::ComputeCallArguments(int argc, Code::Kind kind) { |
| 1029 ASSERT(kind == Code::KEYED_CALL_IC); | 1077 ASSERT(kind == Code::KEYED_CALL_IC); |
| 1030 Code::Flags flags = Code::ComputeFlags(kind, | 1078 Code::Flags flags = Code::ComputeFlags(kind, |
| 1031 MEGAMORPHIC, | 1079 MEGAMORPHIC, |
| 1032 Code::kNoExtraICState, | 1080 Code::kNoExtraICState, |
| 1033 NORMAL, | 1081 NORMAL, |
| 1034 argc); | 1082 argc); |
| 1035 Object* probe; | 1083 Object* probe; |
| 1036 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); | 1084 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); |
| 1037 if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 1085 if (!maybe_probe->ToObject(&probe)) return maybe_probe; |
| 1038 } | 1086 } |
| 1039 if (!probe->IsUndefined()) return probe; | 1087 if (!probe->IsUndefined()) return probe; |
| 1040 StubCompiler compiler; | 1088 HandleScope scope(isolate_); |
| 1089 StubCompiler compiler(isolate_); | |
| 1041 return FillCache(isolate_, compiler.CompileCallArguments(flags)); | 1090 return FillCache(isolate_, compiler.CompileCallArguments(flags)); |
| 1042 } | 1091 } |
| 1043 | 1092 |
| 1044 | 1093 |
| 1045 MaybeObject* StubCache::ComputeCallMegamorphic( | 1094 MaybeObject* StubCache::ComputeCallMegamorphic( |
| 1046 int argc, | 1095 int argc, |
| 1047 Code::Kind kind, | 1096 Code::Kind kind, |
| 1048 Code::ExtraICState extra_ic_state) { | 1097 Code::ExtraICState extra_ic_state) { |
| 1049 Code::Flags flags = Code::ComputeFlags(kind, | 1098 Code::Flags flags = Code::ComputeFlags(kind, |
| 1050 MEGAMORPHIC, | 1099 MEGAMORPHIC, |
| 1051 extra_ic_state, | 1100 extra_ic_state, |
| 1052 NORMAL, | 1101 NORMAL, |
| 1053 argc); | 1102 argc); |
| 1054 Object* probe; | 1103 Object* probe; |
| 1055 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); | 1104 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); |
| 1056 if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 1105 if (!maybe_probe->ToObject(&probe)) return maybe_probe; |
| 1057 } | 1106 } |
| 1058 if (!probe->IsUndefined()) return probe; | 1107 if (!probe->IsUndefined()) return probe; |
| 1059 StubCompiler compiler; | 1108 HandleScope scope(isolate_); |
| 1109 StubCompiler compiler(isolate_); | |
| 1060 return FillCache(isolate_, compiler.CompileCallMegamorphic(flags)); | 1110 return FillCache(isolate_, compiler.CompileCallMegamorphic(flags)); |
| 1061 } | 1111 } |
| 1062 | 1112 |
| 1063 | 1113 |
| 1064 MaybeObject* StubCache::ComputeCallMiss(int argc, | 1114 MaybeObject* StubCache::ComputeCallMiss(int argc, |
| 1065 Code::Kind kind, | 1115 Code::Kind kind, |
| 1066 Code::ExtraICState extra_ic_state) { | 1116 Code::ExtraICState extra_ic_state) { |
| 1067 // MONOMORPHIC_PROTOTYPE_FAILURE state is used to make sure that miss stubs | 1117 // MONOMORPHIC_PROTOTYPE_FAILURE state is used to make sure that miss stubs |
| 1068 // and monomorphic stubs are not mixed up together in the stub cache. | 1118 // and monomorphic stubs are not mixed up together in the stub cache. |
| 1069 Code::Flags flags = Code::ComputeFlags(kind, | 1119 Code::Flags flags = Code::ComputeFlags(kind, |
| 1070 MONOMORPHIC_PROTOTYPE_FAILURE, | 1120 MONOMORPHIC_PROTOTYPE_FAILURE, |
| 1071 extra_ic_state, | 1121 extra_ic_state, |
| 1072 NORMAL, | 1122 NORMAL, |
| 1073 argc, | 1123 argc, |
| 1074 OWN_MAP); | 1124 OWN_MAP); |
| 1075 Object* probe; | 1125 Object* probe; |
| 1076 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); | 1126 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); |
| 1077 if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 1127 if (!maybe_probe->ToObject(&probe)) return maybe_probe; |
| 1078 } | 1128 } |
| 1079 if (!probe->IsUndefined()) return probe; | 1129 if (!probe->IsUndefined()) return probe; |
| 1080 StubCompiler compiler; | 1130 HandleScope scope(isolate_); |
| 1131 StubCompiler compiler(isolate_); | |
| 1081 return FillCache(isolate_, compiler.CompileCallMiss(flags)); | 1132 return FillCache(isolate_, compiler.CompileCallMiss(flags)); |
| 1082 } | 1133 } |
| 1083 | 1134 |
| 1084 | 1135 |
| 1085 #ifdef ENABLE_DEBUGGER_SUPPORT | 1136 #ifdef ENABLE_DEBUGGER_SUPPORT |
| 1086 MaybeObject* StubCache::ComputeCallDebugBreak( | 1137 MaybeObject* StubCache::ComputeCallDebugBreak( |
| 1087 int argc, | 1138 int argc, |
| 1088 Code::Kind kind) { | 1139 Code::Kind kind) { |
| 1089 // Extra IC state is irrelevant for debug break ICs. They jump to | 1140 // Extra IC state is irrelevant for debug break ICs. They jump to |
| 1090 // the actual call ic to carry out the work. | 1141 // the actual call ic to carry out the work. |
| 1091 Code::Flags flags = Code::ComputeFlags(kind, | 1142 Code::Flags flags = Code::ComputeFlags(kind, |
| 1092 DEBUG_BREAK, | 1143 DEBUG_BREAK, |
| 1093 Code::kNoExtraICState, | 1144 Code::kNoExtraICState, |
| 1094 NORMAL, | 1145 NORMAL, |
| 1095 argc); | 1146 argc); |
| 1096 Object* probe; | 1147 Object* probe; |
| 1097 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); | 1148 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); |
| 1098 if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 1149 if (!maybe_probe->ToObject(&probe)) return maybe_probe; |
| 1099 } | 1150 } |
| 1100 if (!probe->IsUndefined()) return probe; | 1151 if (!probe->IsUndefined()) return probe; |
| 1101 StubCompiler compiler; | 1152 HandleScope scope(isolate_); |
| 1153 StubCompiler compiler(isolate_); | |
| 1102 return FillCache(isolate_, compiler.CompileCallDebugBreak(flags)); | 1154 return FillCache(isolate_, compiler.CompileCallDebugBreak(flags)); |
| 1103 } | 1155 } |
| 1104 | 1156 |
| 1105 | 1157 |
| 1106 MaybeObject* StubCache::ComputeCallDebugPrepareStepIn( | 1158 MaybeObject* StubCache::ComputeCallDebugPrepareStepIn( |
| 1107 int argc, | 1159 int argc, |
| 1108 Code::Kind kind) { | 1160 Code::Kind kind) { |
| 1109 // Extra IC state is irrelevant for debug break ICs. They jump to | 1161 // Extra IC state is irrelevant for debug break ICs. They jump to |
| 1110 // the actual call ic to carry out the work. | 1162 // the actual call ic to carry out the work. |
| 1111 Code::Flags flags = Code::ComputeFlags(kind, | 1163 Code::Flags flags = Code::ComputeFlags(kind, |
| 1112 DEBUG_PREPARE_STEP_IN, | 1164 DEBUG_PREPARE_STEP_IN, |
| 1113 Code::kNoExtraICState, | 1165 Code::kNoExtraICState, |
| 1114 NORMAL, | 1166 NORMAL, |
| 1115 argc); | 1167 argc); |
| 1116 Object* probe; | 1168 Object* probe; |
| 1117 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); | 1169 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); |
| 1118 if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 1170 if (!maybe_probe->ToObject(&probe)) return maybe_probe; |
| 1119 } | 1171 } |
| 1120 if (!probe->IsUndefined()) return probe; | 1172 if (!probe->IsUndefined()) return probe; |
| 1121 StubCompiler compiler; | 1173 HandleScope scope(isolate_); |
| 1174 StubCompiler compiler(isolate_); | |
| 1122 return FillCache(isolate_, compiler.CompileCallDebugPrepareStepIn(flags)); | 1175 return FillCache(isolate_, compiler.CompileCallDebugPrepareStepIn(flags)); |
| 1123 } | 1176 } |
| 1124 #endif | 1177 #endif |
| 1125 | 1178 |
| 1126 | 1179 |
| 1127 void StubCache::Clear() { | 1180 void StubCache::Clear() { |
| 1128 Code* empty = isolate_->builtins()->builtin(Builtins::kIllegal); | 1181 Code* empty = isolate_->builtins()->builtin(Builtins::kIllegal); |
| 1129 for (int i = 0; i < kPrimaryTableSize; i++) { | 1182 for (int i = 0; i < kPrimaryTableSize; i++) { |
| 1130 primary_[i].key = heap()->empty_string(); | 1183 primary_[i].key = heap()->empty_string(); |
| 1131 primary_[i].value = empty; | 1184 primary_[i].value = empty; |
| (...skipping 565 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1697 return result; | 1750 return result; |
| 1698 } | 1751 } |
| 1699 | 1752 |
| 1700 | 1753 |
| 1701 void KeyedStoreStubCompiler::GenerateStoreDictionaryElement( | 1754 void KeyedStoreStubCompiler::GenerateStoreDictionaryElement( |
| 1702 MacroAssembler* masm) { | 1755 MacroAssembler* masm) { |
| 1703 KeyedStoreIC::GenerateSlow(masm); | 1756 KeyedStoreIC::GenerateSlow(masm); |
| 1704 } | 1757 } |
| 1705 | 1758 |
| 1706 | 1759 |
| 1707 CallStubCompiler::CallStubCompiler(int argc, | 1760 CallStubCompiler::CallStubCompiler(Isolate* isolate, |
| 1761 int argc, | |
| 1708 Code::Kind kind, | 1762 Code::Kind kind, |
| 1709 Code::ExtraICState extra_ic_state, | 1763 Code::ExtraICState extra_ic_state, |
| 1710 InlineCacheHolderFlag cache_holder) | 1764 InlineCacheHolderFlag cache_holder) |
| 1711 : arguments_(argc), | 1765 : StubCompiler(isolate), |
| 1766 arguments_(argc), | |
| 1712 kind_(kind), | 1767 kind_(kind), |
| 1713 extra_ic_state_(extra_ic_state), | 1768 extra_ic_state_(extra_ic_state), |
| 1714 cache_holder_(cache_holder) { | 1769 cache_holder_(cache_holder) { |
| 1715 } | 1770 } |
| 1716 | 1771 |
| 1717 | 1772 |
| 1718 bool CallStubCompiler::HasCustomCallGenerator(JSFunction* function) { | 1773 bool CallStubCompiler::HasCustomCallGenerator(JSFunction* function) { |
| 1719 SharedFunctionInfo* info = function->shared(); | 1774 SharedFunctionInfo* info = function->shared(); |
| 1720 if (info->HasBuiltinFunctionId()) { | 1775 if (info->HasBuiltinFunctionId()) { |
| 1721 BuiltinFunctionId id = info->builtin_function_id(); | 1776 BuiltinFunctionId id = info->builtin_function_id(); |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1858 expected_receiver_type_ = | 1913 expected_receiver_type_ = |
| 1859 FunctionTemplateInfo::cast(signature->receiver()); | 1914 FunctionTemplateInfo::cast(signature->receiver()); |
| 1860 } | 1915 } |
| 1861 } | 1916 } |
| 1862 | 1917 |
| 1863 is_simple_api_call_ = true; | 1918 is_simple_api_call_ = true; |
| 1864 } | 1919 } |
| 1865 | 1920 |
| 1866 | 1921 |
| 1867 } } // namespace v8::internal | 1922 } } // namespace v8::internal |
| OLD | NEW |