OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 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 | 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 "include/dart_api.h" | 5 #include "include/dart_api.h" |
6 #include "platform/assert.h" | 6 #include "platform/assert.h" |
7 #include "vm/dart_api_impl.h" | 7 #include "vm/dart_api_impl.h" |
8 #include "vm/unit_test.h" | 8 #include "vm/unit_test.h" |
9 | 9 |
10 namespace dart { | 10 namespace dart { |
11 | 11 |
12 | 12 |
13 #define FUNCTION_NAME(name) UnhandledExcp_##name | 13 #define FUNCTION_NAME(name) UnhandledExcp_##name |
14 #define REGISTER_FUNCTION(name, count) \ | 14 #define REGISTER_FUNCTION(name, count) {"" #name, FUNCTION_NAME(name), count}, |
15 { ""#name, FUNCTION_NAME(name), count }, | |
16 | 15 |
17 | 16 |
18 void FUNCTION_NAME(Unhandled_equals)(Dart_NativeArguments args) { | 17 void FUNCTION_NAME(Unhandled_equals)(Dart_NativeArguments args) { |
19 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 18 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
20 const Instance& expected = Instance::CheckedHandle(arguments->NativeArgAt(0)); | 19 const Instance& expected = Instance::CheckedHandle(arguments->NativeArgAt(0)); |
21 const Instance& actual = Instance::CheckedHandle(arguments->NativeArgAt(1)); | 20 const Instance& actual = Instance::CheckedHandle(arguments->NativeArgAt(1)); |
22 if (!expected.CanonicalizeEquals(actual)) { | 21 if (!expected.CanonicalizeEquals(actual)) { |
23 OS::Print("expected: '%s' actual: '%s'\n", | 22 OS::Print("expected: '%s' actual: '%s'\n", expected.ToCString(), |
24 expected.ToCString(), actual.ToCString()); | 23 actual.ToCString()); |
25 FATAL("Unhandled_equals fails.\n"); | 24 FATAL("Unhandled_equals fails.\n"); |
26 } | 25 } |
27 } | 26 } |
28 | 27 |
29 | 28 |
30 void FUNCTION_NAME(Unhandled_invoke)(Dart_NativeArguments args) { | 29 void FUNCTION_NAME(Unhandled_invoke)(Dart_NativeArguments args) { |
31 // Invoke the specified entry point. | 30 // Invoke the specified entry point. |
32 Dart_Handle cls = Dart_GetClass(TestCase::lib(), NewString("Second")); | 31 Dart_Handle cls = Dart_GetClass(TestCase::lib(), NewString("Second")); |
33 Dart_Handle result = Dart_Invoke(cls, | 32 Dart_Handle result = Dart_Invoke(cls, NewString("method2"), 0, NULL); |
34 NewString("method2"), | |
35 0, | |
36 NULL); | |
37 ASSERT(Dart_IsError(result)); | 33 ASSERT(Dart_IsError(result)); |
38 ASSERT(Dart_ErrorHasException(result)); | 34 ASSERT(Dart_ErrorHasException(result)); |
39 return; | 35 return; |
40 } | 36 } |
41 | 37 |
42 | 38 |
43 void FUNCTION_NAME(Unhandled_invoke2)(Dart_NativeArguments args) { | 39 void FUNCTION_NAME(Unhandled_invoke2)(Dart_NativeArguments args) { |
44 // Invoke the specified entry point. | 40 // Invoke the specified entry point. |
45 Dart_Handle cls = Dart_GetClass(TestCase::lib(), NewString("Second")); | 41 Dart_Handle cls = Dart_GetClass(TestCase::lib(), NewString("Second")); |
46 Dart_Handle result = Dart_Invoke(cls, | 42 Dart_Handle result = Dart_Invoke(cls, NewString("method2"), 0, NULL); |
47 NewString("method2"), | |
48 0, | |
49 NULL); | |
50 ASSERT(Dart_IsError(result)); | 43 ASSERT(Dart_IsError(result)); |
51 ASSERT(Dart_ErrorHasException(result)); | 44 ASSERT(Dart_ErrorHasException(result)); |
52 Dart_Handle exception = Dart_ErrorGetException(result); | 45 Dart_Handle exception = Dart_ErrorGetException(result); |
53 ASSERT(!Dart_IsError(exception)); | 46 ASSERT(!Dart_IsError(exception)); |
54 Dart_ThrowException(exception); | 47 Dart_ThrowException(exception); |
55 UNREACHABLE(); | 48 UNREACHABLE(); |
56 return; | 49 return; |
57 } | 50 } |
58 | 51 |
59 | 52 |
60 // List all native functions implemented in the vm or core boot strap dart | 53 // List all native functions implemented in the vm or core boot strap dart |
61 // libraries so that we can resolve the native function to it's entry | 54 // libraries so that we can resolve the native function to it's entry |
62 // point. | 55 // point. |
63 #define UNHANDLED_NATIVE_LIST(V) \ | 56 #define UNHANDLED_NATIVE_LIST(V) \ |
64 V(Unhandled_equals, 2) \ | 57 V(Unhandled_equals, 2) \ |
65 V(Unhandled_invoke, 0) \ | 58 V(Unhandled_invoke, 0) \ |
66 V(Unhandled_invoke2, 0) \ | 59 V(Unhandled_invoke2, 0) |
67 | 60 |
68 | 61 |
69 static struct NativeEntries { | 62 static struct NativeEntries { |
70 const char* name_; | 63 const char* name_; |
71 Dart_NativeFunction function_; | 64 Dart_NativeFunction function_; |
72 int argument_count_; | 65 int argument_count_; |
73 } BuiltinEntries[] = { | 66 } BuiltinEntries[] = {UNHANDLED_NATIVE_LIST(REGISTER_FUNCTION)}; |
74 UNHANDLED_NATIVE_LIST(REGISTER_FUNCTION) | |
75 }; | |
76 | 67 |
77 | 68 |
78 static Dart_NativeFunction native_lookup(Dart_Handle name, | 69 static Dart_NativeFunction native_lookup(Dart_Handle name, |
79 int argument_count, | 70 int argument_count, |
80 bool* auto_setup_scope) { | 71 bool* auto_setup_scope) { |
81 ASSERT(auto_setup_scope != NULL); | 72 ASSERT(auto_setup_scope != NULL); |
82 *auto_setup_scope = true; | 73 *auto_setup_scope = true; |
83 const Object& obj = Object::Handle(Api::UnwrapHandle(name)); | 74 const Object& obj = Object::Handle(Api::UnwrapHandle(name)); |
84 ASSERT(obj.IsString()); | 75 ASSERT(obj.IsString()); |
85 const char* function_name = obj.ToCString(); | 76 const char* function_name = obj.ToCString(); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
120 " return 3;\n" | 111 " return 3;\n" |
121 " }\n" | 112 " }\n" |
122 " return 2;\n" | 113 " return 2;\n" |
123 " }\n" | 114 " }\n" |
124 "}\n" | 115 "}\n" |
125 "testMain() {\n" | 116 "testMain() {\n" |
126 " UnhandledExceptions.equals(2, Second.method1(1));\n" | 117 " UnhandledExceptions.equals(2, Second.method1(1));\n" |
127 " UnhandledExceptions.equals(3, Second.method3(1));\n" | 118 " UnhandledExceptions.equals(3, Second.method3(1));\n" |
128 "}"; | 119 "}"; |
129 Dart_Handle lib = TestCase::LoadTestScript( | 120 Dart_Handle lib = TestCase::LoadTestScript( |
130 kScriptChars, | 121 kScriptChars, reinterpret_cast<Dart_NativeEntryResolver>(native_lookup)); |
131 reinterpret_cast<Dart_NativeEntryResolver>(native_lookup)); | |
132 EXPECT_VALID(Dart_Invoke(lib, NewString("testMain"), 0, NULL)); | 122 EXPECT_VALID(Dart_Invoke(lib, NewString("testMain"), 0, NULL)); |
133 } | 123 } |
134 | 124 |
135 } // namespace dart | 125 } // namespace dart |
OLD | NEW |