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 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
66 template <class C> | 66 template <class C> |
67 static C* FindInstanceOf(Isolate* isolate, Object* obj) { | 67 static C* FindInstanceOf(Isolate* isolate, Object* obj) { |
68 for (Object* cur = obj; !cur->IsNull(); cur = cur->GetPrototype(isolate)) { | 68 for (Object* cur = obj; !cur->IsNull(); cur = cur->GetPrototype(isolate)) { |
69 if (Is<C>(cur)) return C::cast(cur); | 69 if (Is<C>(cur)) return C::cast(cur); |
70 } | 70 } |
71 return NULL; | 71 return NULL; |
72 } | 72 } |
73 | 73 |
74 | 74 |
75 // Entry point that never should be called. | 75 // Entry point that never should be called. |
76 MaybeObject* Accessors::IllegalSetter(Isolate* isolate, | 76 Object* Accessors::IllegalSetter(Isolate* isolate, |
77 JSObject*, | 77 JSObject*, |
78 Object*, | 78 Object*, |
79 void*) { | 79 void*) { |
80 UNREACHABLE(); | 80 UNREACHABLE(); |
81 return NULL; | 81 return NULL; |
82 } | 82 } |
83 | 83 |
84 | 84 |
85 Object* Accessors::IllegalGetAccessor(Isolate* isolate, | 85 Object* Accessors::IllegalGetAccessor(Isolate* isolate, |
86 Object* object, | 86 Object* object, |
87 void*) { | 87 void*) { |
88 UNREACHABLE(); | 88 UNREACHABLE(); |
89 return object; | 89 return object; |
90 } | 90 } |
91 | 91 |
92 | 92 |
93 MaybeObject* Accessors::ReadOnlySetAccessor(Isolate* isolate, | 93 Object* Accessors::ReadOnlySetAccessor(Isolate* isolate, |
94 JSObject*, | 94 JSObject*, |
95 Object* value, | 95 Object* value, |
96 void*) { | 96 void*) { |
97 // According to ECMA-262, section 8.6.2.2, page 28, setting | 97 // According to ECMA-262, section 8.6.2.2, page 28, setting |
98 // read-only properties must be silently ignored. | 98 // read-only properties must be silently ignored. |
99 return value; | 99 return value; |
100 } | 100 } |
101 | 101 |
102 | 102 |
103 static V8_INLINE bool CheckForName(Handle<String> name, | 103 static V8_INLINE bool CheckForName(Handle<String> name, |
104 Handle<String> property_name, | 104 Handle<String> property_name, |
105 int offset, | 105 int offset, |
106 int* object_offset) { | 106 int* object_offset) { |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
167 bool Accessors::IsJSObjectFieldAccessor<HeapType>(Handle<HeapType> type, | 167 bool Accessors::IsJSObjectFieldAccessor<HeapType>(Handle<HeapType> type, |
168 Handle<String> name, | 168 Handle<String> name, |
169 int* object_offset); | 169 int* object_offset); |
170 | 170 |
171 | 171 |
172 // | 172 // |
173 // Accessors::ArrayLength | 173 // Accessors::ArrayLength |
174 // | 174 // |
175 | 175 |
176 | 176 |
177 MaybeObject* Accessors::ArrayGetLength(Isolate* isolate, | 177 Object* Accessors::ArrayGetLength(Isolate* isolate, |
178 Object* object, | 178 Object* object, |
179 void*) { | 179 void*) { |
180 // Traverse the prototype chain until we reach an array. | 180 // Traverse the prototype chain until we reach an array. |
181 JSArray* holder = FindInstanceOf<JSArray>(isolate, object); | 181 JSArray* holder = FindInstanceOf<JSArray>(isolate, object); |
182 return holder == NULL ? Smi::FromInt(0) : holder->length(); | 182 return holder == NULL ? Smi::FromInt(0) : holder->length(); |
183 } | 183 } |
184 | 184 |
185 | 185 |
186 // The helper function will 'flatten' Number objects. | 186 // The helper function will 'flatten' Number objects. |
187 Handle<Object> Accessors::FlattenNumber(Isolate* isolate, | 187 Handle<Object> Accessors::FlattenNumber(Isolate* isolate, |
188 Handle<Object> value) { | 188 Handle<Object> value) { |
189 if (value->IsNumber() || !value->IsJSValue()) return value; | 189 if (value->IsNumber() || !value->IsJSValue()) return value; |
190 Handle<JSValue> wrapper = Handle<JSValue>::cast(value); | 190 Handle<JSValue> wrapper = Handle<JSValue>::cast(value); |
191 ASSERT(wrapper->GetIsolate()->context()->native_context()->number_function()-> | 191 ASSERT(wrapper->GetIsolate()->context()->native_context()->number_function()-> |
192 has_initial_map()); | 192 has_initial_map()); |
193 if (wrapper->map() == | 193 if (wrapper->map() == |
194 isolate->context()->native_context()->number_function()->initial_map()) { | 194 isolate->context()->native_context()->number_function()->initial_map()) { |
195 return handle(wrapper->value(), isolate); | 195 return handle(wrapper->value(), isolate); |
196 } | 196 } |
197 | 197 |
198 return value; | 198 return value; |
199 } | 199 } |
200 | 200 |
201 | 201 |
202 MaybeObject* Accessors::ArraySetLength(Isolate* isolate, | 202 Object* Accessors::ArraySetLength(Isolate* isolate, |
203 JSObject* object_raw, | 203 JSObject* object_raw, |
204 Object* value_raw, | 204 Object* value_raw, |
205 void*) { | 205 void*) { |
206 HandleScope scope(isolate); | 206 HandleScope scope(isolate); |
207 Handle<JSObject> object(object_raw, isolate); | 207 Handle<JSObject> object(object_raw, isolate); |
208 Handle<Object> value(value_raw, isolate); | 208 Handle<Object> value(value_raw, isolate); |
209 | 209 |
210 // This means one of the object's prototypes is a JSArray and the | 210 // This means one of the object's prototypes is a JSArray and the |
211 // object does not have a 'length' property. Calling SetProperty | 211 // object does not have a 'length' property. Calling SetProperty |
212 // causes an infinite loop. | 212 // causes an infinite loop. |
213 if (!object->IsJSArray()) { | 213 if (!object->IsJSArray()) { |
214 Handle<Object> result; | 214 Handle<Object> result; |
215 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 215 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
(...skipping 628 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
844 Handle<Object> Accessors::FunctionSetPrototype(Handle<JSFunction> function, | 844 Handle<Object> Accessors::FunctionSetPrototype(Handle<JSFunction> function, |
845 Handle<Object> prototype) { | 845 Handle<Object> prototype) { |
846 ASSERT(function->should_have_prototype()); | 846 ASSERT(function->should_have_prototype()); |
847 Isolate* isolate = function->GetIsolate(); | 847 Isolate* isolate = function->GetIsolate(); |
848 Handle<Object> result; | 848 Handle<Object> result; |
849 SetFunctionPrototype(isolate, function, prototype).ToHandle(&result); | 849 SetFunctionPrototype(isolate, function, prototype).ToHandle(&result); |
850 return result; | 850 return result; |
851 } | 851 } |
852 | 852 |
853 | 853 |
854 MaybeObject* Accessors::FunctionGetPrototype(Isolate* isolate, | 854 Object* Accessors::FunctionGetPrototype(Isolate* isolate, |
855 Object* object, | 855 Object* object, |
856 void*) { | 856 void*) { |
857 HandleScope scope(isolate); | 857 HandleScope scope(isolate); |
858 return *GetFunctionPrototype(isolate, Handle<Object>(object, isolate)); | 858 return *GetFunctionPrototype(isolate, Handle<Object>(object, isolate)); |
859 } | 859 } |
860 | 860 |
861 | 861 |
862 MaybeObject* Accessors::FunctionSetPrototype(Isolate* isolate, | 862 Object* Accessors::FunctionSetPrototype(Isolate* isolate, |
863 JSObject* object, | 863 JSObject* object, |
864 Object* value, | 864 Object* value, |
865 void*) { | 865 void*) { |
866 Handle<Object> result; | 866 Handle<Object> result; |
867 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 867 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
868 isolate, result, | 868 isolate, result, |
869 SetFunctionPrototype(isolate, | 869 SetFunctionPrototype(isolate, |
870 Handle<JSObject>(object, isolate), | 870 Handle<JSObject>(object, isolate), |
871 Handle<Object>(value, isolate))); | 871 Handle<Object>(value, isolate))); |
872 return *result; | 872 return *result; |
873 } | 873 } |
874 | 874 |
875 | 875 |
876 const AccessorDescriptor Accessors::FunctionPrototype = { | 876 const AccessorDescriptor Accessors::FunctionPrototype = { |
877 FunctionGetPrototype, | 877 FunctionGetPrototype, |
878 FunctionSetPrototype, | 878 FunctionSetPrototype, |
879 0 | 879 0 |
880 }; | 880 }; |
881 | 881 |
882 | 882 |
883 // | 883 // |
884 // Accessors::FunctionLength | 884 // Accessors::FunctionLength |
885 // | 885 // |
886 | 886 |
887 | 887 |
888 MaybeObject* Accessors::FunctionGetLength(Isolate* isolate, | 888 Object* Accessors::FunctionGetLength(Isolate* isolate, |
889 Object* object, | 889 Object* object, |
890 void*) { | 890 void*) { |
891 JSFunction* function = FindInstanceOf<JSFunction>(isolate, object); | 891 JSFunction* function = FindInstanceOf<JSFunction>(isolate, object); |
892 if (function == NULL) return Smi::FromInt(0); | 892 if (function == NULL) return Smi::FromInt(0); |
893 // Check if already compiled. | 893 // Check if already compiled. |
894 if (function->shared()->is_compiled()) { | 894 if (function->shared()->is_compiled()) { |
895 return Smi::FromInt(function->shared()->length()); | 895 return Smi::FromInt(function->shared()->length()); |
896 } | 896 } |
897 // If the function isn't compiled yet, the length is not computed correctly | 897 // If the function isn't compiled yet, the length is not computed correctly |
898 // yet. Compile it now and return the right length. | 898 // yet. Compile it now and return the right length. |
899 HandleScope scope(isolate); | 899 HandleScope scope(isolate); |
900 Handle<JSFunction> function_handle(function); | 900 Handle<JSFunction> function_handle(function); |
901 if (Compiler::EnsureCompiled(function_handle, KEEP_EXCEPTION)) { | 901 if (Compiler::EnsureCompiled(function_handle, KEEP_EXCEPTION)) { |
902 return Smi::FromInt(function_handle->shared()->length()); | 902 return Smi::FromInt(function_handle->shared()->length()); |
903 } | 903 } |
904 return isolate->heap()->exception(); | 904 return isolate->heap()->exception(); |
905 } | 905 } |
906 | 906 |
907 | 907 |
908 const AccessorDescriptor Accessors::FunctionLength = { | 908 const AccessorDescriptor Accessors::FunctionLength = { |
909 FunctionGetLength, | 909 FunctionGetLength, |
910 ReadOnlySetAccessor, | 910 ReadOnlySetAccessor, |
911 0 | 911 0 |
912 }; | 912 }; |
913 | 913 |
914 | 914 |
915 // | 915 // |
916 // Accessors::FunctionName | 916 // Accessors::FunctionName |
917 // | 917 // |
918 | 918 |
919 | 919 |
920 MaybeObject* Accessors::FunctionGetName(Isolate* isolate, | 920 Object* Accessors::FunctionGetName(Isolate* isolate, |
921 Object* object, | 921 Object* object, |
922 void*) { | 922 void*) { |
923 JSFunction* holder = FindInstanceOf<JSFunction>(isolate, object); | 923 JSFunction* holder = FindInstanceOf<JSFunction>(isolate, object); |
924 return holder == NULL | 924 return holder == NULL |
925 ? isolate->heap()->undefined_value() | 925 ? isolate->heap()->undefined_value() |
926 : holder->shared()->name(); | 926 : holder->shared()->name(); |
927 } | 927 } |
928 | 928 |
929 | 929 |
930 const AccessorDescriptor Accessors::FunctionName = { | 930 const AccessorDescriptor Accessors::FunctionName = { |
931 FunctionGetName, | 931 FunctionGetName, |
932 ReadOnlySetAccessor, | 932 ReadOnlySetAccessor, |
933 0 | 933 0 |
934 }; | 934 }; |
935 | 935 |
936 | 936 |
937 // | 937 // |
938 // Accessors::FunctionArguments | 938 // Accessors::FunctionArguments |
939 // | 939 // |
940 | 940 |
941 | 941 |
942 Handle<Object> Accessors::FunctionGetArguments(Handle<JSFunction> function) { | 942 Handle<Object> Accessors::FunctionGetArguments(Handle<JSFunction> function) { |
943 CALL_HEAP_FUNCTION(function->GetIsolate(), | 943 CALL_HEAP_FUNCTION(function->GetIsolate(), |
944 Accessors::FunctionGetArguments(function->GetIsolate(), | 944 Accessors::FunctionGetArguments(function->GetIsolate(), |
945 *function, | 945 *function, |
946 NULL), | 946 NULL), |
947 Object); | 947 Object); |
948 } | 948 } |
949 | 949 |
950 | 950 |
951 static MaybeObject* ConstructArgumentsObjectForInlinedFunction( | 951 static Object* ConstructArgumentsObjectForInlinedFunction( |
952 JavaScriptFrame* frame, | 952 JavaScriptFrame* frame, |
953 Handle<JSFunction> inlined_function, | 953 Handle<JSFunction> inlined_function, |
954 int inlined_frame_index) { | 954 int inlined_frame_index) { |
955 Isolate* isolate = inlined_function->GetIsolate(); | 955 Isolate* isolate = inlined_function->GetIsolate(); |
956 Factory* factory = isolate->factory(); | 956 Factory* factory = isolate->factory(); |
957 SlotRefValueBuilder slot_refs( | 957 SlotRefValueBuilder slot_refs( |
958 frame, | 958 frame, |
959 inlined_frame_index, | 959 inlined_frame_index, |
960 inlined_function->shared()->formal_parameter_count()); | 960 inlined_function->shared()->formal_parameter_count()); |
961 | 961 |
962 int args_count = slot_refs.args_length(); | 962 int args_count = slot_refs.args_length(); |
963 Handle<JSObject> arguments = | 963 Handle<JSObject> arguments = |
964 factory->NewArgumentsObject(inlined_function, args_count); | 964 factory->NewArgumentsObject(inlined_function, args_count); |
965 Handle<FixedArray> array = factory->NewFixedArray(args_count); | 965 Handle<FixedArray> array = factory->NewFixedArray(args_count); |
966 slot_refs.Prepare(isolate); | 966 slot_refs.Prepare(isolate); |
967 for (int i = 0; i < args_count; ++i) { | 967 for (int i = 0; i < args_count; ++i) { |
968 Handle<Object> value = slot_refs.GetNext(isolate, 0); | 968 Handle<Object> value = slot_refs.GetNext(isolate, 0); |
969 array->set(i, *value); | 969 array->set(i, *value); |
970 } | 970 } |
971 slot_refs.Finish(isolate); | 971 slot_refs.Finish(isolate); |
972 arguments->set_elements(*array); | 972 arguments->set_elements(*array); |
973 | 973 |
974 // Return the freshly allocated arguments object. | 974 // Return the freshly allocated arguments object. |
975 return *arguments; | 975 return *arguments; |
976 } | 976 } |
977 | 977 |
978 | 978 |
979 MaybeObject* Accessors::FunctionGetArguments(Isolate* isolate, | 979 Object* Accessors::FunctionGetArguments(Isolate* isolate, |
980 Object* object, | 980 Object* object, |
981 void*) { | 981 void*) { |
982 HandleScope scope(isolate); | 982 HandleScope scope(isolate); |
983 JSFunction* holder = FindInstanceOf<JSFunction>(isolate, object); | 983 JSFunction* holder = FindInstanceOf<JSFunction>(isolate, object); |
984 if (holder == NULL) return isolate->heap()->undefined_value(); | 984 if (holder == NULL) return isolate->heap()->undefined_value(); |
985 Handle<JSFunction> function(holder, isolate); | 985 Handle<JSFunction> function(holder, isolate); |
986 | 986 |
987 if (function->shared()->native()) return isolate->heap()->null_value(); | 987 if (function->shared()->native()) return isolate->heap()->null_value(); |
988 // Find the top invocation of the function by traversing frames. | 988 // Find the top invocation of the function by traversing frames. |
989 List<JSFunction*> functions(2); | 989 List<JSFunction*> functions(2); |
990 for (JavaScriptFrameIterator it(isolate); !it.done(); it.Advance()) { | 990 for (JavaScriptFrameIterator it(isolate); !it.done(); it.Advance()) { |
991 JavaScriptFrame* frame = it.frame(); | 991 JavaScriptFrame* frame = it.frame(); |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1093 ASSERT(functions_.length() > 0); | 1093 ASSERT(functions_.length() > 0); |
1094 frame_iterator_.Advance(); | 1094 frame_iterator_.Advance(); |
1095 index_ = functions_.length() - 1; | 1095 index_ = functions_.length() - 1; |
1096 } | 1096 } |
1097 JavaScriptFrameIterator frame_iterator_; | 1097 JavaScriptFrameIterator frame_iterator_; |
1098 List<JSFunction*> functions_; | 1098 List<JSFunction*> functions_; |
1099 int index_; | 1099 int index_; |
1100 }; | 1100 }; |
1101 | 1101 |
1102 | 1102 |
1103 MaybeObject* Accessors::FunctionGetCaller(Isolate* isolate, | 1103 Object* Accessors::FunctionGetCaller(Isolate* isolate, |
1104 Object* object, | 1104 Object* object, |
1105 void*) { | 1105 void*) { |
1106 HandleScope scope(isolate); | 1106 HandleScope scope(isolate); |
1107 DisallowHeapAllocation no_allocation; | 1107 DisallowHeapAllocation no_allocation; |
1108 JSFunction* holder = FindInstanceOf<JSFunction>(isolate, object); | 1108 JSFunction* holder = FindInstanceOf<JSFunction>(isolate, object); |
1109 if (holder == NULL) return isolate->heap()->undefined_value(); | 1109 if (holder == NULL) return isolate->heap()->undefined_value(); |
1110 if (holder->shared()->native()) return isolate->heap()->null_value(); | 1110 if (holder->shared()->native()) return isolate->heap()->null_value(); |
1111 Handle<JSFunction> function(holder, isolate); | 1111 Handle<JSFunction> function(holder, isolate); |
1112 | 1112 |
1113 FrameFunctionIterator it(isolate, no_allocation); | 1113 FrameFunctionIterator it(isolate, no_allocation); |
1114 | 1114 |
1115 // Find the function from the frames. | 1115 // Find the function from the frames. |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1218 info->set_data(Smi::FromInt(index)); | 1218 info->set_data(Smi::FromInt(index)); |
1219 Handle<Object> getter = v8::FromCData(isolate, &ModuleGetExport); | 1219 Handle<Object> getter = v8::FromCData(isolate, &ModuleGetExport); |
1220 Handle<Object> setter = v8::FromCData(isolate, &ModuleSetExport); | 1220 Handle<Object> setter = v8::FromCData(isolate, &ModuleSetExport); |
1221 info->set_getter(*getter); | 1221 info->set_getter(*getter); |
1222 if (!(attributes & ReadOnly)) info->set_setter(*setter); | 1222 if (!(attributes & ReadOnly)) info->set_setter(*setter); |
1223 return info; | 1223 return info; |
1224 } | 1224 } |
1225 | 1225 |
1226 | 1226 |
1227 } } // namespace v8::internal | 1227 } } // namespace v8::internal |
OLD | NEW |