| 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 921 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 932 CALL_HEAP_FUNCTION(isolate(), | 932 CALL_HEAP_FUNCTION(isolate(), |
| 933 isolate()->heap()->LookupSymbol(*value), String); | 933 isolate()->heap()->LookupSymbol(*value), String); |
| 934 } | 934 } |
| 935 | 935 |
| 936 | 936 |
| 937 Handle<DescriptorArray> Factory::CopyAppendCallbackDescriptors( | 937 Handle<DescriptorArray> Factory::CopyAppendCallbackDescriptors( |
| 938 Handle<DescriptorArray> array, | 938 Handle<DescriptorArray> array, |
| 939 Handle<Object> descriptors) { | 939 Handle<Object> descriptors) { |
| 940 v8::NeanderArray callbacks(descriptors); | 940 v8::NeanderArray callbacks(descriptors); |
| 941 int nof_callbacks = callbacks.length(); | 941 int nof_callbacks = callbacks.length(); |
| 942 int descriptor_count = array->number_of_descriptors(); |
| 942 Handle<DescriptorArray> result = | 943 Handle<DescriptorArray> result = |
| 943 NewDescriptorArray(array->number_of_descriptors() + nof_callbacks); | 944 NewDescriptorArray(descriptor_count + nof_callbacks); |
| 944 | |
| 945 // Number of descriptors added to the result so far. | |
| 946 int descriptor_count = 0; | |
| 947 | 945 |
| 948 // Ensure that marking will not progress and change color of objects. | 946 // Ensure that marking will not progress and change color of objects. |
| 949 DescriptorArray::WhitenessWitness witness(*result); | 947 DescriptorArray::WhitenessWitness witness(*result); |
| 950 | 948 |
| 951 // Copy the descriptors from the array. | 949 // Copy the descriptors from the array. |
| 952 for (int i = 0; i < array->number_of_descriptors(); i++) { | 950 for (int i = 0; i < descriptor_count; i++) { |
| 953 if (!array->IsNullDescriptor(i)) { | 951 DescriptorArray::CopyFrom(result, i, array, i, witness); |
| 954 DescriptorArray::CopyFrom(result, descriptor_count++, array, i, witness); | |
| 955 } | |
| 956 } | 952 } |
| 957 | 953 |
| 958 // Number of duplicates detected. | |
| 959 int duplicates = 0; | |
| 960 | |
| 961 // Fill in new callback descriptors. Process the callbacks from | 954 // Fill in new callback descriptors. Process the callbacks from |
| 962 // back to front so that the last callback with a given name takes | 955 // back to front so that the last callback with a given name takes |
| 963 // precedence over previously added callbacks with that name. | 956 // precedence over previously added callbacks with that name. |
| 964 for (int i = nof_callbacks - 1; i >= 0; i--) { | 957 for (int i = nof_callbacks - 1; i >= 0; i--) { |
| 965 Handle<AccessorInfo> entry = | 958 Handle<AccessorInfo> entry = |
| 966 Handle<AccessorInfo>(AccessorInfo::cast(callbacks.get(i))); | 959 Handle<AccessorInfo>(AccessorInfo::cast(callbacks.get(i))); |
| 967 // Ensure the key is a symbol before writing into the instance descriptor. | 960 // Ensure the key is a symbol before writing into the instance descriptor. |
| 968 Handle<String> key = | 961 Handle<String> key = |
| 969 SymbolFromString(Handle<String>(String::cast(entry->name()))); | 962 SymbolFromString(Handle<String>(String::cast(entry->name()))); |
| 970 // Check if a descriptor with this name already exists before writing. | 963 // Check if a descriptor with this name already exists before writing. |
| 971 if (result->LinearSearch(EXPECT_UNSORTED, *key, descriptor_count) == | 964 if (result->LinearSearch(EXPECT_UNSORTED, *key, descriptor_count) == |
| 972 DescriptorArray::kNotFound) { | 965 DescriptorArray::kNotFound) { |
| 973 CallbacksDescriptor desc(*key, *entry, entry->property_attributes()); | 966 CallbacksDescriptor desc(*key, *entry, entry->property_attributes()); |
| 974 result->Set(descriptor_count, &desc, witness); | 967 result->Set(descriptor_count, &desc, witness); |
| 975 descriptor_count++; | 968 descriptor_count++; |
| 976 } else { | |
| 977 duplicates++; | |
| 978 } | 969 } |
| 979 } | 970 } |
| 980 | 971 |
| 981 // If duplicates were detected, allocate a result of the right size | 972 // If duplicates were detected, allocate a result of the right size |
| 982 // and transfer the elements. | 973 // and transfer the elements. |
| 983 if (duplicates > 0) { | 974 if (descriptor_count < result->length()) { |
| 984 int number_of_descriptors = result->number_of_descriptors() - duplicates; | 975 Handle<DescriptorArray> new_result = NewDescriptorArray(descriptor_count); |
| 985 Handle<DescriptorArray> new_result = | 976 for (int i = 0; i < descriptor_count; i++) { |
| 986 NewDescriptorArray(number_of_descriptors); | |
| 987 for (int i = 0; i < number_of_descriptors; i++) { | |
| 988 DescriptorArray::CopyFrom(new_result, i, result, i, witness); | 977 DescriptorArray::CopyFrom(new_result, i, result, i, witness); |
| 989 } | 978 } |
| 990 result = new_result; | 979 result = new_result; |
| 991 } | 980 } |
| 992 | 981 |
| 993 // Sort the result before returning. | 982 // Sort the result before returning. |
| 994 result->Sort(witness); | 983 result->Sort(witness); |
| 995 return result; | 984 return result; |
| 996 } | 985 } |
| 997 | 986 |
| (...skipping 511 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1509 | 1498 |
| 1510 | 1499 |
| 1511 Handle<Object> Factory::ToBoolean(bool value) { | 1500 Handle<Object> Factory::ToBoolean(bool value) { |
| 1512 return Handle<Object>(value | 1501 return Handle<Object>(value |
| 1513 ? isolate()->heap()->true_value() | 1502 ? isolate()->heap()->true_value() |
| 1514 : isolate()->heap()->false_value()); | 1503 : isolate()->heap()->false_value()); |
| 1515 } | 1504 } |
| 1516 | 1505 |
| 1517 | 1506 |
| 1518 } } // namespace v8::internal | 1507 } } // namespace v8::internal |
| OLD | NEW |