| OLD | NEW |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/native_entry.h" | 5 #include "vm/native_entry.h" |
| 6 | 6 |
| 7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
| 8 | 8 |
| 9 #include "vm/bootstrap.h" | 9 #include "vm/bootstrap.h" |
| 10 #include "vm/code_patcher.h" | 10 #include "vm/code_patcher.h" |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 __args__.SetAt(0, instance); | 32 __args__.SetAt(0, instance); |
| 33 Exceptions::ThrowByType(Exceptions::kArgument, __args__); | 33 Exceptions::ThrowByType(Exceptions::kArgument, __args__); |
| 34 } | 34 } |
| 35 | 35 |
| 36 | 36 |
| 37 NativeFunction NativeEntry::ResolveNative(const Library& library, | 37 NativeFunction NativeEntry::ResolveNative(const Library& library, |
| 38 const String& function_name, | 38 const String& function_name, |
| 39 int number_of_arguments, | 39 int number_of_arguments, |
| 40 bool* auto_setup_scope) { | 40 bool* auto_setup_scope) { |
| 41 // Now resolve the native function to the corresponding native entrypoint. | 41 // Now resolve the native function to the corresponding native entrypoint. |
| 42 if (library.native_entry_resolver() == 0) { | 42 if (library.native_entry_resolver() == NULL) { |
| 43 // Native methods are not allowed in the library to which this | 43 // Native methods are not allowed in the library to which this |
| 44 // class belongs in. | 44 // class belongs in. |
| 45 return NULL; | 45 return NULL; |
| 46 } | 46 } |
| 47 Dart_NativeFunction native_function = NULL; | 47 Dart_NativeFunction native_function = NULL; |
| 48 { | 48 { |
| 49 Thread* T = Thread::Current(); | 49 Thread* T = Thread::Current(); |
| 50 TransitionVMToNative transition(T); | 50 TransitionVMToNative transition(T); |
| 51 Dart_EnterScope(); // Enter a new Dart API scope as we invoke API entries. | 51 Dart_EnterScope(); // Enter a new Dart API scope as we invoke API entries. |
| 52 Dart_NativeEntryResolver resolver = library.native_entry_resolver(); | 52 Dart_NativeEntryResolver resolver = library.native_entry_resolver(); |
| 53 native_function = resolver(Api::NewHandle(T, function_name.raw()), | 53 native_function = resolver(Api::NewHandle(T, function_name.raw()), |
| 54 number_of_arguments, auto_setup_scope); | 54 number_of_arguments, auto_setup_scope); |
| 55 Dart_ExitScope(); // Exit the Dart API scope. | 55 Dart_ExitScope(); // Exit the Dart API scope. |
| 56 } | 56 } |
| 57 return reinterpret_cast<NativeFunction>(native_function); | 57 return reinterpret_cast<NativeFunction>(native_function); |
| 58 } | 58 } |
| 59 | 59 |
| 60 | 60 |
| 61 const uint8_t* NativeEntry::ResolveSymbolInLibrary(const Library& library, | 61 const uint8_t* NativeEntry::ResolveSymbolInLibrary(const Library& library, |
| 62 uword pc) { | 62 uword pc) { |
| 63 Dart_NativeEntrySymbol symbol_resolver = | 63 Dart_NativeEntrySymbol symbol_resolver = |
| 64 library.native_entry_symbol_resolver(); | 64 library.native_entry_symbol_resolver(); |
| 65 if (symbol_resolver == 0) { | 65 if (symbol_resolver == NULL) { |
| 66 // Cannot reverse lookup native entries. | 66 // Cannot reverse lookup native entries. |
| 67 return NULL; | 67 return NULL; |
| 68 } | 68 } |
| 69 return symbol_resolver(reinterpret_cast<Dart_NativeFunction>(pc)); | 69 return symbol_resolver(reinterpret_cast<Dart_NativeFunction>(pc)); |
| 70 } | 70 } |
| 71 | 71 |
| 72 | 72 |
| 73 const uint8_t* NativeEntry::ResolveSymbol(uword pc) { | 73 const uint8_t* NativeEntry::ResolveSymbol(uword pc) { |
| 74 Thread* thread = Thread::Current(); | 74 Thread* thread = Thread::Current(); |
| 75 REUSABLE_GROWABLE_OBJECT_ARRAY_HANDLESCOPE(thread); | 75 REUSABLE_GROWABLE_OBJECT_ARRAY_HANDLESCOPE(thread); |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 225 const Class& cls = Class::Handle(zone, func.Owner()); | 225 const Class& cls = Class::Handle(zone, func.Owner()); |
| 226 const Library& library = Library::Handle(zone, cls.library()); | 226 const Library& library = Library::Handle(zone, cls.library()); |
| 227 | 227 |
| 228 *is_bootstrap_native = | 228 *is_bootstrap_native = |
| 229 Bootstrap::IsBootstapResolver(library.native_entry_resolver()); | 229 Bootstrap::IsBootstapResolver(library.native_entry_resolver()); |
| 230 | 230 |
| 231 const String& native_name = String::Handle(zone, func.native_name()); | 231 const String& native_name = String::Handle(zone, func.native_name()); |
| 232 ASSERT(!native_name.IsNull()); | 232 ASSERT(!native_name.IsNull()); |
| 233 | 233 |
| 234 const int num_params = NativeArguments::ParameterCountForResolution(func); | 234 const int num_params = NativeArguments::ParameterCountForResolution(func); |
| 235 return NativeEntry::ResolveNative(library, native_name, num_params, | 235 NativeFunction native_function = NativeEntry::ResolveNative( |
| 236 is_auto_scope); | 236 library, native_name, num_params, is_auto_scope); |
| 237 if (native_function == NULL) { |
| 238 FATAL2("Failed to resolve native function '%s' in '%s'\n", |
| 239 native_name.ToCString(), func.ToQualifiedCString()); |
| 240 } |
| 241 return native_function; |
| 237 } | 242 } |
| 238 | 243 |
| 239 | 244 |
| 240 uword NativeEntry::LinkNativeCallEntry() { | 245 uword NativeEntry::LinkNativeCallEntry() { |
| 241 uword entry = reinterpret_cast<uword>(NativeEntry::LinkNativeCall); | 246 uword entry = reinterpret_cast<uword>(NativeEntry::LinkNativeCall); |
| 242 #if defined(USING_SIMULATOR) | 247 #if defined(USING_SIMULATOR) |
| 243 entry = Simulator::RedirectExternalReference( | 248 entry = Simulator::RedirectExternalReference( |
| 244 entry, Simulator::kBootstrapNativeCall, NativeEntry::kNumArguments); | 249 entry, Simulator::kBootstrapNativeCall, NativeEntry::kNumArguments); |
| 245 #endif | 250 #endif |
| 246 return entry; | 251 return entry; |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 339 // Because this call is within a compilation unit, Clang doesn't respect | 344 // Because this call is within a compilation unit, Clang doesn't respect |
| 340 // the ABI alignment here. | 345 // the ABI alignment here. |
| 341 NativeEntry::NoScopeNativeCallWrapperNoStackCheck( | 346 NativeEntry::NoScopeNativeCallWrapperNoStackCheck( |
| 342 args, reinterpret_cast<Dart_NativeFunction>(target_function)); | 347 args, reinterpret_cast<Dart_NativeFunction>(target_function)); |
| 343 } | 348 } |
| 344 } | 349 } |
| 345 #endif // !defined(TARGET_ARCH_DBC) | 350 #endif // !defined(TARGET_ARCH_DBC) |
| 346 | 351 |
| 347 | 352 |
| 348 } // namespace dart | 353 } // namespace dart |
| OLD | NEW |