OLD | NEW |
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 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 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
359 } | 359 } |
360 Object* value; | 360 Object* value; |
361 JSObject* holder = result->holder(); | 361 JSObject* holder = result->holder(); |
362 switch (result->type()) { | 362 switch (result->type()) { |
363 case NORMAL: | 363 case NORMAL: |
364 value = | 364 value = |
365 holder->property_dictionary()->ValueAt(result->GetDictionaryEntry()); | 365 holder->property_dictionary()->ValueAt(result->GetDictionaryEntry()); |
366 ASSERT(!value->IsTheHole() || result->IsReadOnly()); | 366 ASSERT(!value->IsTheHole() || result->IsReadOnly()); |
367 return value->IsTheHole() ? Heap::undefined_value() : value; | 367 return value->IsTheHole() ? Heap::undefined_value() : value; |
368 case FIELD: | 368 case FIELD: |
369 value = holder->properties()->get(result->GetFieldIndex()); | 369 value = holder->FastPropertyAt(result->GetFieldIndex()); |
370 ASSERT(!value->IsTheHole() || result->IsReadOnly()); | 370 ASSERT(!value->IsTheHole() || result->IsReadOnly()); |
371 return value->IsTheHole() ? Heap::undefined_value() : value; | 371 return value->IsTheHole() ? Heap::undefined_value() : value; |
372 case CONSTANT_FUNCTION: | 372 case CONSTANT_FUNCTION: |
373 return result->GetConstantFunction(); | 373 return result->GetConstantFunction(); |
374 case CALLBACKS: | 374 case CALLBACKS: |
375 return GetPropertyWithCallback(receiver, | 375 return GetPropertyWithCallback(receiver, |
376 result->GetCallbackObject(), | 376 result->GetCallbackObject(), |
377 name, | 377 name, |
378 holder); | 378 holder); |
379 case INTERCEPTOR: { | 379 case INTERCEPTOR: { |
(...skipping 549 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
929 | 929 |
930 // Return the new clone. | 930 // Return the new clone. |
931 return clone; | 931 return clone; |
932 } | 932 } |
933 | 933 |
934 | 934 |
935 Object* JSObject::AddFastPropertyUsingMap(Map* new_map, | 935 Object* JSObject::AddFastPropertyUsingMap(Map* new_map, |
936 String* name, | 936 String* name, |
937 Object* value) { | 937 Object* value) { |
938 int index = new_map->PropertyIndexFor(name); | 938 int index = new_map->PropertyIndexFor(name); |
939 if (map()->unused_property_fields() > 0) { | 939 if (map()->unused_property_fields() == 0) { |
940 ASSERT(index < properties()->length()); | |
941 properties()->set(index, value); | |
942 } else { | |
943 ASSERT(map()->unused_property_fields() == 0); | 940 ASSERT(map()->unused_property_fields() == 0); |
944 int new_unused = new_map->unused_property_fields(); | 941 int new_unused = new_map->unused_property_fields(); |
945 Object* values = | 942 Object* values = |
946 properties()->CopySize(properties()->length() + new_unused + 1); | 943 properties()->CopySize(properties()->length() + new_unused + 1); |
947 if (values->IsFailure()) return values; | 944 if (values->IsFailure()) return values; |
948 FixedArray::cast(values)->set(index, value); | |
949 set_properties(FixedArray::cast(values)); | 945 set_properties(FixedArray::cast(values)); |
950 } | 946 } |
951 set_map(new_map); | 947 set_map(new_map); |
952 return value; | 948 return FastPropertyAtPut(index, value); |
953 } | 949 } |
954 | 950 |
955 | 951 |
956 Object* JSObject::AddFastProperty(String* name, | 952 Object* JSObject::AddFastProperty(String* name, |
957 Object* value, | 953 Object* value, |
958 PropertyAttributes attributes) { | 954 PropertyAttributes attributes) { |
959 // Normalize the object if the name is not a real identifier. | 955 // Normalize the object if the name is not a real identifier. |
960 StringInputBuffer buffer(name); | 956 StringInputBuffer buffer(name); |
961 if (!Scanner::IsIdentifier(&buffer)) { | 957 if (!Scanner::IsIdentifier(&buffer)) { |
962 Object* obj = NormalizeProperties(); | 958 Object* obj = NormalizeProperties(); |
(...skipping 10 matching lines...) Expand all Loading... |
973 Object* new_descriptors = | 969 Object* new_descriptors = |
974 old_descriptors->CopyInsert(&new_field, REMOVE_TRANSITIONS); | 970 old_descriptors->CopyInsert(&new_field, REMOVE_TRANSITIONS); |
975 if (new_descriptors->IsFailure()) return new_descriptors; | 971 if (new_descriptors->IsFailure()) return new_descriptors; |
976 | 972 |
977 // Only allow map transition if the object's map is NOT equal to the | 973 // Only allow map transition if the object's map is NOT equal to the |
978 // global object_function's map and there is not a transition for name. | 974 // global object_function's map and there is not a transition for name. |
979 bool allow_map_transition = | 975 bool allow_map_transition = |
980 !old_descriptors->Contains(name) && | 976 !old_descriptors->Contains(name) && |
981 (Top::context()->global_context()->object_function()->map() != map()); | 977 (Top::context()->global_context()->object_function()->map() != map()); |
982 | 978 |
983 ASSERT(index < properties()->length() || | 979 ASSERT(index < map()->inobject_properties() || |
| 980 (index - map()->inobject_properties()) < properties()->length() || |
984 map()->unused_property_fields() == 0); | 981 map()->unused_property_fields() == 0); |
985 // Allocate a new map for the object. | 982 // Allocate a new map for the object. |
986 Object* r = map()->Copy(); | 983 Object* r = map()->Copy(); |
987 if (r->IsFailure()) return r; | 984 if (r->IsFailure()) return r; |
988 Map* new_map = Map::cast(r); | 985 Map* new_map = Map::cast(r); |
989 if (allow_map_transition) { | 986 if (allow_map_transition) { |
990 // Allocate new instance descriptors for the old map with map transition. | 987 // Allocate new instance descriptors for the old map with map transition. |
991 MapTransitionDescriptor d(name, Map::cast(new_map), attributes); | 988 MapTransitionDescriptor d(name, Map::cast(new_map), attributes); |
992 Object* r = old_descriptors->CopyInsert(&d, KEEP_TRANSITIONS); | 989 Object* r = old_descriptors->CopyInsert(&d, KEEP_TRANSITIONS); |
993 if (r->IsFailure()) return r; | 990 if (r->IsFailure()) return r; |
994 old_descriptors = DescriptorArray::cast(r); | 991 old_descriptors = DescriptorArray::cast(r); |
995 } | 992 } |
996 | 993 |
997 | |
998 if (map()->unused_property_fields() == 0) { | 994 if (map()->unused_property_fields() == 0) { |
999 if (properties()->length() > kMaxFastProperties) { | 995 if (properties()->length() > kMaxFastProperties) { |
1000 Object* obj = NormalizeProperties(); | 996 Object* obj = NormalizeProperties(); |
1001 if (obj->IsFailure()) return obj; | 997 if (obj->IsFailure()) return obj; |
1002 return AddSlowProperty(name, value, attributes); | 998 return AddSlowProperty(name, value, attributes); |
1003 } | 999 } |
1004 // Make room for the new value | 1000 // Make room for the new value |
1005 Object* values = | 1001 Object* values = |
1006 properties()->CopySize(properties()->length() + kFieldsAdded); | 1002 properties()->CopySize(properties()->length() + kFieldsAdded); |
1007 if (values->IsFailure()) return values; | 1003 if (values->IsFailure()) return values; |
1008 set_properties(FixedArray::cast(values)); | 1004 set_properties(FixedArray::cast(values)); |
1009 new_map->set_unused_property_fields(kFieldsAdded - 1); | 1005 new_map->set_unused_property_fields(kFieldsAdded - 1); |
1010 } else { | 1006 } else { |
1011 new_map->set_unused_property_fields(map()->unused_property_fields() - 1); | 1007 new_map->set_unused_property_fields(map()->unused_property_fields() - 1); |
1012 } | 1008 } |
1013 // We have now allocated all the necessary objects. | 1009 // We have now allocated all the necessary objects. |
1014 // All the changes can be applied at once, so they are atomic. | 1010 // All the changes can be applied at once, so they are atomic. |
1015 map()->set_instance_descriptors(old_descriptors); | 1011 map()->set_instance_descriptors(old_descriptors); |
1016 new_map->set_instance_descriptors(DescriptorArray::cast(new_descriptors)); | 1012 new_map->set_instance_descriptors(DescriptorArray::cast(new_descriptors)); |
1017 set_map(new_map); | 1013 set_map(new_map); |
1018 properties()->set(index, value); | 1014 return FastPropertyAtPut(index, value); |
1019 | |
1020 return value; | |
1021 } | 1015 } |
1022 | 1016 |
1023 | 1017 |
1024 Object* JSObject::AddConstantFunctionProperty(String* name, | 1018 Object* JSObject::AddConstantFunctionProperty(String* name, |
1025 JSFunction* function, | 1019 JSFunction* function, |
1026 PropertyAttributes attributes) { | 1020 PropertyAttributes attributes) { |
1027 // Allocate new instance descriptors with (name, function) added | 1021 // Allocate new instance descriptors with (name, function) added |
1028 ConstantFunctionDescriptor d(name, function, attributes); | 1022 ConstantFunctionDescriptor d(name, function, attributes); |
1029 Object* new_descriptors = | 1023 Object* new_descriptors = |
1030 map()->instance_descriptors()->CopyInsert(&d, REMOVE_TRANSITIONS); | 1024 map()->instance_descriptors()->CopyInsert(&d, REMOVE_TRANSITIONS); |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1204 new_properties = FixedArray::cast(new_properties_unchecked); | 1198 new_properties = FixedArray::cast(new_properties_unchecked); |
1205 } | 1199 } |
1206 | 1200 |
1207 // Update pointers to commit changes. | 1201 // Update pointers to commit changes. |
1208 // Object points to the new map. | 1202 // Object points to the new map. |
1209 new_map->set_unused_property_fields(new_unused_property_fields); | 1203 new_map->set_unused_property_fields(new_unused_property_fields); |
1210 set_map(new_map); | 1204 set_map(new_map); |
1211 if (new_properties) { | 1205 if (new_properties) { |
1212 set_properties(FixedArray::cast(new_properties)); | 1206 set_properties(FixedArray::cast(new_properties)); |
1213 } | 1207 } |
1214 properties()->set(index, new_value); | 1208 return FastPropertyAtPut(index, new_value); |
1215 return new_value; | |
1216 } | 1209 } |
1217 | 1210 |
1218 | 1211 |
1219 | 1212 |
1220 Object* JSObject::SetPropertyWithInterceptor(String* name, | 1213 Object* JSObject::SetPropertyWithInterceptor(String* name, |
1221 Object* value, | 1214 Object* value, |
1222 PropertyAttributes attributes) { | 1215 PropertyAttributes attributes) { |
1223 HandleScope scope; | 1216 HandleScope scope; |
1224 Handle<JSObject> this_handle(this); | 1217 Handle<JSObject> this_handle(this); |
1225 Handle<String> name_handle(name); | 1218 Handle<String> name_handle(name); |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1370 | 1363 |
1371 void JSObject::LocalLookupRealNamedProperty(String* name, | 1364 void JSObject::LocalLookupRealNamedProperty(String* name, |
1372 LookupResult* result) { | 1365 LookupResult* result) { |
1373 if (HasFastProperties()) { | 1366 if (HasFastProperties()) { |
1374 LookupInDescriptor(name, result); | 1367 LookupInDescriptor(name, result); |
1375 if (result->IsValid()) { | 1368 if (result->IsValid()) { |
1376 ASSERT(result->holder() == this && result->type() != NORMAL); | 1369 ASSERT(result->holder() == this && result->type() != NORMAL); |
1377 // Disallow caching for uninitialized constants. These can only | 1370 // Disallow caching for uninitialized constants. These can only |
1378 // occur as fields. | 1371 // occur as fields. |
1379 if (result->IsReadOnly() && result->type() == FIELD && | 1372 if (result->IsReadOnly() && result->type() == FIELD && |
1380 properties()->get(result->GetFieldIndex())->IsTheHole()) { | 1373 FastPropertyAt(result->GetFieldIndex())->IsTheHole()) { |
1381 result->DisallowCaching(); | 1374 result->DisallowCaching(); |
1382 } | 1375 } |
1383 return; | 1376 return; |
1384 } | 1377 } |
1385 } else { | 1378 } else { |
1386 int entry = property_dictionary()->FindStringEntry(name); | 1379 int entry = property_dictionary()->FindStringEntry(name); |
1387 if (entry != DescriptorArray::kNotFound) { | 1380 if (entry != DescriptorArray::kNotFound) { |
1388 // Make sure to disallow caching for uninitialized constants | 1381 // Make sure to disallow caching for uninitialized constants |
1389 // found in the dictionary-mode objects. | 1382 // found in the dictionary-mode objects. |
1390 if (property_dictionary()->ValueAt(entry)->IsTheHole()) { | 1383 if (property_dictionary()->ValueAt(entry)->IsTheHole()) { |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1507 return SetLazyProperty(result, name, value, attributes); | 1500 return SetLazyProperty(result, name, value, attributes); |
1508 } | 1501 } |
1509 if (result->IsReadOnly() && result->IsProperty()) return value; | 1502 if (result->IsReadOnly() && result->IsProperty()) return value; |
1510 // This is a real property that is not read-only, or it is a | 1503 // This is a real property that is not read-only, or it is a |
1511 // transition or null descriptor and there are no setters in the prototypes. | 1504 // transition or null descriptor and there are no setters in the prototypes. |
1512 switch (result->type()) { | 1505 switch (result->type()) { |
1513 case NORMAL: | 1506 case NORMAL: |
1514 property_dictionary()->ValueAtPut(result->GetDictionaryEntry(), value); | 1507 property_dictionary()->ValueAtPut(result->GetDictionaryEntry(), value); |
1515 return value; | 1508 return value; |
1516 case FIELD: | 1509 case FIELD: |
1517 properties()->set(result->GetFieldIndex(), value); | 1510 return FastPropertyAtPut(result->GetFieldIndex(), value); |
1518 return value; | |
1519 case MAP_TRANSITION: | 1511 case MAP_TRANSITION: |
1520 if (attributes == result->GetAttributes()) { | 1512 if (attributes == result->GetAttributes()) { |
1521 // Only use map transition if the attributes match. | 1513 // Only use map transition if the attributes match. |
1522 return AddFastPropertyUsingMap(result->GetTransitionMap(), | 1514 return AddFastPropertyUsingMap(result->GetTransitionMap(), |
1523 name, | 1515 name, |
1524 value); | 1516 value); |
1525 } | 1517 } |
1526 return ConvertDescriptorToField(name, value, attributes); | 1518 return ConvertDescriptorToField(name, value, attributes); |
1527 case CONSTANT_FUNCTION: | 1519 case CONSTANT_FUNCTION: |
1528 if (value == result->GetConstantFunction()) return value; | 1520 if (value == result->GetConstantFunction()) return value; |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1578 } | 1570 } |
1579 if (!result->IsLoaded()) { | 1571 if (!result->IsLoaded()) { |
1580 return SetLazyProperty(result, name, value, attributes); | 1572 return SetLazyProperty(result, name, value, attributes); |
1581 } | 1573 } |
1582 // Check of IsReadOnly removed from here in clone. | 1574 // Check of IsReadOnly removed from here in clone. |
1583 switch (result->type()) { | 1575 switch (result->type()) { |
1584 case NORMAL: | 1576 case NORMAL: |
1585 property_dictionary()->ValueAtPut(result->GetDictionaryEntry(), value); | 1577 property_dictionary()->ValueAtPut(result->GetDictionaryEntry(), value); |
1586 return value; | 1578 return value; |
1587 case FIELD: | 1579 case FIELD: |
1588 properties()->set(result->GetFieldIndex(), value); | 1580 return FastPropertyAtPut(result->GetFieldIndex(), value); |
1589 return value; | |
1590 case MAP_TRANSITION: | 1581 case MAP_TRANSITION: |
1591 if (attributes == result->GetAttributes()) { | 1582 if (attributes == result->GetAttributes()) { |
1592 // Only use map transition if the attributes match. | 1583 // Only use map transition if the attributes match. |
1593 return AddFastPropertyUsingMap(result->GetTransitionMap(), | 1584 return AddFastPropertyUsingMap(result->GetTransitionMap(), |
1594 name, | 1585 name, |
1595 value); | 1586 value); |
1596 } else { | 1587 } else { |
1597 return ConvertDescriptorToField(name, value, attributes); | 1588 return ConvertDescriptorToField(name, value, attributes); |
1598 } | 1589 } |
1599 case CONSTANT_FUNCTION: | 1590 case CONSTANT_FUNCTION: |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1773 PropertyDetails(details.attributes(), NORMAL, details.index()); | 1764 PropertyDetails(details.attributes(), NORMAL, details.index()); |
1774 Object* value = r.GetConstantFunction(); | 1765 Object* value = r.GetConstantFunction(); |
1775 Object* result = dictionary->AddStringEntry(r.GetKey(), value, d); | 1766 Object* result = dictionary->AddStringEntry(r.GetKey(), value, d); |
1776 if (result->IsFailure()) return result; | 1767 if (result->IsFailure()) return result; |
1777 dictionary = Dictionary::cast(result); | 1768 dictionary = Dictionary::cast(result); |
1778 break; | 1769 break; |
1779 } | 1770 } |
1780 case FIELD: { | 1771 case FIELD: { |
1781 PropertyDetails d = | 1772 PropertyDetails d = |
1782 PropertyDetails(details.attributes(), NORMAL, details.index()); | 1773 PropertyDetails(details.attributes(), NORMAL, details.index()); |
1783 Object* value = properties()->get(r.GetFieldIndex()); | 1774 Object* value = FastPropertyAt(r.GetFieldIndex()); |
1784 Object* result = dictionary->AddStringEntry(r.GetKey(), value, d); | 1775 Object* result = dictionary->AddStringEntry(r.GetKey(), value, d); |
1785 if (result->IsFailure()) return result; | 1776 if (result->IsFailure()) return result; |
1786 dictionary = Dictionary::cast(result); | 1777 dictionary = Dictionary::cast(result); |
1787 break; | 1778 break; |
1788 } | 1779 } |
1789 case CALLBACKS: { | 1780 case CALLBACKS: { |
1790 PropertyDetails d = | 1781 PropertyDetails d = |
1791 PropertyDetails(details.attributes(), CALLBACKS, details.index()); | 1782 PropertyDetails(details.attributes(), CALLBACKS, details.index()); |
1792 Object* value = r.GetCallbacksObject(); | 1783 Object* value = r.GetCallbacksObject(); |
1793 Object* result = dictionary->AddStringEntry(r.GetKey(), value, d); | 1784 Object* result = dictionary->AddStringEntry(r.GetKey(), value, d); |
(...skipping 534 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2328 return Heap::undefined_value(); | 2319 return Heap::undefined_value(); |
2329 } | 2320 } |
2330 | 2321 |
2331 | 2322 |
2332 Object* JSObject::SlowReverseLookup(Object* value) { | 2323 Object* JSObject::SlowReverseLookup(Object* value) { |
2333 if (HasFastProperties()) { | 2324 if (HasFastProperties()) { |
2334 for (DescriptorReader r(map()->instance_descriptors()); | 2325 for (DescriptorReader r(map()->instance_descriptors()); |
2335 !r.eos(); | 2326 !r.eos(); |
2336 r.advance()) { | 2327 r.advance()) { |
2337 if (r.type() == FIELD) { | 2328 if (r.type() == FIELD) { |
2338 if (properties()->get(r.GetFieldIndex()) == value) { | 2329 if (FastPropertyAt(r.GetFieldIndex()) == value) { |
2339 return r.GetKey(); | 2330 return r.GetKey(); |
2340 } | 2331 } |
2341 } else if (r.type() == CONSTANT_FUNCTION) { | 2332 } else if (r.type() == CONSTANT_FUNCTION) { |
2342 if (r.GetConstantFunction() == value) { | 2333 if (r.GetConstantFunction() == value) { |
2343 return r.GetKey(); | 2334 return r.GetKey(); |
2344 } | 2335 } |
2345 } | 2336 } |
2346 } | 2337 } |
2347 return Heap::undefined_value(); | 2338 return Heap::undefined_value(); |
2348 } else { | 2339 } else { |
2349 return property_dictionary()->SlowReverseLookup(value); | 2340 return property_dictionary()->SlowReverseLookup(value); |
2350 } | 2341 } |
2351 } | 2342 } |
2352 | 2343 |
2353 | 2344 |
2354 Object* Map::Copy() { | 2345 Object* Map::Copy() { |
2355 Object* result = Heap::AllocateMap(instance_type(), instance_size()); | 2346 Object* result = Heap::AllocateMap(instance_type(), instance_size()); |
2356 if (result->IsFailure()) return result; | 2347 if (result->IsFailure()) return result; |
2357 Map::cast(result)->set_prototype(prototype()); | 2348 Map::cast(result)->set_prototype(prototype()); |
2358 Map::cast(result)->set_constructor(constructor()); | 2349 Map::cast(result)->set_constructor(constructor()); |
2359 // Don't copy descriptors, so map transitions always remain a forest. | 2350 // Don't copy descriptors, so map transitions always remain a forest. |
2360 Map::cast(result)->set_instance_descriptors(Heap::empty_descriptor_array()); | 2351 Map::cast(result)->set_instance_descriptors(Heap::empty_descriptor_array()); |
2361 // Please note instance_type and instance_size are set when allocated. | 2352 // Please note instance_type and instance_size are set when allocated. |
| 2353 Map::cast(result)->set_inobject_properties(inobject_properties()); |
2362 Map::cast(result)->set_unused_property_fields(unused_property_fields()); | 2354 Map::cast(result)->set_unused_property_fields(unused_property_fields()); |
2363 Map::cast(result)->set_bit_field(bit_field()); | 2355 Map::cast(result)->set_bit_field(bit_field()); |
2364 Map::cast(result)->ClearCodeCache(); | 2356 Map::cast(result)->ClearCodeCache(); |
2365 return result; | 2357 return result; |
2366 } | 2358 } |
2367 | 2359 |
2368 | 2360 |
2369 Object* Map::CopyDropTransitions() { | 2361 Object* Map::CopyDropTransitions() { |
2370 Object *new_map = Copy(); | 2362 Object *new_map = Copy(); |
2371 if (new_map->IsFailure()) return new_map; | 2363 if (new_map->IsFailure()) return new_map; |
(...skipping 4064 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6436 // No break point. | 6428 // No break point. |
6437 if (break_point_objects()->IsUndefined()) return 0; | 6429 if (break_point_objects()->IsUndefined()) return 0; |
6438 // Single beak point. | 6430 // Single beak point. |
6439 if (!break_point_objects()->IsFixedArray()) return 1; | 6431 if (!break_point_objects()->IsFixedArray()) return 1; |
6440 // Multiple break points. | 6432 // Multiple break points. |
6441 return FixedArray::cast(break_point_objects())->length(); | 6433 return FixedArray::cast(break_point_objects())->length(); |
6442 } | 6434 } |
6443 | 6435 |
6444 | 6436 |
6445 } } // namespace v8::internal | 6437 } } // namespace v8::internal |
OLD | NEW |