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 874 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
885 Code); | 885 Code); |
886 } | 886 } |
887 | 887 |
888 | 888 |
889 Handle<String> Factory::SymbolFromString(Handle<String> value) { | 889 Handle<String> Factory::SymbolFromString(Handle<String> value) { |
890 CALL_HEAP_FUNCTION(isolate(), | 890 CALL_HEAP_FUNCTION(isolate(), |
891 isolate()->heap()->LookupSymbol(*value), String); | 891 isolate()->heap()->LookupSymbol(*value), String); |
892 } | 892 } |
893 | 893 |
894 | 894 |
895 void Factory::CopyAppendCallbackDescriptors(Handle<Map> map, | |
896 Handle<Object> descriptors) { | |
897 Handle<DescriptorArray> array(map->instance_descriptors()); | |
898 v8::NeanderArray callbacks(descriptors); | |
899 int nof_callbacks = callbacks.length(); | |
900 int descriptor_count = array->number_of_descriptors(); | |
901 Handle<DescriptorArray> result = | |
902 NewDescriptorArray(descriptor_count + nof_callbacks); | |
903 | |
904 // Ensure that marking will not progress and change color of objects. | |
905 DescriptorArray::WhitenessWitness witness(*result); | |
906 | |
907 // Copy the descriptors from the array. | |
908 if (0 < descriptor_count) { | |
909 for (int i = 0; i < descriptor_count; i++) { | |
910 result->CopyFrom(i, *array, i, witness); | |
911 } | |
912 } | |
913 | |
914 map->set_instance_descriptors(*result); | |
915 | |
916 // Fill in new callback descriptors. Process the callbacks from | |
917 // back to front so that the last callback with a given name takes | |
918 // precedence over previously added callbacks with that name. | |
919 for (int i = nof_callbacks - 1; i >= 0; i--) { | |
920 Handle<AccessorInfo> entry = | |
921 Handle<AccessorInfo>(AccessorInfo::cast(callbacks.get(i))); | |
922 // Ensure the key is a symbol before writing into the instance descriptor. | |
923 Handle<String> key = | |
924 SymbolFromString(Handle<String>(String::cast(entry->name()))); | |
925 // Check if a descriptor with this name already exists before writing. | |
926 if (LinearSearch(*result, *key, map->NumberOfSetDescriptors()) == | |
927 DescriptorArray::kNotFound) { | |
928 CallbacksDescriptor desc(*key, *entry, entry->property_attributes()); | |
929 map->AppendDescriptor(&desc, witness); | |
930 } | |
931 } | |
932 | |
933 int new_number_of_descriptors = map->NumberOfSetDescriptors(); | |
934 // Reinstall the original descriptor array if no new elements were added. | |
935 if (new_number_of_descriptors == descriptor_count) { | |
936 map->set_instance_descriptors(*array); | |
937 return; | |
938 } | |
939 | |
940 // If duplicates were detected, allocate a result of the right size | |
941 // and transfer the elements. | |
942 if (new_number_of_descriptors < result->length()) { | |
943 Handle<DescriptorArray> new_result = | |
944 NewDescriptorArray(new_number_of_descriptors); | |
945 for (int i = 0; i < new_number_of_descriptors; i++) { | |
946 new_result->CopyFrom(i, *result, i, witness); | |
947 } | |
948 map->set_instance_descriptors(*new_result); | |
949 } | |
950 } | |
951 | |
952 | |
953 Handle<JSObject> Factory::NewJSObject(Handle<JSFunction> constructor, | 895 Handle<JSObject> Factory::NewJSObject(Handle<JSFunction> constructor, |
954 PretenureFlag pretenure) { | 896 PretenureFlag pretenure) { |
955 CALL_HEAP_FUNCTION( | 897 CALL_HEAP_FUNCTION( |
956 isolate(), | 898 isolate(), |
957 isolate()->heap()->AllocateJSObject(*constructor, pretenure), JSObject); | 899 isolate()->heap()->AllocateJSObject(*constructor, pretenure), JSObject); |
958 } | 900 } |
959 | 901 |
960 | 902 |
961 Handle<JSModule> Factory::NewJSModule(Handle<Context> context, | 903 Handle<JSModule> Factory::NewJSModule(Handle<Context> context, |
962 Handle<ScopeInfo> scope_info) { | 904 Handle<ScopeInfo> scope_info) { |
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1330 } | 1272 } |
1331 | 1273 |
1332 result->shared()->set_function_data(*obj); | 1274 result->shared()->set_function_data(*obj); |
1333 result->shared()->set_construct_stub(*construct_stub); | 1275 result->shared()->set_construct_stub(*construct_stub); |
1334 result->shared()->DontAdaptArguments(); | 1276 result->shared()->DontAdaptArguments(); |
1335 | 1277 |
1336 // Recursively copy parent templates' accessors, 'data' may be modified. | 1278 // Recursively copy parent templates' accessors, 'data' may be modified. |
1337 while (true) { | 1279 while (true) { |
1338 Handle<Object> props = Handle<Object>(obj->property_accessors()); | 1280 Handle<Object> props = Handle<Object>(obj->property_accessors()); |
1339 if (!props->IsUndefined()) { | 1281 if (!props->IsUndefined()) { |
1340 CopyAppendCallbackDescriptors(map, props); | 1282 Map::CopyAppendCallbackDescriptors(map, props); |
1341 } | 1283 } |
1342 Handle<Object> parent = Handle<Object>(obj->parent_template()); | 1284 Handle<Object> parent = Handle<Object>(obj->parent_template()); |
1343 if (parent->IsUndefined()) break; | 1285 if (parent->IsUndefined()) break; |
1344 obj = Handle<FunctionTemplateInfo>::cast(parent); | 1286 obj = Handle<FunctionTemplateInfo>::cast(parent); |
1345 } | 1287 } |
1346 | 1288 |
1347 ASSERT(result->shared()->IsApiFunction()); | 1289 ASSERT(result->shared()->IsApiFunction()); |
1348 return result; | 1290 return result; |
1349 } | 1291 } |
1350 | 1292 |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1459 | 1401 |
1460 | 1402 |
1461 Handle<Object> Factory::ToBoolean(bool value) { | 1403 Handle<Object> Factory::ToBoolean(bool value) { |
1462 return Handle<Object>(value | 1404 return Handle<Object>(value |
1463 ? isolate()->heap()->true_value() | 1405 ? isolate()->heap()->true_value() |
1464 : isolate()->heap()->false_value()); | 1406 : isolate()->heap()->false_value()); |
1465 } | 1407 } |
1466 | 1408 |
1467 | 1409 |
1468 } } // namespace v8::internal | 1410 } } // namespace v8::internal |
OLD | NEW |