| 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(), scratch3(), |
| 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 |