| Index: runtime/vm/code_patcher_x64_test.cc | 
| =================================================================== | 
| --- runtime/vm/code_patcher_x64_test.cc	(revision 0) | 
| +++ runtime/vm/code_patcher_x64_test.cc	(revision 0) | 
| @@ -0,0 +1,86 @@ | 
| +// Copyright (c) 2011, 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. | 
| + | 
| +#include "vm/globals.h" | 
| +#if defined(TARGET_ARCH_X64) | 
| + | 
| +#include "vm/assembler.h" | 
| +#include "vm/code_generator.h" | 
| +#include "vm/code_patcher.h" | 
| +#include "vm/dart_entry.h" | 
| +#include "vm/ic_data.h" | 
| +#include "vm/instructions.h" | 
| +#include "vm/native_entry.h" | 
| +#include "vm/native_entry_test.h" | 
| +#include "vm/stub_code.h" | 
| +#include "vm/unit_test.h" | 
| + | 
| +namespace dart { | 
| + | 
| +static const intptr_t kPos = 1;  // Dummy token index in non-existing source. | 
| + | 
| +CODEGEN_TEST_GENERATE(NativePatchStaticCall, test) { | 
| +  SequenceNode* node_seq = test->node_sequence(); | 
| +  const int num_params = 0; | 
| +  const bool has_opt_params = false; | 
| +  const String& native_name = | 
| +      String::ZoneHandle(String::NewSymbol("TestStaticCallPatching")); | 
| +  NativeFunction native_function = reinterpret_cast<NativeFunction>( | 
| +      NATIVE_ENTRY_FUNCTION(TestStaticCallPatching)); | 
| +  node_seq->Add(new ReturnNode(kPos, | 
| +                               new NativeBodyNode(kPos, | 
| +                                                  native_name, | 
| +                                                  native_function, | 
| +                                                  num_params, | 
| +                                                  has_opt_params))); | 
| +} | 
| + | 
| +CODEGEN_TEST2_GENERATE(PatchStaticCall, function, test) { | 
| +  SequenceNode* node_seq = test->node_sequence(); | 
| +  ArgumentListNode* arguments = new ArgumentListNode(kPos); | 
| +  node_seq->Add(new ReturnNode(kPos, | 
| +                               new StaticCallNode(kPos, function, arguments))); | 
| +} | 
| + | 
| +CODEGEN_TEST2_RUN(PatchStaticCall, NativePatchStaticCall, Instance::null()); | 
| + | 
| +#define __ assembler-> | 
| + | 
| +ASSEMBLER_TEST_GENERATE(IcDataAccess, assembler) { | 
| +  const String& function_name = String::Handle(String::New("Vermicelles")); | 
| +  ICData ic_data(function_name, 1); | 
| +  EXPECT(!Array::Handle(ic_data.data()).IsNull()); | 
| +  __ LoadObject(RBX, Array::ZoneHandle(ic_data.data())); | 
| +  __ LoadObject(R10, CodeGenerator::ArgumentsDescriptor(1, Array::Handle())); | 
| +  ExternalLabel target_label( | 
| +      "InlineCache", StubCode::OneArgCheckInlineCacheEntryPoint()); | 
| +  __ call(&target_label); | 
| +  __ ret(); | 
| +} | 
| + | 
| + | 
| +ASSEMBLER_TEST_RUN(IcDataAccess, entry) { | 
| +  uword return_address = entry + CodePatcher::InstanceCallSizeInBytes(); | 
| +  const Array& array = Array::Handle( | 
| +      CodePatcher::GetInstanceCallIcDataAt(return_address)); | 
| +  EXPECT(!array.IsNull()); | 
| +  ICData ic_data(array); | 
| +  EXPECT_STREQ("Vermicelles", | 
| +      String::Handle(ic_data.FunctionName()).ToCString()); | 
| +  EXPECT_EQ(1, ic_data.NumberOfArgumentsChecked()); | 
| +  EXPECT_EQ(0, ic_data.NumberOfChecks()); | 
| +  const String& new_function_name = String::Handle(String::New("Rigi")); | 
| +  ICData new_ic_data(new_function_name, 1); | 
| +  EXPECT_STREQ("Rigi", String::Handle(new_ic_data.FunctionName()).ToCString()); | 
| +  CodePatcher::SetInstanceCallIcDataAt(return_address, | 
| +                                       Array::ZoneHandle(new_ic_data.data())); | 
| +  const Array& new_array = Array::Handle( | 
| +      CodePatcher::GetInstanceCallIcDataAt(return_address)); | 
| +  ICData test_ic_data(new_array); | 
| +  EXPECT_STREQ("Rigi", String::Handle(test_ic_data.FunctionName()).ToCString()); | 
| +} | 
| + | 
| +}  // namespace dart | 
| + | 
| +#endif  // TARGET_ARCH_X64 | 
|  |