1/* Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
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.
4 */
5#include <assert.h>
6#include <stdio.h>
7#include <stdlib.h>
8#include <string.h>
9
10#include "include/dart_api.h"
11
12#if defined(ASSERT)
13#error ASSERT already defined!
14#endif
15
16
17/* Native methods. */
18void IfNull(Dart_NativeArguments arguments) {
19 Dart_Handle object = Dart_GetNativeArgument(arguments, 0);
20 if (Dart_IsNull(object)) {
21 Dart_SetReturnValue(arguments, Dart_GetNativeArgument(arguments, 1));
22 } else {
23 Dart_SetReturnValue(arguments, object);
24 }
25}
26
27
28void ThrowMeTheBall(Dart_NativeArguments arguments) {
29 Dart_Handle object = Dart_GetNativeArgument(arguments, 0);
30 Dart_ThrowException(object);
31}
32
33
34/* Native resolver for the extension library. */
35Dart_NativeFunction ResolveName(Dart_Handle name,
36 int argc,
37 bool* auto_setup_scope) {
38 /* assert(Dart_IsString(name)); */
39 const char* c_name;
40 Dart_Handle check_error;
41
42 if (auto_setup_scope == NULL) {
43 return NULL;
44 }
45 *auto_setup_scope = 1;
46 check_error = Dart_StringToCString(name, &c_name);
47 if (Dart_IsError(check_error)) {
48 Dart_PropagateError(check_error);
49 }
50 if ((strcmp("TestExtension_IfNull", c_name) == 0) && (argc == 2)) {
51 return IfNull;
52 }
53 if ((strcmp("TestExtension_ThrowMeTheBall", c_name) == 0) && (argc == 1)) {
54 return ThrowMeTheBall;
55 }
56 return NULL;
57}
58
59
60/* Native entry point for the extension library. */
61DART_EXPORT Dart_Handle test_extension_Init(Dart_Handle parent_library) {
62 Dart_Handle result_code;
63 if (Dart_IsError(parent_library)) {
64 return parent_library;
65 }
66
67 result_code = Dart_SetNativeResolver(parent_library, ResolveName, NULL);
68 if (Dart_IsError(result_code)) {
69 return result_code;
70 }
71
72 return parent_library;
73}
74