OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
214 handler = | 214 handler = |
215 compiler.CompileLoadNonexistent(receiver, current, cache_name, global); | 215 compiler.CompileLoadNonexistent(receiver, current, cache_name, global); |
216 JSObject::UpdateMapCodeCache(receiver, cache_name, handler); | 216 JSObject::UpdateMapCodeCache(receiver, cache_name, handler); |
217 return handler; | 217 return handler; |
218 } | 218 } |
219 | 219 |
220 | 220 |
221 Handle<Code> StubCache::ComputeLoadField(Handle<Name> name, | 221 Handle<Code> StubCache::ComputeLoadField(Handle<Name> name, |
222 Handle<JSObject> receiver, | 222 Handle<JSObject> receiver, |
223 Handle<JSObject> holder, | 223 Handle<JSObject> holder, |
224 PropertyIndex field) { | 224 PropertyIndex field, |
| 225 Representation representation) { |
225 if (receiver.is_identical_to(holder)) { | 226 if (receiver.is_identical_to(holder)) { |
226 LoadFieldStub stub(field.is_inobject(holder), | 227 LoadFieldStub stub(field.is_inobject(holder), |
227 field.translate(holder)); | 228 field.translate(holder), |
| 229 representation); |
228 return stub.GetCode(isolate()); | 230 return stub.GetCode(isolate()); |
229 } | 231 } |
230 | 232 |
231 Handle<JSObject> stub_holder = StubHolder(receiver, holder); | 233 Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
232 Handle<Code> stub = FindHandler( | 234 Handle<Code> stub = FindHandler( |
233 name, receiver, stub_holder, Code::LOAD_IC, Code::FIELD); | 235 name, receiver, stub_holder, Code::LOAD_IC, Code::FIELD); |
234 if (!stub.is_null()) return stub; | 236 if (!stub.is_null()) return stub; |
235 | 237 |
236 LoadStubCompiler compiler(isolate_); | 238 LoadStubCompiler compiler(isolate_); |
237 Handle<Code> handler = | 239 Handle<Code> handler = |
238 compiler.CompileLoadField(receiver, holder, name, field); | 240 compiler.CompileLoadField(receiver, holder, name, field, representation); |
239 JSObject::UpdateMapCodeCache(stub_holder, name, handler); | 241 JSObject::UpdateMapCodeCache(stub_holder, name, handler); |
240 return handler; | 242 return handler; |
241 } | 243 } |
242 | 244 |
243 | 245 |
244 Handle<Code> StubCache::ComputeLoadCallback( | 246 Handle<Code> StubCache::ComputeLoadCallback( |
245 Handle<Name> name, | 247 Handle<Name> name, |
246 Handle<JSObject> receiver, | 248 Handle<JSObject> receiver, |
247 Handle<JSObject> holder, | 249 Handle<JSObject> holder, |
248 Handle<ExecutableAccessorInfo> callback) { | 250 Handle<ExecutableAccessorInfo> callback) { |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
329 Handle<Code> ic = | 331 Handle<Code> ic = |
330 compiler.CompileLoadGlobal(receiver, holder, cell, name, is_dont_delete); | 332 compiler.CompileLoadGlobal(receiver, holder, cell, name, is_dont_delete); |
331 JSObject::UpdateMapCodeCache(stub_holder, name, ic); | 333 JSObject::UpdateMapCodeCache(stub_holder, name, ic); |
332 return ic; | 334 return ic; |
333 } | 335 } |
334 | 336 |
335 | 337 |
336 Handle<Code> StubCache::ComputeKeyedLoadField(Handle<Name> name, | 338 Handle<Code> StubCache::ComputeKeyedLoadField(Handle<Name> name, |
337 Handle<JSObject> receiver, | 339 Handle<JSObject> receiver, |
338 Handle<JSObject> holder, | 340 Handle<JSObject> holder, |
339 PropertyIndex field) { | 341 PropertyIndex field, |
| 342 Representation representation) { |
340 if (receiver.is_identical_to(holder)) { | 343 if (receiver.is_identical_to(holder)) { |
341 KeyedLoadFieldStub stub(field.is_inobject(holder), | 344 KeyedLoadFieldStub stub(field.is_inobject(holder), |
342 field.translate(holder)); | 345 field.translate(holder), |
| 346 representation); |
343 return stub.GetCode(isolate()); | 347 return stub.GetCode(isolate()); |
344 } | 348 } |
345 | 349 |
346 Handle<JSObject> stub_holder = StubHolder(receiver, holder); | 350 Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
347 Handle<Code> stub = FindHandler( | 351 Handle<Code> stub = FindHandler( |
348 name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::FIELD); | 352 name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::FIELD); |
349 if (!stub.is_null()) return stub; | 353 if (!stub.is_null()) return stub; |
350 | 354 |
351 KeyedLoadStubCompiler compiler(isolate_); | 355 KeyedLoadStubCompiler compiler(isolate_); |
352 Handle<Code> handler = | 356 Handle<Code> handler = |
353 compiler.CompileLoadField(receiver, holder, name, field); | 357 compiler.CompileLoadField(receiver, holder, name, field, representation); |
354 JSObject::UpdateMapCodeCache(stub_holder, name, handler); | 358 JSObject::UpdateMapCodeCache(stub_holder, name, handler); |
355 return handler; | 359 return handler; |
356 } | 360 } |
357 | 361 |
358 | 362 |
359 Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<Name> name, | 363 Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<Name> name, |
360 Handle<JSObject> receiver, | 364 Handle<JSObject> receiver, |
361 Handle<JSObject> holder, | 365 Handle<JSObject> holder, |
362 Handle<JSFunction> value) { | 366 Handle<JSFunction> value) { |
363 Handle<JSObject> stub_holder = StubHolder(receiver, holder); | 367 Handle<JSObject> stub_holder = StubHolder(receiver, holder); |
(...skipping 1123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1487 Label* success) { | 1491 Label* success) { |
1488 Label miss; | 1492 Label miss; |
1489 | 1493 |
1490 Register reg = HandlerFrontendHeader(object, object_reg, holder, name, &miss); | 1494 Register reg = HandlerFrontendHeader(object, object_reg, holder, name, &miss); |
1491 | 1495 |
1492 HandlerFrontendFooter(success, &miss); | 1496 HandlerFrontendFooter(success, &miss); |
1493 return reg; | 1497 return reg; |
1494 } | 1498 } |
1495 | 1499 |
1496 | 1500 |
1497 Handle<Code> BaseLoadStubCompiler::CompileLoadField(Handle<JSObject> object, | 1501 Handle<Code> BaseLoadStubCompiler::CompileLoadField( |
1498 Handle<JSObject> holder, | 1502 Handle<JSObject> object, |
1499 Handle<Name> name, | 1503 Handle<JSObject> holder, |
1500 PropertyIndex field) { | 1504 Handle<Name> name, |
| 1505 PropertyIndex field, |
| 1506 Representation representation) { |
1501 Label miss; | 1507 Label miss; |
1502 | 1508 |
1503 Register reg = HandlerFrontendHeader(object, receiver(), holder, name, &miss); | 1509 Register reg = HandlerFrontendHeader(object, receiver(), holder, name, &miss); |
1504 | 1510 |
1505 GenerateLoadField(reg, holder, field); | 1511 GenerateLoadField(reg, holder, field, representation); |
1506 | 1512 |
1507 __ bind(&miss); | 1513 __ bind(&miss); |
1508 TailCallBuiltin(masm(), MissBuiltin(kind())); | 1514 TailCallBuiltin(masm(), MissBuiltin(kind())); |
1509 | 1515 |
1510 // Return the generated code. | 1516 // Return the generated code. |
1511 return GetCode(kind(), Code::FIELD, name); | 1517 return GetCode(kind(), Code::FIELD, name); |
1512 } | 1518 } |
1513 | 1519 |
1514 | 1520 |
1515 // Load a fast property out of a holder object (src). In-object properties | |
1516 // are loaded directly otherwise the property is loaded from the properties | |
1517 // fixed array. | |
1518 void StubCompiler::GenerateFastPropertyLoad(MacroAssembler* masm, | |
1519 Register dst, | |
1520 Register src, | |
1521 Handle<JSObject> holder, | |
1522 PropertyIndex index) { | |
1523 DoGenerateFastPropertyLoad( | |
1524 masm, dst, src, index.is_inobject(holder), index.translate(holder)); | |
1525 } | |
1526 | |
1527 | |
1528 Handle<Code> BaseLoadStubCompiler::CompileLoadConstant( | 1521 Handle<Code> BaseLoadStubCompiler::CompileLoadConstant( |
1529 Handle<JSObject> object, | 1522 Handle<JSObject> object, |
1530 Handle<JSObject> holder, | 1523 Handle<JSObject> holder, |
1531 Handle<Name> name, | 1524 Handle<Name> name, |
1532 Handle<JSFunction> value) { | 1525 Handle<JSFunction> value) { |
1533 Label success; | 1526 Label success; |
1534 HandlerFrontend(object, receiver(), holder, name, &success); | 1527 HandlerFrontend(object, receiver(), holder, name, &success); |
1535 __ bind(&success); | 1528 __ bind(&success); |
1536 GenerateLoadConstant(value); | 1529 GenerateLoadConstant(value); |
1537 | 1530 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1580 void BaseLoadStubCompiler::GenerateLoadPostInterceptor( | 1573 void BaseLoadStubCompiler::GenerateLoadPostInterceptor( |
1581 Register interceptor_reg, | 1574 Register interceptor_reg, |
1582 Handle<JSObject> interceptor_holder, | 1575 Handle<JSObject> interceptor_holder, |
1583 Handle<Name> name, | 1576 Handle<Name> name, |
1584 LookupResult* lookup) { | 1577 LookupResult* lookup) { |
1585 Label success; | 1578 Label success; |
1586 Handle<JSObject> holder(lookup->holder()); | 1579 Handle<JSObject> holder(lookup->holder()); |
1587 if (lookup->IsField()) { | 1580 if (lookup->IsField()) { |
1588 PropertyIndex field = lookup->GetFieldIndex(); | 1581 PropertyIndex field = lookup->GetFieldIndex(); |
1589 if (interceptor_holder.is_identical_to(holder)) { | 1582 if (interceptor_holder.is_identical_to(holder)) { |
1590 GenerateLoadField(interceptor_reg, holder, field); | 1583 GenerateLoadField( |
| 1584 interceptor_reg, holder, field, lookup->representation()); |
1591 } else { | 1585 } else { |
1592 // We found FIELD property in prototype chain of interceptor's holder. | 1586 // We found FIELD property in prototype chain of interceptor's holder. |
1593 // Retrieve a field from field's holder. | 1587 // Retrieve a field from field's holder. |
1594 Register reg = HandlerFrontend( | 1588 Register reg = HandlerFrontend( |
1595 interceptor_holder, interceptor_reg, holder, name, &success); | 1589 interceptor_holder, interceptor_reg, holder, name, &success); |
1596 __ bind(&success); | 1590 __ bind(&success); |
1597 GenerateLoadField(reg, holder, field); | 1591 GenerateLoadField( |
| 1592 reg, holder, field, lookup->representation()); |
1598 } | 1593 } |
1599 } else { | 1594 } else { |
1600 // We found CALLBACKS property in prototype chain of interceptor's | 1595 // We found CALLBACKS property in prototype chain of interceptor's |
1601 // holder. | 1596 // holder. |
1602 ASSERT(lookup->type() == CALLBACKS); | 1597 ASSERT(lookup->type() == CALLBACKS); |
1603 Handle<ExecutableAccessorInfo> callback( | 1598 Handle<ExecutableAccessorInfo> callback( |
1604 ExecutableAccessorInfo::cast(lookup->GetCallbackObject())); | 1599 ExecutableAccessorInfo::cast(lookup->GetCallbackObject())); |
1605 ASSERT(callback->getter() != NULL); | 1600 ASSERT(callback->getter() != NULL); |
1606 | 1601 |
1607 Register reg = CallbackHandlerFrontend( | 1602 Register reg = CallbackHandlerFrontend( |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1639 // Return the generated code. | 1634 // Return the generated code. |
1640 return GetCode(kind(), Code::CALLBACKS, name); | 1635 return GetCode(kind(), Code::CALLBACKS, name); |
1641 } | 1636 } |
1642 | 1637 |
1643 | 1638 |
1644 Handle<Code> BaseStoreStubCompiler::CompileStoreTransition( | 1639 Handle<Code> BaseStoreStubCompiler::CompileStoreTransition( |
1645 Handle<JSObject> object, | 1640 Handle<JSObject> object, |
1646 LookupResult* lookup, | 1641 LookupResult* lookup, |
1647 Handle<Map> transition, | 1642 Handle<Map> transition, |
1648 Handle<Name> name) { | 1643 Handle<Name> name) { |
1649 Label miss, miss_restore_name; | 1644 Label miss, miss_restore_name, slow; |
1650 | 1645 |
1651 GenerateNameCheck(name, this->name(), &miss); | 1646 GenerateNameCheck(name, this->name(), &miss); |
1652 | 1647 |
1653 GenerateStoreTransition(masm(), | 1648 GenerateStoreTransition(masm(), |
1654 object, | 1649 object, |
1655 lookup, | 1650 lookup, |
1656 transition, | 1651 transition, |
1657 name, | 1652 name, |
1658 receiver(), this->name(), value(), | 1653 receiver(), this->name(), value(), |
1659 scratch1(), scratch2(), | 1654 scratch1(), scratch2(), |
1660 &miss, | 1655 &miss, |
1661 &miss_restore_name); | 1656 &miss_restore_name, |
| 1657 &slow); |
1662 | 1658 |
1663 // Handle store cache miss. | 1659 // Handle store cache miss. |
1664 GenerateRestoreName(masm(), &miss_restore_name, name); | 1660 GenerateRestoreName(masm(), &miss_restore_name, name); |
1665 __ bind(&miss); | 1661 __ bind(&miss); |
1666 TailCallBuiltin(masm(), MissBuiltin(kind())); | 1662 TailCallBuiltin(masm(), MissBuiltin(kind())); |
1667 | 1663 |
| 1664 GenerateRestoreName(masm(), &slow, name); |
| 1665 TailCallBuiltin(masm(), SlowBuiltin(kind())); |
| 1666 |
1668 // Return the generated code. | 1667 // Return the generated code. |
1669 return GetICCode(kind(), Code::MAP_TRANSITION, name); | 1668 return GetICCode(kind(), Code::MAP_TRANSITION, name); |
1670 } | 1669 } |
1671 | 1670 |
1672 | 1671 |
1673 Handle<Code> BaseStoreStubCompiler::CompileStoreField(Handle<JSObject> object, | 1672 Handle<Code> BaseStoreStubCompiler::CompileStoreField(Handle<JSObject> object, |
1674 LookupResult* lookup, | 1673 LookupResult* lookup, |
1675 Handle<Name> name) { | 1674 Handle<Name> name) { |
1676 Label miss; | 1675 Label miss; |
1677 | 1676 |
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2089 Handle<FunctionTemplateInfo>( | 2088 Handle<FunctionTemplateInfo>( |
2090 FunctionTemplateInfo::cast(signature->receiver())); | 2089 FunctionTemplateInfo::cast(signature->receiver())); |
2091 } | 2090 } |
2092 } | 2091 } |
2093 | 2092 |
2094 is_simple_api_call_ = true; | 2093 is_simple_api_call_ = true; |
2095 } | 2094 } |
2096 | 2095 |
2097 | 2096 |
2098 } } // namespace v8::internal | 2097 } } // namespace v8::internal |
OLD | NEW |