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 772 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
783 } | 783 } |
784 | 784 |
785 | 785 |
786 template <bool is_construct> | 786 template <bool is_construct> |
787 static Object* HandleApiCallHelper( | 787 static Object* HandleApiCallHelper( |
788 BuiltinArguments<NEEDS_CALLED_FUNCTION> args) { | 788 BuiltinArguments<NEEDS_CALLED_FUNCTION> args) { |
789 ASSERT(is_construct == CalledAsConstructor()); | 789 ASSERT(is_construct == CalledAsConstructor()); |
790 | 790 |
791 HandleScope scope; | 791 HandleScope scope; |
792 Handle<JSFunction> function = args.called_function(); | 792 Handle<JSFunction> function = args.called_function(); |
| 793 ASSERT(function->shared()->IsApiFunction()); |
793 | 794 |
| 795 FunctionTemplateInfo* fun_data = function->shared()->get_api_func_data(); |
794 if (is_construct) { | 796 if (is_construct) { |
795 Handle<FunctionTemplateInfo> desc = | 797 Handle<FunctionTemplateInfo> desc(fun_data); |
796 Handle<FunctionTemplateInfo>( | |
797 FunctionTemplateInfo::cast(function->shared()->function_data())); | |
798 bool pending_exception = false; | 798 bool pending_exception = false; |
799 Factory::ConfigureInstance(desc, Handle<JSObject>::cast(args.receiver()), | 799 Factory::ConfigureInstance(desc, Handle<JSObject>::cast(args.receiver()), |
800 &pending_exception); | 800 &pending_exception); |
801 ASSERT(Top::has_pending_exception() == pending_exception); | 801 ASSERT(Top::has_pending_exception() == pending_exception); |
802 if (pending_exception) return Failure::Exception(); | 802 if (pending_exception) return Failure::Exception(); |
| 803 fun_data = *desc; |
803 } | 804 } |
804 | 805 |
805 FunctionTemplateInfo* fun_data = | |
806 FunctionTemplateInfo::cast(function->shared()->function_data()); | |
807 Object* raw_holder = TypeCheck(args.length(), &args[0], fun_data); | 806 Object* raw_holder = TypeCheck(args.length(), &args[0], fun_data); |
808 | 807 |
809 if (raw_holder->IsNull()) { | 808 if (raw_holder->IsNull()) { |
810 // This function cannot be called with the given receiver. Abort! | 809 // This function cannot be called with the given receiver. Abort! |
811 Handle<Object> obj = | 810 Handle<Object> obj = |
812 Factory::NewTypeError("illegal_invocation", HandleVector(&function, 1)); | 811 Factory::NewTypeError("illegal_invocation", HandleVector(&function, 1)); |
813 return Top::Throw(*obj); | 812 return Top::Throw(*obj); |
814 } | 813 } |
815 | 814 |
816 Object* raw_call_data = fun_data->call_code(); | 815 Object* raw_call_data = fun_data->call_code(); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
867 | 866 |
868 BUILTIN(HandleApiCallConstruct) { | 867 BUILTIN(HandleApiCallConstruct) { |
869 return HandleApiCallHelper<true>(args); | 868 return HandleApiCallHelper<true>(args); |
870 } | 869 } |
871 | 870 |
872 | 871 |
873 #ifdef DEBUG | 872 #ifdef DEBUG |
874 | 873 |
875 static void VerifyTypeCheck(Handle<JSObject> object, | 874 static void VerifyTypeCheck(Handle<JSObject> object, |
876 Handle<JSFunction> function) { | 875 Handle<JSFunction> function) { |
877 FunctionTemplateInfo* info = | 876 ASSERT(function->shared()->IsApiFunction()); |
878 FunctionTemplateInfo::cast(function->shared()->function_data()); | 877 FunctionTemplateInfo* info = function->shared()->get_api_func_data(); |
879 if (info->signature()->IsUndefined()) return; | 878 if (info->signature()->IsUndefined()) return; |
880 SignatureInfo* signature = SignatureInfo::cast(info->signature()); | 879 SignatureInfo* signature = SignatureInfo::cast(info->signature()); |
881 Object* receiver_type = signature->receiver(); | 880 Object* receiver_type = signature->receiver(); |
882 if (receiver_type->IsUndefined()) return; | 881 if (receiver_type->IsUndefined()) return; |
883 FunctionTemplateInfo* type = FunctionTemplateInfo::cast(receiver_type); | 882 FunctionTemplateInfo* type = FunctionTemplateInfo::cast(receiver_type); |
884 ASSERT(object->IsInstanceOf(type)); | 883 ASSERT(object->IsInstanceOf(type)); |
885 } | 884 } |
886 | 885 |
887 #endif | 886 #endif |
888 | 887 |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
952 | 951 |
953 Handle<Object> receiver = args.at<Object>(0); | 952 Handle<Object> receiver = args.at<Object>(0); |
954 | 953 |
955 // Get the object called. | 954 // Get the object called. |
956 JSObject* obj = JSObject::cast(*args.receiver()); | 955 JSObject* obj = JSObject::cast(*args.receiver()); |
957 | 956 |
958 // Get the invocation callback from the function descriptor that was | 957 // Get the invocation callback from the function descriptor that was |
959 // used to create the called object. | 958 // used to create the called object. |
960 ASSERT(obj->map()->has_instance_call_handler()); | 959 ASSERT(obj->map()->has_instance_call_handler()); |
961 JSFunction* constructor = JSFunction::cast(obj->map()->constructor()); | 960 JSFunction* constructor = JSFunction::cast(obj->map()->constructor()); |
962 Object* template_info = constructor->shared()->function_data(); | 961 ASSERT(constructor->shared()->IsApiFunction()); |
963 Object* handler = | 962 Object* handler = |
964 FunctionTemplateInfo::cast(template_info)->instance_call_handler(); | 963 constructor->shared()->get_api_func_data()->instance_call_handler(); |
965 ASSERT(!handler->IsUndefined()); | 964 ASSERT(!handler->IsUndefined()); |
966 CallHandlerInfo* call_data = CallHandlerInfo::cast(handler); | 965 CallHandlerInfo* call_data = CallHandlerInfo::cast(handler); |
967 Object* callback_obj = call_data->callback(); | 966 Object* callback_obj = call_data->callback(); |
968 v8::InvocationCallback callback = | 967 v8::InvocationCallback callback = |
969 v8::ToCData<v8::InvocationCallback>(callback_obj); | 968 v8::ToCData<v8::InvocationCallback>(callback_obj); |
970 | 969 |
971 // Get the data for the call and perform the callback. | 970 // Get the data for the call and perform the callback. |
972 Object* data_obj = call_data->data(); | 971 Object* data_obj = call_data->data(); |
973 Object* result; | 972 Object* result; |
974 { HandleScope scope; | 973 { HandleScope scope; |
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1375 if (entry->contains(pc)) { | 1374 if (entry->contains(pc)) { |
1376 return names_[i]; | 1375 return names_[i]; |
1377 } | 1376 } |
1378 } | 1377 } |
1379 } | 1378 } |
1380 return NULL; | 1379 return NULL; |
1381 } | 1380 } |
1382 | 1381 |
1383 | 1382 |
1384 } } // namespace v8::internal | 1383 } } // namespace v8::internal |
OLD | NEW |