1 // Copyright 2012 the V8 project authors. All rights reserved. 2 // Redistribution and use in source and binary forms, with or without 3 // modification, are permitted provided that the following conditions are 4 // met: 5 // 6 // * Redistributions of source code must retain the above copyright 7 // notice, this list of conditions and the following disclaimer. 8 // * Redistributions in binary form must reproduce the above 9 // copyright notice, this list of conditions and the following 10 // disclaimer in the documentation and/or other materials provided 11 // with the distribution. 12 // * Neither the name of Google Inc. nor the names of its 13 // contributors may be used to endorse or promote products derived 14 // from this software without specific prior written permission. 15 // 16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 28 #include "v8.h" 29 30 namespace v8 { 31 namespace internal { 32 33 34 void LookupResult::Iterate(ObjectVisitor* visitor) { 35 LookupResult* current = this; // Could be NULL. 36 while (current != NULL) { 37 visitor->VisitPointer(BitCast<Object**>(¤t->holder_)); 38 current = current->next_; 39 } 40 } 41 42 43 #ifdef OBJECT_PRINT 44 void LookupResult::Print(FILE* out) { 45 if (!IsFound()) { 46 PrintF(out, "Not Found\n"); 47 return; 48 } 49 50 PrintF(out, "LookupResult:\n"); 51 PrintF(out, " -cacheable = %s\n", IsCacheable() ? "true" : "false"); 52 PrintF(out, " -attributes = %x\n", GetAttributes()); 53 switch (type()) { 54 case NORMAL: 55 PrintF(out, " -type = normal\n"); 56 PrintF(out, " -entry = %d", GetDictionaryEntry()); 57 break; 58 case MAP_TRANSITION: 59 PrintF(out, " -type = map transition\n"); 60 PrintF(out, " -map:\n"); 61 GetTransitionMap()->Print(out); 62 PrintF(out, "\n"); 63 break; 64 case ELEMENTS_TRANSITION: 65 PrintF(out, " -type = elements transition\n"); 66 PrintF(out, " -map:\n"); 67 GetTransitionMap()->Print(out); 68 PrintF(out, "\n"); 69 break; 70 case CONSTANT_FUNCTION: 71 PrintF(out, " -type = constant function\n"); 72 PrintF(out, " -function:\n"); 73 GetConstantFunction()->Print(out); 74 PrintF(out, "\n"); 75 break; 76 case FIELD: 77 PrintF(out, " -type = field\n"); 78 PrintF(out, " -index = %d", GetFieldIndex()); 79 PrintF(out, "\n"); 80 break; 81 case CALLBACKS: 82 PrintF(out, " -type = call backs\n"); 83 PrintF(out, " -callback object:\n"); 84 GetCallbackObject()->Print(out); 85 break; 86 case HANDLER: 87 PrintF(out, " -type = lookup proxy\n"); 88 break; 89 case INTERCEPTOR: 90 PrintF(out, " -type = lookup interceptor\n"); 91 break; 92 case CONSTANT_TRANSITION: 93 PrintF(out, " -type = constant property transition\n"); 94 PrintF(out, " -map:\n"); 95 GetTransitionMap()->Print(out); 96 PrintF(out, "\n"); 97 break; 98 case NULL_DESCRIPTOR: 99 PrintF(out, " =type = null descriptor\n"); 100 break; 101 } 102 } 103 104 105 void Descriptor::Print(FILE* out) { 106 PrintF(out, "Descriptor "); 107 GetKey()->ShortPrint(out); 108 PrintF(out, " @ "); 109 GetValue()->ShortPrint(out); 110 PrintF(out, " %d\n", GetDetails().index()); 111 } 112 113 114 #endif 115 116 117 bool Descriptor::ContainsTransition() { 118 switch (details_.type()) { 119 case MAP_TRANSITION: 120 case CONSTANT_TRANSITION: 121 case ELEMENTS_TRANSITION: 122 return true; 123 case CALLBACKS: { 124 if (!value_->IsAccessorPair()) return false; 125 AccessorPair* accessors = AccessorPair::cast(value_); 126 return accessors->getter()->IsMap() || accessors->setter()->IsMap(); 127 } 128 case NORMAL: 129 case FIELD: 130 case CONSTANT_FUNCTION: 131 case HANDLER: 132 case INTERCEPTOR: 133 case NULL_DESCRIPTOR: 134 return false; 135 } 136 UNREACHABLE(); // Keep the compiler happy. 137 return false; 138 } 139 140 141 } } // namespace v8::internal 142