| 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_debugger_api.h" | 5 #include "include/dart_debugger_api.h" |
| 6 #include "platform/assert.h" | 6 #include "platform/assert.h" |
| 7 #include "vm/bigint_operations.h" | 7 #include "vm/bigint_operations.h" |
| 8 #include "vm/class_finalizer.h" | 8 #include "vm/class_finalizer.h" |
| 9 #include "vm/dart_api_impl.h" | 9 #include "vm/dart_api_impl.h" |
| 10 #include "vm/dart_api_message.h" | 10 #include "vm/dart_api_message.h" |
| (...skipping 1242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1253 const Object& list = Object::Handle(Api::UnwrapHandle(result)); | 1253 const Object& list = Object::Handle(Api::UnwrapHandle(result)); |
| 1254 writer.WriteMessage(list); | 1254 writer.WriteMessage(list); |
| 1255 intptr_t buffer_len = writer.BytesWritten(); | 1255 intptr_t buffer_len = writer.BytesWritten(); |
| 1256 | 1256 |
| 1257 // Read object back from the snapshot into a C structure. | 1257 // Read object back from the snapshot into a C structure. |
| 1258 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator); | 1258 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator); |
| 1259 return api_reader.ReadMessage(); | 1259 return api_reader.ReadMessage(); |
| 1260 } | 1260 } |
| 1261 | 1261 |
| 1262 | 1262 |
| 1263 static void CheckString(Dart_Handle string, const char* expected) { |
| 1264 StackZone zone(Isolate::Current()); |
| 1265 uint8_t* buffer; |
| 1266 MessageWriter writer(&buffer, &zone_allocator); |
| 1267 String& str = String::Handle(); |
| 1268 str ^= Api::UnwrapHandle(string); |
| 1269 writer.WriteMessage(str); |
| 1270 intptr_t buffer_len = writer.BytesWritten(); |
| 1271 |
| 1272 // Read object back from the snapshot into a C structure. |
| 1273 ApiNativeScope scope; |
| 1274 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator); |
| 1275 Dart_CObject* root = api_reader.ReadMessage(); |
| 1276 EXPECT_NOTNULL(root); |
| 1277 EXPECT_EQ(Dart_CObject::kString, root->type); |
| 1278 EXPECT_STREQ(expected, root->value.as_string); |
| 1279 CheckEncodeDecodeMessage(root); |
| 1280 } |
| 1281 |
| 1282 |
| 1283 static void CheckStringInvalid(Dart_Handle string) { |
| 1284 StackZone zone(Isolate::Current()); |
| 1285 uint8_t* buffer; |
| 1286 MessageWriter writer(&buffer, &zone_allocator); |
| 1287 String& str = String::Handle(); |
| 1288 str ^= Api::UnwrapHandle(string); |
| 1289 writer.WriteMessage(str); |
| 1290 intptr_t buffer_len = writer.BytesWritten(); |
| 1291 |
| 1292 // Read object back from the snapshot into a C structure. |
| 1293 ApiNativeScope scope; |
| 1294 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator); |
| 1295 Dart_CObject* root = api_reader.ReadMessage(); |
| 1296 EXPECT_NOTNULL(root); |
| 1297 EXPECT_EQ(Dart_CObject::kUnsupported, root->type); |
| 1298 } |
| 1299 |
| 1300 |
| 1263 UNIT_TEST_CASE(DartGeneratedMessages) { | 1301 UNIT_TEST_CASE(DartGeneratedMessages) { |
| 1264 static const char* kCustomIsolateScriptChars = | 1302 static const char* kCustomIsolateScriptChars = |
| 1265 "getSmi() {\n" | 1303 "getSmi() {\n" |
| 1266 " return 42;\n" | 1304 " return 42;\n" |
| 1267 "}\n" | 1305 "}\n" |
| 1268 "getBigint() {\n" | 1306 "getBigint() {\n" |
| 1269 " return -0x424242424242424242424242424242424242;\n" | 1307 " return -0x424242424242424242424242424242424242;\n" |
| 1270 "}\n" | 1308 "}\n" |
| 1271 "getAsciiString() {\n" | 1309 "getAsciiString() {\n" |
| 1272 " return \"Hello, world!\";\n" | 1310 " return \"Hello, world!\";\n" |
| 1273 "}\n" | 1311 "}\n" |
| 1274 "getNonAsciiString() {\n" | 1312 "getNonAsciiString() {\n" |
| 1275 " return \"Blåbærgrød\";\n" | 1313 " return \"Blåbærgrød\";\n" |
| 1276 "}\n" | 1314 "}\n" |
| 1315 "getNonBMPString() {\n" |
| 1316 " return \"\\u{10000}\\u{1F601}\\u{1F637}\\u{20000}\";\n" |
| 1317 "}\n" |
| 1318 "getLeadSurrogateString() {\n" |
| 1319 " return new String.fromCharCodes([0xd800]);\n" |
| 1320 "}\n" |
| 1321 "getTrailSurrogateString() {\n" |
| 1322 " return \"\\u{10000}\".substring(1);\n" |
| 1323 "}\n" |
| 1324 "getSurrogatesString() {\n" |
| 1325 " return new String.fromCharCodes([0xdc00, 0xdc00, 0xd800, 0xd800]);\n" |
| 1326 "}\n" |
| 1327 "getCrappyString() {\n" |
| 1328 " return new String.fromCharCodes([0xd800, 32, 0xdc00, 32]);\n" |
| 1329 "}\n" |
| 1277 "getList() {\n" | 1330 "getList() {\n" |
| 1278 " return new List(kArrayLength);\n" | 1331 " return new List(kArrayLength);\n" |
| 1279 "}\n"; | 1332 "}\n"; |
| 1280 | 1333 |
| 1281 TestCase::CreateTestIsolate(); | 1334 TestCase::CreateTestIsolate(); |
| 1282 Isolate* isolate = Isolate::Current(); | 1335 Isolate* isolate = Isolate::Current(); |
| 1283 EXPECT(isolate != NULL); | 1336 EXPECT(isolate != NULL); |
| 1284 Dart_EnterScope(); | 1337 Dart_EnterScope(); |
| 1285 | 1338 |
| 1286 Dart_Handle lib = TestCase::LoadTestScript(kCustomIsolateScriptChars, | 1339 Dart_Handle lib = TestCase::LoadTestScript(kCustomIsolateScriptChars, |
| 1287 NULL); | 1340 NULL); |
| 1288 EXPECT_VALID(lib); | 1341 EXPECT_VALID(lib); |
| 1289 Dart_Handle smi_result; | 1342 Dart_Handle smi_result; |
| 1290 smi_result = Dart_Invoke(lib, NewString("getSmi"), 0, NULL); | 1343 smi_result = Dart_Invoke(lib, NewString("getSmi"), 0, NULL); |
| 1291 EXPECT_VALID(smi_result); | 1344 EXPECT_VALID(smi_result); |
| 1292 Dart_Handle bigint_result; | 1345 Dart_Handle bigint_result; |
| 1293 bigint_result = Dart_Invoke(lib, NewString("getBigint"), 0, NULL); | 1346 bigint_result = Dart_Invoke(lib, NewString("getBigint"), 0, NULL); |
| 1294 EXPECT_VALID(bigint_result); | 1347 EXPECT_VALID(bigint_result); |
| 1348 |
| 1295 Dart_Handle ascii_string_result; | 1349 Dart_Handle ascii_string_result; |
| 1296 ascii_string_result = Dart_Invoke(lib, NewString("getAsciiString"), 0, NULL); | 1350 ascii_string_result = Dart_Invoke(lib, NewString("getAsciiString"), 0, NULL); |
| 1297 EXPECT_VALID(ascii_string_result); | 1351 EXPECT_VALID(ascii_string_result); |
| 1298 EXPECT(Dart_IsString(ascii_string_result)); | 1352 EXPECT(Dart_IsString(ascii_string_result)); |
| 1353 |
| 1299 Dart_Handle non_ascii_string_result; | 1354 Dart_Handle non_ascii_string_result; |
| 1300 non_ascii_string_result = | 1355 non_ascii_string_result = |
| 1301 Dart_Invoke(lib, NewString("getNonAsciiString"), 0, NULL); | 1356 Dart_Invoke(lib, NewString("getNonAsciiString"), 0, NULL); |
| 1302 EXPECT_VALID(non_ascii_string_result); | 1357 EXPECT_VALID(non_ascii_string_result); |
| 1303 EXPECT(Dart_IsString(non_ascii_string_result)); | 1358 EXPECT(Dart_IsString(non_ascii_string_result)); |
| 1304 | 1359 |
| 1360 Dart_Handle non_bmp_string_result; |
| 1361 non_bmp_string_result = |
| 1362 Dart_Invoke(lib, NewString("getNonBMPString"), 0, NULL); |
| 1363 EXPECT_VALID(non_bmp_string_result); |
| 1364 EXPECT(Dart_IsString(non_bmp_string_result)); |
| 1365 |
| 1366 Dart_Handle lead_surrogate_string_result; |
| 1367 lead_surrogate_string_result = |
| 1368 Dart_Invoke(lib, NewString("getLeadSurrogateString"), 0, NULL); |
| 1369 EXPECT_VALID(lead_surrogate_string_result); |
| 1370 EXPECT(Dart_IsString(lead_surrogate_string_result)); |
| 1371 |
| 1372 Dart_Handle trail_surrogate_string_result; |
| 1373 trail_surrogate_string_result = |
| 1374 Dart_Invoke(lib, NewString("getTrailSurrogateString"), 0, NULL); |
| 1375 EXPECT_VALID(trail_surrogate_string_result); |
| 1376 EXPECT(Dart_IsString(trail_surrogate_string_result)); |
| 1377 |
| 1378 Dart_Handle surrogates_string_result; |
| 1379 surrogates_string_result = |
| 1380 Dart_Invoke(lib, NewString("getSurrogatesString"), 0, NULL); |
| 1381 EXPECT_VALID(surrogates_string_result); |
| 1382 EXPECT(Dart_IsString(surrogates_string_result)); |
| 1383 |
| 1384 Dart_Handle crappy_string_result; |
| 1385 crappy_string_result = |
| 1386 Dart_Invoke(lib, NewString("getCrappyString"), 0, NULL); |
| 1387 EXPECT_VALID(crappy_string_result); |
| 1388 EXPECT(Dart_IsString(crappy_string_result)); |
| 1389 |
| 1305 { | 1390 { |
| 1306 DARTSCOPE_NOCHECKS(isolate); | 1391 DARTSCOPE_NOCHECKS(isolate); |
| 1307 | 1392 |
| 1308 { | 1393 { |
| 1309 StackZone zone(Isolate::Current()); | 1394 StackZone zone(Isolate::Current()); |
| 1310 uint8_t* buffer; | 1395 uint8_t* buffer; |
| 1311 MessageWriter writer(&buffer, &zone_allocator); | 1396 MessageWriter writer(&buffer, &zone_allocator); |
| 1312 Smi& smi = Smi::Handle(); | 1397 Smi& smi = Smi::Handle(); |
| 1313 smi ^= Api::UnwrapHandle(smi_result); | 1398 smi ^= Api::UnwrapHandle(smi_result); |
| 1314 writer.WriteMessage(smi); | 1399 writer.WriteMessage(smi); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1335 // Read object back from the snapshot into a C structure. | 1420 // Read object back from the snapshot into a C structure. |
| 1336 ApiNativeScope scope; | 1421 ApiNativeScope scope; |
| 1337 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator); | 1422 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator); |
| 1338 Dart_CObject* root = api_reader.ReadMessage(); | 1423 Dart_CObject* root = api_reader.ReadMessage(); |
| 1339 EXPECT_NOTNULL(root); | 1424 EXPECT_NOTNULL(root); |
| 1340 EXPECT_EQ(Dart_CObject::kBigint, root->type); | 1425 EXPECT_EQ(Dart_CObject::kBigint, root->type); |
| 1341 EXPECT_STREQ("-424242424242424242424242424242424242", | 1426 EXPECT_STREQ("-424242424242424242424242424242424242", |
| 1342 root->value.as_bigint); | 1427 root->value.as_bigint); |
| 1343 CheckEncodeDecodeMessage(root); | 1428 CheckEncodeDecodeMessage(root); |
| 1344 } | 1429 } |
| 1345 { | 1430 CheckString(ascii_string_result, "Hello, world!"); |
| 1346 StackZone zone(Isolate::Current()); | 1431 CheckString(non_ascii_string_result, "Blåbærgrød"); |
| 1347 uint8_t* buffer; | 1432 CheckString(non_bmp_string_result, |
| 1348 MessageWriter writer(&buffer, &zone_allocator); | 1433 "\xf0\x90\x80\x80" |
| 1349 String& str = String::Handle(); | 1434 "\xf0\x9f\x98\x81" |
| 1350 str ^= Api::UnwrapHandle(ascii_string_result); | 1435 "\xf0\x9f\x98\xb7" |
| 1351 writer.WriteMessage(str); | 1436 "\xf0\xa0\x80\x80"); |
| 1352 intptr_t buffer_len = writer.BytesWritten(); | 1437 CheckStringInvalid(lead_surrogate_string_result); |
| 1353 | 1438 CheckStringInvalid(trail_surrogate_string_result); |
| 1354 // Read object back from the snapshot into a C structure. | 1439 CheckStringInvalid(crappy_string_result); |
| 1355 ApiNativeScope scope; | 1440 CheckStringInvalid(surrogates_string_result); |
| 1356 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator); | |
| 1357 Dart_CObject* root = api_reader.ReadMessage(); | |
| 1358 EXPECT_NOTNULL(root); | |
| 1359 EXPECT_EQ(Dart_CObject::kString, root->type); | |
| 1360 EXPECT_STREQ("Hello, world!", root->value.as_string); | |
| 1361 CheckEncodeDecodeMessage(root); | |
| 1362 } | |
| 1363 { | |
| 1364 StackZone zone(Isolate::Current()); | |
| 1365 uint8_t* buffer; | |
| 1366 MessageWriter writer(&buffer, &zone_allocator); | |
| 1367 String& str = String::Handle(); | |
| 1368 str ^= Api::UnwrapHandle(non_ascii_string_result); | |
| 1369 writer.WriteMessage(str); | |
| 1370 intptr_t buffer_len = writer.BytesWritten(); | |
| 1371 | |
| 1372 // Read object back from the snapshot into a C structure. | |
| 1373 ApiNativeScope scope; | |
| 1374 ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator); | |
| 1375 Dart_CObject* root = api_reader.ReadMessage(); | |
| 1376 EXPECT_NOTNULL(root); | |
| 1377 EXPECT_EQ(Dart_CObject::kString, root->type); | |
| 1378 EXPECT_STREQ("Blåbærgrød", root->value.as_string); | |
| 1379 CheckEncodeDecodeMessage(root); | |
| 1380 } | |
| 1381 } | 1441 } |
| 1382 Dart_ExitScope(); | 1442 Dart_ExitScope(); |
| 1383 Dart_ShutdownIsolate(); | 1443 Dart_ShutdownIsolate(); |
| 1384 } | 1444 } |
| 1385 | 1445 |
| 1386 | 1446 |
| 1387 UNIT_TEST_CASE(DartGeneratedListMessages) { | 1447 UNIT_TEST_CASE(DartGeneratedListMessages) { |
| 1388 const int kArrayLength = 10; | 1448 const int kArrayLength = 10; |
| 1389 static const char* kScriptChars = | 1449 static const char* kScriptChars = |
| 1390 "final int kArrayLength = 10;\n" | 1450 "final int kArrayLength = 10;\n" |
| (...skipping 675 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2066 " }\n" | 2126 " }\n" |
| 2067 " }\n" | 2127 " }\n" |
| 2068 " messageCount++;\n" | 2128 " messageCount++;\n" |
| 2069 " if (messageCount == 9) throw new Exception(exception);\n" | 2129 " if (messageCount == 9) throw new Exception(exception);\n" |
| 2070 " });\n" | 2130 " });\n" |
| 2071 " return port.toSendPort();\n" | 2131 " return port.toSendPort();\n" |
| 2072 "}\n"; | 2132 "}\n"; |
| 2073 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); | 2133 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); |
| 2074 Dart_EnterScope(); | 2134 Dart_EnterScope(); |
| 2075 | 2135 |
| 2076 // xxx | |
| 2077 Dart_Handle send_port = Dart_Invoke(lib, NewString("main"), 0, NULL); | 2136 Dart_Handle send_port = Dart_Invoke(lib, NewString("main"), 0, NULL); |
| 2078 EXPECT_VALID(send_port); | 2137 EXPECT_VALID(send_port); |
| 2079 Dart_Handle result = Dart_GetField(send_port, NewString("_id")); | 2138 Dart_Handle result = Dart_GetField(send_port, NewString("_id")); |
| 2080 ASSERT(!Dart_IsError(result)); | 2139 ASSERT(!Dart_IsError(result)); |
| 2081 ASSERT(Dart_IsInteger(result)); | 2140 ASSERT(Dart_IsInteger(result)); |
| 2082 int64_t send_port_id; | 2141 int64_t send_port_id; |
| 2083 Dart_Handle result2 = Dart_IntegerToInt64(result, &send_port_id); | 2142 Dart_Handle result2 = Dart_IntegerToInt64(result, &send_port_id); |
| 2084 ASSERT(!Dart_IsError(result2)); | 2143 ASSERT(!Dart_IsError(result2)); |
| 2085 | 2144 |
| 2086 // Setup single object message. | 2145 // Setup single object message. |
| (...skipping 15 matching lines...) Expand all Loading... |
| 2102 EXPECT(Dart_PostCObject(send_port_id, &object)); | 2161 EXPECT(Dart_PostCObject(send_port_id, &object)); |
| 2103 | 2162 |
| 2104 object.type = Dart_CObject::kString; | 2163 object.type = Dart_CObject::kString; |
| 2105 object.value.as_string = const_cast<char*>("456"); | 2164 object.value.as_string = const_cast<char*>("456"); |
| 2106 EXPECT(Dart_PostCObject(send_port_id, &object)); | 2165 EXPECT(Dart_PostCObject(send_port_id, &object)); |
| 2107 | 2166 |
| 2108 object.type = Dart_CObject::kString; | 2167 object.type = Dart_CObject::kString; |
| 2109 object.value.as_string = const_cast<char*>("æøå"); | 2168 object.value.as_string = const_cast<char*>("æøå"); |
| 2110 EXPECT(Dart_PostCObject(send_port_id, &object)); | 2169 EXPECT(Dart_PostCObject(send_port_id, &object)); |
| 2111 | 2170 |
| 2112 // Try to post an invalid UTF-8 sequence (lead surrogate). | |
| 2113 const char* data = "\xED\xA0\x80"; // U+D800 | |
| 2114 object.type = Dart_CObject::kString; | |
| 2115 object.value.as_string = const_cast<char*>(data); | |
| 2116 EXPECT(!Dart_PostCObject(send_port_id, &object)); | |
| 2117 | |
| 2118 object.type = Dart_CObject::kDouble; | 2171 object.type = Dart_CObject::kDouble; |
| 2119 object.value.as_double = 3.14; | 2172 object.value.as_double = 3.14; |
| 2120 EXPECT(Dart_PostCObject(send_port_id, &object)); | 2173 EXPECT(Dart_PostCObject(send_port_id, &object)); |
| 2121 | 2174 |
| 2122 object.type = Dart_CObject::kArray; | 2175 object.type = Dart_CObject::kArray; |
| 2123 object.value.as_array.length = 0; | 2176 object.value.as_array.length = 0; |
| 2124 EXPECT(Dart_PostCObject(send_port_id, &object)); | 2177 EXPECT(Dart_PostCObject(send_port_id, &object)); |
| 2125 | 2178 |
| 2126 static const int kArrayLength = 10; | 2179 static const int kArrayLength = 10; |
| 2127 Dart_CObject* array = | 2180 Dart_CObject* array = |
| (...skipping 19 matching lines...) Expand all Loading... |
| 2147 EXPECT(Dart_ErrorHasException(result)); | 2200 EXPECT(Dart_ErrorHasException(result)); |
| 2148 EXPECT_SUBSTRING("Exception: nulltruefalse123456æøå3.14[]100123456789\n", | 2201 EXPECT_SUBSTRING("Exception: nulltruefalse123456æøå3.14[]100123456789\n", |
| 2149 Dart_GetError(result)); | 2202 Dart_GetError(result)); |
| 2150 | 2203 |
| 2151 Dart_ExitScope(); | 2204 Dart_ExitScope(); |
| 2152 } | 2205 } |
| 2153 | 2206 |
| 2154 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). | 2207 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). |
| 2155 | 2208 |
| 2156 } // namespace dart | 2209 } // namespace dart |
| OLD | NEW |