diff options
Diffstat (limited to 'deps/v8/src/d8/d8-test.cc')
-rw-r--r-- | deps/v8/src/d8/d8-test.cc | 176 |
1 files changed, 175 insertions, 1 deletions
diff --git a/deps/v8/src/d8/d8-test.cc b/deps/v8/src/d8/d8-test.cc index a4d5abdc44..c7e790379e 100644 --- a/deps/v8/src/d8/d8-test.cc +++ b/deps/v8/src/d8/d8-test.cc @@ -922,7 +922,7 @@ class FastCApiObject { args.GetReturnValue().Set(Number::New(isolate, result)); } else { IntegerT clamped = std::numeric_limits<IntegerT>::max(); - if (std::isnan(checked_arg_dbl)) { + if (std::isnan(checked_arg_dbl) || std::isnan(real_arg)) { clamped = 0; } else { IntegerT lower_bound = std::numeric_limits<IntegerT>::min(); @@ -1029,6 +1029,140 @@ class FastCApiObject { args.GetIsolate()->ThrowError("should be unreachable from wasm"); } + static void AssertIsExternal(const FunctionCallbackInfo<Value>& args) { + FastCApiObject* self = UnwrapObject(args.This()); + CHECK_SELF_OR_THROW(); + + Local<Value> value = args[0]; + + if (!value->IsExternal()) { + args.GetIsolate()->ThrowError("Did not get an external."); + } + } + + static void* GetPointerFastCallback(Local<Object> receiver, + FastApiCallbackOptions& options) { + FastCApiObject* self = UnwrapObject(receiver); + CHECK_SELF_OR_FALLBACK(nullptr); + self->fast_call_count_++; + + return static_cast<void*>(self); + } + + static void GetPointerSlowCallback(const FunctionCallbackInfo<Value>& args) { + Isolate* isolate = args.GetIsolate(); + FastCApiObject* self = UnwrapObject(args.This()); + CHECK_SELF_OR_THROW(); + self->slow_call_count_++; + + args.GetReturnValue().Set(External::New(isolate, static_cast<void*>(self))); + } + + static void* GetNullPointerFastCallback(Local<Object> receiver, + FastApiCallbackOptions& options) { + FastCApiObject* self = UnwrapObject(receiver); + CHECK_SELF_OR_FALLBACK(nullptr); + self->fast_call_count_++; + + return nullptr; + } + + static void GetNullPointerSlowCallback( + const FunctionCallbackInfo<Value>& args) { + Isolate* isolate = args.GetIsolate(); + FastCApiObject* self = UnwrapObject(args.This()); + CHECK_SELF_OR_THROW(); + self->slow_call_count_++; + + args.GetReturnValue().Set(v8::Null(isolate)); + } + + static void* PassPointerFastCallback(Local<Object> receiver, void* pointer, + FastApiCallbackOptions& options) { + FastCApiObject* self = UnwrapObject(receiver); + CHECK_SELF_OR_FALLBACK(nullptr); + self->fast_call_count_++; + + return pointer; + } + + static void PassPointerSlowCallback(const FunctionCallbackInfo<Value>& args) { + FastCApiObject* self = UnwrapObject(args.This()); + CHECK_SELF_OR_THROW(); + self->slow_call_count_++; + + if (args.Length() != 1) { + args.GetIsolate()->ThrowError( + "Invalid number of arguments, expected one."); + return; + } + + Local<Value> maybe_external = args[0].As<Value>(); + + if (maybe_external->IsNull()) { + args.GetReturnValue().Set(maybe_external); + return; + } + if (!maybe_external->IsExternal()) { + args.GetIsolate()->ThrowError("Did not get an external."); + return; + } + + Local<External> external = args[0].As<External>(); + + args.GetReturnValue().Set(external); + } + + static bool ComparePointersFastCallback(Local<Object> receiver, + void* pointer_a, void* pointer_b, + FastApiCallbackOptions& options) { + FastCApiObject* self = UnwrapObject(receiver); + CHECK_SELF_OR_FALLBACK(false); + self->fast_call_count_++; + + return pointer_a == pointer_b; + } + + static void ComparePointersSlowCallback( + const FunctionCallbackInfo<Value>& args) { + FastCApiObject* self = UnwrapObject(args.This()); + CHECK_SELF_OR_THROW(); + self->slow_call_count_++; + + if (args.Length() != 2) { + args.GetIsolate()->ThrowError( + "Invalid number of arguments, expected two."); + return; + } + + Local<Value> value_a = args[0]; + Local<Value> value_b = args[1]; + + void* pointer_a; + if (value_a->IsNull()) { + pointer_a = nullptr; + } else if (value_a->IsExternal()) { + pointer_a = value_a.As<External>()->Value(); + } else { + args.GetIsolate()->ThrowError( + "Did not get an external as first parameter."); + return; + } + + void* pointer_b; + if (value_b->IsNull()) { + pointer_b = nullptr; + } else if (value_b->IsExternal()) { + pointer_b = value_b.As<External>()->Value(); + } else { + args.GetIsolate()->ThrowError( + "Did not get an external as second parameter."); + return; + } + + args.GetReturnValue().Set(pointer_a == pointer_b); + } + static void FastCallCount(const FunctionCallbackInfo<Value>& args) { FastCApiObject* self = UnwrapObject(args.This()); CHECK_SELF_OR_THROW(); @@ -1465,6 +1599,46 @@ Local<FunctionTemplate> Shell::CreateTestFastCApiTemplate(Isolate* isolate) { SideEffectType::kHasSideEffect, &test_wasm_memory_c_func)); api_obj_ctor->PrototypeTemplate()->Set( + isolate, "assert_is_external", + FunctionTemplate::New(isolate, FastCApiObject::AssertIsExternal, + Local<Value>(), signature, 1, + ConstructorBehavior::kThrow, + SideEffectType::kHasSideEffect, nullptr)); + + CFunction get_pointer_c_func = + CFunction::Make(FastCApiObject::GetPointerFastCallback); + api_obj_ctor->PrototypeTemplate()->Set( + isolate, "get_pointer", + FunctionTemplate::New( + isolate, FastCApiObject::GetPointerSlowCallback, Local<Value>(), + signature, 1, ConstructorBehavior::kThrow, + SideEffectType::kHasSideEffect, &get_pointer_c_func)); + CFunction get_null_pointer_c_func = + CFunction::Make(FastCApiObject::GetNullPointerFastCallback); + api_obj_ctor->PrototypeTemplate()->Set( + isolate, "get_null_pointer", + FunctionTemplate::New( + isolate, FastCApiObject::GetNullPointerSlowCallback, Local<Value>(), + signature, 1, ConstructorBehavior::kThrow, + SideEffectType::kHasSideEffect, &get_null_pointer_c_func)); + CFunction pass_pointer_c_func = + CFunction::Make(FastCApiObject::PassPointerFastCallback); + api_obj_ctor->PrototypeTemplate()->Set( + isolate, "pass_pointer", + FunctionTemplate::New( + isolate, FastCApiObject::PassPointerSlowCallback, Local<Value>(), + signature, 1, ConstructorBehavior::kThrow, + SideEffectType::kHasSideEffect, &pass_pointer_c_func)); + CFunction compare_pointers_c_func = + CFunction::Make(FastCApiObject::ComparePointersFastCallback); + api_obj_ctor->PrototypeTemplate()->Set( + isolate, "compare_pointers", + FunctionTemplate::New( + isolate, FastCApiObject::ComparePointersSlowCallback, + Local<Value>(), signature, 1, ConstructorBehavior::kThrow, + SideEffectType::kHasSideEffect, &compare_pointers_c_func)); + + api_obj_ctor->PrototypeTemplate()->Set( isolate, "fast_call_count", FunctionTemplate::New( isolate, FastCApiObject::FastCallCount, Local<Value>(), signature, |