OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/runtime/runtime-utils.h" | 5 #include "src/runtime/runtime-utils.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "src/arguments.h" | 9 #include "src/arguments.h" |
10 #include "src/assembler-inl.h" | 10 #include "src/assembler-inl.h" |
(...skipping 846 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
857 | 857 |
858 #undef FIXED_TYPED_ARRAYS_CHECK_RUNTIME_FUNCTION | 858 #undef FIXED_TYPED_ARRAYS_CHECK_RUNTIME_FUNCTION |
859 | 859 |
860 | 860 |
861 RUNTIME_FUNCTION(Runtime_SpeciesProtector) { | 861 RUNTIME_FUNCTION(Runtime_SpeciesProtector) { |
862 SealHandleScope shs(isolate); | 862 SealHandleScope shs(isolate); |
863 DCHECK_EQ(0, args.length()); | 863 DCHECK_EQ(0, args.length()); |
864 return isolate->heap()->ToBoolean(isolate->IsArraySpeciesLookupChainIntact()); | 864 return isolate->heap()->ToBoolean(isolate->IsArraySpeciesLookupChainIntact()); |
865 } | 865 } |
866 | 866 |
867 #define CONVERT_ARG_HANDLE_CHECKED_2(Type, name, index) \ | |
868 CHECK(Type::Is##Type(args[index])); \ | |
869 Handle<Type> name = args.at<Type>(index); | |
870 | |
871 // Take a compiled wasm module, serialize it and copy the buffer into an array | 867 // Take a compiled wasm module, serialize it and copy the buffer into an array |
872 // buffer, which is then returned. | 868 // buffer, which is then returned. |
873 RUNTIME_FUNCTION(Runtime_SerializeWasmModule) { | 869 RUNTIME_FUNCTION(Runtime_SerializeWasmModule) { |
874 HandleScope shs(isolate); | 870 HandleScope shs(isolate); |
875 DCHECK_EQ(1, args.length()); | 871 DCHECK_EQ(1, args.length()); |
876 CONVERT_ARG_HANDLE_CHECKED_2(WasmModuleObject, module_obj, 0); | 872 CONVERT_ARG_HANDLE_CHECKED(WasmModuleObject, module_obj, 0); |
877 | 873 |
878 Handle<WasmCompiledModule> orig(module_obj->compiled_module()); | 874 Handle<WasmCompiledModule> orig(module_obj->compiled_module()); |
879 std::unique_ptr<ScriptData> data = | 875 std::unique_ptr<ScriptData> data = |
880 WasmCompiledModuleSerializer::SerializeWasmModule(isolate, orig); | 876 WasmCompiledModuleSerializer::SerializeWasmModule(isolate, orig); |
881 void* buff = isolate->array_buffer_allocator()->Allocate(data->length()); | 877 void* buff = isolate->array_buffer_allocator()->Allocate(data->length()); |
882 Handle<JSArrayBuffer> ret = isolate->factory()->NewJSArrayBuffer(); | 878 Handle<JSArrayBuffer> ret = isolate->factory()->NewJSArrayBuffer(); |
883 JSArrayBuffer::Setup(ret, isolate, false, buff, data->length()); | 879 JSArrayBuffer::Setup(ret, isolate, false, buff, data->length()); |
884 memcpy(buff, data->data(), data->length()); | 880 memcpy(buff, data->data(), data->length()); |
885 return *ret; | 881 return *ret; |
886 } | 882 } |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
918 if (!maybe_compiled_module.ToHandle(&compiled_module)) { | 914 if (!maybe_compiled_module.ToHandle(&compiled_module)) { |
919 return isolate->heap()->undefined_value(); | 915 return isolate->heap()->undefined_value(); |
920 } | 916 } |
921 return *WasmModuleObject::New( | 917 return *WasmModuleObject::New( |
922 isolate, Handle<WasmCompiledModule>::cast(compiled_module)); | 918 isolate, Handle<WasmCompiledModule>::cast(compiled_module)); |
923 } | 919 } |
924 | 920 |
925 RUNTIME_FUNCTION(Runtime_ValidateWasmInstancesChain) { | 921 RUNTIME_FUNCTION(Runtime_ValidateWasmInstancesChain) { |
926 HandleScope shs(isolate); | 922 HandleScope shs(isolate); |
927 DCHECK_EQ(2, args.length()); | 923 DCHECK_EQ(2, args.length()); |
928 CONVERT_ARG_HANDLE_CHECKED_2(WasmModuleObject, module_obj, 0); | 924 CONVERT_ARG_HANDLE_CHECKED(WasmModuleObject, module_obj, 0); |
929 CONVERT_ARG_HANDLE_CHECKED(Smi, instance_count, 1); | 925 CONVERT_ARG_HANDLE_CHECKED(Smi, instance_count, 1); |
930 wasm::testing::ValidateInstancesChain(isolate, module_obj, | 926 wasm::testing::ValidateInstancesChain(isolate, module_obj, |
931 instance_count->value()); | 927 instance_count->value()); |
932 return isolate->heap()->ToBoolean(true); | 928 return isolate->heap()->ToBoolean(true); |
933 } | 929 } |
934 | 930 |
935 RUNTIME_FUNCTION(Runtime_ValidateWasmModuleState) { | 931 RUNTIME_FUNCTION(Runtime_ValidateWasmModuleState) { |
936 HandleScope shs(isolate); | 932 HandleScope shs(isolate); |
937 DCHECK_EQ(1, args.length()); | 933 DCHECK_EQ(1, args.length()); |
938 CONVERT_ARG_HANDLE_CHECKED_2(WasmModuleObject, module_obj, 0); | 934 CONVERT_ARG_HANDLE_CHECKED(WasmModuleObject, module_obj, 0); |
939 wasm::testing::ValidateModuleState(isolate, module_obj); | 935 wasm::testing::ValidateModuleState(isolate, module_obj); |
940 return isolate->heap()->ToBoolean(true); | 936 return isolate->heap()->ToBoolean(true); |
941 } | 937 } |
942 | 938 |
943 RUNTIME_FUNCTION(Runtime_ValidateWasmOrphanedInstance) { | 939 RUNTIME_FUNCTION(Runtime_ValidateWasmOrphanedInstance) { |
944 HandleScope shs(isolate); | 940 HandleScope shs(isolate); |
945 DCHECK_EQ(1, args.length()); | 941 DCHECK_EQ(1, args.length()); |
946 CONVERT_ARG_HANDLE_CHECKED_2(WasmInstanceObject, instance, 0); | 942 CONVERT_ARG_HANDLE_CHECKED(WasmInstanceObject, instance, 0); |
947 wasm::testing::ValidateOrphanedInstance(isolate, instance); | 943 wasm::testing::ValidateOrphanedInstance(isolate, instance); |
948 return isolate->heap()->ToBoolean(true); | 944 return isolate->heap()->ToBoolean(true); |
949 } | 945 } |
950 | 946 |
951 RUNTIME_FUNCTION(Runtime_HeapObjectVerify) { | 947 RUNTIME_FUNCTION(Runtime_HeapObjectVerify) { |
952 HandleScope shs(isolate); | 948 HandleScope shs(isolate); |
953 DCHECK_EQ(1, args.length()); | 949 DCHECK_EQ(1, args.length()); |
954 CONVERT_ARG_HANDLE_CHECKED(Object, object, 0); | 950 CONVERT_ARG_HANDLE_CHECKED(Object, object, 0); |
955 #ifdef VERIFY_HEAP | 951 #ifdef VERIFY_HEAP |
956 object->ObjectVerify(); | 952 object->ObjectVerify(); |
957 #else | 953 #else |
958 CHECK(object->IsObject()); | 954 CHECK(object->IsObject()); |
959 if (object->IsHeapObject()) { | 955 if (object->IsHeapObject()) { |
960 CHECK(HeapObject::cast(*object)->map()->IsMap()); | 956 CHECK(HeapObject::cast(*object)->map()->IsMap()); |
961 } else { | 957 } else { |
962 CHECK(object->IsSmi()); | 958 CHECK(object->IsSmi()); |
963 } | 959 } |
964 #endif | 960 #endif |
965 return isolate->heap()->ToBoolean(true); | 961 return isolate->heap()->ToBoolean(true); |
966 } | 962 } |
967 | 963 |
968 RUNTIME_FUNCTION(Runtime_WasmNumInterpretedCalls) { | 964 RUNTIME_FUNCTION(Runtime_WasmNumInterpretedCalls) { |
969 DCHECK_EQ(1, args.length()); | 965 DCHECK_EQ(1, args.length()); |
970 HandleScope scope(isolate); | 966 HandleScope scope(isolate); |
971 CONVERT_ARG_HANDLE_CHECKED(JSObject, instance_obj, 0); | 967 CONVERT_ARG_HANDLE_CHECKED(WasmInstanceObject, instance, 0); |
972 CHECK(WasmInstanceObject::IsWasmInstanceObject(*instance_obj)); | |
973 Handle<WasmInstanceObject> instance = | |
974 Handle<WasmInstanceObject>::cast(instance_obj); | |
975 if (!instance->has_debug_info()) return 0; | 968 if (!instance->has_debug_info()) return 0; |
976 uint64_t num = instance->debug_info()->NumInterpretedCalls(); | 969 uint64_t num = instance->debug_info()->NumInterpretedCalls(); |
977 return *isolate->factory()->NewNumberFromSize(static_cast<size_t>(num)); | 970 return *isolate->factory()->NewNumberFromSize(static_cast<size_t>(num)); |
978 } | 971 } |
979 | 972 |
980 RUNTIME_FUNCTION(Runtime_RedirectToWasmInterpreter) { | 973 RUNTIME_FUNCTION(Runtime_RedirectToWasmInterpreter) { |
981 DCHECK_EQ(2, args.length()); | 974 DCHECK_EQ(2, args.length()); |
982 HandleScope scope(isolate); | 975 HandleScope scope(isolate); |
983 CONVERT_ARG_HANDLE_CHECKED(JSObject, instance_obj, 0); | 976 CONVERT_ARG_HANDLE_CHECKED(WasmInstanceObject, instance, 0); |
984 CONVERT_SMI_ARG_CHECKED(function_index, 1); | 977 CONVERT_SMI_ARG_CHECKED(function_index, 1); |
985 CHECK(WasmInstanceObject::IsWasmInstanceObject(*instance_obj)); | |
986 Handle<WasmInstanceObject> instance = | |
987 Handle<WasmInstanceObject>::cast(instance_obj); | |
988 Handle<WasmDebugInfo> debug_info = | 978 Handle<WasmDebugInfo> debug_info = |
989 WasmInstanceObject::GetOrCreateDebugInfo(instance); | 979 WasmInstanceObject::GetOrCreateDebugInfo(instance); |
990 WasmDebugInfo::RedirectToInterpreter(debug_info, | 980 WasmDebugInfo::RedirectToInterpreter(debug_info, |
991 Vector<int>(&function_index, 1)); | 981 Vector<int>(&function_index, 1)); |
992 return isolate->heap()->undefined_value(); | 982 return isolate->heap()->undefined_value(); |
993 } | 983 } |
994 | 984 |
995 } // namespace internal | 985 } // namespace internal |
996 } // namespace v8 | 986 } // namespace v8 |
OLD | NEW |