| Index: vm/bootstrap_natives.cc
|
| ===================================================================
|
| --- vm/bootstrap_natives.cc (revision 0)
|
| +++ vm/bootstrap_natives.cc (revision 0)
|
| @@ -0,0 +1,64 @@
|
| +// 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/bootstrap.h"
|
| +
|
| +#include "include/dart_api.h"
|
| +
|
| +#include "vm/bootstrap_natives.h"
|
| +#include "vm/dart_api_impl.h"
|
| +#include "vm/object.h"
|
| +#include "vm/object_store.h"
|
| +
|
| +namespace dart {
|
| +
|
| +// List all native functions implemented in the vm or core bootstrap dart
|
| +// libraries so that we can resolve the native function to it's entry
|
| +// point.
|
| +static struct NativeEntries {
|
| + const char* name_;
|
| + Dart_NativeFunction function_;
|
| + int argument_count_;
|
| +} BootStrapEntries[] = {
|
| + BOOTSTRAP_NATIVE_LIST(REGISTER_NATIVE_ENTRY)
|
| +};
|
| +
|
| +
|
| +static Dart_NativeFunction NativeLookup(Dart_Handle name,
|
| + int argument_count) {
|
| + const Object& obj = Object::Handle(Api::UnwrapHandle(name));
|
| + if (!obj.IsString()) {
|
| + return NULL;
|
| + }
|
| + const char* function_name = obj.ToCString();
|
| + ASSERT(function_name != NULL);
|
| + int num_entries = sizeof(BootStrapEntries) / sizeof(struct NativeEntries);
|
| + for (int i = 0; i < num_entries; i++) {
|
| + struct NativeEntries* entry = &(BootStrapEntries[i]);
|
| + if (!strncmp(function_name, entry->name_, strlen(entry->name_))) {
|
| + if (entry->argument_count_ == argument_count) {
|
| + return reinterpret_cast<Dart_NativeFunction>(entry->function_);
|
| + } else {
|
| + // Wrong number of arguments.
|
| + // TODO(regis): Should we pass a buffer for error reporting?
|
| + return NULL;
|
| + }
|
| + }
|
| + }
|
| + return NULL;
|
| +}
|
| +
|
| +
|
| +void Bootstrap::SetupNativeResolver() {
|
| + Library& library = Library::Handle(Library::CoreLibrary());
|
| + ASSERT(!library.IsNull());
|
| + library.set_native_entry_resolver(
|
| + reinterpret_cast<Dart_NativeEntryResolver>(NativeLookup));
|
| + library = Library::CoreImplLibrary();
|
| + ASSERT(!library.IsNull());
|
| + library.set_native_entry_resolver(
|
| + reinterpret_cast<Dart_NativeEntryResolver>(NativeLookup));
|
| +}
|
| +
|
| +} // namespace dart
|
|
|