// Copyright (c) 2020, 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" #include "vm/object.h" #include "vm/symbols.h" namespace dart { // Add function to a class and that class to the class dictionary so that // frame walking can be used. const Function& RegisterFakeFunction(const char* name, const Code& code) { Thread* thread = Thread::Current(); const String& class_name = String::Handle(Symbols::New(thread, "ownerClass")); const Script& script = Script::Handle(); const Library& lib = Library::Handle(Library::CoreLibrary()); const Class& owner_class = Class::Handle( Class::New(lib, class_name, script, TokenPosition::kNoSource)); const String& function_name = String::ZoneHandle(Symbols::New(thread, name)); const FunctionType& signature = FunctionType::ZoneHandle(FunctionType::New()); Function& function = Function::ZoneHandle(Function::New( signature, function_name, UntaggedFunction::kRegularFunction, true, false, false, false, false, owner_class, TokenPosition::kNoSource)); const Array& functions = Array::Handle(Array::New(1)); functions.SetAt(0, function); { SafepointWriteRwLocker ml(thread, thread->isolate_group()->program_lock()); owner_class.SetFunctions(functions); } lib.AddClass(owner_class); function.AttachCode(code); return function; } } // namespace dart