Chromium Code Reviews| Index: vm/dart_api_impl_test.cc |
| =================================================================== |
| --- vm/dart_api_impl_test.cc (revision 1545) |
| +++ vm/dart_api_impl_test.cc (working copy) |
| @@ -988,6 +988,17 @@ |
| } |
| +void NativeFieldLookup(Dart_NativeArguments args) { |
|
Ivan Posva
2011/11/16 19:19:53
?
siva
2011/11/17 00:04:28
See below.
On 2011/11/16 19:19:53, Ivan Posva wro
|
| + UNREACHABLE(); |
| +} |
| + |
| + |
| +static Dart_NativeFunction native_field_lookup(Dart_Handle name, |
| + int argument_count) { |
| + return reinterpret_cast<Dart_NativeFunction>(&native_field_lookup); |
|
Ivan Posva
2011/11/16 19:19:53
This points to itself?
siva
2011/11/17 00:04:28
Changed native_field_lookup to &NativeFieldLookup
|
| +} |
| + |
| + |
| UNIT_TEST_CASE(InjectNativeFields1) { |
| const char* kScriptChars = |
| "class NativeFields extends NativeFieldsWrapper {\n" |
| @@ -1007,12 +1018,12 @@ |
| Dart_CreateIsolate(NULL, NULL); |
| { |
| - DARTSCOPE(Isolate::Current()); |
| Dart_EnterScope(); // Start a Dart API scope for invoking API functions. |
| const int kNumNativeFields = 4; |
| // Create a test library. |
| - Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); |
| + Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, |
| + native_field_lookup); |
| // Create a native wrapper class with native fields. |
| result = Dart_CreateNativeWrapperClass( |
| @@ -1029,6 +1040,7 @@ |
| 0, |
| NULL); |
| EXPECT_VALID(result); |
| + DARTSCOPE(Isolate::Current()); |
| Instance& obj = Instance::Handle(); |
| obj ^= Api::UnwrapHandle(result); |
| const Class& cls = Class::Handle(obj.clazz()); |
| @@ -1089,6 +1101,169 @@ |
| } |
| +UNIT_TEST_CASE(InjectNativeFields3) { |
| + const char* kScriptChars = |
| + "#import('dart:core-native-fields');" |
| + "class NativeFields extends NativeFieldWrapperClass2 {\n" |
| + " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n" |
| + " int fld1;\n" |
| + " final int fld2;\n" |
| + " static int fld3;\n" |
| + " static final int fld4 = 10;\n" |
| + "}\n" |
| + "class NativeFieldsTest {\n" |
| + " static NativeFields testMain() {\n" |
| + " NativeFields obj = new NativeFields(10, 20);\n" |
| + " return obj;\n" |
| + " }\n" |
| + "}\n"; |
| + Dart_Handle result; |
| + |
| + Dart_CreateIsolate(NULL, NULL); |
| + { |
| + Dart_EnterScope(); // Start a Dart API scope for invoking API functions. |
| + const int kNumNativeFields = 2; |
| + |
| + // Load up a test script in the test library. |
| + Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, |
| + native_field_lookup); |
| + |
| + // Invoke a function which returns an object of type NativeFields. |
| + result = Dart_InvokeStatic(lib, |
| + Dart_NewString("NativeFieldsTest"), |
| + Dart_NewString("testMain"), |
| + 0, |
| + NULL); |
| + EXPECT_VALID(result); |
| + DARTSCOPE(Isolate::Current()); |
| + Instance& obj = Instance::Handle(); |
| + obj ^= Api::UnwrapHandle(result); |
| + const Class& cls = Class::Handle(obj.clazz()); |
| + // We expect the newly created "NativeFields" object to have |
| + // 2 dart instance fields (fld1, fld2) and kNumNativeFields native fields. |
| + // Hence the size of an instance of "NativeFields" should be |
| + // (kNumNativeFields + 2) * kWordSize + sizeof the header word. |
| + // We check to make sure the instance size computed by the VM matches |
| + // our expectations. |
| + EXPECT_EQ(Utils::RoundUp(((kNumNativeFields + 2) * kWordSize) + kWordSize, |
| + kObjectAlignment), |
| + cls.instance_size()); |
| + |
| + Dart_ExitScope(); // Exit the Dart API scope. |
| + } |
| + Dart_ShutdownIsolate(); |
| +} |
| + |
| + |
| +UNIT_TEST_CASE(InjectNativeFields4) { |
| + const char* kScriptChars = |
| + "#import('dart:core-native-fields');" |
| + "class NativeFields extends NativeFieldWrapperClass2 {\n" |
| + " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n" |
| + " int fld1;\n" |
| + " final int fld2;\n" |
| + " static int fld3;\n" |
| + " static final int fld4 = 10;\n" |
| + "}\n" |
| + "class NativeFieldsTest {\n" |
| + " static NativeFields testMain() {\n" |
| + " NativeFields obj = new NativeFields(10, 20);\n" |
| + " return obj;\n" |
| + " }\n" |
| + "}\n"; |
| + Dart_Handle result; |
| + |
| + Dart_CreateIsolate(NULL, NULL); |
| + { |
| + Dart_EnterScope(); // Start a Dart API scope for invoking API functions. |
| + |
| + // Load up a test script in the test library. |
| + Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); |
| + |
| + // Invoke a function which returns an object of type NativeFields. |
| + result = Dart_InvokeStatic(lib, |
| + Dart_NewString("NativeFieldsTest"), |
| + Dart_NewString("testMain"), |
| + 0, |
| + NULL); |
| + EXPECT(Dart_IsError(result)); |
|
Ivan Posva
2011/11/16 19:19:53
Please specify at least what kind of error you exp
siva
2011/11/17 00:04:28
Done.
|
| + Dart_ExitScope(); // Exit the Dart API scope. |
| + } |
| + Dart_ShutdownIsolate(); |
| +} |
| + |
| + |
| +static void TestNativeFields(Dart_Handle retobj) { |
| + // Access and set various instance fields of the object. |
| + Dart_Handle result = Dart_GetInstanceField(retobj, Dart_NewString("fld3")); |
| + EXPECT(Dart_IsError(result)); |
| + result = Dart_GetInstanceField(retobj, Dart_NewString("fld1")); |
| + EXPECT_VALID(result); |
| + int64_t value = 0; |
| + result = Dart_IntegerValue(result, &value); |
| + EXPECT_EQ(10, value); |
| + result = Dart_GetInstanceField(retobj, Dart_NewString("fld2")); |
| + EXPECT_VALID(result); |
| + result = Dart_IntegerValue(result, &value); |
| + EXPECT_EQ(20, value); |
| + result = Dart_SetInstanceField(retobj, |
| + Dart_NewString("fld2"), |
| + Dart_NewInteger(40)); |
| + EXPECT(Dart_IsError(result)); |
| + result = Dart_SetInstanceField(retobj, |
| + Dart_NewString("fld1"), |
| + Dart_NewInteger(40)); |
| + EXPECT_VALID(result); |
| + result = Dart_GetInstanceField(retobj, Dart_NewString("fld1")); |
| + EXPECT_VALID(result); |
| + result = Dart_IntegerValue(result, &value); |
| + EXPECT_EQ(40, value); |
| + |
| + // Now access and set various native instance fields of the returned object. |
| + const int kNativeFld0 = 0; |
| + const int kNativeFld1 = 1; |
| + const int kNativeFld2 = 2; |
| + const int kNativeFld3 = 3; |
| + const int kNativeFld4 = 4; |
| + intptr_t field_value = 0; |
| + result = Dart_GetNativeInstanceField(retobj, kNativeFld4, &field_value); |
| + EXPECT(Dart_IsError(result)); |
| + result = Dart_GetNativeInstanceField(retobj, kNativeFld0, &field_value); |
| + EXPECT_VALID(result); |
| + EXPECT_EQ(0, field_value); |
| + result = Dart_GetNativeInstanceField(retobj, kNativeFld1, &field_value); |
| + EXPECT_VALID(result); |
| + EXPECT_EQ(0, field_value); |
| + result = Dart_GetNativeInstanceField(retobj, kNativeFld2, &field_value); |
| + EXPECT_VALID(result); |
| + EXPECT_EQ(0, field_value); |
| + result = Dart_SetNativeInstanceField(retobj, kNativeFld4, 40); |
| + EXPECT(Dart_IsError(result)); |
| + result = Dart_SetNativeInstanceField(retobj, kNativeFld0, 4); |
| + EXPECT_VALID(result); |
| + result = Dart_SetNativeInstanceField(retobj, kNativeFld1, 40); |
| + EXPECT_VALID(result); |
| + result = Dart_SetNativeInstanceField(retobj, kNativeFld2, 400); |
| + EXPECT_VALID(result); |
| + result = Dart_SetNativeInstanceField(retobj, kNativeFld3, 4000); |
| + EXPECT_VALID(result); |
| + result = Dart_GetNativeInstanceField(retobj, kNativeFld3, &field_value); |
| + EXPECT_VALID(result); |
| + EXPECT_EQ(4000, field_value); |
| + |
| + // Now re-access various dart instance fields of the returned object |
| + // to ensure that there was no corruption while setting native fields. |
| + result = Dart_GetInstanceField(retobj, Dart_NewString("fld1")); |
| + EXPECT_VALID(result); |
| + result = Dart_IntegerValue(result, &value); |
| + EXPECT_EQ(40, value); |
| + result = Dart_GetInstanceField(retobj, Dart_NewString("fld2")); |
| + EXPECT_VALID(result); |
| + result = Dart_IntegerValue(result, &value); |
| + EXPECT_EQ(20, value); |
| +} |
| + |
| + |
| UNIT_TEST_CASE(NativeFieldAccess) { |
| const char* kScriptChars = |
| "class NativeFields extends NativeFieldsWrapper {\n" |
| @@ -1112,7 +1287,8 @@ |
| const int kNumNativeFields = 4; |
| // Create a test library. |
| - Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); |
| + Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, |
| + native_field_lookup); |
| // Create a native wrapper class with native fields. |
| result = Dart_CreateNativeWrapperClass( |
| @@ -1131,73 +1307,49 @@ |
| EXPECT_VALID(retobj); |
| // Now access and set various instance fields of the returned object. |
| - result = Dart_GetInstanceField(retobj, Dart_NewString("fld3")); |
| - EXPECT(Dart_IsError(result)); |
| - result = Dart_GetInstanceField(retobj, Dart_NewString("fld1")); |
| - EXPECT_VALID(result); |
| - int64_t value = 0; |
| - result = Dart_IntegerValue(result, &value); |
| - EXPECT_EQ(10, value); |
| - result = Dart_GetInstanceField(retobj, Dart_NewString("fld2")); |
| - EXPECT_VALID(result); |
| - result = Dart_IntegerValue(result, &value); |
| - EXPECT_EQ(20, value); |
| - result = Dart_SetInstanceField(retobj, |
| - Dart_NewString("fld2"), |
| - Dart_NewInteger(40)); |
| - EXPECT(Dart_IsError(result)); |
| - result = Dart_SetInstanceField(retobj, |
| - Dart_NewString("fld1"), |
| - Dart_NewInteger(40)); |
| - EXPECT_VALID(result); |
| - result = Dart_GetInstanceField(retobj, Dart_NewString("fld1")); |
| - EXPECT_VALID(result); |
| - result = Dart_IntegerValue(result, &value); |
| - EXPECT_EQ(40, value); |
| + TestNativeFields(retobj); |
| - // Now access and set various native instance fields of the returned object. |
| - const int kNativeFld0 = 0; |
| - const int kNativeFld1 = 1; |
| - const int kNativeFld2 = 2; |
| - const int kNativeFld3 = 3; |
| - const int kNativeFld4 = 4; |
| - intptr_t field_value = 0; |
| - result = Dart_GetNativeInstanceField(retobj, kNativeFld4, &field_value); |
| - EXPECT(Dart_IsError(result)); |
| - result = Dart_GetNativeInstanceField(retobj, kNativeFld0, &field_value); |
| - EXPECT_VALID(result); |
| - EXPECT_EQ(0, field_value); |
| - result = Dart_GetNativeInstanceField(retobj, kNativeFld1, &field_value); |
| - EXPECT_VALID(result); |
| - EXPECT_EQ(0, field_value); |
| - result = Dart_GetNativeInstanceField(retobj, kNativeFld2, &field_value); |
| - EXPECT_VALID(result); |
| - EXPECT_EQ(0, field_value); |
| - result = Dart_SetNativeInstanceField(retobj, kNativeFld4, 40); |
| - EXPECT(Dart_IsError(result)); |
| - result = Dart_SetNativeInstanceField(retobj, kNativeFld0, 4); |
| - EXPECT_VALID(result); |
| - result = Dart_SetNativeInstanceField(retobj, kNativeFld1, 40); |
| - EXPECT_VALID(result); |
| - result = Dart_SetNativeInstanceField(retobj, kNativeFld2, 400); |
| - EXPECT_VALID(result); |
| - result = Dart_SetNativeInstanceField(retobj, kNativeFld3, 4000); |
| - EXPECT_VALID(result); |
| - result = Dart_GetNativeInstanceField(retobj, kNativeFld3, &field_value); |
| - EXPECT_VALID(result); |
| - EXPECT_EQ(4000, field_value); |
| + Dart_ExitScope(); // Exit the Dart API scope. |
| + } |
| + Dart_ShutdownIsolate(); |
| +} |
| - // Now re-access various dart instance fields of the returned object |
| - // to ensure that there was no corruption while setting native fields. |
| - result = Dart_GetInstanceField(retobj, Dart_NewString("fld1")); |
| - EXPECT_VALID(result); |
| - result = Dart_IntegerValue(result, &value); |
| - EXPECT_EQ(40, value); |
| - result = Dart_GetInstanceField(retobj, Dart_NewString("fld2")); |
| - EXPECT_VALID(result); |
| - result = Dart_IntegerValue(result, &value); |
| - EXPECT_EQ(20, value); |
| +UNIT_TEST_CASE(ImplicitNativeFieldAccess) { |
| + const char* kScriptChars = |
| + "#import('dart:core-native-fields');" |
| + "class NativeFields extends NativeFieldWrapperClass4 {\n" |
| + " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n" |
| + " int fld1;\n" |
| + " final int fld2;\n" |
| + " static int fld3;\n" |
| + " static final int fld4 = 10;\n" |
| + "}\n" |
| + "class NativeFieldsTest {\n" |
| + " static NativeFields testMain() {\n" |
| + " NativeFields obj = new NativeFields(10, 20);\n" |
| + " return obj;\n" |
| + " }\n" |
| + "}\n"; |
| + Dart_CreateIsolate(NULL, NULL); |
| + { |
| + Dart_EnterScope(); // Start a Dart API scope for invoking API functions. |
| + |
| + // Load up a test script in the test library. |
| + Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, |
| + native_field_lookup); |
| + |
| + // Invoke a function which returns an object of type NativeFields. |
| + Dart_Handle retobj = Dart_InvokeStatic(lib, |
| + Dart_NewString("NativeFieldsTest"), |
| + Dart_NewString("testMain"), |
| + 0, |
| + NULL); |
| + EXPECT_VALID(retobj); |
| + |
| + // Now access and set various instance fields of the returned object. |
| + TestNativeFields(retobj); |
| + |
| Dart_ExitScope(); // Exit the Dart API scope. |
| } |
| Dart_ShutdownIsolate(); |