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(receiver), |
227 field.translate(holder)); | 228 field.translate(receiver), |
danno
2013/05/07 13:04:47
Extraneous change?
Toon Verwaest
2013/05/07 15:08:52
Done.
| |
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( |
1510 object, receiver(), holder, name, &miss); | |
danno
2013/05/07 13:04:47
Extraneous whitespace change
Toon Verwaest
2013/05/07 15:08:52
Done.
| |
1504 | 1511 |
1505 GenerateLoadField(reg, holder, field); | 1512 GenerateLoadField(reg, holder, field, representation); |
1506 | 1513 |
1507 __ bind(&miss); | 1514 __ bind(&miss); |
1508 TailCallBuiltin(masm(), MissBuiltin(kind())); | 1515 TailCallBuiltin(masm(), MissBuiltin(kind())); |
1509 | 1516 |
1510 // Return the generated code. | 1517 // Return the generated code. |
1511 return GetCode(kind(), Code::FIELD, name); | 1518 return GetCode(kind(), Code::FIELD, name); |
1512 } | 1519 } |
1513 | 1520 |
1514 | 1521 |
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( | 1522 Handle<Code> BaseLoadStubCompiler::CompileLoadConstant( |
1529 Handle<JSObject> object, | 1523 Handle<JSObject> object, |
1530 Handle<JSObject> holder, | 1524 Handle<JSObject> holder, |
1531 Handle<Name> name, | 1525 Handle<Name> name, |
1532 Handle<JSFunction> value) { | 1526 Handle<JSFunction> value) { |
1533 Label success; | 1527 Label success; |
1534 HandlerFrontend(object, receiver(), holder, name, &success); | 1528 HandlerFrontend(object, receiver(), holder, name, &success); |
1535 __ bind(&success); | 1529 __ bind(&success); |
1536 GenerateLoadConstant(value); | 1530 GenerateLoadConstant(value); |
1537 | 1531 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1580 void BaseLoadStubCompiler::GenerateLoadPostInterceptor( | 1574 void BaseLoadStubCompiler::GenerateLoadPostInterceptor( |
1581 Register interceptor_reg, | 1575 Register interceptor_reg, |
1582 Handle<JSObject> interceptor_holder, | 1576 Handle<JSObject> interceptor_holder, |
1583 Handle<Name> name, | 1577 Handle<Name> name, |
1584 LookupResult* lookup) { | 1578 LookupResult* lookup) { |
1585 Label success; | 1579 Label success; |
1586 Handle<JSObject> holder(lookup->holder()); | 1580 Handle<JSObject> holder(lookup->holder()); |
1587 if (lookup->IsField()) { | 1581 if (lookup->IsField()) { |
1588 PropertyIndex field = lookup->GetFieldIndex(); | 1582 PropertyIndex field = lookup->GetFieldIndex(); |
1589 if (interceptor_holder.is_identical_to(holder)) { | 1583 if (interceptor_holder.is_identical_to(holder)) { |
1590 GenerateLoadField(interceptor_reg, holder, field); | 1584 GenerateLoadField( |
1585 interceptor_reg, holder, field, lookup->representation()); | |
1591 } else { | 1586 } else { |
1592 // We found FIELD property in prototype chain of interceptor's holder. | 1587 // We found FIELD property in prototype chain of interceptor's holder. |
1593 // Retrieve a field from field's holder. | 1588 // Retrieve a field from field's holder. |
1594 Register reg = HandlerFrontend( | 1589 Register reg = HandlerFrontend( |
1595 interceptor_holder, interceptor_reg, holder, name, &success); | 1590 interceptor_holder, interceptor_reg, holder, name, &success); |
1596 __ bind(&success); | 1591 __ bind(&success); |
1597 GenerateLoadField(reg, holder, field); | 1592 GenerateLoadField( |
1593 reg, holder, field, lookup->representation()); | |
1598 } | 1594 } |
1599 } else { | 1595 } else { |
1600 // We found CALLBACKS property in prototype chain of interceptor's | 1596 // We found CALLBACKS property in prototype chain of interceptor's |
1601 // holder. | 1597 // holder. |
1602 ASSERT(lookup->type() == CALLBACKS); | 1598 ASSERT(lookup->type() == CALLBACKS); |
1603 Handle<ExecutableAccessorInfo> callback( | 1599 Handle<ExecutableAccessorInfo> callback( |
1604 ExecutableAccessorInfo::cast(lookup->GetCallbackObject())); | 1600 ExecutableAccessorInfo::cast(lookup->GetCallbackObject())); |
1605 ASSERT(callback->getter() != NULL); | 1601 ASSERT(callback->getter() != NULL); |
1606 | 1602 |
1607 Register reg = CallbackHandlerFrontend( | 1603 Register reg = CallbackHandlerFrontend( |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1639 // Return the generated code. | 1635 // Return the generated code. |
1640 return GetCode(kind(), Code::CALLBACKS, name); | 1636 return GetCode(kind(), Code::CALLBACKS, name); |
1641 } | 1637 } |
1642 | 1638 |
1643 | 1639 |
1644 Handle<Code> BaseStoreStubCompiler::CompileStoreTransition( | 1640 Handle<Code> BaseStoreStubCompiler::CompileStoreTransition( |
1645 Handle<JSObject> object, | 1641 Handle<JSObject> object, |
1646 LookupResult* lookup, | 1642 LookupResult* lookup, |
1647 Handle<Map> transition, | 1643 Handle<Map> transition, |
1648 Handle<Name> name) { | 1644 Handle<Name> name) { |
1649 Label miss, miss_restore_name; | 1645 Label miss, miss_restore_name, slow; |
1650 | 1646 |
1651 GenerateNameCheck(name, this->name(), &miss); | 1647 GenerateNameCheck(name, this->name(), &miss); |
1652 | 1648 |
1653 GenerateStoreTransition(masm(), | 1649 GenerateStoreTransition(masm(), |
1654 object, | 1650 object, |
1655 lookup, | 1651 lookup, |
1656 transition, | 1652 transition, |
1657 name, | 1653 name, |
1658 receiver(), this->name(), value(), | 1654 receiver(), this->name(), value(), |
1659 scratch1(), scratch2(), | 1655 scratch1(), scratch2(), |
1660 &miss, | 1656 &miss, |
1661 &miss_restore_name); | 1657 &miss_restore_name, |
1658 &slow); | |
1662 | 1659 |
1663 // Handle store cache miss. | 1660 // Handle store cache miss. |
1664 GenerateRestoreName(masm(), &miss_restore_name, name); | 1661 GenerateRestoreName(masm(), &miss_restore_name, name); |
1665 __ bind(&miss); | 1662 __ bind(&miss); |
1666 TailCallBuiltin(masm(), MissBuiltin(kind())); | 1663 TailCallBuiltin(masm(), MissBuiltin(kind())); |
1667 | 1664 |
1665 GenerateRestoreName(masm(), &slow, name); | |
1666 TailCallBuiltin(masm(), SlowBuiltin(kind())); | |
1667 | |
1668 // Return the generated code. | 1668 // Return the generated code. |
1669 return GetICCode(kind(), Code::MAP_TRANSITION, name); | 1669 return GetICCode(kind(), Code::MAP_TRANSITION, name); |
1670 } | 1670 } |
1671 | 1671 |
1672 | 1672 |
1673 Handle<Code> BaseStoreStubCompiler::CompileStoreField(Handle<JSObject> object, | 1673 Handle<Code> BaseStoreStubCompiler::CompileStoreField(Handle<JSObject> object, |
1674 LookupResult* lookup, | 1674 LookupResult* lookup, |
1675 Handle<Name> name) { | 1675 Handle<Name> name) { |
1676 Label miss; | 1676 Label miss; |
1677 | 1677 |
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2089 Handle<FunctionTemplateInfo>( | 2089 Handle<FunctionTemplateInfo>( |
2090 FunctionTemplateInfo::cast(signature->receiver())); | 2090 FunctionTemplateInfo::cast(signature->receiver())); |
2091 } | 2091 } |
2092 } | 2092 } |
2093 | 2093 |
2094 is_simple_api_call_ = true; | 2094 is_simple_api_call_ = true; |
2095 } | 2095 } |
2096 | 2096 |
2097 | 2097 |
2098 } } // namespace v8::internal | 2098 } } // namespace v8::internal |
OLD | NEW |