Index: vm/dart_api_impl_test.cc |
=================================================================== |
--- vm/dart_api_impl_test.cc (revision 8699) |
+++ vm/dart_api_impl_test.cc (working copy) |
@@ -5172,6 +5172,153 @@ |
Isolate::SetInterruptCallback(saved); |
} |
+ |
+static int64_t GetValue(Dart_Handle arg) { |
+ EXPECT(!Dart_IsError(arg)); |
+ EXPECT(Dart_IsInteger(arg)); |
+ int64_t value; |
+ EXPECT_VALID(Dart_IntegerToInt64(arg, &value)); |
+ return value; |
+} |
+ |
+void NativeFoo1(Dart_NativeArguments args) { |
+ Dart_EnterScope(); |
+ intptr_t i = Dart_GetNativeArgumentCount(args); |
+ EXPECT_EQ(1, i); |
+ Dart_Handle arg = Dart_GetNativeArgument(args, 0); |
+ EXPECT(!Dart_IsError(arg)); |
+ Dart_SetReturnValue(args, Dart_NewInteger(1)); |
+ Dart_ExitScope(); |
+} |
+ |
+ |
+void NativeFoo2(Dart_NativeArguments args) { |
+ Dart_EnterScope(); |
+ intptr_t i = Dart_GetNativeArgumentCount(args); |
+ EXPECT_EQ(2, i); |
+ Dart_Handle arg = Dart_GetNativeArgument(args, 1); |
+ Dart_SetReturnValue(args, Dart_NewInteger(GetValue(arg))); |
+ Dart_ExitScope(); |
+} |
+ |
+ |
+void NativeFoo3(Dart_NativeArguments args) { |
+ Dart_EnterScope(); |
+ intptr_t i = Dart_GetNativeArgumentCount(args); |
+ EXPECT_EQ(3, i); |
+ Dart_Handle arg1 = Dart_GetNativeArgument(args, 1); |
+ Dart_Handle arg2 = Dart_GetNativeArgument(args, 2); |
+ Dart_SetReturnValue(args, Dart_NewInteger(GetValue(arg1) + GetValue(arg2))); |
+ Dart_ExitScope(); |
+} |
+ |
+ |
+void NativeFoo4(Dart_NativeArguments args) { |
+ Dart_EnterScope(); |
+ intptr_t i = Dart_GetNativeArgumentCount(args); |
+ EXPECT_EQ(4, i); |
+ Dart_Handle arg1 = Dart_GetNativeArgument(args, 1); |
+ Dart_Handle arg2 = Dart_GetNativeArgument(args, 2); |
+ Dart_Handle arg3 = Dart_GetNativeArgument(args, 3); |
+ Dart_SetReturnValue(args, Dart_NewInteger(GetValue(arg1) + |
+ GetValue(arg2) + |
+ GetValue(arg3))); |
+ Dart_ExitScope(); |
+} |
+ |
+ |
+static Dart_NativeFunction MyNativeClosureResolver(Dart_Handle name, |
+ int arg_count) { |
+ const Object& obj = Object::Handle(Api::UnwrapHandle(name)); |
+ if (!obj.IsString()) { |
+ return NULL; |
+ } |
+ const char* function_name = obj.ToCString(); |
+ const char* kNativeFoo1 = "NativeFoo1"; |
+ const char* kNativeFoo2 = "NativeFoo2"; |
+ const char* kNativeFoo3 = "NativeFoo3"; |
+ const char* kNativeFoo4 = "NativeFoo4"; |
+ if (!strncmp(function_name, kNativeFoo1, strlen(kNativeFoo1))) { |
+ return &NativeFoo1; |
+ } else if (!strncmp(function_name, kNativeFoo2, strlen(kNativeFoo2))) { |
+ return &NativeFoo2; |
+ } else if (!strncmp(function_name, kNativeFoo3, strlen(kNativeFoo3))) { |
+ return &NativeFoo3; |
+ } else if (!strncmp(function_name, kNativeFoo4, strlen(kNativeFoo4))) { |
+ return &NativeFoo4; |
+ } else { |
+ UNREACHABLE(); |
+ return NULL; |
+ } |
+} |
+ |
+ |
+TEST_CASE(NativeFunctionClosure) { |
+ const char* kScriptChars = |
+ "class Test {" |
+ " int foo1() native \"NativeFoo1\";\n" |
+ " int foo2(int i) native \"NativeFoo2\";\n" |
regis
2012/06/15 17:13:34
Add a test for a static native.
siva
2012/06/16 00:25:43
Done.
|
+ " int foo3([int k = 10000, int l = 1]) native \"NativeFoo3\";\n" |
+ " int foo4(int i," |
+ " [int j = 10, int k = 1]) native \"NativeFoo4\";\n" |
+ " int bar1() { var func = foo1; return func(); }\n" |
+ " int bar2(int i) { var func = foo2; return func(i); }\n" |
+ " int bar30() { var func = foo3; return func(); }\n" |
+ " int bar31(int i) { var func = foo3; return func(i); }\n" |
+ " int bar32(int i, int j) { var func = foo3; return func(i, j); }\n" |
+ " int bar41(int i) {\n" |
+ " var func = foo4; return func(i); }\n" |
+ " int bar42(int i, int j) {\n" |
+ " var func = foo4; return func(i, j); }\n" |
+ " int bar43(int i, int j, int k) {\n" |
+ " var func = foo4; return func(i, j, k); }\n" |
+ "}\n" |
+ "int testMain() {\n" |
+ " Test obj = new Test();\n" |
+ " Expect.equals(1, obj.foo1());\n" |
+ " Expect.equals(1, obj.bar1());\n" |
+ "\n" |
+ " Expect.equals(10, obj.foo2(10));\n" |
+ " Expect.equals(10, obj.bar2(10));\n" |
+ "\n" |
+ " Expect.equals(10001, obj.foo3());\n" |
+ " Expect.equals(10001, obj.bar30());\n" |
+ " Expect.equals(2, obj.foo3(1));\n" |
+ " Expect.equals(2, obj.bar31(1));\n" |
+ " Expect.equals(4, obj.foo3(2, 2));\n" |
+ " Expect.equals(4, obj.bar32(2, 2));\n" |
+ "\n" |
+ " Expect.equals(12, obj.foo4(1));\n" |
+ " Expect.equals(12, obj.bar41(1));\n" |
+ " Expect.equals(3, obj.foo4(1, 1));\n" |
+ " Expect.equals(3, obj.bar42(1, 1));\n" |
+ " Expect.equals(6, obj.foo4(2, 2, 2));\n" |
+ " Expect.equals(6, obj.bar43(2, 2, 2));\n" |
+ "\n" |
+ " return 0;\n" |
+ "}\n"; |
+ |
+ Dart_Handle result; |
+ |
+ // Load a test script. |
+ Dart_Handle url = Dart_NewString(TestCase::url()); |
+ Dart_Handle source = Dart_NewString(kScriptChars); |
+ result = Dart_SetLibraryTagHandler(library_handler); |
+ EXPECT_VALID(result); |
+ Dart_Handle lib = Dart_LoadScript(url, source); |
+ EXPECT_VALID(lib); |
+ EXPECT(Dart_IsLibrary(lib)); |
+ result = Dart_SetNativeResolver(lib, &MyNativeClosureResolver); |
+ EXPECT_VALID(result); |
+ |
+ result = Dart_Invoke(lib, Dart_NewString("testMain"), 0, NULL); |
+ EXPECT_VALID(result); |
+ EXPECT(Dart_IsInteger(result)); |
+ int64_t value = 0; |
+ EXPECT_VALID(Dart_IntegerToInt64(result, &value)); |
+ EXPECT_EQ(0, value); |
+} |
+ |
#endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). |
} // namespace dart |