| OLD | NEW |
| 1 // Copyright 2011 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 |
| 11 // with the distribution. | 11 // with the distribution. |
| (...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 369 Handle<JSObject> object, | 369 Handle<JSObject> object, |
| 370 int index, | 370 int index, |
| 371 Handle<Map> transition, | 371 Handle<Map> transition, |
| 372 Register receiver_reg, | 372 Register receiver_reg, |
| 373 Register name_reg, | 373 Register name_reg, |
| 374 Register scratch, | 374 Register scratch, |
| 375 Label* miss_label) { | 375 Label* miss_label) { |
| 376 // r0 : value | 376 // r0 : value |
| 377 Label exit; | 377 Label exit; |
| 378 | 378 |
| 379 // Check that the receiver isn't a smi. | 379 // Check that the map of the object hasn't changed. |
| 380 __ JumpIfSmi(receiver_reg, miss_label); | 380 __ CheckMap(receiver_reg, scratch, Handle<Map>(object->map()), miss_label, |
| 381 | 381 DO_SMI_CHECK, ALLOW_ELEMENT_TRANSITION_MAPS); |
| 382 // Check that the map of the receiver hasn't changed. | |
| 383 __ ldr(scratch, FieldMemOperand(receiver_reg, HeapObject::kMapOffset)); | |
| 384 __ cmp(scratch, Operand(Handle<Map>(object->map()))); | |
| 385 __ b(ne, miss_label); | |
| 386 | 382 |
| 387 // Perform global security token check if needed. | 383 // Perform global security token check if needed. |
| 388 if (object->IsJSGlobalProxy()) { | 384 if (object->IsJSGlobalProxy()) { |
| 389 __ CheckAccessGlobalProxy(receiver_reg, scratch, miss_label); | 385 __ CheckAccessGlobalProxy(receiver_reg, scratch, miss_label); |
| 390 } | 386 } |
| 391 | 387 |
| 392 // Stub never generated for non-global objects that require access | 388 // Stub never generated for non-global objects that require access |
| 393 // checks. | 389 // checks. |
| 394 ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded()); | 390 ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded()); |
| 395 | 391 |
| (...skipping 616 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1012 StringDictionary::kNotFound); | 1008 StringDictionary::kNotFound); |
| 1013 | 1009 |
| 1014 GenerateDictionaryNegativeLookup(masm(), miss, reg, name, | 1010 GenerateDictionaryNegativeLookup(masm(), miss, reg, name, |
| 1015 scratch1, scratch2); | 1011 scratch1, scratch2); |
| 1016 | 1012 |
| 1017 __ ldr(scratch1, FieldMemOperand(reg, HeapObject::kMapOffset)); | 1013 __ ldr(scratch1, FieldMemOperand(reg, HeapObject::kMapOffset)); |
| 1018 reg = holder_reg; // From now on the object will be in holder_reg. | 1014 reg = holder_reg; // From now on the object will be in holder_reg. |
| 1019 __ ldr(reg, FieldMemOperand(scratch1, Map::kPrototypeOffset)); | 1015 __ ldr(reg, FieldMemOperand(scratch1, Map::kPrototypeOffset)); |
| 1020 } else { | 1016 } else { |
| 1021 Handle<Map> current_map(current->map()); | 1017 Handle<Map> current_map(current->map()); |
| 1022 __ ldr(scratch1, FieldMemOperand(reg, HeapObject::kMapOffset)); | 1018 __ CheckMap(reg, scratch1, current_map, miss, DONT_DO_SMI_CHECK, |
| 1023 __ cmp(scratch1, Operand(current_map)); | 1019 ALLOW_ELEMENT_TRANSITION_MAPS); |
| 1024 // Branch on the result of the map check. | 1020 |
| 1025 __ b(ne, miss); | |
| 1026 // Check access rights to the global object. This has to happen after | 1021 // Check access rights to the global object. This has to happen after |
| 1027 // the map check so that we know that the object is actually a global | 1022 // the map check so that we know that the object is actually a global |
| 1028 // object. | 1023 // object. |
| 1029 if (current->IsJSGlobalProxy()) { | 1024 if (current->IsJSGlobalProxy()) { |
| 1030 __ CheckAccessGlobalProxy(reg, scratch2, miss); | 1025 __ CheckAccessGlobalProxy(reg, scratch2, miss); |
| 1031 } | 1026 } |
| 1032 reg = holder_reg; // From now on the object will be in holder_reg. | 1027 reg = holder_reg; // From now on the object will be in holder_reg. |
| 1033 | 1028 |
| 1034 if (heap()->InNewSpace(*prototype)) { | 1029 if (heap()->InNewSpace(*prototype)) { |
| 1035 // The prototype is in new space; we cannot store a reference to it | 1030 // The prototype is in new space; we cannot store a reference to it |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1046 } | 1041 } |
| 1047 | 1042 |
| 1048 // Go to the next object in the prototype chain. | 1043 // Go to the next object in the prototype chain. |
| 1049 current = prototype; | 1044 current = prototype; |
| 1050 } | 1045 } |
| 1051 | 1046 |
| 1052 // Log the check depth. | 1047 // Log the check depth. |
| 1053 LOG(masm()->isolate(), IntEvent("check-maps-depth", depth + 1)); | 1048 LOG(masm()->isolate(), IntEvent("check-maps-depth", depth + 1)); |
| 1054 | 1049 |
| 1055 // Check the holder map. | 1050 // Check the holder map. |
| 1056 __ ldr(scratch1, FieldMemOperand(reg, HeapObject::kMapOffset)); | 1051 __ CheckMap(reg, scratch1, Handle<Map>(current->map()), miss, |
| 1057 __ cmp(scratch1, Operand(Handle<Map>(current->map()))); | 1052 DONT_DO_SMI_CHECK, ALLOW_ELEMENT_TRANSITION_MAPS); |
| 1058 __ b(ne, miss); | |
| 1059 | 1053 |
| 1060 // Perform security check for access to the global object. | 1054 // Perform security check for access to the global object. |
| 1061 ASSERT(holder->IsJSGlobalProxy() || !holder->IsAccessCheckNeeded()); | 1055 ASSERT(holder->IsJSGlobalProxy() || !holder->IsAccessCheckNeeded()); |
| 1062 if (holder->IsJSGlobalProxy()) { | 1056 if (holder->IsJSGlobalProxy()) { |
| 1063 __ CheckAccessGlobalProxy(reg, scratch1, miss); | 1057 __ CheckAccessGlobalProxy(reg, scratch1, miss); |
| 1064 } | 1058 } |
| 1065 | 1059 |
| 1066 // If we've skipped any global objects, it's not enough to verify that | 1060 // If we've skipped any global objects, it's not enough to verify that |
| 1067 // their maps haven't changed. We also need to check that the property | 1061 // their maps haven't changed. We also need to check that the property |
| 1068 // cell for the property is still empty. | 1062 // cell for the property is still empty. |
| (...skipping 1396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2465 Handle<AccessorInfo> callback, | 2459 Handle<AccessorInfo> callback, |
| 2466 Handle<String> name) { | 2460 Handle<String> name) { |
| 2467 // ----------- S t a t e ------------- | 2461 // ----------- S t a t e ------------- |
| 2468 // -- r0 : value | 2462 // -- r0 : value |
| 2469 // -- r1 : receiver | 2463 // -- r1 : receiver |
| 2470 // -- r2 : name | 2464 // -- r2 : name |
| 2471 // -- lr : return address | 2465 // -- lr : return address |
| 2472 // ----------------------------------- | 2466 // ----------------------------------- |
| 2473 Label miss; | 2467 Label miss; |
| 2474 | 2468 |
| 2475 // Check that the object isn't a smi. | |
| 2476 __ JumpIfSmi(r1, &miss); | |
| 2477 | |
| 2478 // Check that the map of the object hasn't changed. | 2469 // Check that the map of the object hasn't changed. |
| 2479 __ ldr(r3, FieldMemOperand(r1, HeapObject::kMapOffset)); | 2470 __ CheckMap(r1, r3, Handle<Map>(object->map()), &miss, |
| 2480 __ cmp(r3, Operand(Handle<Map>(object->map()))); | 2471 DO_SMI_CHECK, ALLOW_ELEMENT_TRANSITION_MAPS); |
| 2481 __ b(ne, &miss); | |
| 2482 | 2472 |
| 2483 // Perform global security token check if needed. | 2473 // Perform global security token check if needed. |
| 2484 if (object->IsJSGlobalProxy()) { | 2474 if (object->IsJSGlobalProxy()) { |
| 2485 __ CheckAccessGlobalProxy(r1, r3, &miss); | 2475 __ CheckAccessGlobalProxy(r1, r3, &miss); |
| 2486 } | 2476 } |
| 2487 | 2477 |
| 2488 // Stub never generated for non-global objects that require access | 2478 // Stub never generated for non-global objects that require access |
| 2489 // checks. | 2479 // checks. |
| 2490 ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded()); | 2480 ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded()); |
| 2491 | 2481 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 2513 Handle<JSObject> receiver, | 2503 Handle<JSObject> receiver, |
| 2514 Handle<String> name) { | 2504 Handle<String> name) { |
| 2515 // ----------- S t a t e ------------- | 2505 // ----------- S t a t e ------------- |
| 2516 // -- r0 : value | 2506 // -- r0 : value |
| 2517 // -- r1 : receiver | 2507 // -- r1 : receiver |
| 2518 // -- r2 : name | 2508 // -- r2 : name |
| 2519 // -- lr : return address | 2509 // -- lr : return address |
| 2520 // ----------------------------------- | 2510 // ----------------------------------- |
| 2521 Label miss; | 2511 Label miss; |
| 2522 | 2512 |
| 2523 // Check that the object isn't a smi. | |
| 2524 __ JumpIfSmi(r1, &miss); | |
| 2525 | |
| 2526 // Check that the map of the object hasn't changed. | 2513 // Check that the map of the object hasn't changed. |
| 2527 __ ldr(r3, FieldMemOperand(r1, HeapObject::kMapOffset)); | 2514 __ CheckMap(r1, r3, Handle<Map>(receiver->map()), &miss, |
| 2528 __ cmp(r3, Operand(Handle<Map>(receiver->map()))); | 2515 DO_SMI_CHECK, ALLOW_ELEMENT_TRANSITION_MAPS); |
| 2529 __ b(ne, &miss); | |
| 2530 | 2516 |
| 2531 // Perform global security token check if needed. | 2517 // Perform global security token check if needed. |
| 2532 if (receiver->IsJSGlobalProxy()) { | 2518 if (receiver->IsJSGlobalProxy()) { |
| 2533 __ CheckAccessGlobalProxy(r1, r3, &miss); | 2519 __ CheckAccessGlobalProxy(r1, r3, &miss); |
| 2534 } | 2520 } |
| 2535 | 2521 |
| 2536 // Stub is never generated for non-global objects that require access | 2522 // Stub is never generated for non-global objects that require access |
| 2537 // checks. | 2523 // checks. |
| 2538 ASSERT(receiver->IsJSGlobalProxy() || !receiver->IsAccessCheckNeeded()); | 2524 ASSERT(receiver->IsJSGlobalProxy() || !receiver->IsAccessCheckNeeded()); |
| 2539 | 2525 |
| (...skipping 1686 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4226 Handle<Code> ic_miss = masm->isolate()->builtins()->KeyedStoreIC_Miss(); | 4212 Handle<Code> ic_miss = masm->isolate()->builtins()->KeyedStoreIC_Miss(); |
| 4227 __ Jump(ic_miss, RelocInfo::CODE_TARGET); | 4213 __ Jump(ic_miss, RelocInfo::CODE_TARGET); |
| 4228 } | 4214 } |
| 4229 | 4215 |
| 4230 | 4216 |
| 4231 #undef __ | 4217 #undef __ |
| 4232 | 4218 |
| 4233 } } // namespace v8::internal | 4219 } } // namespace v8::internal |
| 4234 | 4220 |
| 4235 #endif // V8_TARGET_ARCH_ARM | 4221 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |