63a8e5227d
This makes the code in the code generator independent from how stubs are actually called (i.e. directly embedding the target address, or indirectly by loading the target address from the code object). BUG= R=rmacnak@google.com Review URL: https://codereview.chromium.org//1270803003 .
62 lines
2.2 KiB
C++
62 lines
2.2 KiB
C++
// Copyright (c) 2013, 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_MIPS)
|
|
|
|
#include "vm/assembler.h"
|
|
#include "vm/code_generator.h"
|
|
#include "vm/code_patcher.h"
|
|
#include "vm/dart_entry.h"
|
|
#include "vm/instructions.h"
|
|
#include "vm/native_entry.h"
|
|
#include "vm/native_entry_test.h"
|
|
#include "vm/stub_code.h"
|
|
#include "vm/symbols.h"
|
|
#include "vm/unit_test.h"
|
|
|
|
namespace dart {
|
|
|
|
#define __ assembler->
|
|
|
|
ASSEMBLER_TEST_GENERATE(IcDataAccess, assembler) {
|
|
const String& class_name = String::Handle(Symbols::New("ownerClass"));
|
|
const Script& script = Script::Handle();
|
|
const Class& owner_class =
|
|
Class::Handle(Class::New(class_name, script, Scanner::kNoSourcePos));
|
|
const String& function_name = String::Handle(Symbols::New("callerFunction"));
|
|
const Function& function = Function::Handle(
|
|
Function::New(function_name, RawFunction::kRegularFunction,
|
|
true, false, false, false, false, owner_class, 0));
|
|
|
|
const String& target_name = String::Handle(String::New("targetFunction"));
|
|
const Array& args_descriptor =
|
|
Array::Handle(ArgumentsDescriptor::New(1, Object::null_array()));
|
|
const ICData& ic_data = ICData::ZoneHandle(ICData::New(function,
|
|
target_name,
|
|
args_descriptor,
|
|
15,
|
|
1));
|
|
|
|
__ LoadObject(S5, ic_data);
|
|
__ BranchLinkPatchable(*StubCode::OneArgCheckInlineCache_entry());
|
|
__ Ret();
|
|
}
|
|
|
|
|
|
ASSEMBLER_TEST_RUN(IcDataAccess, test) {
|
|
uword return_address =
|
|
test->entry() + test->code().Size() - 2 * Instr::kInstrSize;
|
|
ICData& ic_data = ICData::Handle();
|
|
CodePatcher::GetInstanceCallAt(return_address, test->code(), &ic_data);
|
|
EXPECT_STREQ("targetFunction",
|
|
String::Handle(ic_data.target_name()).ToCString());
|
|
EXPECT_EQ(1, ic_data.NumArgsTested());
|
|
EXPECT_EQ(0, ic_data.NumberOfChecks());
|
|
}
|
|
|
|
} // namespace dart
|
|
|
|
#endif // TARGET_ARCH_MIPS
|