| Index: runtime/vm/dart_api_impl_test.cc
|
| ===================================================================
|
| --- runtime/vm/dart_api_impl_test.cc (revision 36461)
|
| +++ runtime/vm/dart_api_impl_test.cc (working copy)
|
| @@ -5208,7 +5208,204 @@
|
| }
|
|
|
|
|
| -void NativeArgumentCounter(Dart_NativeArguments args) {
|
| +static intptr_t kNativeArgumentNativeField1Value = 30;
|
| +static intptr_t kNativeArgumentNativeField2Value = 40;
|
| +static intptr_t native_arg_str_peer = 100;
|
| +static void NativeArgumentCreate(Dart_NativeArguments args) {
|
| + Dart_Handle lib = Dart_LookupLibrary(NewString(TestCase::url()));
|
| + Dart_Handle type = Dart_GetType(lib, NewString("MyObject"), 0, NULL);
|
| + EXPECT_VALID(type);
|
| +
|
| + // Allocate without a constructor.
|
| + Dart_Handle obj = Dart_Allocate(type);
|
| + EXPECT_VALID(obj);
|
| +
|
| + // Setup native fields.
|
| + Dart_SetNativeInstanceField(obj, 0, kNativeArgumentNativeField1Value);
|
| + Dart_SetNativeInstanceField(obj, 1, kNativeArgumentNativeField2Value);
|
| + kNativeArgumentNativeField1Value *= 2;
|
| + kNativeArgumentNativeField2Value *= 2;
|
| + Dart_SetReturnValue(args, obj);
|
| +}
|
| +
|
| +
|
| +static void NativeArgumentAccess(Dart_NativeArguments args) {
|
| + const int kNumNativeFields = 2;
|
| +
|
| + // Test different argument types with a valid descriptor set.
|
| + {
|
| + const char* cstr = NULL;
|
| + intptr_t native_fields1[kNumNativeFields];
|
| + intptr_t native_fields2[kNumNativeFields];
|
| + const Dart_NativeArgument_Descriptor arg_descriptors[9] = {
|
| + { Dart_NativeArgument_kNativeFields, 0 },
|
| + { Dart_NativeArgument_kInt32, 1 },
|
| + { Dart_NativeArgument_kUint64, 2 },
|
| + { Dart_NativeArgument_kBool, 3 },
|
| + { Dart_NativeArgument_kDouble, 4 },
|
| + { Dart_NativeArgument_kString, 5 },
|
| + { Dart_NativeArgument_kString, 6 },
|
| + { Dart_NativeArgument_kNativeFields, 7 },
|
| + { Dart_NativeArgument_kInstance, 7 },
|
| + };
|
| + Dart_NativeArgument_Value arg_values[9];
|
| + arg_values[0].as_native_fields.num_fields = kNumNativeFields;
|
| + arg_values[0].as_native_fields.values = native_fields1;
|
| + arg_values[7].as_native_fields.num_fields = kNumNativeFields;
|
| + arg_values[7].as_native_fields.values = native_fields2;
|
| + Dart_Handle result = Dart_GetNativeArguments(args,
|
| + 9,
|
| + arg_descriptors,
|
| + arg_values);
|
| + EXPECT_VALID(result);
|
| +
|
| + EXPECT(arg_values[0].as_native_fields.values[0] == 30);
|
| + EXPECT(arg_values[0].as_native_fields.values[1] == 40);
|
| +
|
| + EXPECT(arg_values[1].as_int32 == 77);
|
| +
|
| + EXPECT(arg_values[2].as_uint64 == 0xffffffffffffffff);
|
| +
|
| + EXPECT(arg_values[3].as_bool == true);
|
| +
|
| + EXPECT(arg_values[4].as_double == 3.14);
|
| +
|
| + EXPECT_VALID(arg_values[5].as_string.dart_str);
|
| + EXPECT(Dart_IsString(arg_values[5].as_string.dart_str));
|
| + EXPECT_VALID(Dart_StringToCString(arg_values[5].as_string.dart_str, &cstr));
|
| + EXPECT_STREQ("abcdefg", cstr);
|
| + EXPECT(arg_values[5].as_string.peer == NULL);
|
| +
|
| + EXPECT(arg_values[6].as_string.dart_str == NULL);
|
| + EXPECT(arg_values[6].as_string.peer ==
|
| + reinterpret_cast<void*>(&native_arg_str_peer));
|
| +
|
| + EXPECT(arg_values[7].as_native_fields.values[0] == 60);
|
| + EXPECT(arg_values[7].as_native_fields.values[1] == 80);
|
| +
|
| + EXPECT_VALID(arg_values[8].as_instance);
|
| + EXPECT(Dart_IsInstance(arg_values[8].as_instance));
|
| + int field_count = 0;
|
| + EXPECT_VALID(Dart_GetNativeInstanceFieldCount(
|
| + arg_values[8].as_instance, &field_count));
|
| + EXPECT(field_count == 2);
|
| + }
|
| +
|
| + // Test with an invalid descriptor set (invalid type).
|
| + {
|
| + const Dart_NativeArgument_Descriptor arg_descriptors[8] = {
|
| + { Dart_NativeArgument_kInt32, 1 },
|
| + { Dart_NativeArgument_kUint64, 2 },
|
| + { Dart_NativeArgument_kString, 3 },
|
| + { Dart_NativeArgument_kDouble, 4 },
|
| + { Dart_NativeArgument_kString, 5 },
|
| + { Dart_NativeArgument_kString, 6 },
|
| + { Dart_NativeArgument_kNativeFields, 0 },
|
| + { Dart_NativeArgument_kNativeFields, 7 },
|
| + };
|
| + Dart_NativeArgument_Value arg_values[8];
|
| + Dart_Handle result = Dart_GetNativeArguments(args,
|
| + 8,
|
| + arg_descriptors,
|
| + arg_values);
|
| + EXPECT(Dart_IsError(result));
|
| + }
|
| +
|
| + // Test with an invalid range error.
|
| + {
|
| + const Dart_NativeArgument_Descriptor arg_descriptors[8] = {
|
| + { Dart_NativeArgument_kInt32, 2 },
|
| + { Dart_NativeArgument_kUint64, 2 },
|
| + { Dart_NativeArgument_kBool, 3 },
|
| + { Dart_NativeArgument_kDouble, 4 },
|
| + { Dart_NativeArgument_kString, 5 },
|
| + { Dart_NativeArgument_kString, 6 },
|
| + { Dart_NativeArgument_kNativeFields, 0 },
|
| + { Dart_NativeArgument_kNativeFields, 7 },
|
| + };
|
| + Dart_NativeArgument_Value arg_values[8];
|
| + Dart_Handle result = Dart_GetNativeArguments(args,
|
| + 8,
|
| + arg_descriptors,
|
| + arg_values);
|
| + EXPECT(Dart_IsError(result));
|
| + }
|
| +
|
| + Dart_SetIntegerReturnValue(args, 0);
|
| +}
|
| +
|
| +
|
| +static Dart_NativeFunction native_args_lookup(Dart_Handle name,
|
| + int argument_count,
|
| + bool* auto_scope_setup) {
|
| + const Object& obj = Object::Handle(Api::UnwrapHandle(name));
|
| + if (!obj.IsString()) {
|
| + return NULL;
|
| + }
|
| + ASSERT(auto_scope_setup != NULL);
|
| + *auto_scope_setup = true;
|
| + const char* function_name = obj.ToCString();
|
| + ASSERT(function_name != NULL);
|
| + if (!strcmp(function_name, "NativeArgument_Create")) {
|
| + return reinterpret_cast<Dart_NativeFunction>(&NativeArgumentCreate);
|
| + } else if (!strcmp(function_name, "NativeArgument_Access")) {
|
| + return reinterpret_cast<Dart_NativeFunction>(&NativeArgumentAccess);
|
| + }
|
| + return NULL;
|
| +}
|
| +
|
| +
|
| +TEST_CASE(GetNativeArguments) {
|
| + const char* kScriptChars =
|
| + "import 'dart:nativewrappers';"
|
| + "class MyObject extends NativeFieldWrapperClass2 {"
|
| + " static MyObject createObject() native 'NativeArgument_Create';"
|
| + " int accessFields(int arg1,"
|
| + " int arg2,"
|
| + " bool arg3,"
|
| + " double arg4,"
|
| + " String arg5,"
|
| + " String arg6,"
|
| + " MyObject arg7) native 'NativeArgument_Access';"
|
| + "}"
|
| + "int testMain(String extstr) {"
|
| + " String str = 'abcdefg';"
|
| + " MyObject obj1 = MyObject.createObject();"
|
| + " MyObject obj2 = MyObject.createObject();"
|
| + " return obj1.accessFields(77,"
|
| + " 0xffffffffffffffff,"
|
| + " true,"
|
| + " 3.14,"
|
| + " str,"
|
| + " extstr,"
|
| + " obj2);"
|
| + "}";
|
| +
|
| + Dart_Handle lib = TestCase::LoadTestScript(
|
| + kScriptChars,
|
| + reinterpret_cast<Dart_NativeEntryResolver>(native_args_lookup));
|
| +
|
| + intptr_t size;
|
| + Dart_Handle ascii_str = NewString("string");
|
| + EXPECT_VALID(ascii_str);
|
| + EXPECT_VALID(Dart_StringStorageSize(ascii_str, &size));
|
| + uint8_t ext_ascii_str[10];
|
| + Dart_Handle extstr = Dart_MakeExternalString(
|
| + ascii_str,
|
| + ext_ascii_str,
|
| + size,
|
| + reinterpret_cast<void*>(&native_arg_str_peer),
|
| + NULL);
|
| +
|
| + Dart_Handle args[1];
|
| + args[0] = extstr;
|
| + Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 1, args);
|
| + EXPECT_VALID(result);
|
| + EXPECT(Dart_IsInteger(result));
|
| +}
|
| +
|
| +
|
| +static void NativeArgumentCounter(Dart_NativeArguments args) {
|
| Dart_EnterScope();
|
| int count = Dart_GetNativeArgumentCount(args);
|
| Dart_SetReturnValue(args, Dart_NewInteger(count));
|
|
|