// Copyright 2019 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 "src/heap/memory-measurement-inl.h" #include "src/heap/memory-measurement.h" #include "test/cctest/cctest.h" #include "test/cctest/heap/heap-tester.h" #include "test/cctest/heap/heap-utils.h" namespace v8 { namespace internal { namespace heap { namespace { Handle GetNativeContext(Isolate* isolate, v8::Local v8_context) { Handle context = v8::Utils::OpenHandle(*v8_context); return handle(context->native_context(), isolate); } } // anonymous namespace TEST(NativeContextInferrerGlobalObject) { LocalContext env; Isolate* isolate = CcTest::i_isolate(); HandleScope handle_scope(isolate); Handle native_context = GetNativeContext(isolate, env.local()); Handle global = handle(native_context->global_object(), isolate); NativeContextInferrer inferrer; Address inferred_context = 0; CHECK(inferrer.Infer(isolate, global->map(), *global, &inferred_context)); CHECK_EQ(native_context->ptr(), inferred_context); } TEST(NativeContextInferrerJSFunction) { LocalContext env; Isolate* isolate = CcTest::i_isolate(); HandleScope scope(isolate); Handle native_context = GetNativeContext(isolate, env.local()); v8::Local result = CompileRun("(function () { return 1; })"); Handle object = Utils::OpenHandle(*result); Handle function = Handle::cast(object); NativeContextInferrer inferrer; Address inferred_context = 0; CHECK(inferrer.Infer(isolate, function->map(), *function, &inferred_context)); CHECK_EQ(native_context->ptr(), inferred_context); } TEST(NativeContextInferrerJSObject) { LocalContext env; Isolate* isolate = CcTest::i_isolate(); HandleScope scope(isolate); Handle native_context = GetNativeContext(isolate, env.local()); v8::Local result = CompileRun("({a : 10})"); Handle object = Utils::OpenHandle(*result); Handle function = Handle::cast(object); NativeContextInferrer inferrer; Address inferred_context = 0; // TODO(ulan): Enable this test once we have more precise native // context inference. CHECK(inferrer.Infer(isolate, function->map(), *function, &inferred_context)); CHECK_EQ(native_context->ptr(), inferred_context); } TEST(NativeContextStatsMerge) { NativeContextStats stats1, stats2; Address object = 0; stats1.IncrementSize(object, 10); stats2.IncrementSize(object, 20); stats1.Merge(stats2); CHECK_EQ(30, stats1.Get(object)); } } // namespace heap } // namespace internal } // namespace v8