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 976 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
987 JSObject::kHeaderSize, | 987 JSObject::kHeaderSize, |
988 prototype, | 988 prototype, |
989 code, | 989 code, |
990 false); | 990 false); |
991 ASSERT(!function->has_initial_map()); | 991 ASSERT(!function->has_initial_map()); |
992 function->shared()->set_instance_class_name(*symbol); | 992 function->shared()->set_instance_class_name(*symbol); |
993 function->shared()->set_expected_nof_properties(2); | 993 function->shared()->set_expected_nof_properties(2); |
994 Handle<JSObject> result = Factory::NewJSObject(function); | 994 Handle<JSObject> result = Factory::NewJSObject(function); |
995 | 995 |
996 global_context()->set_arguments_boilerplate(*result); | 996 global_context()->set_arguments_boilerplate(*result); |
997 // Note: callee must be added as the first property and | 997 // Note: length must be added as the first property and |
998 // length must be added as the second property. | 998 // callee must be added as the second property. |
Lasse Reichstein
2011/03/15 09:58:40
These are swapped because length is the only one r
Martin Maly
2011/03/16 01:21:24
Yes. We always have length, calee is only on non-s
| |
999 SetLocalPropertyNoThrow(result, Factory::length_symbol(), | |
1000 Factory::undefined_value(), | |
1001 DONT_ENUM); | |
999 SetLocalPropertyNoThrow(result, Factory::callee_symbol(), | 1002 SetLocalPropertyNoThrow(result, Factory::callee_symbol(), |
1000 Factory::undefined_value(), | 1003 Factory::undefined_value(), |
1001 DONT_ENUM); | 1004 DONT_ENUM); |
1002 SetLocalPropertyNoThrow(result, Factory::length_symbol(), | |
1003 Factory::undefined_value(), | |
1004 DONT_ENUM); | |
1005 | 1005 |
1006 #ifdef DEBUG | 1006 #ifdef DEBUG |
1007 LookupResult lookup; | 1007 LookupResult lookup; |
1008 result->LocalLookup(Heap::callee_symbol(), &lookup); | 1008 result->LocalLookup(Heap::callee_symbol(), &lookup); |
1009 ASSERT(lookup.IsProperty() && (lookup.type() == FIELD)); | 1009 ASSERT(lookup.IsProperty() && (lookup.type() == FIELD)); |
1010 ASSERT(lookup.GetFieldIndex() == Heap::arguments_callee_index); | 1010 ASSERT(lookup.GetFieldIndex() == Heap::arguments_callee_index); |
1011 | 1011 |
1012 result->LocalLookup(Heap::length_symbol(), &lookup); | 1012 result->LocalLookup(Heap::length_symbol(), &lookup); |
1013 ASSERT(lookup.IsProperty() && (lookup.type() == FIELD)); | 1013 ASSERT(lookup.IsProperty() && (lookup.type() == FIELD)); |
1014 ASSERT(lookup.GetFieldIndex() == Heap::arguments_length_index); | 1014 ASSERT(lookup.GetFieldIndex() == Heap::arguments_length_index); |
1015 | 1015 |
1016 ASSERT(result->map()->inobject_properties() > Heap::arguments_callee_index); | 1016 ASSERT(result->map()->inobject_properties() > Heap::arguments_callee_index); |
1017 ASSERT(result->map()->inobject_properties() > Heap::arguments_length_index); | 1017 ASSERT(result->map()->inobject_properties() > Heap::arguments_length_index); |
1018 | 1018 |
1019 // Check the state of the object. | 1019 // Check the state of the object. |
1020 ASSERT(result->HasFastProperties()); | 1020 ASSERT(result->HasFastProperties()); |
1021 ASSERT(result->HasFastElements()); | 1021 ASSERT(result->HasFastElements()); |
1022 #endif | 1022 #endif |
1023 } | 1023 } |
1024 | 1024 |
1025 { // --- strict mode arguments boilerplate | |
1026 const PropertyAttributes attributes = | |
1027 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); | |
1028 | |
1029 // 1. Create the poison pills. | |
1030 Handle<FixedArray> callee = Factory::NewFixedArray(2, TENURED); | |
1031 Handle<FixedArray> caller = Factory::NewFixedArray(2, TENURED); | |
1032 CreateThrowTypeErrorCallbacks(callee, Builtins::StrictArgumentsCallee); | |
1033 CreateThrowTypeErrorCallbacks(caller, Builtins::StrictArgumentsCaller); | |
1034 | |
1035 // 2. Create the descriptor array for the arguments object. | |
1036 Handle<DescriptorArray> descriptors = Factory::NewDescriptorArray(3); | |
1037 { // length | |
1038 FieldDescriptor d(*Factory::length_symbol(), 0, DONT_ENUM); | |
1039 descriptors->Set(0, &d); | |
1040 } | |
1041 { // callee | |
1042 CallbacksDescriptor d(*Factory::callee_symbol(), *callee, attributes); | |
1043 descriptors->Set(1, &d); | |
1044 } | |
1045 { // caller | |
1046 CallbacksDescriptor d(*Factory::caller_symbol(), *caller, attributes); | |
1047 descriptors->Set(2, &d); | |
1048 } | |
1049 descriptors->Sort(); | |
1050 | |
1051 // 3. Create the map. Allocate one in-object field for length. | |
1052 Handle<Map> map = Factory::NewMap(JS_OBJECT_TYPE, | |
1053 Heap::kArgumentsObjectSizeStrict); | |
1054 map->set_instance_descriptors(*descriptors); | |
1055 map->set_function_with_prototype(true); | |
1056 map->set_prototype(global_context()->object_function()->prototype()); | |
1057 map->set_pre_allocated_property_fields(1); | |
1058 map->set_inobject_properties(1); | |
1059 | |
1060 // 4. Copy constructor from the non-strict arguments boilerplate. | |
1061 map->set_constructor( | |
1062 global_context()->arguments_boilerplate()->map()->constructor()); | |
1063 | |
1064 // 5. Allocate the arguments boilerplate object. | |
1065 Handle<JSObject> result = Factory::NewJSObjectFromMap(map); | |
1066 global_context()->set_arguments_boilerplate_strict(*result); | |
1067 | |
1068 // 6. Add length property only for strict mode boilerplate. | |
1069 SetLocalPropertyNoThrow(result, Factory::length_symbol(), | |
1070 Factory::undefined_value(), | |
1071 DONT_ENUM); | |
1072 | |
1073 #ifdef DEBUG | |
1074 LookupResult lookup; | |
1075 result->LocalLookup(Heap::length_symbol(), &lookup); | |
1076 ASSERT(lookup.IsProperty() && (lookup.type() == FIELD)); | |
1077 ASSERT(lookup.GetFieldIndex() == Heap::arguments_length_index); | |
1078 | |
1079 ASSERT(result->map()->inobject_properties() > Heap::arguments_length_index); | |
1080 | |
1081 // Check the state of the object. | |
1082 ASSERT(result->HasFastProperties()); | |
1083 ASSERT(result->HasFastElements()); | |
1084 #endif | |
1085 } | |
1086 | |
1025 { // --- context extension | 1087 { // --- context extension |
1026 // Create a function for the context extension objects. | 1088 // Create a function for the context extension objects. |
1027 Handle<Code> code = Handle<Code>(Builtins::builtin(Builtins::Illegal)); | 1089 Handle<Code> code = Handle<Code>(Builtins::builtin(Builtins::Illegal)); |
1028 Handle<JSFunction> context_extension_fun = | 1090 Handle<JSFunction> context_extension_fun = |
1029 Factory::NewFunction(Factory::empty_symbol(), | 1091 Factory::NewFunction(Factory::empty_symbol(), |
1030 JS_CONTEXT_EXTENSION_OBJECT_TYPE, | 1092 JS_CONTEXT_EXTENSION_OBJECT_TYPE, |
1031 JSObject::kHeaderSize, | 1093 JSObject::kHeaderSize, |
1032 code, | 1094 code, |
1033 true); | 1095 true); |
1034 | 1096 |
(...skipping 998 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2033 } | 2095 } |
2034 | 2096 |
2035 | 2097 |
2036 // Restore statics that are thread local. | 2098 // Restore statics that are thread local. |
2037 char* BootstrapperActive::RestoreState(char* from) { | 2099 char* BootstrapperActive::RestoreState(char* from) { |
2038 nesting_ = *reinterpret_cast<int*>(from); | 2100 nesting_ = *reinterpret_cast<int*>(from); |
2039 return from + sizeof(nesting_); | 2101 return from + sizeof(nesting_); |
2040 } | 2102 } |
2041 | 2103 |
2042 } } // namespace v8::internal | 2104 } } // namespace v8::internal |
OLD | NEW |