Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(67)

Side by Side Diff: vm/dart_api_impl_test.cc

Issue 8537023: Implement automatic loading of dart:core_native_fields library (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/runtime/
Patch Set: '' Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, 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 6
7 #include "vm/assert.h" 7 #include "vm/assert.h"
8 #include "vm/dart_api_impl.h" 8 #include "vm/dart_api_impl.h"
9 #include "vm/dart_api_state.h" 9 #include "vm/dart_api_state.h"
10 #include "vm/unit_test.h" 10 #include "vm/unit_test.h"
(...skipping 1031 matching lines...) Expand 10 before | Expand all | Expand 10 after
1042 // "NativeFieldsWrapper" and there is no definition of it either 1042 // "NativeFieldsWrapper" and there is no definition of it either
1043 // in the dart code or through the native field injection mechanism. 1043 // in the dart code or through the native field injection mechanism.
1044 EXPECT(!Dart_IsValid(result)); 1044 EXPECT(!Dart_IsValid(result));
1045 1045
1046 Dart_ExitScope(); // Exit the Dart API scope. 1046 Dart_ExitScope(); // Exit the Dart API scope.
1047 } 1047 }
1048 Dart_ShutdownIsolate(); 1048 Dart_ShutdownIsolate();
1049 } 1049 }
1050 1050
1051 1051
1052 UNIT_TEST_CASE(InjectNativeFields3) {
1053 const char* kScriptChars =
1054 "#import('dart:core_native_fields');"
1055 "class NativeFields extends NativeFieldWrapperClass2 {\n"
1056 " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
1057 " int fld1;\n"
1058 " final int fld2;\n"
1059 " static int fld3;\n"
1060 " static final int fld4 = 10;\n"
1061 "}\n"
1062 "class NativeFieldsTest {\n"
1063 " static NativeFields testMain() {\n"
1064 " NativeFields obj = new NativeFields(10, 20);\n"
1065 " return obj;\n"
1066 " }\n"
1067 "}\n";
1068 Dart_Handle result;
1069
1070 Dart_CreateIsolate(NULL, NULL);
1071 {
1072 Zone zone;
1073 HandleScope scope;
Anton Muhin 2011/11/13 16:19:32 may you defer VM Zone and HandleScope creation til
siva 2011/11/15 02:16:52 Done.
1074 Dart_EnterScope(); // Start a Dart API scope for invoking API functions.
1075 const int kNumNativeFields = 2;
1076
1077 // Load up a test script in the test library.
1078 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
1079
1080 // Invoke a function which returns an object of type NativeFields.
1081 result = Dart_InvokeStatic(lib,
1082 Dart_NewString("NativeFieldsTest"),
1083 Dart_NewString("testMain"),
1084 0,
1085 NULL);
1086 EXPECT_VALID(result);
1087 EXPECT(!Dart_ExceptionOccurred(result));
1088 Instance& obj = Instance::Handle();
1089 obj ^= Api::UnwrapHandle(result);
1090 const Class& cls = Class::Handle(obj.clazz());
1091 // We expect the newly created "NativeFields" object to have
1092 // 2 dart instance fields (fld1, fld2) and kNumNativeFields native fields.
1093 // Hence the size of an instance of "NativeFields" should be
1094 // (kNumNativeFields + 2) * kWordSize + sizeof the header word.
1095 // We check to make sure the instance size computed by the VM matches
1096 // our expectations.
1097 EXPECT_EQ(Utils::RoundUp(((kNumNativeFields + 2) * kWordSize) + kWordSize,
1098 kObjectAlignment),
1099 cls.instance_size());
1100
1101 Dart_ExitScope(); // Exit the Dart API scope.
1102 }
1103 Dart_ShutdownIsolate();
1104 }
1105
1106
1107 static void TestNativeFields(Dart_Handle retobj) {
1108 // Access and set various instance fields of the object.
1109 Dart_Handle result = Dart_GetInstanceField(retobj, Dart_NewString("fld3"));
1110 EXPECT(!Dart_IsValid(result));
1111 result = Dart_GetInstanceField(retobj, Dart_NewString("fld1"));
1112 EXPECT_VALID(result);
1113 int64_t value = 0;
1114 result = Dart_IntegerValue(result, &value);
1115 EXPECT_EQ(10, value);
1116 result = Dart_GetInstanceField(retobj, Dart_NewString("fld2"));
1117 EXPECT_VALID(result);
1118 result = Dart_IntegerValue(result, &value);
1119 EXPECT_EQ(20, value);
1120 result = Dart_SetInstanceField(retobj,
1121 Dart_NewString("fld2"),
1122 Dart_NewInteger(40));
1123 EXPECT(!Dart_IsValid(result));
1124 result = Dart_SetInstanceField(retobj,
1125 Dart_NewString("fld1"),
1126 Dart_NewInteger(40));
1127 EXPECT_VALID(result);
1128 result = Dart_GetInstanceField(retobj, Dart_NewString("fld1"));
1129 EXPECT_VALID(result);
1130 result = Dart_IntegerValue(result, &value);
1131 EXPECT_EQ(40, value);
1132
1133 // Now access and set various native instance fields of the returned object.
1134 const int kNativeFld0 = 0;
1135 const int kNativeFld1 = 1;
1136 const int kNativeFld2 = 2;
1137 const int kNativeFld3 = 3;
1138 const int kNativeFld4 = 4;
1139 intptr_t field_value = 0;
1140 result = Dart_GetNativeInstanceField(retobj, kNativeFld4, &field_value);
1141 EXPECT(!Dart_IsValid(result));
1142 result = Dart_GetNativeInstanceField(retobj, kNativeFld0, &field_value);
1143 EXPECT_VALID(result);
1144 EXPECT_EQ(0, field_value);
1145 result = Dart_GetNativeInstanceField(retobj, kNativeFld1, &field_value);
1146 EXPECT_VALID(result);
1147 EXPECT_EQ(0, field_value);
1148 result = Dart_GetNativeInstanceField(retobj, kNativeFld2, &field_value);
1149 EXPECT_VALID(result);
1150 EXPECT_EQ(0, field_value);
1151 result = Dart_SetNativeInstanceField(retobj, kNativeFld4, 40);
1152 EXPECT(!Dart_IsValid(result));
1153 result = Dart_SetNativeInstanceField(retobj, kNativeFld0, 4);
1154 EXPECT_VALID(result);
1155 result = Dart_SetNativeInstanceField(retobj, kNativeFld1, 40);
1156 EXPECT_VALID(result);
1157 result = Dart_SetNativeInstanceField(retobj, kNativeFld2, 400);
1158 EXPECT_VALID(result);
1159 result = Dart_SetNativeInstanceField(retobj, kNativeFld3, 4000);
1160 EXPECT_VALID(result);
1161 result = Dart_GetNativeInstanceField(retobj, kNativeFld3, &field_value);
1162 EXPECT_VALID(result);
1163 EXPECT_EQ(4000, field_value);
1164
1165 // Now re-access various dart instance fields of the returned object
1166 // to ensure that there was no corruption while setting native fields.
1167 result = Dart_GetInstanceField(retobj, Dart_NewString("fld1"));
1168 EXPECT_VALID(result);
1169 result = Dart_IntegerValue(result, &value);
1170 EXPECT_EQ(40, value);
1171 result = Dart_GetInstanceField(retobj, Dart_NewString("fld2"));
1172 EXPECT_VALID(result);
1173 result = Dart_IntegerValue(result, &value);
1174 EXPECT_EQ(20, value);
1175 }
1176
1177
1052 UNIT_TEST_CASE(NativeFieldAccess) { 1178 UNIT_TEST_CASE(NativeFieldAccess) {
1053 const char* kScriptChars = 1179 const char* kScriptChars =
1054 "class NativeFields extends NativeFieldsWrapper {\n" 1180 "class NativeFields extends NativeFieldsWrapper {\n"
1055 " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n" 1181 " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
1056 " int fld1;\n" 1182 " int fld1;\n"
1057 " final int fld2;\n" 1183 " final int fld2;\n"
1058 " static int fld3;\n" 1184 " static int fld3;\n"
1059 " static final int fld4 = 10;\n" 1185 " static final int fld4 = 10;\n"
1060 "}\n" 1186 "}\n"
1061 "class NativeFieldsTest {\n" 1187 "class NativeFieldsTest {\n"
(...skipping 23 matching lines...) Expand all
1085 // Invoke a function which returns an object of type NativeFields. 1211 // Invoke a function which returns an object of type NativeFields.
1086 Dart_Handle retobj = Dart_InvokeStatic(lib, 1212 Dart_Handle retobj = Dart_InvokeStatic(lib,
1087 Dart_NewString("NativeFieldsTest"), 1213 Dart_NewString("NativeFieldsTest"),
1088 Dart_NewString("testMain"), 1214 Dart_NewString("testMain"),
1089 0, 1215 0,
1090 NULL); 1216 NULL);
1091 EXPECT_VALID(retobj); 1217 EXPECT_VALID(retobj);
1092 EXPECT(!Dart_ExceptionOccurred(retobj)); 1218 EXPECT(!Dart_ExceptionOccurred(retobj));
1093 1219
1094 // Now access and set various instance fields of the returned object. 1220 // Now access and set various instance fields of the returned object.
1095 result = Dart_GetInstanceField(retobj, Dart_NewString("fld3")); 1221 TestNativeFields(retobj);
1096 EXPECT(!Dart_IsValid(result));
1097 result = Dart_GetInstanceField(retobj, Dart_NewString("fld1"));
1098 EXPECT_VALID(result);
1099 int64_t value = 0;
1100 result = Dart_IntegerValue(result, &value);
1101 EXPECT_EQ(10, value);
1102 result = Dart_GetInstanceField(retobj, Dart_NewString("fld2"));
1103 EXPECT_VALID(result);
1104 result = Dart_IntegerValue(result, &value);
1105 EXPECT_EQ(20, value);
1106 result = Dart_SetInstanceField(retobj,
1107 Dart_NewString("fld2"),
1108 Dart_NewInteger(40));
1109 EXPECT(!Dart_IsValid(result));
1110 result = Dart_SetInstanceField(retobj,
1111 Dart_NewString("fld1"),
1112 Dart_NewInteger(40));
1113 EXPECT_VALID(result);
1114 result = Dart_GetInstanceField(retobj, Dart_NewString("fld1"));
1115 EXPECT_VALID(result);
1116 result = Dart_IntegerValue(result, &value);
1117 EXPECT_EQ(40, value);
1118
1119 // Now access and set various native instance fields of the returned object.
1120 const int kNativeFld0 = 0;
1121 const int kNativeFld1 = 1;
1122 const int kNativeFld2 = 2;
1123 const int kNativeFld3 = 3;
1124 const int kNativeFld4 = 4;
1125 intptr_t field_value = 0;
1126 result = Dart_GetNativeInstanceField(retobj, kNativeFld4, &field_value);
1127 EXPECT(!Dart_IsValid(result));
1128 result = Dart_GetNativeInstanceField(retobj, kNativeFld0, &field_value);
1129 EXPECT_VALID(result);
1130 EXPECT_EQ(0, field_value);
1131 result = Dart_GetNativeInstanceField(retobj, kNativeFld1, &field_value);
1132 EXPECT_VALID(result);
1133 EXPECT_EQ(0, field_value);
1134 result = Dart_GetNativeInstanceField(retobj, kNativeFld2, &field_value);
1135 EXPECT_VALID(result);
1136 EXPECT_EQ(0, field_value);
1137 result = Dart_SetNativeInstanceField(retobj, kNativeFld4, 40);
1138 EXPECT(!Dart_IsValid(result));
1139 result = Dart_SetNativeInstanceField(retobj, kNativeFld0, 4);
1140 EXPECT_VALID(result);
1141 result = Dart_SetNativeInstanceField(retobj, kNativeFld1, 40);
1142 EXPECT_VALID(result);
1143 result = Dart_SetNativeInstanceField(retobj, kNativeFld2, 400);
1144 EXPECT_VALID(result);
1145 result = Dart_SetNativeInstanceField(retobj, kNativeFld3, 4000);
1146 EXPECT_VALID(result);
1147 result = Dart_GetNativeInstanceField(retobj, kNativeFld3, &field_value);
1148 EXPECT_VALID(result);
1149 EXPECT_EQ(4000, field_value);
1150
1151 // Now re-access various dart instance fields of the returned object
1152 // to ensure that there was no corruption while setting native fields.
1153 result = Dart_GetInstanceField(retobj, Dart_NewString("fld1"));
1154 EXPECT_VALID(result);
1155 result = Dart_IntegerValue(result, &value);
1156 EXPECT_EQ(40, value);
1157 result = Dart_GetInstanceField(retobj, Dart_NewString("fld2"));
1158 EXPECT_VALID(result);
1159 result = Dart_IntegerValue(result, &value);
1160 EXPECT_EQ(20, value);
1161 1222
1162 Dart_ExitScope(); // Exit the Dart API scope. 1223 Dart_ExitScope(); // Exit the Dart API scope.
1163 } 1224 }
1164 Dart_ShutdownIsolate(); 1225 Dart_ShutdownIsolate();
1226 }
1227
1228
1229 UNIT_TEST_CASE(ImplicitNativeFieldAccess) {
1230 const char* kScriptChars =
1231 "#import('dart:core_native_fields');"
1232 "class NativeFields extends NativeFieldWrapperClass4 {\n"
1233 " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
1234 " int fld1;\n"
1235 " final int fld2;\n"
1236 " static int fld3;\n"
1237 " static final int fld4 = 10;\n"
1238 "}\n"
1239 "class NativeFieldsTest {\n"
1240 " static NativeFields testMain() {\n"
1241 " NativeFields obj = new NativeFields(10, 20);\n"
1242 " return obj;\n"
1243 " }\n"
1244 "}\n";
1245 Dart_CreateIsolate(NULL, NULL);
1246 {
1247 Dart_EnterScope(); // Start a Dart API scope for invoking API functions.
1248
1249 // Load up a test script in the test library.
1250 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
1251
1252 // Invoke a function which returns an object of type NativeFields.
1253 Dart_Handle retobj = Dart_InvokeStatic(lib,
1254 Dart_NewString("NativeFieldsTest"),
1255 Dart_NewString("testMain"),
1256 0,
1257 NULL);
1258 EXPECT_VALID(retobj);
1259 EXPECT(!Dart_ExceptionOccurred(retobj));
1260
1261 // Now access and set various instance fields of the returned object.
1262 TestNativeFields(retobj);
1263
1264 Dart_ExitScope(); // Exit the Dart API scope.
1265 }
1266 Dart_ShutdownIsolate();
1165 } 1267 }
1166 1268
1167 1269
1168 UNIT_TEST_CASE(NegativeNativeFieldAccess) { 1270 UNIT_TEST_CASE(NegativeNativeFieldAccess) {
1169 const char* kScriptChars = 1271 const char* kScriptChars =
1170 "class NativeFields {\n" 1272 "class NativeFields {\n"
1171 " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n" 1273 " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
1172 " int fld1;\n" 1274 " int fld1;\n"
1173 " final int fld2;\n" 1275 " final int fld2;\n"
1174 " static int fld3;\n" 1276 " static int fld3;\n"
(...skipping 921 matching lines...) Expand 10 before | Expand all | Expand 10 after
2096 NULL); 2198 NULL);
2097 EXPECT_VALID(result); 2199 EXPECT_VALID(result);
2098 2200
2099 Dart_ExitScope(); // Exit the Dart API scope. 2201 Dart_ExitScope(); // Exit the Dart API scope.
2100 } 2202 }
2101 Dart_ShutdownIsolate(); 2203 Dart_ShutdownIsolate();
2102 } 2204 }
2103 #endif // TARGET_ARCH_IA32. 2205 #endif // TARGET_ARCH_IA32.
2104 2206
2105 } // namespace dart 2207 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698