OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/interface.h" | 7 #include "src/interface.h" |
8 | 8 |
9 namespace v8 { | 9 namespace v8 { |
10 namespace internal { | 10 namespace internal { |
11 | 11 |
12 static bool Match(void* key1, void* key2) { | |
13 String* name1 = *static_cast<String**>(key1); | |
14 String* name2 = *static_cast<String**>(key2); | |
15 ASSERT(name1->IsInternalizedString()); | |
16 ASSERT(name2->IsInternalizedString()); | |
17 return name1 == name2; | |
18 } | |
19 | |
20 | |
21 Interface* Interface::Lookup(Handle<String> name, Zone* zone) { | 12 Interface* Interface::Lookup(Handle<String> name, Zone* zone) { |
22 ASSERT(IsModule()); | 13 ASSERT(IsModule()); |
23 ZoneHashMap* map = Chase()->exports_; | 14 ZoneHashMap* map = Chase()->exports_; |
24 if (map == NULL) return NULL; | 15 if (map == NULL) return NULL; |
25 ZoneAllocationPolicy allocator(zone); | 16 ZoneAllocationPolicy allocator(zone); |
26 ZoneHashMap::Entry* p = map->Lookup(name.location(), name->Hash(), false, | 17 ZoneHashMap::Entry* p = map->Lookup(name.location(), name->Hash(), false, |
27 allocator); | 18 allocator); |
28 if (p == NULL) return NULL; | 19 if (p == NULL) return NULL; |
29 ASSERT(*static_cast<String**>(p->key) == *name); | 20 ASSERT(*static_cast<String**>(p->key) == *name); |
30 ASSERT(p->value != NULL); | 21 ASSERT(p->value != NULL); |
31 return static_cast<Interface*>(p->value); | 22 return static_cast<Interface*>(p->value); |
32 } | 23 } |
33 | 24 |
34 | 25 |
35 #ifdef DEBUG | 26 #ifdef DEBUG |
36 // Current nesting depth for debug output. | 27 // Current nesting depth for debug output. |
37 class Nesting { | 28 class Nesting { |
38 public: | 29 public: |
39 Nesting() { current_ += 2; } | 30 Nesting() { current_ += 2; } |
40 ~Nesting() { current_ -= 2; } | 31 ~Nesting() { current_ -= 2; } |
41 static int current() { return current_; } | 32 static int current() { return current_; } |
42 private: | 33 private: |
43 static int current_; | 34 static int current_; |
44 }; | 35 }; |
45 | 36 |
46 int Nesting::current_ = 0; | 37 int Nesting::current_ = 0; |
47 #endif | 38 #endif |
48 | 39 |
49 | 40 |
50 void Interface::DoAdd( | 41 void Interface::DoAdd(const void* name, uint32_t hash, Interface* interface, |
51 void* name, uint32_t hash, Interface* interface, Zone* zone, bool* ok) { | 42 Zone* zone, bool* ok) { |
52 MakeModule(ok); | 43 MakeModule(ok); |
53 if (!*ok) return; | 44 if (!*ok) return; |
54 | 45 |
55 #ifdef DEBUG | 46 #ifdef DEBUG |
56 if (FLAG_print_interface_details) { | 47 if (FLAG_print_interface_details) { |
57 PrintF("%*s# Adding...\n", Nesting::current(), ""); | 48 PrintF("%*s# Adding...\n", Nesting::current(), ""); |
58 PrintF("%*sthis = ", Nesting::current(), ""); | 49 PrintF("%*sthis = ", Nesting::current(), ""); |
59 this->Print(Nesting::current()); | 50 this->Print(Nesting::current()); |
60 PrintF("%*s%s : ", Nesting::current(), "", | 51 const AstString* symbol = static_cast<const AstString*>(name); |
61 (*static_cast<String**>(name))->ToAsciiArray()); | 52 PrintF("%*s%.*s : ", Nesting::current(), "", symbol->length(), |
| 53 symbol->raw_data()); |
62 interface->Print(Nesting::current()); | 54 interface->Print(Nesting::current()); |
63 } | 55 } |
64 #endif | 56 #endif |
65 | 57 |
66 ZoneHashMap** map = &Chase()->exports_; | 58 ZoneHashMap** map = &Chase()->exports_; |
67 ZoneAllocationPolicy allocator(zone); | 59 ZoneAllocationPolicy allocator(zone); |
68 | 60 |
69 if (*map == NULL) { | 61 if (*map == NULL) { |
70 *map = new(zone->New(sizeof(ZoneHashMap))) | 62 *map = new(zone->New(sizeof(ZoneHashMap))) |
71 ZoneHashMap(Match, ZoneHashMap::kDefaultHashMapCapacity, allocator); | 63 ZoneHashMap(ZoneHashMap::PointersMatch, |
| 64 ZoneHashMap::kDefaultHashMapCapacity, allocator); |
72 } | 65 } |
73 | 66 |
74 ZoneHashMap::Entry* p = (*map)->Lookup(name, hash, !IsFrozen(), allocator); | 67 ZoneHashMap::Entry* p = |
| 68 (*map)->Lookup(const_cast<void*>(name), hash, !IsFrozen(), allocator); |
75 if (p == NULL) { | 69 if (p == NULL) { |
76 // This didn't have name but was frozen already, that's an error. | 70 // This didn't have name but was frozen already, that's an error. |
77 *ok = false; | 71 *ok = false; |
78 } else if (p->value == NULL) { | 72 } else if (p->value == NULL) { |
79 p->value = interface; | 73 p->value = interface; |
80 } else { | 74 } else { |
81 #ifdef DEBUG | 75 #ifdef DEBUG |
82 Nesting nested; | 76 Nesting nested; |
83 #endif | 77 #endif |
84 static_cast<Interface*>(p->value)->Unify(interface, zone, ok); | 78 static_cast<Interface*>(p->value)->Unify(interface, zone, ok); |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
213 PrintF("%*s%s : ", n0 + 2, "", name->ToAsciiArray()); | 207 PrintF("%*s%s : ", n0 + 2, "", name->ToAsciiArray()); |
214 interface->Print(n0 + 2); | 208 interface->Print(n0 + 2); |
215 } | 209 } |
216 PrintF("%*s}\n", n0, ""); | 210 PrintF("%*s}\n", n0, ""); |
217 } | 211 } |
218 } | 212 } |
219 } | 213 } |
220 #endif | 214 #endif |
221 | 215 |
222 } } // namespace v8::internal | 216 } } // namespace v8::internal |
OLD | NEW |