// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This tests whether objects in Handles which are passed in function arguments // can be re-accessed after a moving collection. // // A GC call ensures that every Handle'd object is relocated. Attempting to // deref the value after this call should yield the same object that was // initially allocated. #include #include "objects.h" #include "tests.h" extern Handle AllocateHeapObject(long data); long expected = 1234; __attribute__((noinline)) Handle bar(Handle x) { GC(); assert((*x).data == expected && "GC Objects differ across a collection"); return x; } __attribute__((noinline)) Handle foo(Handle x) { assert((*x).data == expected && "GC Objects differ across a collection"); return bar(x); } __attribute__((noinline)) Handle baz(Handle x) { assert((*x).data == expected && "GC Objects differ across a collection"); return foo(x); } __attribute__((noinline)) void test_relocation() { auto handle = AllocateHeapObject(expected); baz(handle); assert((*handle).data == expected && "GC Objects differ across a collection"); } int main() { InitGC(); test_relocation(); TeardownGC(); return 0; }