OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 "bin/io_buffer.h" | 5 #include "bin/io_buffer.h" |
6 #include "bin/socket.h" | 6 #include "bin/socket.h" |
7 #include "bin/dartutils.h" | 7 #include "bin/dartutils.h" |
8 #include "bin/thread.h" | 8 #include "bin/thread.h" |
9 #include "bin/utils.h" | 9 #include "bin/utils.h" |
10 | 10 |
11 #include "platform/globals.h" | 11 #include "platform/globals.h" |
12 #include "platform/thread.h" | 12 #include "platform/thread.h" |
13 #include "platform/utils.h" | 13 #include "platform/utils.h" |
14 | 14 |
15 #include "include/dart_api.h" | 15 #include "include/dart_api.h" |
16 | 16 |
17 | 17 |
18 namespace dart { | 18 namespace dart { |
19 namespace bin { | 19 namespace bin { |
20 | 20 |
21 static const int kSocketIdNativeField = 0; | 21 static const int kSocketIdNativeField = 0; |
22 | 22 |
23 dart::Mutex* Socket::mutex_ = new dart::Mutex(); | 23 dart::Mutex* Socket::mutex_ = new dart::Mutex(); |
24 int Socket::service_ports_size_ = 0; | 24 int Socket::service_ports_size_ = 0; |
25 Dart_Port* Socket::service_ports_ = NULL; | 25 Dart_Port* Socket::service_ports_ = NULL; |
26 int Socket::service_ports_index_ = 0; | 26 int Socket::service_ports_index_ = 0; |
27 | 27 |
| 28 // TODO(sgjesse): Make this thread local. |
| 29 unsigned int rand_r_state = 0; |
28 | 30 |
29 static void GetSockAddr(Dart_Handle obj, RawAddr* addr) { | 31 static void GetSockAddr(Dart_Handle obj, RawAddr* addr) { |
30 Dart_TypedData_Type data_type; | 32 Dart_TypedData_Type data_type; |
31 uint8_t* data = NULL; | 33 uint8_t* data = NULL; |
32 intptr_t len; | 34 intptr_t len; |
33 Dart_Handle result = Dart_TypedDataAcquireData( | 35 Dart_Handle result = Dart_TypedDataAcquireData( |
34 obj, &data_type, reinterpret_cast<void**>(&data), &len); | 36 obj, &data_type, reinterpret_cast<void**>(&data), &len); |
35 if (Dart_IsError(result)) Dart_PropagateError(result); | 37 if (Dart_IsError(result)) Dart_PropagateError(result); |
| 38 if (data_type != Dart_TypedData_kUint8) { |
| 39 Dart_PropagateError(Dart_NewApiError("Unexpected type for socket address")); |
| 40 } |
36 memmove(reinterpret_cast<void *>(addr), data, len); | 41 memmove(reinterpret_cast<void *>(addr), data, len); |
37 Dart_TypedDataReleaseData(obj); | 42 Dart_TypedDataReleaseData(obj); |
38 } | 43 } |
39 | 44 |
40 | 45 |
41 void FUNCTION_NAME(InternetAddress_Fixed)(Dart_NativeArguments args) { | 46 void FUNCTION_NAME(InternetAddress_Fixed)(Dart_NativeArguments args) { |
42 int64_t id = 0; | 47 int64_t id = 0; |
43 bool ok = DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 0), &id); | 48 bool ok = DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 0), &id); |
44 ASSERT(ok); | 49 ASSERT(ok); |
45 USE(ok); | 50 USE(ok); |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); | 119 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); |
115 } | 120 } |
116 } else { | 121 } else { |
117 OSError os_error(-1, "Invalid argument", OSError::kUnknown); | 122 OSError os_error(-1, "Invalid argument", OSError::kUnknown); |
118 Dart_Handle err = DartUtils::NewDartOSError(&os_error); | 123 Dart_Handle err = DartUtils::NewDartOSError(&os_error); |
119 if (Dart_IsError(err)) Dart_PropagateError(err); | 124 if (Dart_IsError(err)) Dart_PropagateError(err); |
120 Dart_SetReturnValue(args, err); | 125 Dart_SetReturnValue(args, err); |
121 } | 126 } |
122 } | 127 } |
123 | 128 |
| 129 void FUNCTION_NAME(Socket_CreateBindDatagram)(Dart_NativeArguments args) { |
| 130 RawAddr addr; |
| 131 GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); |
| 132 int64_t port = 0; |
| 133 DartUtils::GetInt64Value(Dart_GetNativeArgument(args, 2), &port); |
| 134 intptr_t socket = Socket::CreateBindDatagram(&addr, port); |
| 135 OSError error; |
| 136 if (socket >= 0) { |
| 137 Socket::SetSocketIdNativeField(Dart_GetNativeArgument(args, 0), socket); |
| 138 Dart_SetReturnValue(args, Dart_True()); |
| 139 } else { |
| 140 OSError error; |
| 141 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&error)); |
| 142 } |
| 143 } |
| 144 |
124 | 145 |
125 void FUNCTION_NAME(Socket_Available)(Dart_NativeArguments args) { | 146 void FUNCTION_NAME(Socket_Available)(Dart_NativeArguments args) { |
126 intptr_t socket = | 147 intptr_t socket = |
127 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 148 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
128 intptr_t available = Socket::Available(socket); | 149 intptr_t available = Socket::Available(socket); |
129 if (available >= 0) { | 150 if (available >= 0) { |
130 Dart_SetReturnValue(args, Dart_NewInteger(available)); | 151 Dart_SetReturnValue(args, Dart_NewInteger(available)); |
131 } else { | 152 } else { |
132 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 153 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
133 } | 154 } |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
179 Dart_SetReturnValue(args, err); | 200 Dart_SetReturnValue(args, err); |
180 } | 201 } |
181 } else if (available == 0) { | 202 } else if (available == 0) { |
182 Dart_SetReturnValue(args, Dart_Null()); | 203 Dart_SetReturnValue(args, Dart_Null()); |
183 } else { | 204 } else { |
184 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 205 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
185 } | 206 } |
186 } | 207 } |
187 | 208 |
188 | 209 |
| 210 void FUNCTION_NAME(Socket_RecvFrom)(Dart_NativeArguments args) { |
| 211 static bool drop_datagrams = Dart_IsVMFlagSet("drop_datagrams"); |
| 212 intptr_t socket = |
| 213 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 214 |
| 215 // TODO(sgjesse): This needs to be 64k as that is the max UDP packet size. |
| 216 uint8_t buffer[4096]; |
| 217 RawAddr addr; |
| 218 intptr_t bytes_read = Socket::RecvFrom(socket, buffer, 4096, &addr); |
| 219 Dart_Handle err; |
| 220 if (bytes_read > 0) { |
| 221 uint8_t* data_buffer = NULL; |
| 222 Dart_Handle data = IOBuffer::Allocate(bytes_read, &data_buffer); |
| 223 if (Dart_IsError(data)) Dart_PropagateError(data); |
| 224 ASSERT(data_buffer != NULL); |
| 225 memmove(data_buffer, buffer, bytes_read); |
| 226 |
| 227 // Get the port and clear it in the sockaddr structure. |
| 228 int port = SocketAddress::GetAddrPort(&addr); |
| 229 if (addr.addr.sa_family == AF_INET) { |
| 230 addr.in.sin_port = 0; |
| 231 } else { |
| 232 ASSERT(addr.addr.sa_family == AF_INET6); |
| 233 addr.in6.sin6_port = 0; |
| 234 } |
| 235 // Format the address to a string using the numeric format. |
| 236 char numeric_address[INET6_ADDRSTRLEN]; |
| 237 Socket::FormatNumericAddress(&addr, numeric_address, INET6_ADDRSTRLEN); |
| 238 |
| 239 // Create a Datagram object with the data and sender address and port. |
| 240 const int kNumArgs = 5; |
| 241 Dart_Handle dart_args[kNumArgs]; |
| 242 dart_args[0] = data; |
| 243 dart_args[1] = Dart_NewInteger(addr.addr.sa_family == AF_INET |
| 244 ? SocketAddress::TYPE_IPV4 |
| 245 : SocketAddress::TYPE_IPV6); |
| 246 dart_args[2] = Dart_NewStringFromCString(numeric_address); |
| 247 if (Dart_IsError(dart_args[2])) Dart_PropagateError(dart_args[2]); |
| 248 int len = SocketAddress::GetAddrLength(&addr); |
| 249 dart_args[3] = Dart_NewTypedData(Dart_TypedData_kUint8, len); |
| 250 if (Dart_IsError(dart_args[3])) Dart_PropagateError(dart_args[3]); |
| 251 err = Dart_ListSetAsBytes( |
| 252 dart_args[3], 0, reinterpret_cast<uint8_t *>(&addr), len); |
| 253 if (Dart_IsError(err)) Dart_PropagateError(err); |
| 254 dart_args[4] = Dart_NewInteger(port); |
| 255 if (Dart_IsError(dart_args[4])) Dart_PropagateError(dart_args[4]); |
| 256 // TODO(sgjesse): Cache the _makeDatagram function somewhere. |
| 257 Dart_Handle io_lib = |
| 258 Dart_LookupLibrary(DartUtils::NewString("dart:io")); |
| 259 if (Dart_IsError(io_lib)) Dart_PropagateError(io_lib); |
| 260 Dart_Handle result = |
| 261 Dart_Invoke(io_lib, |
| 262 DartUtils::NewString("_makeDatagram"), |
| 263 kNumArgs, |
| 264 dart_args); |
| 265 if (Dart_IsError(result)) Dart_PropagateError(result); |
| 266 if (drop_datagrams) { |
| 267 int random = rand_r(&rand_r_state); |
| 268 if (random > (RAND_MAX / 2)) { |
| 269 Dart_SetReturnValue(args, result); |
| 270 } else { |
| 271 Dart_SetReturnValue(args, Dart_Null()); |
| 272 } |
| 273 } else { |
| 274 Dart_SetReturnValue(args, result); |
| 275 } |
| 276 } else if (bytes_read == 0) { |
| 277 Dart_SetReturnValue(args, Dart_Null()); |
| 278 } else { |
| 279 ASSERT(bytes_read == -1); |
| 280 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| 281 } |
| 282 } |
| 283 |
| 284 |
189 void FUNCTION_NAME(Socket_WriteList)(Dart_NativeArguments args) { | 285 void FUNCTION_NAME(Socket_WriteList)(Dart_NativeArguments args) { |
190 static bool short_socket_writes = Dart_IsVMFlagSet("short_socket_write"); | 286 static bool short_socket_writes = Dart_IsVMFlagSet("short_socket_write"); |
191 intptr_t socket = | 287 intptr_t socket = |
192 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 288 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
193 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1); | 289 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1); |
194 ASSERT(Dart_IsList(buffer_obj)); | 290 ASSERT(Dart_IsList(buffer_obj)); |
195 intptr_t offset = | 291 intptr_t offset = |
196 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 2)); | 292 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 2)); |
197 intptr_t length = | 293 intptr_t length = |
198 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 3)); | 294 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 3)); |
(...skipping 14 matching lines...) Expand all Loading... |
213 Dart_SetReturnValue(args, Dart_NewInteger(bytes_written)); | 309 Dart_SetReturnValue(args, Dart_NewInteger(bytes_written)); |
214 } else { | 310 } else { |
215 // Extract OSError before we release data, as it may override the error. | 311 // Extract OSError before we release data, as it may override the error. |
216 OSError os_error; | 312 OSError os_error; |
217 Dart_TypedDataReleaseData(buffer_obj); | 313 Dart_TypedDataReleaseData(buffer_obj); |
218 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); | 314 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); |
219 } | 315 } |
220 } | 316 } |
221 | 317 |
222 | 318 |
| 319 void FUNCTION_NAME(Socket_SendTo)(Dart_NativeArguments args) { |
| 320 intptr_t socket = |
| 321 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 322 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1); |
| 323 intptr_t offset = |
| 324 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 2)); |
| 325 intptr_t length = |
| 326 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 3)); |
| 327 Dart_Handle address_obj = Dart_GetNativeArgument(args, 4); |
| 328 ASSERT(Dart_IsList(address_obj)); |
| 329 RawAddr addr; |
| 330 GetSockAddr(address_obj, &addr); |
| 331 intptr_t port = |
| 332 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 5)); |
| 333 SocketAddress::SetAddrPort(&addr, port); |
| 334 Dart_TypedData_Type type; |
| 335 uint8_t* buffer = NULL; |
| 336 intptr_t len; |
| 337 Dart_Handle result = Dart_TypedDataAcquireData( |
| 338 buffer_obj, &type, reinterpret_cast<void**>(&buffer), &len); |
| 339 if (Dart_IsError(result)) Dart_PropagateError(result); |
| 340 ASSERT((offset + length) <= len); |
| 341 buffer += offset; |
| 342 intptr_t bytes_written = Socket::SendTo(socket, buffer, length, addr); |
| 343 if (bytes_written >= 0) { |
| 344 Dart_TypedDataReleaseData(buffer_obj); |
| 345 Dart_SetReturnValue(args, Dart_NewInteger(bytes_written)); |
| 346 } else { |
| 347 // Extract OSError before we release data, as it may override the error. |
| 348 OSError os_error; |
| 349 Dart_TypedDataReleaseData(buffer_obj); |
| 350 Dart_SetReturnValue(args, DartUtils::NewDartOSError(&os_error)); |
| 351 } |
| 352 } |
| 353 |
| 354 |
223 void FUNCTION_NAME(Socket_GetPort)(Dart_NativeArguments args) { | 355 void FUNCTION_NAME(Socket_GetPort)(Dart_NativeArguments args) { |
224 intptr_t socket = | 356 intptr_t socket = |
225 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 357 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
226 OSError os_error; | 358 OSError os_error; |
227 intptr_t port = Socket::GetPort(socket); | 359 intptr_t port = Socket::GetPort(socket); |
228 if (port > 0) { | 360 if (port > 0) { |
229 Dart_SetReturnValue(args, Dart_NewInteger(port)); | 361 Dart_SetReturnValue(args, Dart_NewInteger(port)); |
230 } else { | 362 } else { |
231 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); | 363 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
232 } | 364 } |
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
463 } else { | 595 } else { |
464 result = CObject::NewOSError(os_error); | 596 result = CObject::NewOSError(os_error); |
465 delete os_error; | 597 delete os_error; |
466 } | 598 } |
467 return result; | 599 return result; |
468 } | 600 } |
469 return CObject::IllegalArgumentError(); | 601 return CObject::IllegalArgumentError(); |
470 } | 602 } |
471 | 603 |
472 | 604 |
| 605 void FUNCTION_NAME(Socket_GetOption)(Dart_NativeArguments args) { |
| 606 intptr_t socket = |
| 607 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 608 int64_t option; |
| 609 Dart_Handle err = |
| 610 Dart_IntegerToInt64(Dart_GetNativeArgument(args, 1), &option); |
| 611 if (Dart_IsError(err)) Dart_PropagateError(err); |
| 612 bool ok; |
| 613 switch (option) { |
| 614 case 0: { // TCP_NODELAY. |
| 615 bool enabled; |
| 616 ok = Socket::GetNoDelay(socket, &enabled); |
| 617 if (ok) { |
| 618 Dart_SetReturnValue(args, enabled ? Dart_True() : Dart_False()); |
| 619 } |
| 620 break; |
| 621 } |
| 622 case 1: { // IP_MULTICAST_LOOP. |
| 623 bool enabled; |
| 624 ok = Socket::GetMulticastLoop(socket, &enabled); |
| 625 if (ok) { |
| 626 Dart_SetReturnValue(args, enabled ? Dart_True() : Dart_False()); |
| 627 } |
| 628 break; |
| 629 } |
| 630 case 2: { // IP_MULTICAST_TTL. |
| 631 int value; |
| 632 ok = Socket::GetMulticastTTL(socket, &value); |
| 633 if (ok) { |
| 634 Dart_SetReturnValue(args, Dart_NewInteger(value)); |
| 635 } |
| 636 break; |
| 637 } |
| 638 case 3: { // IP_BROADCAST. |
| 639 bool enabled; |
| 640 ok = Socket::GetBroadcast(socket, &enabled); |
| 641 if (ok) { |
| 642 Dart_SetReturnValue(args, enabled ? Dart_True() : Dart_False()); |
| 643 } |
| 644 break; |
| 645 } |
| 646 default: |
| 647 UNREACHABLE(); |
| 648 break; |
| 649 } |
| 650 // In case of failure the return value is not set above. |
| 651 if (!ok) { |
| 652 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| 653 } |
| 654 } |
| 655 |
| 656 |
473 void FUNCTION_NAME(Socket_SetOption)(Dart_NativeArguments args) { | 657 void FUNCTION_NAME(Socket_SetOption)(Dart_NativeArguments args) { |
474 bool result = false; | 658 bool result = false; |
475 intptr_t socket = | 659 intptr_t socket = |
476 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); | 660 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
477 Dart_Handle option_obj = Dart_GetNativeArgument(args, 1); | |
478 int64_t option; | 661 int64_t option; |
479 Dart_Handle err = Dart_IntegerToInt64(option_obj, &option); | 662 Dart_Handle err = |
480 if (Dart_IsError(err)) Dart_PropagateError(err); | 663 Dart_IntegerToInt64(Dart_GetNativeArgument(args, 1), &option); |
481 Dart_Handle enabled_obj = Dart_GetNativeArgument(args, 2); | |
482 bool enabled; | |
483 err = Dart_BooleanValue(enabled_obj, &enabled); | |
484 if (Dart_IsError(err)) Dart_PropagateError(err); | 664 if (Dart_IsError(err)) Dart_PropagateError(err); |
485 switch (option) { | 665 switch (option) { |
486 case 0: // TCP_NODELAY. | 666 case 0: // TCP_NODELAY. |
487 result = Socket::SetNoDelay(socket, enabled); | 667 result = Socket::SetNoDelay( |
| 668 socket, DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 2))); |
| 669 break; |
| 670 case 1: // IP_MULTICAST_LOOP. |
| 671 result = Socket::SetMulticastLoop( |
| 672 socket, DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 2))); |
| 673 break; |
| 674 case 2: // IP_MULTICAST_TTL. |
| 675 result = Socket::SetMulticastTTL( |
| 676 socket, DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 2))); |
| 677 break; |
| 678 case 3: // IP_BROADCAST. |
| 679 result = Socket::SetBroadcast( |
| 680 socket, DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 2))); |
488 break; | 681 break; |
489 default: | 682 default: |
| 683 UNREACHABLE(); |
490 break; | 684 break; |
491 } | 685 } |
492 Dart_SetReturnValue(args, Dart_NewBoolean(result)); | 686 if (result) { |
| 687 Dart_SetReturnValue(args, Dart_Null()); |
| 688 } else { |
| 689 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| 690 } |
493 } | 691 } |
494 | 692 |
495 | 693 |
| 694 void FUNCTION_NAME(Socket_JoinMulticast)(Dart_NativeArguments args) { |
| 695 intptr_t socket = |
| 696 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 697 RawAddr addr; |
| 698 GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); |
| 699 if (Socket::JoinMulticast(socket, &addr, 0)) { |
| 700 Dart_SetReturnValue(args, Dart_Null()); |
| 701 } else { |
| 702 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| 703 } |
| 704 } |
| 705 |
| 706 |
| 707 void FUNCTION_NAME(Socket_LeaveMulticast)(Dart_NativeArguments args) { |
| 708 intptr_t socket = |
| 709 Socket::GetSocketIdNativeField(Dart_GetNativeArgument(args, 0)); |
| 710 RawAddr addr; |
| 711 GetSockAddr(Dart_GetNativeArgument(args, 1), &addr); |
| 712 if (Socket::LeaveMulticast(socket, &addr, 0)) { |
| 713 Dart_SetReturnValue(args, Dart_Null()); |
| 714 } else { |
| 715 Dart_SetReturnValue(args, DartUtils::NewDartOSError()); |
| 716 } |
| 717 } |
| 718 |
| 719 |
496 void Socket::SetSocketIdNativeField(Dart_Handle socket, intptr_t id) { | 720 void Socket::SetSocketIdNativeField(Dart_Handle socket, intptr_t id) { |
497 Dart_Handle err = | 721 Dart_Handle err = |
498 Dart_SetNativeInstanceField(socket, kSocketIdNativeField, id); | 722 Dart_SetNativeInstanceField(socket, kSocketIdNativeField, id); |
499 if (Dart_IsError(err)) Dart_PropagateError(err); | 723 if (Dart_IsError(err)) Dart_PropagateError(err); |
500 } | 724 } |
501 | 725 |
502 | 726 |
503 intptr_t Socket::GetSocketIdNativeField(Dart_Handle socket_obj) { | 727 intptr_t Socket::GetSocketIdNativeField(Dart_Handle socket_obj) { |
504 intptr_t socket = 0; | 728 intptr_t socket = 0; |
505 Dart_Handle err = | 729 Dart_Handle err = |
506 Dart_GetNativeInstanceField(socket_obj, kSocketIdNativeField, &socket); | 730 Dart_GetNativeInstanceField(socket_obj, kSocketIdNativeField, &socket); |
507 if (Dart_IsError(err)) Dart_PropagateError(err); | 731 if (Dart_IsError(err)) Dart_PropagateError(err); |
508 return socket; | 732 return socket; |
509 } | 733 } |
510 | 734 |
511 } // namespace bin | 735 } // namespace bin |
512 } // namespace dart | 736 } // namespace dart |
OLD | NEW |