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 // This static helper should be removed if |
| 113 JSObject* receiver) { | 113 // LoadStubCompiler::CompileLoadNonexistent is handlified. |
| 114 static Handle<Code> CompileLoadNonexistent(Isolate* isolate, | |
| 115 LoadStubCompiler* compiler, | |
| 116 Handle<String> cache_name, | |
| 117 Handle<JSObject> receiver, | |
| 118 Handle<JSObject> last) { | |
| 119 CALL_HEAP_FUNCTION( | |
|
Kevin Millikin (Chromium)
2011/09/29 09:21:32
This is the interface between handle code and raw
| |
| 120 isolate, | |
| 121 compiler->CompileLoadNonexistent(*cache_name, *receiver, *last), | |
| 122 Code); | |
| 123 } | |
| 124 | |
| 125 | |
| 126 static void UpdateMapCodeCache(Isolate* isolate, | |
| 127 Handle<JSObject> receiver, | |
| 128 Handle<String> cache_name, | |
| 129 Handle<Code> code) { | |
| 130 CALL_HEAP_FUNCTION_VOID(isolate, | |
| 131 receiver->UpdateMapCodeCache(*cache_name, *code)); | |
| 132 } | |
| 133 | |
| 134 | |
| 135 Handle<Code> StubCache::ComputeLoadNonexistent(Handle<String> name, | |
| 136 Handle<JSObject> receiver) { | |
| 114 ASSERT(receiver->IsGlobalObject() || receiver->HasFastProperties()); | 137 ASSERT(receiver->IsGlobalObject() || receiver->HasFastProperties()); |
| 115 // If no global objects are present in the prototype chain, the load | 138 // 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 | 139 // 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 | 140 // 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 | 141 // there are global objects involved, we need to check global |
| 119 // property cells in the stub and therefore the stub will be | 142 // property cells in the stub and therefore the stub will be |
| 120 // specific to the name. | 143 // specific to the name. |
| 121 String* cache_name = heap()->empty_string(); | 144 Handle<String> cache_name = factory()->empty_string(); |
| 122 if (receiver->IsGlobalObject()) cache_name = name; | 145 if (receiver->IsGlobalObject()) cache_name = name; |
| 123 JSObject* last = receiver; | 146 |
| 147 // TODO(kmillikin): If we were willing to write | |
| 148 // *last.location() = JSObject::cast(last->GetPrototype()); | |
| 149 // we could avoid the linear space usage. | |
|
Kevin Millikin (Chromium)
2011/09/29 09:21:32
We never do this trick because we're paranoid abou
| |
| 150 Handle<JSObject> last = receiver; | |
| 124 while (last->GetPrototype() != heap()->null_value()) { | 151 while (last->GetPrototype() != heap()->null_value()) { |
| 125 last = JSObject::cast(last->GetPrototype()); | 152 last = Handle<JSObject>(JSObject::cast(last->GetPrototype())); |
| 126 if (last->IsGlobalObject()) cache_name = name; | 153 if (last->IsGlobalObject()) cache_name = name; |
| 127 } | 154 } |
| 128 // Compile the stub that is either shared for all names or | 155 // Compile the stub that is either shared for all names or |
| 129 // name specific if there are global objects involved. | 156 // name specific if there are global objects involved. |
| 130 Code::Flags flags = | 157 Code::Flags flags = |
| 131 Code::ComputeMonomorphicFlags(Code::LOAD_IC, NONEXISTENT); | 158 Code::ComputeMonomorphicFlags(Code::LOAD_IC, NONEXISTENT); |
| 132 Object* code = receiver->map()->FindInCodeCache(cache_name, flags); | 159 Handle<Object> probe(receiver->map()->FindInCodeCache(*cache_name, flags)); |
| 133 if (code->IsUndefined()) { | 160 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 134 LoadStubCompiler compiler; | 161 |
|
Kevin Millikin (Chromium)
2011/09/29 09:21:32
Though this implicitly introduces a handle scope,
| |
| 135 { MaybeObject* maybe_code = | 162 LoadStubCompiler compiler(isolate_); |
| 136 compiler.CompileLoadNonexistent(cache_name, receiver, last); | 163 Handle<Code> code = |
| 137 if (!maybe_code->ToObject(&code)) return maybe_code; | 164 CompileLoadNonexistent(isolate_, &compiler, cache_name, receiver, last); |
| 138 } | 165 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *cache_name)); |
| 139 PROFILE(isolate_, | 166 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *cache_name, *code)); |
| 140 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), cache_name)); | 167 UpdateMapCodeCache(isolate_, receiver, cache_name, code); |
| 141 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, cache_name, Code::cast(code))); | 168 return code; |
| 142 Object* result; | 169 } |
| 143 { MaybeObject* maybe_result = | 170 |
| 144 receiver->UpdateMapCodeCache(cache_name, Code::cast(code)); | 171 |
| 145 if (!maybe_result->ToObject(&result)) return maybe_result; | 172 // This static helper should be removed if |
| 146 } | 173 // LoadStubCompiler::CompileLoadField is handlified. |
| 147 } | 174 static Handle<Code> CompileLoadField(Isolate* isolate, |
| 148 return code; | 175 LoadStubCompiler* compiler, |
| 149 } | 176 Handle<JSObject> receiver, |
| 150 | 177 Handle<JSObject> holder, |
| 151 | 178 int field_index, |
| 152 MaybeObject* StubCache::ComputeLoadField(String* name, | 179 Handle<String> name) { |
| 153 JSObject* receiver, | 180 CALL_HEAP_FUNCTION( |
| 154 JSObject* holder, | 181 isolate, |
| 182 compiler->CompileLoadField(*receiver, *holder, field_index, *name), | |
| 183 Code); | |
| 184 } | |
| 185 | |
| 186 | |
| 187 Handle<Code> StubCache::ComputeLoadField(Handle<String> name, | |
| 188 Handle<JSObject> receiver, | |
| 189 Handle<JSObject> holder, | |
| 155 int field_index) { | 190 int field_index) { |
| 156 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 191 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
| 157 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, FIELD); | 192 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, FIELD); |
| 158 Object* code = receiver->map()->FindInCodeCache(name, flags); | 193 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
| 159 if (code->IsUndefined()) { | 194 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 160 LoadStubCompiler compiler; | 195 |
| 161 { MaybeObject* maybe_code = | 196 LoadStubCompiler compiler(isolate_); |
| 162 compiler.CompileLoadField(receiver, holder, field_index, name); | 197 Handle<Code> code = CompileLoadField(isolate_, |
| 163 if (!maybe_code->ToObject(&code)) return maybe_code; | 198 &compiler, |
| 164 } | 199 receiver, |
| 165 PROFILE(isolate_, | 200 holder, |
| 166 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); | 201 field_index, |
| 167 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); | 202 name); |
| 168 Object* result; | 203 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
| 169 { MaybeObject* maybe_result = | 204 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
| 170 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 205 UpdateMapCodeCache(isolate_, receiver, name, code); |
| 171 if (!maybe_result->ToObject(&result)) return maybe_result; | 206 return code; |
| 172 } | 207 } |
| 173 } | 208 |
| 174 return code; | 209 |
| 175 } | 210 // This static helper should be removed if |
| 176 | 211 // LoadStubCompiler::CompileLoadCallback is handlified. |
| 177 | 212 static Handle<Code> CompileLoadCallback(Isolate* isolate, |
| 178 MaybeObject* StubCache::ComputeLoadCallback(String* name, | 213 LoadStubCompiler* compiler, |
| 179 JSObject* receiver, | 214 Handle<String> name, |
| 180 JSObject* holder, | 215 Handle<JSObject> receiver, |
| 181 AccessorInfo* callback) { | 216 Handle<JSObject> holder, |
| 217 Handle<AccessorInfo> callback) { | |
| 218 CALL_HEAP_FUNCTION( | |
| 219 isolate, | |
| 220 compiler->CompileLoadCallback(*name, *receiver, *holder, *callback), | |
| 221 Code); | |
| 222 } | |
| 223 | |
| 224 | |
| 225 Handle<Code> StubCache::ComputeLoadCallback(Handle<String> name, | |
| 226 Handle<JSObject> receiver, | |
| 227 Handle<JSObject> holder, | |
| 228 Handle<AccessorInfo> callback) { | |
| 182 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); | 229 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); |
| 183 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 230 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
| 184 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, CALLBACKS); | 231 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, CALLBACKS); |
| 185 Object* code = receiver->map()->FindInCodeCache(name, flags); | 232 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
| 186 if (code->IsUndefined()) { | 233 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 187 LoadStubCompiler compiler; | 234 |
| 188 { MaybeObject* maybe_code = | 235 LoadStubCompiler compiler(isolate_); |
| 189 compiler.CompileLoadCallback(name, receiver, holder, callback); | 236 Handle<Code> code = CompileLoadCallback(isolate_, |
| 190 if (!maybe_code->ToObject(&code)) return maybe_code; | 237 &compiler, |
| 191 } | 238 name, |
| 192 PROFILE(isolate_, | 239 receiver, |
| 193 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); | 240 holder, |
| 194 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); | 241 callback); |
| 195 Object* result; | 242 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
| 196 { MaybeObject* maybe_result = | 243 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
| 197 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 244 UpdateMapCodeCache(isolate_, receiver, name, code); |
| 198 if (!maybe_result->ToObject(&result)) return maybe_result; | 245 return code; |
| 199 } | 246 } |
| 200 } | 247 |
| 201 return code; | 248 |
| 202 } | 249 // This static helper should be removed if |
| 203 | 250 // LoadStubCompiler::CompileLoadConstant is handlified. |
| 204 | 251 static Handle<Code> CompileLoadConstant(Isolate* isolate, |
| 205 MaybeObject* StubCache::ComputeLoadConstant(String* name, | 252 LoadStubCompiler* compiler, |
| 206 JSObject* receiver, | 253 Handle<JSObject> receiver, |
| 207 JSObject* holder, | 254 Handle<JSObject> holder, |
| 208 Object* value) { | 255 Handle<Object> value, |
| 209 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 256 Handle<String> name) { |
| 257 CALL_HEAP_FUNCTION( | |
| 258 isolate, | |
| 259 compiler->CompileLoadConstant(*receiver, *holder, *value, *name), | |
| 260 Code); | |
| 261 } | |
| 262 | |
| 263 | |
| 264 Handle<Code> StubCache::ComputeLoadConstant(Handle<String> name, | |
| 265 Handle<JSObject> receiver, | |
| 266 Handle<JSObject> holder, | |
| 267 Handle<Object> value) { | |
| 268 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | |
| 210 Code::Flags flags = | 269 Code::Flags flags = |
| 211 Code::ComputeMonomorphicFlags(Code::LOAD_IC, CONSTANT_FUNCTION); | 270 Code::ComputeMonomorphicFlags(Code::LOAD_IC, CONSTANT_FUNCTION); |
| 212 Object* code = receiver->map()->FindInCodeCache(name, flags); | 271 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
| 213 if (code->IsUndefined()) { | 272 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 214 LoadStubCompiler compiler; | 273 |
| 215 { MaybeObject* maybe_code = | 274 LoadStubCompiler compiler(isolate_); |
| 216 compiler.CompileLoadConstant(receiver, holder, value, name); | 275 Handle<Code> code = CompileLoadConstant(isolate_, |
| 217 if (!maybe_code->ToObject(&code)) return maybe_code; | 276 &compiler, |
| 218 } | 277 receiver, |
| 219 PROFILE(isolate_, | 278 holder, |
| 220 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); | 279 value, |
| 221 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); | 280 name); |
| 222 Object* result; | 281 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
| 223 { MaybeObject* maybe_result = | 282 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
| 224 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 283 UpdateMapCodeCache(isolate_, receiver, name, code); |
| 225 if (!maybe_result->ToObject(&result)) return maybe_result; | 284 return code; |
| 226 } | 285 } |
| 227 } | 286 |
| 228 return code; | 287 |
| 229 } | 288 // This static helper should be removed if |
| 230 | 289 // LoadStubCompiler::CompileLoadInterceptor is handlified. |
| 231 | 290 static Handle<Code> CompileLoadInterceptor(Isolate* isolate, |
| 232 MaybeObject* StubCache::ComputeLoadInterceptor(String* name, | 291 LoadStubCompiler* compiler, |
| 233 JSObject* receiver, | 292 Handle<JSObject> receiver, |
| 234 JSObject* holder) { | 293 Handle<JSObject> holder, |
| 235 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 294 Handle<String> name) { |
| 295 CALL_HEAP_FUNCTION( | |
| 296 isolate, | |
| 297 compiler->CompileLoadInterceptor(*receiver, *holder, *name), | |
| 298 Code); | |
| 299 } | |
| 300 | |
| 301 | |
| 302 Handle<Code> StubCache::ComputeLoadInterceptor(Handle<String> name, | |
| 303 Handle<JSObject> receiver, | |
| 304 Handle<JSObject> holder) { | |
| 305 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | |
| 236 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, INTERCEPTOR); | 306 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, INTERCEPTOR); |
| 237 Object* code = receiver->map()->FindInCodeCache(name, flags); | 307 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
| 238 if (code->IsUndefined()) { | 308 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 239 LoadStubCompiler compiler; | 309 |
| 240 { MaybeObject* maybe_code = | 310 LoadStubCompiler compiler(isolate_); |
| 241 compiler.CompileLoadInterceptor(receiver, holder, name); | 311 Handle<Code> code = CompileLoadInterceptor(isolate_, |
| 242 if (!maybe_code->ToObject(&code)) return maybe_code; | 312 &compiler, |
| 243 } | 313 receiver, |
| 244 PROFILE(isolate_, | 314 holder, |
| 245 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); | 315 name); |
| 246 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); | 316 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
| 247 Object* result; | 317 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
| 248 { MaybeObject* maybe_result = | 318 UpdateMapCodeCache(isolate_, receiver, name, code); |
| 249 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 319 return code; |
| 250 if (!maybe_result->ToObject(&result)) return maybe_result; | 320 } |
| 251 } | 321 |
| 252 } | 322 |
| 253 return code; | 323 Handle<Code> StubCache::ComputeLoadNormal() { |
| 254 } | 324 return isolate_->builtins()->LoadIC_Normal(); |
| 255 | 325 } |
| 256 | 326 |
| 257 MaybeObject* StubCache::ComputeLoadNormal() { | 327 |
| 258 return isolate_->builtins()->builtin(Builtins::kLoadIC_Normal); | 328 // This static helper should be removed if |
| 259 } | 329 // LoadStubCompiler::CompileLoadGlobal is handlified. |
| 260 | 330 static Handle<Code> CompileLoadGlobal(Isolate* isolate, |
| 261 | 331 LoadStubCompiler* compiler, |
| 262 MaybeObject* StubCache::ComputeLoadGlobal(String* name, | 332 Handle<JSObject> receiver, |
| 263 JSObject* receiver, | 333 Handle<GlobalObject> holder, |
| 264 GlobalObject* holder, | 334 Handle<JSGlobalPropertyCell> cell, |
| 265 JSGlobalPropertyCell* cell, | 335 Handle<String> name, |
| 336 bool is_dont_delete) { | |
| 337 CALL_HEAP_FUNCTION( | |
| 338 isolate, | |
| 339 compiler->CompileLoadGlobal(*receiver, *holder, *cell, *name, | |
| 340 is_dont_delete), | |
| 341 Code); | |
| 342 } | |
| 343 | |
| 344 | |
| 345 Handle<Code> StubCache::ComputeLoadGlobal(Handle<String> name, | |
| 346 Handle<JSObject> receiver, | |
| 347 Handle<GlobalObject> holder, | |
| 348 Handle<JSGlobalPropertyCell> cell, | |
| 266 bool is_dont_delete) { | 349 bool is_dont_delete) { |
| 267 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 350 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
| 268 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, NORMAL); | 351 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, NORMAL); |
| 269 Object* code = receiver->map()->FindInCodeCache(name, flags); | 352 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
| 270 if (code->IsUndefined()) { | 353 if (probe->IsCode()) return Handle<Code>::cast(probe); |
| 271 LoadStubCompiler compiler; | 354 |
| 272 { MaybeObject* maybe_code = compiler.CompileLoadGlobal(receiver, | 355 LoadStubCompiler compiler(isolate_); |
| 273 holder, | 356 Handle<Code> code = CompileLoadGlobal(isolate_, |
| 274 cell, | 357 &compiler, |
| 275 name, | 358 receiver, |
| 276 is_dont_delete); | 359 holder, |
| 277 if (!maybe_code->ToObject(&code)) return maybe_code; | 360 cell, |
| 278 } | 361 name, |
| 279 PROFILE(isolate_, | 362 is_dont_delete); |
| 280 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); | 363 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
| 281 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); | 364 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
| 282 Object* result; | 365 UpdateMapCodeCache(isolate_, receiver, name, code); |
| 283 { MaybeObject* maybe_result = | 366 return code; |
| 284 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 367 } |
| 285 if (!maybe_result->ToObject(&result)) return maybe_result; | 368 |
| 286 } | |
| 287 } | |
| 288 return code; | |
| 289 } | |
| 290 | |
| 291 | 369 |
| 292 MaybeObject* StubCache::ComputeKeyedLoadField(String* name, | 370 MaybeObject* StubCache::ComputeKeyedLoadField(String* name, |
| 293 JSObject* receiver, | 371 JSObject* receiver, |
| 294 JSObject* holder, | 372 JSObject* holder, |
| 295 int field_index) { | 373 int field_index) { |
| 296 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 374 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
| 297 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, FIELD); | 375 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, FIELD); |
| 298 Object* code = receiver->map()->FindInCodeCache(name, flags); | 376 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 299 if (code->IsUndefined()) { | 377 if (code->IsUndefined()) { |
| 300 KeyedLoadStubCompiler compiler; | 378 HandleScope scope(isolate()); |
| 379 KeyedLoadStubCompiler compiler(isolate()); | |
| 301 { MaybeObject* maybe_code = | 380 { MaybeObject* maybe_code = |
| 302 compiler.CompileLoadField(name, receiver, holder, field_index); | 381 compiler.CompileLoadField(name, receiver, holder, field_index); |
| 303 if (!maybe_code->ToObject(&code)) return maybe_code; | 382 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 304 } | 383 } |
| 305 PROFILE(isolate_, | 384 PROFILE(isolate_, |
| 306 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 385 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
| 307 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 386 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
| 308 Object* result; | 387 Object* result; |
| 309 { MaybeObject* maybe_result = | 388 { MaybeObject* maybe_result = |
| 310 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 389 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 311 if (!maybe_result->ToObject(&result)) return maybe_result; | 390 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 312 } | 391 } |
| 313 } | 392 } |
| 314 return code; | 393 return code; |
| 315 } | 394 } |
| 316 | 395 |
| 317 | 396 |
| 318 MaybeObject* StubCache::ComputeKeyedLoadConstant(String* name, | 397 MaybeObject* StubCache::ComputeKeyedLoadConstant(String* name, |
| 319 JSObject* receiver, | 398 JSObject* receiver, |
| 320 JSObject* holder, | 399 JSObject* holder, |
| 321 Object* value) { | 400 Object* value) { |
| 322 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 401 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
| 323 Code::Flags flags = | 402 Code::Flags flags = |
| 324 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CONSTANT_FUNCTION); | 403 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CONSTANT_FUNCTION); |
| 325 Object* code = receiver->map()->FindInCodeCache(name, flags); | 404 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 326 if (code->IsUndefined()) { | 405 if (code->IsUndefined()) { |
| 327 KeyedLoadStubCompiler compiler; | 406 HandleScope scope(isolate()); |
| 407 KeyedLoadStubCompiler compiler(isolate()); | |
| 328 { MaybeObject* maybe_code = | 408 { MaybeObject* maybe_code = |
| 329 compiler.CompileLoadConstant(name, receiver, holder, value); | 409 compiler.CompileLoadConstant(name, receiver, holder, value); |
| 330 if (!maybe_code->ToObject(&code)) return maybe_code; | 410 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 331 } | 411 } |
| 332 PROFILE(isolate_, | 412 PROFILE(isolate_, |
| 333 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 413 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
| 334 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 414 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
| 335 Object* result; | 415 Object* result; |
| 336 { MaybeObject* maybe_result = | 416 { MaybeObject* maybe_result = |
| 337 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 417 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 338 if (!maybe_result->ToObject(&result)) return maybe_result; | 418 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 339 } | 419 } |
| 340 } | 420 } |
| 341 return code; | 421 return code; |
| 342 } | 422 } |
| 343 | 423 |
| 344 | 424 |
| 345 MaybeObject* StubCache::ComputeKeyedLoadInterceptor(String* name, | 425 MaybeObject* StubCache::ComputeKeyedLoadInterceptor(String* name, |
| 346 JSObject* receiver, | 426 JSObject* receiver, |
| 347 JSObject* holder) { | 427 JSObject* holder) { |
| 348 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 428 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
| 349 Code::Flags flags = | 429 Code::Flags flags = |
| 350 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, INTERCEPTOR); | 430 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, INTERCEPTOR); |
| 351 Object* code = receiver->map()->FindInCodeCache(name, flags); | 431 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 352 if (code->IsUndefined()) { | 432 if (code->IsUndefined()) { |
| 353 KeyedLoadStubCompiler compiler; | 433 HandleScope scope(isolate()); |
| 434 KeyedLoadStubCompiler compiler(isolate()); | |
| 354 { MaybeObject* maybe_code = | 435 { MaybeObject* maybe_code = |
| 355 compiler.CompileLoadInterceptor(receiver, holder, name); | 436 compiler.CompileLoadInterceptor(receiver, holder, name); |
| 356 if (!maybe_code->ToObject(&code)) return maybe_code; | 437 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 357 } | 438 } |
| 358 PROFILE(isolate_, | 439 PROFILE(isolate_, |
| 359 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 440 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
| 360 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 441 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
| 361 Object* result; | 442 Object* result; |
| 362 { MaybeObject* maybe_result = | 443 { MaybeObject* maybe_result = |
| 363 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 444 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 364 if (!maybe_result->ToObject(&result)) return maybe_result; | 445 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 365 } | 446 } |
| 366 } | 447 } |
| 367 return code; | 448 return code; |
| 368 } | 449 } |
| 369 | 450 |
| 370 | 451 |
| 371 MaybeObject* StubCache::ComputeKeyedLoadCallback(String* name, | 452 MaybeObject* StubCache::ComputeKeyedLoadCallback(String* name, |
| 372 JSObject* receiver, | 453 JSObject* receiver, |
| 373 JSObject* holder, | 454 JSObject* holder, |
| 374 AccessorInfo* callback) { | 455 AccessorInfo* callback) { |
| 375 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 456 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
| 376 Code::Flags flags = | 457 Code::Flags flags = |
| 377 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); | 458 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); |
| 378 Object* code = receiver->map()->FindInCodeCache(name, flags); | 459 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 379 if (code->IsUndefined()) { | 460 if (code->IsUndefined()) { |
| 380 KeyedLoadStubCompiler compiler; | 461 HandleScope scope(isolate()); |
| 462 KeyedLoadStubCompiler compiler(isolate()); | |
| 381 { MaybeObject* maybe_code = | 463 { MaybeObject* maybe_code = |
| 382 compiler.CompileLoadCallback(name, receiver, holder, callback); | 464 compiler.CompileLoadCallback(name, receiver, holder, callback); |
| 383 if (!maybe_code->ToObject(&code)) return maybe_code; | 465 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 384 } | 466 } |
| 385 PROFILE(isolate_, | 467 PROFILE(isolate_, |
| 386 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 468 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
| 387 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 469 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
| 388 Object* result; | 470 Object* result; |
| 389 { MaybeObject* maybe_result = | 471 { MaybeObject* maybe_result = |
| 390 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 472 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 391 if (!maybe_result->ToObject(&result)) return maybe_result; | 473 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 392 } | 474 } |
| 393 } | 475 } |
| 394 return code; | 476 return code; |
| 395 } | 477 } |
| 396 | 478 |
| 397 | 479 |
| 398 | 480 |
| 399 MaybeObject* StubCache::ComputeKeyedLoadArrayLength(String* name, | 481 MaybeObject* StubCache::ComputeKeyedLoadArrayLength(String* name, |
| 400 JSArray* receiver) { | 482 JSArray* receiver) { |
| 401 Code::Flags flags = | 483 Code::Flags flags = |
| 402 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); | 484 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); |
| 403 ASSERT(receiver->IsJSObject()); | 485 ASSERT(receiver->IsJSObject()); |
| 404 Object* code = receiver->map()->FindInCodeCache(name, flags); | 486 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 405 if (code->IsUndefined()) { | 487 if (code->IsUndefined()) { |
| 406 KeyedLoadStubCompiler compiler; | 488 HandleScope scope(isolate()); |
| 489 KeyedLoadStubCompiler compiler(isolate()); | |
| 407 { MaybeObject* maybe_code = compiler.CompileLoadArrayLength(name); | 490 { MaybeObject* maybe_code = compiler.CompileLoadArrayLength(name); |
| 408 if (!maybe_code->ToObject(&code)) return maybe_code; | 491 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 409 } | 492 } |
| 410 PROFILE(isolate_, | 493 PROFILE(isolate_, |
| 411 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 494 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
| 412 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 495 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
| 413 Object* result; | 496 Object* result; |
| 414 { MaybeObject* maybe_result = | 497 { MaybeObject* maybe_result = |
| 415 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 498 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 416 if (!maybe_result->ToObject(&result)) return maybe_result; | 499 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 417 } | 500 } |
| 418 } | 501 } |
| 419 return code; | 502 return code; |
| 420 } | 503 } |
| 421 | 504 |
| 422 | 505 |
| 423 MaybeObject* StubCache::ComputeKeyedLoadStringLength(String* name, | 506 MaybeObject* StubCache::ComputeKeyedLoadStringLength(String* name, |
| 424 String* receiver) { | 507 String* receiver) { |
| 425 Code::Flags flags = | 508 Code::Flags flags = |
| 426 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); | 509 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); |
| 427 Map* map = receiver->map(); | 510 Map* map = receiver->map(); |
| 428 Object* code = map->FindInCodeCache(name, flags); | 511 Object* code = map->FindInCodeCache(name, flags); |
| 429 if (code->IsUndefined()) { | 512 if (code->IsUndefined()) { |
| 430 KeyedLoadStubCompiler compiler; | 513 HandleScope scope(isolate()); |
| 514 KeyedLoadStubCompiler compiler(isolate()); | |
| 431 { MaybeObject* maybe_code = compiler.CompileLoadStringLength(name); | 515 { MaybeObject* maybe_code = compiler.CompileLoadStringLength(name); |
| 432 if (!maybe_code->ToObject(&code)) return maybe_code; | 516 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 433 } | 517 } |
| 434 PROFILE(isolate_, | 518 PROFILE(isolate_, |
| 435 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 519 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
| 436 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 520 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
| 437 Object* result; | 521 Object* result; |
| 438 { MaybeObject* maybe_result = map->UpdateCodeCache(name, Code::cast(code)); | 522 { MaybeObject* maybe_result = map->UpdateCodeCache(name, Code::cast(code)); |
| 439 if (!maybe_result->ToObject(&result)) return maybe_result; | 523 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 440 } | 524 } |
| 441 } | 525 } |
| 442 return code; | 526 return code; |
| 443 } | 527 } |
| 444 | 528 |
| 445 | 529 |
| 446 MaybeObject* StubCache::ComputeKeyedLoadFunctionPrototype( | 530 MaybeObject* StubCache::ComputeKeyedLoadFunctionPrototype( |
| 447 String* name, | 531 String* name, |
| 448 JSFunction* receiver) { | 532 JSFunction* receiver) { |
| 449 Code::Flags flags = | 533 Code::Flags flags = |
| 450 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); | 534 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); |
| 451 Object* code = receiver->map()->FindInCodeCache(name, flags); | 535 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 452 if (code->IsUndefined()) { | 536 if (code->IsUndefined()) { |
| 453 KeyedLoadStubCompiler compiler; | 537 HandleScope scope(isolate()); |
| 538 KeyedLoadStubCompiler compiler(isolate()); | |
| 454 { MaybeObject* maybe_code = compiler.CompileLoadFunctionPrototype(name); | 539 { MaybeObject* maybe_code = compiler.CompileLoadFunctionPrototype(name); |
| 455 if (!maybe_code->ToObject(&code)) return maybe_code; | 540 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 456 } | 541 } |
| 457 PROFILE(isolate_, | 542 PROFILE(isolate_, |
| 458 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 543 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
| 459 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 544 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
| 460 Object* result; | 545 Object* result; |
| 461 { MaybeObject* maybe_result = | 546 { MaybeObject* maybe_result = |
| 462 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 547 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 463 if (!maybe_result->ToObject(&result)) return maybe_result; | 548 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 464 } | 549 } |
| 465 } | 550 } |
| 466 return code; | 551 return code; |
| 467 } | 552 } |
| 468 | 553 |
| 469 | 554 |
| 470 MaybeObject* StubCache::ComputeStoreField(String* name, | 555 MaybeObject* StubCache::ComputeStoreField(String* name, |
| 471 JSObject* receiver, | 556 JSObject* receiver, |
| 472 int field_index, | 557 int field_index, |
| 473 Map* transition, | 558 Map* transition, |
| 474 StrictModeFlag strict_mode) { | 559 StrictModeFlag strict_mode) { |
| 475 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; | 560 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; |
| 476 Code::Flags flags = Code::ComputeMonomorphicFlags( | 561 Code::Flags flags = Code::ComputeMonomorphicFlags( |
| 477 Code::STORE_IC, type, strict_mode); | 562 Code::STORE_IC, type, strict_mode); |
| 478 Object* code = receiver->map()->FindInCodeCache(name, flags); | 563 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 479 if (code->IsUndefined()) { | 564 if (code->IsUndefined()) { |
| 480 StoreStubCompiler compiler(strict_mode); | 565 HandleScope scope(isolate()); |
| 566 StoreStubCompiler compiler(isolate(), strict_mode); | |
| 481 { MaybeObject* maybe_code = | 567 { MaybeObject* maybe_code = |
| 482 compiler.CompileStoreField(receiver, field_index, transition, name); | 568 compiler.CompileStoreField(receiver, field_index, transition, name); |
| 483 if (!maybe_code->ToObject(&code)) return maybe_code; | 569 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 484 } | 570 } |
| 485 PROFILE(isolate_, | 571 PROFILE(isolate_, |
| 486 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); | 572 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); |
| 487 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); | 573 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); |
| 488 Object* result; | 574 Object* result; |
| 489 { MaybeObject* maybe_result = | 575 { MaybeObject* maybe_result = |
| 490 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 576 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 507 strict_mode); | 593 strict_mode); |
| 508 String* name = is_store | 594 String* name = is_store |
| 509 ? isolate()->heap()->KeyedStoreElementMonomorphic_symbol() | 595 ? isolate()->heap()->KeyedStoreElementMonomorphic_symbol() |
| 510 : isolate()->heap()->KeyedLoadElementMonomorphic_symbol(); | 596 : isolate()->heap()->KeyedLoadElementMonomorphic_symbol(); |
| 511 Object* maybe_code = receiver->map()->FindInCodeCache(name, flags); | 597 Object* maybe_code = receiver->map()->FindInCodeCache(name, flags); |
| 512 if (!maybe_code->IsUndefined()) return Code::cast(maybe_code); | 598 if (!maybe_code->IsUndefined()) return Code::cast(maybe_code); |
| 513 | 599 |
| 514 MaybeObject* maybe_new_code = NULL; | 600 MaybeObject* maybe_new_code = NULL; |
| 515 Map* receiver_map = receiver->map(); | 601 Map* receiver_map = receiver->map(); |
| 516 if (is_store) { | 602 if (is_store) { |
| 517 KeyedStoreStubCompiler compiler(strict_mode); | 603 HandleScope scope(isolate()); |
| 604 KeyedStoreStubCompiler compiler(isolate(), strict_mode); | |
| 518 maybe_new_code = compiler.CompileStoreElement(receiver_map); | 605 maybe_new_code = compiler.CompileStoreElement(receiver_map); |
| 519 } else { | 606 } else { |
| 520 KeyedLoadStubCompiler compiler; | 607 HandleScope scope(isolate()); |
| 608 KeyedLoadStubCompiler compiler(isolate()); | |
| 521 maybe_new_code = compiler.CompileLoadElement(receiver_map); | 609 maybe_new_code = compiler.CompileLoadElement(receiver_map); |
| 522 } | 610 } |
| 523 Code* code; | 611 Code* code; |
| 524 if (!maybe_new_code->To(&code)) return maybe_new_code; | 612 if (!maybe_new_code->To(&code)) return maybe_new_code; |
| 525 if (is_store) { | 613 if (is_store) { |
| 526 PROFILE(isolate_, | 614 PROFILE(isolate_, |
| 527 CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, | 615 CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, |
| 528 Code::cast(code), 0)); | 616 Code::cast(code), 0)); |
| 529 } else { | 617 } else { |
| 530 PROFILE(isolate_, | 618 PROFILE(isolate_, |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 549 | 637 |
| 550 | 638 |
| 551 MaybeObject* StubCache::ComputeStoreGlobal(String* name, | 639 MaybeObject* StubCache::ComputeStoreGlobal(String* name, |
| 552 GlobalObject* receiver, | 640 GlobalObject* receiver, |
| 553 JSGlobalPropertyCell* cell, | 641 JSGlobalPropertyCell* cell, |
| 554 StrictModeFlag strict_mode) { | 642 StrictModeFlag strict_mode) { |
| 555 Code::Flags flags = Code::ComputeMonomorphicFlags( | 643 Code::Flags flags = Code::ComputeMonomorphicFlags( |
| 556 Code::STORE_IC, NORMAL, strict_mode); | 644 Code::STORE_IC, NORMAL, strict_mode); |
| 557 Object* code = receiver->map()->FindInCodeCache(name, flags); | 645 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 558 if (code->IsUndefined()) { | 646 if (code->IsUndefined()) { |
| 559 StoreStubCompiler compiler(strict_mode); | 647 HandleScope scope(isolate()); |
| 648 StoreStubCompiler compiler(isolate(), strict_mode); | |
| 560 { MaybeObject* maybe_code = | 649 { MaybeObject* maybe_code = |
| 561 compiler.CompileStoreGlobal(receiver, cell, name); | 650 compiler.CompileStoreGlobal(receiver, cell, name); |
| 562 if (!maybe_code->ToObject(&code)) return maybe_code; | 651 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 563 } | 652 } |
| 564 PROFILE(isolate_, | 653 PROFILE(isolate_, |
| 565 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); | 654 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); |
| 566 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); | 655 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); |
| 567 Object* result; | 656 Object* result; |
| 568 { MaybeObject* maybe_result = | 657 { MaybeObject* maybe_result = |
| 569 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 658 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 570 if (!maybe_result->ToObject(&result)) return maybe_result; | 659 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 571 } | 660 } |
| 572 } | 661 } |
| 573 return code; | 662 return code; |
| 574 } | 663 } |
| 575 | 664 |
| 576 | 665 |
| 577 MaybeObject* StubCache::ComputeStoreCallback( | 666 MaybeObject* StubCache::ComputeStoreCallback( |
| 578 String* name, | 667 String* name, |
| 579 JSObject* receiver, | 668 JSObject* receiver, |
| 580 AccessorInfo* callback, | 669 AccessorInfo* callback, |
| 581 StrictModeFlag strict_mode) { | 670 StrictModeFlag strict_mode) { |
| 582 ASSERT(v8::ToCData<Address>(callback->setter()) != 0); | 671 ASSERT(v8::ToCData<Address>(callback->setter()) != 0); |
| 583 Code::Flags flags = Code::ComputeMonomorphicFlags( | 672 Code::Flags flags = Code::ComputeMonomorphicFlags( |
| 584 Code::STORE_IC, CALLBACKS, strict_mode); | 673 Code::STORE_IC, CALLBACKS, strict_mode); |
| 585 Object* code = receiver->map()->FindInCodeCache(name, flags); | 674 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 586 if (code->IsUndefined()) { | 675 if (code->IsUndefined()) { |
| 587 StoreStubCompiler compiler(strict_mode); | 676 HandleScope scope(isolate()); |
| 677 StoreStubCompiler compiler(isolate(), strict_mode); | |
| 588 { MaybeObject* maybe_code = | 678 { MaybeObject* maybe_code = |
| 589 compiler.CompileStoreCallback(receiver, callback, name); | 679 compiler.CompileStoreCallback(receiver, callback, name); |
| 590 if (!maybe_code->ToObject(&code)) return maybe_code; | 680 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 591 } | 681 } |
| 592 PROFILE(isolate_, | 682 PROFILE(isolate_, |
| 593 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); | 683 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); |
| 594 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); | 684 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); |
| 595 Object* result; | 685 Object* result; |
| 596 { MaybeObject* maybe_result = | 686 { MaybeObject* maybe_result = |
| 597 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 687 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 598 if (!maybe_result->ToObject(&result)) return maybe_result; | 688 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 599 } | 689 } |
| 600 } | 690 } |
| 601 return code; | 691 return code; |
| 602 } | 692 } |
| 603 | 693 |
| 604 | 694 |
| 605 MaybeObject* StubCache::ComputeStoreInterceptor( | 695 MaybeObject* StubCache::ComputeStoreInterceptor( |
| 606 String* name, | 696 String* name, |
| 607 JSObject* receiver, | 697 JSObject* receiver, |
| 608 StrictModeFlag strict_mode) { | 698 StrictModeFlag strict_mode) { |
| 609 Code::Flags flags = Code::ComputeMonomorphicFlags( | 699 Code::Flags flags = Code::ComputeMonomorphicFlags( |
| 610 Code::STORE_IC, INTERCEPTOR, strict_mode); | 700 Code::STORE_IC, INTERCEPTOR, strict_mode); |
| 611 Object* code = receiver->map()->FindInCodeCache(name, flags); | 701 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 612 if (code->IsUndefined()) { | 702 if (code->IsUndefined()) { |
| 613 StoreStubCompiler compiler(strict_mode); | 703 HandleScope scope(isolate()); |
| 704 StoreStubCompiler compiler(isolate(), strict_mode); | |
| 614 { MaybeObject* maybe_code = | 705 { MaybeObject* maybe_code = |
| 615 compiler.CompileStoreInterceptor(receiver, name); | 706 compiler.CompileStoreInterceptor(receiver, name); |
| 616 if (!maybe_code->ToObject(&code)) return maybe_code; | 707 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 617 } | 708 } |
| 618 PROFILE(isolate_, | 709 PROFILE(isolate_, |
| 619 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); | 710 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); |
| 620 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); | 711 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); |
| 621 Object* result; | 712 Object* result; |
| 622 { MaybeObject* maybe_result = | 713 { MaybeObject* maybe_result = |
| 623 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 714 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 624 if (!maybe_result->ToObject(&result)) return maybe_result; | 715 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 625 } | 716 } |
| 626 } | 717 } |
| 627 return code; | 718 return code; |
| 628 } | 719 } |
| 629 | 720 |
| 630 | 721 |
| 631 MaybeObject* StubCache::ComputeKeyedStoreField(String* name, | 722 MaybeObject* StubCache::ComputeKeyedStoreField(String* name, |
| 632 JSObject* receiver, | 723 JSObject* receiver, |
| 633 int field_index, | 724 int field_index, |
| 634 Map* transition, | 725 Map* transition, |
| 635 StrictModeFlag strict_mode) { | 726 StrictModeFlag strict_mode) { |
| 636 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; | 727 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; |
| 637 Code::Flags flags = Code::ComputeMonomorphicFlags( | 728 Code::Flags flags = Code::ComputeMonomorphicFlags( |
| 638 Code::KEYED_STORE_IC, type, strict_mode); | 729 Code::KEYED_STORE_IC, type, strict_mode); |
| 639 Object* code = receiver->map()->FindInCodeCache(name, flags); | 730 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 640 if (code->IsUndefined()) { | 731 if (code->IsUndefined()) { |
| 641 KeyedStoreStubCompiler compiler(strict_mode); | 732 HandleScope scope(isolate()); |
| 733 KeyedStoreStubCompiler compiler(isolate(), strict_mode); | |
| 642 { MaybeObject* maybe_code = | 734 { MaybeObject* maybe_code = |
| 643 compiler.CompileStoreField(receiver, field_index, transition, name); | 735 compiler.CompileStoreField(receiver, field_index, transition, name); |
| 644 if (!maybe_code->ToObject(&code)) return maybe_code; | 736 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 645 } | 737 } |
| 646 PROFILE(isolate(), | 738 PROFILE(isolate(), |
| 647 CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, | 739 CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, |
| 648 Code::cast(code), name)); | 740 Code::cast(code), name)); |
| 649 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, name, Code::cast(code))); | 741 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, name, Code::cast(code))); |
| 650 Object* result; | 742 Object* result; |
| 651 { MaybeObject* maybe_result = | 743 { MaybeObject* maybe_result = |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 687 cache_holder, | 779 cache_holder, |
| 688 argc); | 780 argc); |
| 689 Object* code = map_holder->map()->FindInCodeCache(name, flags); | 781 Object* code = map_holder->map()->FindInCodeCache(name, flags); |
| 690 if (code->IsUndefined()) { | 782 if (code->IsUndefined()) { |
| 691 // If the function hasn't been compiled yet, we cannot do it now | 783 // If the function hasn't been compiled yet, we cannot do it now |
| 692 // because it may cause GC. To avoid this issue, we return an | 784 // because it may cause GC. To avoid this issue, we return an |
| 693 // internal error which will make sure we do not update any | 785 // internal error which will make sure we do not update any |
| 694 // caches. | 786 // caches. |
| 695 if (!function->is_compiled()) return Failure::InternalError(); | 787 if (!function->is_compiled()) return Failure::InternalError(); |
| 696 // Compile the stub - only create stubs for fully compiled functions. | 788 // Compile the stub - only create stubs for fully compiled functions. |
| 697 CallStubCompiler compiler(argc, kind, extra_ic_state, cache_holder); | 789 HandleScope scope(isolate()); |
| 790 CallStubCompiler compiler(isolate(), argc, kind, extra_ic_state, | |
| 791 cache_holder); | |
| 698 { MaybeObject* maybe_code = | 792 { MaybeObject* maybe_code = |
| 699 compiler.CompileCallConstant(object, holder, function, name, check); | 793 compiler.CompileCallConstant(object, holder, function, name, check); |
| 700 if (!maybe_code->ToObject(&code)) return maybe_code; | 794 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 701 } | 795 } |
| 702 Code::cast(code)->set_check_type(check); | 796 Code::cast(code)->set_check_type(check); |
| 703 ASSERT_EQ(flags, Code::cast(code)->flags()); | 797 ASSERT_EQ(flags, Code::cast(code)->flags()); |
| 704 PROFILE(isolate_, | 798 PROFILE(isolate_, |
| 705 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), | 799 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), |
| 706 Code::cast(code), name)); | 800 Code::cast(code), name)); |
| 707 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); | 801 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 734 object = holder; | 828 object = holder; |
| 735 } | 829 } |
| 736 | 830 |
| 737 Code::Flags flags = Code::ComputeMonomorphicFlags(kind, | 831 Code::Flags flags = Code::ComputeMonomorphicFlags(kind, |
| 738 FIELD, | 832 FIELD, |
| 739 extra_ic_state, | 833 extra_ic_state, |
| 740 cache_holder, | 834 cache_holder, |
| 741 argc); | 835 argc); |
| 742 Object* code = map_holder->map()->FindInCodeCache(name, flags); | 836 Object* code = map_holder->map()->FindInCodeCache(name, flags); |
| 743 if (code->IsUndefined()) { | 837 if (code->IsUndefined()) { |
| 744 CallStubCompiler compiler(argc, kind, extra_ic_state, cache_holder); | 838 HandleScope scope(isolate()); |
| 839 CallStubCompiler compiler(isolate(), argc, kind, extra_ic_state, | |
| 840 cache_holder); | |
| 745 { MaybeObject* maybe_code = | 841 { MaybeObject* maybe_code = |
| 746 compiler.CompileCallField(JSObject::cast(object), | 842 compiler.CompileCallField(JSObject::cast(object), |
| 747 holder, | 843 holder, |
| 748 index, | 844 index, |
| 749 name); | 845 name); |
| 750 if (!maybe_code->ToObject(&code)) return maybe_code; | 846 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 751 } | 847 } |
| 752 ASSERT_EQ(flags, Code::cast(code)->flags()); | 848 ASSERT_EQ(flags, Code::cast(code)->flags()); |
| 753 PROFILE(isolate_, | 849 PROFILE(isolate_, |
| 754 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), | 850 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 783 object = holder; | 879 object = holder; |
| 784 } | 880 } |
| 785 | 881 |
| 786 Code::Flags flags = Code::ComputeMonomorphicFlags(kind, | 882 Code::Flags flags = Code::ComputeMonomorphicFlags(kind, |
| 787 INTERCEPTOR, | 883 INTERCEPTOR, |
| 788 extra_ic_state, | 884 extra_ic_state, |
| 789 cache_holder, | 885 cache_holder, |
| 790 argc); | 886 argc); |
| 791 Object* code = map_holder->map()->FindInCodeCache(name, flags); | 887 Object* code = map_holder->map()->FindInCodeCache(name, flags); |
| 792 if (code->IsUndefined()) { | 888 if (code->IsUndefined()) { |
| 793 CallStubCompiler compiler(argc, kind, extra_ic_state, cache_holder); | 889 HandleScope scope(isolate()); |
| 890 CallStubCompiler compiler(isolate(), argc, kind, extra_ic_state, | |
| 891 cache_holder); | |
| 794 { MaybeObject* maybe_code = | 892 { MaybeObject* maybe_code = |
| 795 compiler.CompileCallInterceptor(JSObject::cast(object), holder, name); | 893 compiler.CompileCallInterceptor(JSObject::cast(object), holder, name); |
| 796 if (!maybe_code->ToObject(&code)) return maybe_code; | 894 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 797 } | 895 } |
| 798 ASSERT_EQ(flags, Code::cast(code)->flags()); | 896 ASSERT_EQ(flags, Code::cast(code)->flags()); |
| 799 PROFILE(isolate(), | 897 PROFILE(isolate(), |
| 800 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), | 898 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), |
| 801 Code::cast(code), name)); | 899 Code::cast(code), name)); |
| 802 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); | 900 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); |
| 803 Object* result; | 901 Object* result; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 839 extra_ic_state, | 937 extra_ic_state, |
| 840 cache_holder, | 938 cache_holder, |
| 841 argc); | 939 argc); |
| 842 Object* code = map_holder->map()->FindInCodeCache(name, flags); | 940 Object* code = map_holder->map()->FindInCodeCache(name, flags); |
| 843 if (code->IsUndefined()) { | 941 if (code->IsUndefined()) { |
| 844 // If the function hasn't been compiled yet, we cannot do it now | 942 // If the function hasn't been compiled yet, we cannot do it now |
| 845 // because it may cause GC. To avoid this issue, we return an | 943 // because it may cause GC. To avoid this issue, we return an |
| 846 // internal error which will make sure we do not update any | 944 // internal error which will make sure we do not update any |
| 847 // caches. | 945 // caches. |
| 848 if (!function->is_compiled()) return Failure::InternalError(); | 946 if (!function->is_compiled()) return Failure::InternalError(); |
| 849 CallStubCompiler compiler(argc, kind, extra_ic_state, cache_holder); | 947 HandleScope scope(isolate()); |
| 948 CallStubCompiler compiler(isolate(), argc, kind, extra_ic_state, | |
| 949 cache_holder); | |
| 850 { MaybeObject* maybe_code = | 950 { MaybeObject* maybe_code = |
| 851 compiler.CompileCallGlobal(receiver, holder, cell, function, name); | 951 compiler.CompileCallGlobal(receiver, holder, cell, function, name); |
| 852 if (!maybe_code->ToObject(&code)) return maybe_code; | 952 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 853 } | 953 } |
| 854 ASSERT_EQ(flags, Code::cast(code)->flags()); | 954 ASSERT_EQ(flags, Code::cast(code)->flags()); |
| 855 PROFILE(isolate(), | 955 PROFILE(isolate(), |
| 856 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), | 956 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), |
| 857 Code::cast(code), name)); | 957 Code::cast(code), name)); |
| 858 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); | 958 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); |
| 859 Object* result; | 959 Object* result; |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 942 Code::Flags flags = Code::ComputeFlags(kind, | 1042 Code::Flags flags = Code::ComputeFlags(kind, |
| 943 UNINITIALIZED, | 1043 UNINITIALIZED, |
| 944 extra_state, | 1044 extra_state, |
| 945 NORMAL, | 1045 NORMAL, |
| 946 argc); | 1046 argc); |
| 947 Object* probe; | 1047 Object* probe; |
| 948 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); | 1048 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); |
| 949 if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 1049 if (!maybe_probe->ToObject(&probe)) return maybe_probe; |
| 950 } | 1050 } |
| 951 if (!probe->IsUndefined()) return probe; | 1051 if (!probe->IsUndefined()) return probe; |
| 952 StubCompiler compiler; | 1052 HandleScope scope(isolate()); |
| 1053 StubCompiler compiler(isolate()); | |
| 953 return FillCache(isolate_, compiler.CompileCallInitialize(flags)); | 1054 return FillCache(isolate_, compiler.CompileCallInitialize(flags)); |
| 954 } | 1055 } |
| 955 | 1056 |
| 956 | 1057 |
| 957 Handle<Code> StubCache::ComputeCallInitialize(int argc, | 1058 Handle<Code> StubCache::ComputeCallInitialize(int argc, |
| 958 RelocInfo::Mode mode) { | 1059 RelocInfo::Mode mode) { |
| 959 CALL_HEAP_FUNCTION(isolate_, | 1060 CALL_HEAP_FUNCTION(isolate_, |
| 960 ComputeCallInitialize(argc, mode, Code::CALL_IC), | 1061 ComputeCallInitialize(argc, mode, Code::CALL_IC), |
| 961 Code); | 1062 Code); |
| 962 } | 1063 } |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 977 Code::Flags flags = Code::ComputeFlags(kind, | 1078 Code::Flags flags = Code::ComputeFlags(kind, |
| 978 PREMONOMORPHIC, | 1079 PREMONOMORPHIC, |
| 979 extra_ic_state, | 1080 extra_ic_state, |
| 980 NORMAL, | 1081 NORMAL, |
| 981 argc); | 1082 argc); |
| 982 Object* probe; | 1083 Object* probe; |
| 983 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); | 1084 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); |
| 984 if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 1085 if (!maybe_probe->ToObject(&probe)) return maybe_probe; |
| 985 } | 1086 } |
| 986 if (!probe->IsUndefined()) return probe; | 1087 if (!probe->IsUndefined()) return probe; |
| 987 StubCompiler compiler; | 1088 HandleScope scope(isolate()); |
| 1089 StubCompiler compiler(isolate()); | |
| 988 return FillCache(isolate_, compiler.CompileCallPreMonomorphic(flags)); | 1090 return FillCache(isolate_, compiler.CompileCallPreMonomorphic(flags)); |
| 989 } | 1091 } |
| 990 | 1092 |
| 991 | 1093 |
| 992 MaybeObject* StubCache::ComputeCallNormal(int argc, | 1094 MaybeObject* StubCache::ComputeCallNormal(int argc, |
| 993 Code::Kind kind, | 1095 Code::Kind kind, |
| 994 Code::ExtraICState extra_ic_state) { | 1096 Code::ExtraICState extra_ic_state) { |
| 995 Code::Flags flags = Code::ComputeFlags(kind, | 1097 Code::Flags flags = Code::ComputeFlags(kind, |
| 996 MONOMORPHIC, | 1098 MONOMORPHIC, |
| 997 extra_ic_state, | 1099 extra_ic_state, |
| 998 NORMAL, | 1100 NORMAL, |
| 999 argc); | 1101 argc); |
| 1000 Object* probe; | 1102 Object* probe; |
| 1001 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); | 1103 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); |
| 1002 if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 1104 if (!maybe_probe->ToObject(&probe)) return maybe_probe; |
| 1003 } | 1105 } |
| 1004 if (!probe->IsUndefined()) return probe; | 1106 if (!probe->IsUndefined()) return probe; |
| 1005 StubCompiler compiler; | 1107 HandleScope scope(isolate()); |
| 1108 StubCompiler compiler(isolate()); | |
| 1006 return FillCache(isolate_, compiler.CompileCallNormal(flags)); | 1109 return FillCache(isolate_, compiler.CompileCallNormal(flags)); |
| 1007 } | 1110 } |
| 1008 | 1111 |
| 1009 | 1112 |
| 1010 MaybeObject* StubCache::ComputeCallArguments(int argc, Code::Kind kind) { | 1113 MaybeObject* StubCache::ComputeCallArguments(int argc, Code::Kind kind) { |
| 1011 ASSERT(kind == Code::KEYED_CALL_IC); | 1114 ASSERT(kind == Code::KEYED_CALL_IC); |
| 1012 Code::Flags flags = Code::ComputeFlags(kind, | 1115 Code::Flags flags = Code::ComputeFlags(kind, |
| 1013 MEGAMORPHIC, | 1116 MEGAMORPHIC, |
| 1014 Code::kNoExtraICState, | 1117 Code::kNoExtraICState, |
| 1015 NORMAL, | 1118 NORMAL, |
| 1016 argc); | 1119 argc); |
| 1017 Object* probe; | 1120 Object* probe; |
| 1018 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); | 1121 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); |
| 1019 if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 1122 if (!maybe_probe->ToObject(&probe)) return maybe_probe; |
| 1020 } | 1123 } |
| 1021 if (!probe->IsUndefined()) return probe; | 1124 if (!probe->IsUndefined()) return probe; |
| 1022 StubCompiler compiler; | 1125 HandleScope scope(isolate()); |
| 1126 StubCompiler compiler(isolate()); | |
| 1023 return FillCache(isolate_, compiler.CompileCallArguments(flags)); | 1127 return FillCache(isolate_, compiler.CompileCallArguments(flags)); |
| 1024 } | 1128 } |
| 1025 | 1129 |
| 1026 | 1130 |
| 1027 MaybeObject* StubCache::ComputeCallMegamorphic( | 1131 MaybeObject* StubCache::ComputeCallMegamorphic( |
| 1028 int argc, | 1132 int argc, |
| 1029 Code::Kind kind, | 1133 Code::Kind kind, |
| 1030 Code::ExtraICState extra_ic_state) { | 1134 Code::ExtraICState extra_ic_state) { |
| 1031 Code::Flags flags = Code::ComputeFlags(kind, | 1135 Code::Flags flags = Code::ComputeFlags(kind, |
| 1032 MEGAMORPHIC, | 1136 MEGAMORPHIC, |
| 1033 extra_ic_state, | 1137 extra_ic_state, |
| 1034 NORMAL, | 1138 NORMAL, |
| 1035 argc); | 1139 argc); |
| 1036 Object* probe; | 1140 Object* probe; |
| 1037 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); | 1141 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); |
| 1038 if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 1142 if (!maybe_probe->ToObject(&probe)) return maybe_probe; |
| 1039 } | 1143 } |
| 1040 if (!probe->IsUndefined()) return probe; | 1144 if (!probe->IsUndefined()) return probe; |
| 1041 StubCompiler compiler; | 1145 HandleScope scope(isolate()); |
| 1146 StubCompiler compiler(isolate()); | |
| 1042 return FillCache(isolate_, compiler.CompileCallMegamorphic(flags)); | 1147 return FillCache(isolate_, compiler.CompileCallMegamorphic(flags)); |
| 1043 } | 1148 } |
| 1044 | 1149 |
| 1045 | 1150 |
| 1046 MaybeObject* StubCache::ComputeCallMiss(int argc, | 1151 MaybeObject* StubCache::ComputeCallMiss(int argc, |
| 1047 Code::Kind kind, | 1152 Code::Kind kind, |
| 1048 Code::ExtraICState extra_ic_state) { | 1153 Code::ExtraICState extra_ic_state) { |
| 1049 // MONOMORPHIC_PROTOTYPE_FAILURE state is used to make sure that miss stubs | 1154 // MONOMORPHIC_PROTOTYPE_FAILURE state is used to make sure that miss stubs |
| 1050 // and monomorphic stubs are not mixed up together in the stub cache. | 1155 // and monomorphic stubs are not mixed up together in the stub cache. |
| 1051 Code::Flags flags = Code::ComputeFlags(kind, | 1156 Code::Flags flags = Code::ComputeFlags(kind, |
| 1052 MONOMORPHIC_PROTOTYPE_FAILURE, | 1157 MONOMORPHIC_PROTOTYPE_FAILURE, |
| 1053 extra_ic_state, | 1158 extra_ic_state, |
| 1054 NORMAL, | 1159 NORMAL, |
| 1055 argc, | 1160 argc, |
| 1056 OWN_MAP); | 1161 OWN_MAP); |
| 1057 Object* probe; | 1162 Object* probe; |
| 1058 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); | 1163 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); |
| 1059 if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 1164 if (!maybe_probe->ToObject(&probe)) return maybe_probe; |
| 1060 } | 1165 } |
| 1061 if (!probe->IsUndefined()) return probe; | 1166 if (!probe->IsUndefined()) return probe; |
| 1062 StubCompiler compiler; | 1167 HandleScope scope(isolate()); |
| 1168 StubCompiler compiler(isolate()); | |
| 1063 return FillCache(isolate_, compiler.CompileCallMiss(flags)); | 1169 return FillCache(isolate_, compiler.CompileCallMiss(flags)); |
| 1064 } | 1170 } |
| 1065 | 1171 |
| 1066 | 1172 |
| 1067 #ifdef ENABLE_DEBUGGER_SUPPORT | 1173 #ifdef ENABLE_DEBUGGER_SUPPORT |
| 1068 MaybeObject* StubCache::ComputeCallDebugBreak( | 1174 MaybeObject* StubCache::ComputeCallDebugBreak( |
| 1069 int argc, | 1175 int argc, |
| 1070 Code::Kind kind) { | 1176 Code::Kind kind) { |
| 1071 // Extra IC state is irrelevant for debug break ICs. They jump to | 1177 // Extra IC state is irrelevant for debug break ICs. They jump to |
| 1072 // the actual call ic to carry out the work. | 1178 // the actual call ic to carry out the work. |
| 1073 Code::Flags flags = Code::ComputeFlags(kind, | 1179 Code::Flags flags = Code::ComputeFlags(kind, |
| 1074 DEBUG_BREAK, | 1180 DEBUG_BREAK, |
| 1075 Code::kNoExtraICState, | 1181 Code::kNoExtraICState, |
| 1076 NORMAL, | 1182 NORMAL, |
| 1077 argc); | 1183 argc); |
| 1078 Object* probe; | 1184 Object* probe; |
| 1079 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); | 1185 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); |
| 1080 if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 1186 if (!maybe_probe->ToObject(&probe)) return maybe_probe; |
| 1081 } | 1187 } |
| 1082 if (!probe->IsUndefined()) return probe; | 1188 if (!probe->IsUndefined()) return probe; |
| 1083 StubCompiler compiler; | 1189 HandleScope scope(isolate()); |
| 1190 StubCompiler compiler(isolate()); | |
| 1084 return FillCache(isolate_, compiler.CompileCallDebugBreak(flags)); | 1191 return FillCache(isolate_, compiler.CompileCallDebugBreak(flags)); |
| 1085 } | 1192 } |
| 1086 | 1193 |
| 1087 | 1194 |
| 1088 MaybeObject* StubCache::ComputeCallDebugPrepareStepIn( | 1195 MaybeObject* StubCache::ComputeCallDebugPrepareStepIn( |
| 1089 int argc, | 1196 int argc, |
| 1090 Code::Kind kind) { | 1197 Code::Kind kind) { |
| 1091 // Extra IC state is irrelevant for debug break ICs. They jump to | 1198 // Extra IC state is irrelevant for debug break ICs. They jump to |
| 1092 // the actual call ic to carry out the work. | 1199 // the actual call ic to carry out the work. |
| 1093 Code::Flags flags = Code::ComputeFlags(kind, | 1200 Code::Flags flags = Code::ComputeFlags(kind, |
| 1094 DEBUG_PREPARE_STEP_IN, | 1201 DEBUG_PREPARE_STEP_IN, |
| 1095 Code::kNoExtraICState, | 1202 Code::kNoExtraICState, |
| 1096 NORMAL, | 1203 NORMAL, |
| 1097 argc); | 1204 argc); |
| 1098 Object* probe; | 1205 Object* probe; |
| 1099 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); | 1206 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); |
| 1100 if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 1207 if (!maybe_probe->ToObject(&probe)) return maybe_probe; |
| 1101 } | 1208 } |
| 1102 if (!probe->IsUndefined()) return probe; | 1209 if (!probe->IsUndefined()) return probe; |
| 1103 StubCompiler compiler; | 1210 HandleScope scope(isolate()); |
| 1211 StubCompiler compiler(isolate()); | |
| 1104 return FillCache(isolate_, compiler.CompileCallDebugPrepareStepIn(flags)); | 1212 return FillCache(isolate_, compiler.CompileCallDebugPrepareStepIn(flags)); |
| 1105 } | 1213 } |
| 1106 #endif | 1214 #endif |
| 1107 | 1215 |
| 1108 | 1216 |
| 1109 void StubCache::Clear() { | 1217 void StubCache::Clear() { |
| 1110 Code* empty = isolate_->builtins()->builtin(Builtins::kIllegal); | 1218 Code* empty = isolate_->builtins()->builtin(Builtins::kIllegal); |
| 1111 for (int i = 0; i < kPrimaryTableSize; i++) { | 1219 for (int i = 0; i < kPrimaryTableSize; i++) { |
| 1112 Code* code = primary_[i].value; | 1220 Code* code = primary_[i].value; |
| 1113 if (code != empty && !code->is_pregenerated()) { | 1221 if (code != empty && !code->is_pregenerated()) { |
| (...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1685 return result; | 1793 return result; |
| 1686 } | 1794 } |
| 1687 | 1795 |
| 1688 | 1796 |
| 1689 void KeyedStoreStubCompiler::GenerateStoreDictionaryElement( | 1797 void KeyedStoreStubCompiler::GenerateStoreDictionaryElement( |
| 1690 MacroAssembler* masm) { | 1798 MacroAssembler* masm) { |
| 1691 KeyedStoreIC::GenerateSlow(masm); | 1799 KeyedStoreIC::GenerateSlow(masm); |
| 1692 } | 1800 } |
| 1693 | 1801 |
| 1694 | 1802 |
| 1695 CallStubCompiler::CallStubCompiler(int argc, | 1803 CallStubCompiler::CallStubCompiler(Isolate* isolate, |
| 1804 int argc, | |
| 1696 Code::Kind kind, | 1805 Code::Kind kind, |
| 1697 Code::ExtraICState extra_ic_state, | 1806 Code::ExtraICState extra_ic_state, |
| 1698 InlineCacheHolderFlag cache_holder) | 1807 InlineCacheHolderFlag cache_holder) |
| 1699 : arguments_(argc), | 1808 : StubCompiler(isolate), |
| 1809 arguments_(argc), | |
| 1700 kind_(kind), | 1810 kind_(kind), |
| 1701 extra_ic_state_(extra_ic_state), | 1811 extra_ic_state_(extra_ic_state), |
| 1702 cache_holder_(cache_holder) { | 1812 cache_holder_(cache_holder) { |
| 1703 } | 1813 } |
| 1704 | 1814 |
| 1705 | 1815 |
| 1706 bool CallStubCompiler::HasCustomCallGenerator(JSFunction* function) { | 1816 bool CallStubCompiler::HasCustomCallGenerator(JSFunction* function) { |
| 1707 SharedFunctionInfo* info = function->shared(); | 1817 SharedFunctionInfo* info = function->shared(); |
| 1708 if (info->HasBuiltinFunctionId()) { | 1818 if (info->HasBuiltinFunctionId()) { |
| 1709 BuiltinFunctionId id = info->builtin_function_id(); | 1819 BuiltinFunctionId id = info->builtin_function_id(); |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1846 expected_receiver_type_ = | 1956 expected_receiver_type_ = |
| 1847 FunctionTemplateInfo::cast(signature->receiver()); | 1957 FunctionTemplateInfo::cast(signature->receiver()); |
| 1848 } | 1958 } |
| 1849 } | 1959 } |
| 1850 | 1960 |
| 1851 is_simple_api_call_ = true; | 1961 is_simple_api_call_ = true; |
| 1852 } | 1962 } |
| 1853 | 1963 |
| 1854 | 1964 |
| 1855 } } // namespace v8::internal | 1965 } } // namespace v8::internal |
| OLD | NEW |