// Copyright 2021 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "include/v8-exception.h" #include "include/v8-local-handle.h" #include "include/v8-object.h" #include "include/v8-template.h" #include "src/api/api.h" #include "src/objects/js-array-inl.h" #include "src/objects/objects-inl.h" #include "src/runtime/runtime.h" #include "test/unittests/test-utils.h" #include "testing/gtest/include/gtest/gtest.h" namespace v8 { namespace internal { namespace { using RuntimeTest = TestWithContext; TEST_F(RuntimeTest, ReturnsPrototype) { TryCatch try_catch(isolate()); Local object = v8::Object::New(isolate()); Handle i_result = Runtime::GetInternalProperties(i_isolate(), Utils::OpenHandle(*object)) .ToHandleChecked(); Local result = Utils::ToLocal(i_result); EXPECT_GE(result->Length(), 1u); char name_buffer[100]; result->Get(context(), 0) .ToLocalChecked() .As() ->WriteUtf8(isolate(), name_buffer); EXPECT_EQ("[[Prototype]]", std::string(name_buffer)); } bool AccessCheck(Local accessing_context, Local accessed_object, Local data) { return false; } TEST_F(RuntimeTest, DoesNotReturnPrototypeWhenInacessible) { TryCatch try_catch(isolate()); Local object_template = ObjectTemplate::New(isolate()); object_template->SetAccessCheckCallback(AccessCheck); Local object = object_template->NewInstance(context()).ToLocalChecked(); Handle i_result = Runtime::GetInternalProperties(i_isolate(), Utils::OpenHandle(*object)) .ToHandleChecked(); Local result = Utils::ToLocal(i_result); EXPECT_EQ(0u, result->Length()); } #if V8_ENABLE_WEBASSEMBLY TEST_F(RuntimeTest, WasmTableWithoutInstance) { uint32_t initial = 1u; bool has_maximum = false; uint32_t maximum = std::numeric_limits::max(); Handle elements; Handle table = WasmTableObject::New( i_isolate(), Handle(), wasm::kWasmAnyRef, initial, has_maximum, maximum, &elements, i_isolate()->factory()->null_value()); MaybeHandle result = Runtime::GetInternalProperties(i_isolate(), table); ASSERT_FALSE(result.is_null()); // ["[[Prototype]]", , "[[Entries]]", ] ASSERT_EQ(4, result.ToHandleChecked()->elements().length()); Handle entries = FixedArrayBase::GetElement(i_isolate(), result.ToHandleChecked(), 3) .ToHandleChecked(); EXPECT_EQ(1, JSArray::cast(*entries).elements().length()); } #endif } // namespace } // namespace internal } // namespace v8