From a4b84a722ac052d57c1946237fc3e18de31a704c Mon Sep 17 00:00:00 2001 From: "zra@google.com" Date: Tue, 29 Apr 2014 14:48:00 +0000 Subject: [PATCH] Ensures that stubs added to each object pool on x64 are generated before they are used by reordering the list of stubs. R=iposva@google.com Review URL: https://codereview.chromium.org//258133002 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@35524 260f80e4-7a28-3924-810f-c04153c831b5 --- runtime/vm/assembler_arm64.cc | 8 +++++--- runtime/vm/assembler_x64.cc | 8 +++++--- runtime/vm/stub_code.h | 2 +- tests/standalone/io/directory_list_sync_test.dart | 14 ++++++++++++++ 4 files changed, 25 insertions(+), 7 deletions(-) create mode 100644 tests/standalone/io/directory_list_sync_test.dart diff --git a/runtime/vm/assembler_arm64.cc b/runtime/vm/assembler_arm64.cc index 91ad71ee7eb..945bb31e0fe 100644 --- a/runtime/vm/assembler_arm64.cc +++ b/runtime/vm/assembler_arm64.cc @@ -49,17 +49,19 @@ Assembler::Assembler(bool use_far_branches) patchable_pool_entries_.Add(kNotPatchable); object_pool_index_table_.Insert(ObjIndexPair(Bool::False().raw(), 2)); + const Smi& vacant = Smi::Handle(Smi::New(0xfa >> kSmiTagShift)); + if (StubCode::UpdateStoreBuffer_entry() != NULL) { FindExternalLabel(&StubCode::UpdateStoreBufferLabel(), kNotPatchable); } else { - object_pool_.Add(Object::null_object(), Heap::kOld); + object_pool_.Add(vacant, Heap::kOld); patchable_pool_entries_.Add(kNotPatchable); } if (StubCode::CallToRuntime_entry() != NULL) { FindExternalLabel(&StubCode::CallToRuntimeLabel(), kNotPatchable); } else { - object_pool_.Add(Object::null_object(), Heap::kOld); + object_pool_.Add(vacant, Heap::kOld); patchable_pool_entries_.Add(kNotPatchable); } @@ -69,7 +71,7 @@ Assembler::Assembler(bool use_far_branches) FindExternalLabel(&StubCode::BreakpointRuntimeLabel(), kNotPatchable); ASSERT(index == kBreakpointRuntimeCPIndex); } else { - object_pool_.Add(Object::null_object(), Heap::kOld); + object_pool_.Add(vacant, Heap::kOld); patchable_pool_entries_.Add(kNotPatchable); } } diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc index 88c056bbeb6..1b236da14b0 100644 --- a/runtime/vm/assembler_x64.cc +++ b/runtime/vm/assembler_x64.cc @@ -45,17 +45,19 @@ Assembler::Assembler(bool use_far_branches) patchable_pool_entries_.Add(kNotPatchable); object_pool_index_table_.Insert(ObjIndexPair(Bool::False().raw(), 2)); + const Smi& vacant = Smi::Handle(Smi::New(0xfa >> kSmiTagShift)); + if (StubCode::UpdateStoreBuffer_entry() != NULL) { FindExternalLabel(&StubCode::UpdateStoreBufferLabel(), kNotPatchable); } else { - object_pool_.Add(Object::null_object(), Heap::kOld); + object_pool_.Add(vacant, Heap::kOld); patchable_pool_entries_.Add(kNotPatchable); } if (StubCode::CallToRuntime_entry() != NULL) { FindExternalLabel(&StubCode::CallToRuntimeLabel(), kNotPatchable); } else { - object_pool_.Add(Object::null_object(), Heap::kOld); + object_pool_.Add(vacant, Heap::kOld); patchable_pool_entries_.Add(kNotPatchable); } @@ -65,7 +67,7 @@ Assembler::Assembler(bool use_far_branches) FindExternalLabel(&StubCode::BreakpointRuntimeLabel(), kNotPatchable); ASSERT(index == kBreakpointRuntimeCPIndex); } else { - object_pool_.Add(Object::null_object(), Heap::kOld); + object_pool_.Add(vacant, Heap::kOld); patchable_pool_entries_.Add(kNotPatchable); } } diff --git a/runtime/vm/stub_code.h b/runtime/vm/stub_code.h index 17acb6d22c6..a3c08d95460 100644 --- a/runtime/vm/stub_code.h +++ b/runtime/vm/stub_code.h @@ -50,7 +50,6 @@ class RawCode; // List of stubs created per isolate, these stubs could potentially contain // embedded objects and hence cannot be shared across isolates. #define STUB_CODE_LIST(V) \ - V(InvokeDartCode) \ V(AllocateContext) \ V(UpdateStoreBuffer) \ V(OneArgCheckInlineCache) \ @@ -64,6 +63,7 @@ class RawCode; V(ZeroArgsUnoptimizedStaticCall) \ V(TwoArgsUnoptimizedStaticCall) \ V(OptimizeFunction) \ + V(InvokeDartCode) \ // class StubEntry is used to describe stub methods generated in dart to // abstract out common code executed from generated dart code. diff --git a/tests/standalone/io/directory_list_sync_test.dart b/tests/standalone/io/directory_list_sync_test.dart new file mode 100644 index 00000000000..99d18fb3840 --- /dev/null +++ b/tests/standalone/io/directory_list_sync_test.dart @@ -0,0 +1,14 @@ +// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:io'; + +void main() { + File script = new File.fromUri(Platform.script); + // tests/standalone/io/../../.. + Directory startingDir = script.parent.parent.parent.parent; + List each = + startingDir.listSync(recursive: true, followLinks: false); + print("Found: ${each.length} entities"); +}