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 | |
13 #define FUNCTION_NAME(name) UnhandledExcp_##name | 12 #define FUNCTION_NAME(name) UnhandledExcp_##name |
14 #define REGISTER_FUNCTION(name, count) {"" #name, FUNCTION_NAME(name), count}, | 13 #define REGISTER_FUNCTION(name, count) {"" #name, FUNCTION_NAME(name), count}, |
15 | 14 |
16 | |
17 void FUNCTION_NAME(Unhandled_equals)(Dart_NativeArguments args) { | 15 void FUNCTION_NAME(Unhandled_equals)(Dart_NativeArguments args) { |
18 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 16 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
19 const Instance& expected = Instance::CheckedHandle(arguments->NativeArgAt(0)); | 17 const Instance& expected = Instance::CheckedHandle(arguments->NativeArgAt(0)); |
20 const Instance& actual = Instance::CheckedHandle(arguments->NativeArgAt(1)); | 18 const Instance& actual = Instance::CheckedHandle(arguments->NativeArgAt(1)); |
21 if (!expected.CanonicalizeEquals(actual)) { | 19 if (!expected.CanonicalizeEquals(actual)) { |
22 OS::Print("expected: '%s' actual: '%s'\n", expected.ToCString(), | 20 OS::Print("expected: '%s' actual: '%s'\n", expected.ToCString(), |
23 actual.ToCString()); | 21 actual.ToCString()); |
24 FATAL("Unhandled_equals fails.\n"); | 22 FATAL("Unhandled_equals fails.\n"); |
25 } | 23 } |
26 } | 24 } |
27 | 25 |
28 | |
29 void FUNCTION_NAME(Unhandled_invoke)(Dart_NativeArguments args) { | 26 void FUNCTION_NAME(Unhandled_invoke)(Dart_NativeArguments args) { |
30 // Invoke the specified entry point. | 27 // Invoke the specified entry point. |
31 Dart_Handle cls = Dart_GetClass(TestCase::lib(), NewString("Second")); | 28 Dart_Handle cls = Dart_GetClass(TestCase::lib(), NewString("Second")); |
32 Dart_Handle result = Dart_Invoke(cls, NewString("method2"), 0, NULL); | 29 Dart_Handle result = Dart_Invoke(cls, NewString("method2"), 0, NULL); |
33 ASSERT(Dart_IsError(result)); | 30 ASSERT(Dart_IsError(result)); |
34 ASSERT(Dart_ErrorHasException(result)); | 31 ASSERT(Dart_ErrorHasException(result)); |
35 return; | 32 return; |
36 } | 33 } |
37 | 34 |
38 | |
39 void FUNCTION_NAME(Unhandled_invoke2)(Dart_NativeArguments args) { | 35 void FUNCTION_NAME(Unhandled_invoke2)(Dart_NativeArguments args) { |
40 // Invoke the specified entry point. | 36 // Invoke the specified entry point. |
41 Dart_Handle cls = Dart_GetClass(TestCase::lib(), NewString("Second")); | 37 Dart_Handle cls = Dart_GetClass(TestCase::lib(), NewString("Second")); |
42 Dart_Handle result = Dart_Invoke(cls, NewString("method2"), 0, NULL); | 38 Dart_Handle result = Dart_Invoke(cls, NewString("method2"), 0, NULL); |
43 ASSERT(Dart_IsError(result)); | 39 ASSERT(Dart_IsError(result)); |
44 ASSERT(Dart_ErrorHasException(result)); | 40 ASSERT(Dart_ErrorHasException(result)); |
45 Dart_Handle exception = Dart_ErrorGetException(result); | 41 Dart_Handle exception = Dart_ErrorGetException(result); |
46 ASSERT(!Dart_IsError(exception)); | 42 ASSERT(!Dart_IsError(exception)); |
47 Dart_ThrowException(exception); | 43 Dart_ThrowException(exception); |
48 UNREACHABLE(); | 44 UNREACHABLE(); |
49 return; | 45 return; |
50 } | 46 } |
51 | 47 |
52 | |
53 // List all native functions implemented in the vm or core boot strap dart | 48 // List all native functions implemented in the vm or core boot strap dart |
54 // libraries so that we can resolve the native function to it's entry | 49 // libraries so that we can resolve the native function to it's entry |
55 // point. | 50 // point. |
56 #define UNHANDLED_NATIVE_LIST(V) \ | 51 #define UNHANDLED_NATIVE_LIST(V) \ |
57 V(Unhandled_equals, 2) \ | 52 V(Unhandled_equals, 2) \ |
58 V(Unhandled_invoke, 0) \ | 53 V(Unhandled_invoke, 0) \ |
59 V(Unhandled_invoke2, 0) | 54 V(Unhandled_invoke2, 0) |
60 | 55 |
61 | |
62 static struct NativeEntries { | 56 static struct NativeEntries { |
63 const char* name_; | 57 const char* name_; |
64 Dart_NativeFunction function_; | 58 Dart_NativeFunction function_; |
65 int argument_count_; | 59 int argument_count_; |
66 } BuiltinEntries[] = {UNHANDLED_NATIVE_LIST(REGISTER_FUNCTION)}; | 60 } BuiltinEntries[] = {UNHANDLED_NATIVE_LIST(REGISTER_FUNCTION)}; |
67 | 61 |
68 | |
69 static Dart_NativeFunction native_lookup(Dart_Handle name, | 62 static Dart_NativeFunction native_lookup(Dart_Handle name, |
70 int argument_count, | 63 int argument_count, |
71 bool* auto_setup_scope) { | 64 bool* auto_setup_scope) { |
72 ASSERT(auto_setup_scope != NULL); | 65 ASSERT(auto_setup_scope != NULL); |
73 *auto_setup_scope = true; | 66 *auto_setup_scope = true; |
74 const Object& obj = Object::Handle(Api::UnwrapHandle(name)); | 67 const Object& obj = Object::Handle(Api::UnwrapHandle(name)); |
75 ASSERT(obj.IsString()); | 68 ASSERT(obj.IsString()); |
76 const char* function_name = obj.ToCString(); | 69 const char* function_name = obj.ToCString(); |
77 ASSERT(function_name != NULL); | 70 ASSERT(function_name != NULL); |
78 int num_entries = sizeof(BuiltinEntries) / sizeof(struct NativeEntries); | 71 int num_entries = sizeof(BuiltinEntries) / sizeof(struct NativeEntries); |
79 for (int i = 0; i < num_entries; i++) { | 72 for (int i = 0; i < num_entries; i++) { |
80 struct NativeEntries* entry = &(BuiltinEntries[i]); | 73 struct NativeEntries* entry = &(BuiltinEntries[i]); |
81 if (!strcmp(function_name, entry->name_) && | 74 if (!strcmp(function_name, entry->name_) && |
82 (argument_count == entry->argument_count_)) { | 75 (argument_count == entry->argument_count_)) { |
83 return reinterpret_cast<Dart_NativeFunction>(entry->function_); | 76 return reinterpret_cast<Dart_NativeFunction>(entry->function_); |
84 } | 77 } |
85 } | 78 } |
86 return NULL; | 79 return NULL; |
87 } | 80 } |
88 | 81 |
89 | |
90 // Unit test case to verify unhandled exceptions. | 82 // Unit test case to verify unhandled exceptions. |
91 TEST_CASE(UnhandledExceptions) { | 83 TEST_CASE(UnhandledExceptions) { |
92 const char* kScriptChars = | 84 const char* kScriptChars = |
93 "class UnhandledExceptions {\n" | 85 "class UnhandledExceptions {\n" |
94 " static equals(var obj1, var obj2) native \"Unhandled_equals\";" | 86 " static equals(var obj1, var obj2) native \"Unhandled_equals\";" |
95 " static invoke() native \"Unhandled_invoke\";\n" | 87 " static invoke() native \"Unhandled_invoke\";\n" |
96 " static invoke2() native \"Unhandled_invoke2\";\n" | 88 " static invoke2() native \"Unhandled_invoke2\";\n" |
97 "}\n" | 89 "}\n" |
98 "class Second {\n" | 90 "class Second {\n" |
99 " Second() { }\n" | 91 " Second() { }\n" |
(...skipping 16 matching lines...) Expand all Loading... |
116 "testMain() {\n" | 108 "testMain() {\n" |
117 " UnhandledExceptions.equals(2, Second.method1(1));\n" | 109 " UnhandledExceptions.equals(2, Second.method1(1));\n" |
118 " UnhandledExceptions.equals(3, Second.method3(1));\n" | 110 " UnhandledExceptions.equals(3, Second.method3(1));\n" |
119 "}"; | 111 "}"; |
120 Dart_Handle lib = TestCase::LoadTestScript( | 112 Dart_Handle lib = TestCase::LoadTestScript( |
121 kScriptChars, reinterpret_cast<Dart_NativeEntryResolver>(native_lookup)); | 113 kScriptChars, reinterpret_cast<Dart_NativeEntryResolver>(native_lookup)); |
122 EXPECT_VALID(Dart_Invoke(lib, NewString("testMain"), 0, NULL)); | 114 EXPECT_VALID(Dart_Invoke(lib, NewString("testMain"), 0, NULL)); |
123 } | 115 } |
124 | 116 |
125 } // namespace dart | 117 } // namespace dart |
OLD | NEW |