github.com/sagernet/gvisor@v0.0.0-20240428053021-e691de28565f/pkg/marshal/primitive/primitive_abi_autogen_unsafe.go (about) 1 // Automatically generated marshal implementation. See tools/go_marshal. 2 3 package primitive 4 5 import ( 6 "github.com/sagernet/gvisor/pkg/gohacks" 7 "github.com/sagernet/gvisor/pkg/hostarch" 8 "github.com/sagernet/gvisor/pkg/marshal" 9 "io" 10 "reflect" 11 "runtime" 12 "unsafe" 13 ) 14 15 // Marshallable types used by this file. 16 var _ marshal.Marshallable = (*Int16)(nil) 17 var _ marshal.Marshallable = (*Int32)(nil) 18 var _ marshal.Marshallable = (*Int64)(nil) 19 var _ marshal.Marshallable = (*Int8)(nil) 20 var _ marshal.Marshallable = (*Uint16)(nil) 21 var _ marshal.Marshallable = (*Uint32)(nil) 22 var _ marshal.Marshallable = (*Uint64)(nil) 23 var _ marshal.Marshallable = (*Uint8)(nil) 24 25 // SizeBytes implements marshal.Marshallable.SizeBytes. 26 //go:nosplit 27 func (i *Int16) SizeBytes() int { 28 return 2 29 } 30 31 // MarshalBytes implements marshal.Marshallable.MarshalBytes. 32 func (i *Int16) MarshalBytes(dst []byte) []byte { 33 hostarch.ByteOrder.PutUint16(dst[:2], uint16(*i)) 34 return dst[2:] 35 } 36 37 // UnmarshalBytes implements marshal.Marshallable.UnmarshalBytes. 38 func (i *Int16) UnmarshalBytes(src []byte) []byte { 39 *i = Int16(int16(hostarch.ByteOrder.Uint16(src[:2]))) 40 return src[2:] 41 } 42 43 // Packed implements marshal.Marshallable.Packed. 44 //go:nosplit 45 func (i *Int16) Packed() bool { 46 // Scalar newtypes are always packed. 47 return true 48 } 49 50 // MarshalUnsafe implements marshal.Marshallable.MarshalUnsafe. 51 func (i *Int16) MarshalUnsafe(dst []byte) []byte { 52 size := i.SizeBytes() 53 gohacks.Memmove(unsafe.Pointer(&dst[0]), unsafe.Pointer(i), uintptr(size)) 54 return dst[size:] 55 } 56 57 // UnmarshalUnsafe implements marshal.Marshallable.UnmarshalUnsafe. 58 func (i *Int16) UnmarshalUnsafe(src []byte) []byte { 59 size := i.SizeBytes() 60 gohacks.Memmove(unsafe.Pointer(i), unsafe.Pointer(&src[0]), uintptr(size)) 61 return src[size:] 62 } 63 64 // CopyOutN implements marshal.Marshallable.CopyOutN. 65 func (i *Int16) CopyOutN(cc marshal.CopyContext, addr hostarch.Addr, limit int) (int, error) { 66 // Construct a slice backed by dst's underlying memory. 67 var buf []byte 68 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 69 hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(i))) 70 hdr.Len = i.SizeBytes() 71 hdr.Cap = i.SizeBytes() 72 73 length, err := cc.CopyOutBytes(addr, buf[:limit]) // escapes: okay. 74 // Since we bypassed the compiler's escape analysis, indicate that i 75 // must live until the use above. 76 runtime.KeepAlive(i) // escapes: replaced by intrinsic. 77 return length, err 78 } 79 80 // CopyOut implements marshal.Marshallable.CopyOut. 81 func (i *Int16) CopyOut(cc marshal.CopyContext, addr hostarch.Addr) (int, error) { 82 return i.CopyOutN(cc, addr, i.SizeBytes()) 83 } 84 85 // CopyInN implements marshal.Marshallable.CopyInN. 86 func (i *Int16) CopyInN(cc marshal.CopyContext, addr hostarch.Addr, limit int) (int, error) { 87 // Construct a slice backed by dst's underlying memory. 88 var buf []byte 89 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 90 hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(i))) 91 hdr.Len = i.SizeBytes() 92 hdr.Cap = i.SizeBytes() 93 94 length, err := cc.CopyInBytes(addr, buf[:limit]) // escapes: okay. 95 // Since we bypassed the compiler's escape analysis, indicate that i 96 // must live until the use above. 97 runtime.KeepAlive(i) // escapes: replaced by intrinsic. 98 return length, err 99 } 100 101 // CopyIn implements marshal.Marshallable.CopyIn. 102 func (i *Int16) CopyIn(cc marshal.CopyContext, addr hostarch.Addr) (int, error) { 103 return i.CopyInN(cc, addr, i.SizeBytes()) 104 } 105 106 // WriteTo implements io.WriterTo.WriteTo. 107 func (i *Int16) WriteTo(writer io.Writer) (int64, error) { 108 // Construct a slice backed by dst's underlying memory. 109 var buf []byte 110 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 111 hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(i))) 112 hdr.Len = i.SizeBytes() 113 hdr.Cap = i.SizeBytes() 114 115 length, err := writer.Write(buf) 116 // Since we bypassed the compiler's escape analysis, indicate that i 117 // must live until the use above. 118 runtime.KeepAlive(i) // escapes: replaced by intrinsic. 119 return int64(length), err 120 } 121 122 // CheckedMarshal implements marshal.CheckedMarshallable.CheckedMarshal. 123 func (i *Int16) CheckedMarshal(dst []byte) ([]byte, bool) { 124 size := i.SizeBytes() 125 if size > len(dst) { 126 return dst, false 127 } 128 gohacks.Memmove(unsafe.Pointer(&dst[0]), unsafe.Pointer(i), uintptr(size)) 129 return dst[size:], true 130 } 131 132 // CheckedUnmarshal implements marshal.CheckedMarshallable.CheckedUnmarshal. 133 func (i *Int16) CheckedUnmarshal(src []byte) ([]byte, bool) { 134 size := i.SizeBytes() 135 if size > len(src) { 136 return src, false 137 } 138 gohacks.Memmove(unsafe.Pointer(i), unsafe.Pointer(&src[0]), uintptr(size)) 139 return src[size:], true 140 } 141 142 // CopyInt16SliceIn copies in a slice of int16 objects from the task's memory. 143 func CopyInt16SliceIn(cc marshal.CopyContext, addr hostarch.Addr, dst []int16) (int, error) { 144 count := len(dst) 145 if count == 0 { 146 return 0, nil 147 } 148 size := (*Int16)(nil).SizeBytes() 149 150 ptr := unsafe.Pointer(&dst) 151 val := gohacks.Noescape(unsafe.Pointer((*reflect.SliceHeader)(ptr).Data)) 152 153 // Construct a slice backed by dst's underlying memory. 154 var buf []byte 155 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 156 hdr.Data = uintptr(val) 157 hdr.Len = size * count 158 hdr.Cap = size * count 159 160 length, err := cc.CopyInBytes(addr, buf) // escapes: okay. 161 // Since we bypassed the compiler's escape analysis, indicate that dst 162 // must live until the use above. 163 runtime.KeepAlive(dst) // escapes: replaced by intrinsic. 164 return length, err 165 } 166 167 // CopyInt16SliceOut copies a slice of int16 objects to the task's memory. 168 func CopyInt16SliceOut(cc marshal.CopyContext, addr hostarch.Addr, src []int16) (int, error) { 169 count := len(src) 170 if count == 0 { 171 return 0, nil 172 } 173 size := (*Int16)(nil).SizeBytes() 174 175 ptr := unsafe.Pointer(&src) 176 val := gohacks.Noescape(unsafe.Pointer((*reflect.SliceHeader)(ptr).Data)) 177 178 // Construct a slice backed by dst's underlying memory. 179 var buf []byte 180 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 181 hdr.Data = uintptr(val) 182 hdr.Len = size * count 183 hdr.Cap = size * count 184 185 length, err := cc.CopyOutBytes(addr, buf) // escapes: okay. 186 // Since we bypassed the compiler's escape analysis, indicate that src 187 // must live until the use above. 188 runtime.KeepAlive(src) // escapes: replaced by intrinsic. 189 return length, err 190 } 191 192 // MarshalUnsafeInt16Slice is like Int16.MarshalUnsafe, but for a []Int16. 193 func MarshalUnsafeInt16Slice(src []Int16, dst []byte) []byte { 194 count := len(src) 195 if count == 0 { 196 return dst 197 } 198 size := (*Int16)(nil).SizeBytes() 199 200 buf := dst[:size*count] 201 gohacks.Memmove(unsafe.Pointer(&buf[0]), unsafe.Pointer(&src[0]), uintptr(len(buf))) 202 return dst[size*count:] 203 } 204 205 // UnmarshalUnsafeInt16Slice is like Int16.UnmarshalUnsafe, but for a []Int16. 206 func UnmarshalUnsafeInt16Slice(dst []Int16, src []byte) []byte { 207 count := len(dst) 208 if count == 0 { 209 return src 210 } 211 size := (*Int16)(nil).SizeBytes() 212 213 buf := src[:size*count] 214 gohacks.Memmove(unsafe.Pointer(&dst[0]), unsafe.Pointer(&buf[0]), uintptr(len(buf))) 215 return src[size*count:] 216 } 217 218 // SizeBytes implements marshal.Marshallable.SizeBytes. 219 //go:nosplit 220 func (i *Int32) SizeBytes() int { 221 return 4 222 } 223 224 // MarshalBytes implements marshal.Marshallable.MarshalBytes. 225 func (i *Int32) MarshalBytes(dst []byte) []byte { 226 hostarch.ByteOrder.PutUint32(dst[:4], uint32(*i)) 227 return dst[4:] 228 } 229 230 // UnmarshalBytes implements marshal.Marshallable.UnmarshalBytes. 231 func (i *Int32) UnmarshalBytes(src []byte) []byte { 232 *i = Int32(int32(hostarch.ByteOrder.Uint32(src[:4]))) 233 return src[4:] 234 } 235 236 // Packed implements marshal.Marshallable.Packed. 237 //go:nosplit 238 func (i *Int32) Packed() bool { 239 // Scalar newtypes are always packed. 240 return true 241 } 242 243 // MarshalUnsafe implements marshal.Marshallable.MarshalUnsafe. 244 func (i *Int32) MarshalUnsafe(dst []byte) []byte { 245 size := i.SizeBytes() 246 gohacks.Memmove(unsafe.Pointer(&dst[0]), unsafe.Pointer(i), uintptr(size)) 247 return dst[size:] 248 } 249 250 // UnmarshalUnsafe implements marshal.Marshallable.UnmarshalUnsafe. 251 func (i *Int32) UnmarshalUnsafe(src []byte) []byte { 252 size := i.SizeBytes() 253 gohacks.Memmove(unsafe.Pointer(i), unsafe.Pointer(&src[0]), uintptr(size)) 254 return src[size:] 255 } 256 257 // CopyOutN implements marshal.Marshallable.CopyOutN. 258 func (i *Int32) CopyOutN(cc marshal.CopyContext, addr hostarch.Addr, limit int) (int, error) { 259 // Construct a slice backed by dst's underlying memory. 260 var buf []byte 261 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 262 hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(i))) 263 hdr.Len = i.SizeBytes() 264 hdr.Cap = i.SizeBytes() 265 266 length, err := cc.CopyOutBytes(addr, buf[:limit]) // escapes: okay. 267 // Since we bypassed the compiler's escape analysis, indicate that i 268 // must live until the use above. 269 runtime.KeepAlive(i) // escapes: replaced by intrinsic. 270 return length, err 271 } 272 273 // CopyOut implements marshal.Marshallable.CopyOut. 274 func (i *Int32) CopyOut(cc marshal.CopyContext, addr hostarch.Addr) (int, error) { 275 return i.CopyOutN(cc, addr, i.SizeBytes()) 276 } 277 278 // CopyInN implements marshal.Marshallable.CopyInN. 279 func (i *Int32) CopyInN(cc marshal.CopyContext, addr hostarch.Addr, limit int) (int, error) { 280 // Construct a slice backed by dst's underlying memory. 281 var buf []byte 282 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 283 hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(i))) 284 hdr.Len = i.SizeBytes() 285 hdr.Cap = i.SizeBytes() 286 287 length, err := cc.CopyInBytes(addr, buf[:limit]) // escapes: okay. 288 // Since we bypassed the compiler's escape analysis, indicate that i 289 // must live until the use above. 290 runtime.KeepAlive(i) // escapes: replaced by intrinsic. 291 return length, err 292 } 293 294 // CopyIn implements marshal.Marshallable.CopyIn. 295 func (i *Int32) CopyIn(cc marshal.CopyContext, addr hostarch.Addr) (int, error) { 296 return i.CopyInN(cc, addr, i.SizeBytes()) 297 } 298 299 // WriteTo implements io.WriterTo.WriteTo. 300 func (i *Int32) WriteTo(writer io.Writer) (int64, error) { 301 // Construct a slice backed by dst's underlying memory. 302 var buf []byte 303 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 304 hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(i))) 305 hdr.Len = i.SizeBytes() 306 hdr.Cap = i.SizeBytes() 307 308 length, err := writer.Write(buf) 309 // Since we bypassed the compiler's escape analysis, indicate that i 310 // must live until the use above. 311 runtime.KeepAlive(i) // escapes: replaced by intrinsic. 312 return int64(length), err 313 } 314 315 // CheckedMarshal implements marshal.CheckedMarshallable.CheckedMarshal. 316 func (i *Int32) CheckedMarshal(dst []byte) ([]byte, bool) { 317 size := i.SizeBytes() 318 if size > len(dst) { 319 return dst, false 320 } 321 gohacks.Memmove(unsafe.Pointer(&dst[0]), unsafe.Pointer(i), uintptr(size)) 322 return dst[size:], true 323 } 324 325 // CheckedUnmarshal implements marshal.CheckedMarshallable.CheckedUnmarshal. 326 func (i *Int32) CheckedUnmarshal(src []byte) ([]byte, bool) { 327 size := i.SizeBytes() 328 if size > len(src) { 329 return src, false 330 } 331 gohacks.Memmove(unsafe.Pointer(i), unsafe.Pointer(&src[0]), uintptr(size)) 332 return src[size:], true 333 } 334 335 // CopyInt32SliceIn copies in a slice of int32 objects from the task's memory. 336 func CopyInt32SliceIn(cc marshal.CopyContext, addr hostarch.Addr, dst []int32) (int, error) { 337 count := len(dst) 338 if count == 0 { 339 return 0, nil 340 } 341 size := (*Int32)(nil).SizeBytes() 342 343 ptr := unsafe.Pointer(&dst) 344 val := gohacks.Noescape(unsafe.Pointer((*reflect.SliceHeader)(ptr).Data)) 345 346 // Construct a slice backed by dst's underlying memory. 347 var buf []byte 348 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 349 hdr.Data = uintptr(val) 350 hdr.Len = size * count 351 hdr.Cap = size * count 352 353 length, err := cc.CopyInBytes(addr, buf) // escapes: okay. 354 // Since we bypassed the compiler's escape analysis, indicate that dst 355 // must live until the use above. 356 runtime.KeepAlive(dst) // escapes: replaced by intrinsic. 357 return length, err 358 } 359 360 // CopyInt32SliceOut copies a slice of int32 objects to the task's memory. 361 func CopyInt32SliceOut(cc marshal.CopyContext, addr hostarch.Addr, src []int32) (int, error) { 362 count := len(src) 363 if count == 0 { 364 return 0, nil 365 } 366 size := (*Int32)(nil).SizeBytes() 367 368 ptr := unsafe.Pointer(&src) 369 val := gohacks.Noescape(unsafe.Pointer((*reflect.SliceHeader)(ptr).Data)) 370 371 // Construct a slice backed by dst's underlying memory. 372 var buf []byte 373 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 374 hdr.Data = uintptr(val) 375 hdr.Len = size * count 376 hdr.Cap = size * count 377 378 length, err := cc.CopyOutBytes(addr, buf) // escapes: okay. 379 // Since we bypassed the compiler's escape analysis, indicate that src 380 // must live until the use above. 381 runtime.KeepAlive(src) // escapes: replaced by intrinsic. 382 return length, err 383 } 384 385 // MarshalUnsafeInt32Slice is like Int32.MarshalUnsafe, but for a []Int32. 386 func MarshalUnsafeInt32Slice(src []Int32, dst []byte) []byte { 387 count := len(src) 388 if count == 0 { 389 return dst 390 } 391 size := (*Int32)(nil).SizeBytes() 392 393 buf := dst[:size*count] 394 gohacks.Memmove(unsafe.Pointer(&buf[0]), unsafe.Pointer(&src[0]), uintptr(len(buf))) 395 return dst[size*count:] 396 } 397 398 // UnmarshalUnsafeInt32Slice is like Int32.UnmarshalUnsafe, but for a []Int32. 399 func UnmarshalUnsafeInt32Slice(dst []Int32, src []byte) []byte { 400 count := len(dst) 401 if count == 0 { 402 return src 403 } 404 size := (*Int32)(nil).SizeBytes() 405 406 buf := src[:size*count] 407 gohacks.Memmove(unsafe.Pointer(&dst[0]), unsafe.Pointer(&buf[0]), uintptr(len(buf))) 408 return src[size*count:] 409 } 410 411 // SizeBytes implements marshal.Marshallable.SizeBytes. 412 //go:nosplit 413 func (i *Int64) SizeBytes() int { 414 return 8 415 } 416 417 // MarshalBytes implements marshal.Marshallable.MarshalBytes. 418 func (i *Int64) MarshalBytes(dst []byte) []byte { 419 hostarch.ByteOrder.PutUint64(dst[:8], uint64(*i)) 420 return dst[8:] 421 } 422 423 // UnmarshalBytes implements marshal.Marshallable.UnmarshalBytes. 424 func (i *Int64) UnmarshalBytes(src []byte) []byte { 425 *i = Int64(int64(hostarch.ByteOrder.Uint64(src[:8]))) 426 return src[8:] 427 } 428 429 // Packed implements marshal.Marshallable.Packed. 430 //go:nosplit 431 func (i *Int64) Packed() bool { 432 // Scalar newtypes are always packed. 433 return true 434 } 435 436 // MarshalUnsafe implements marshal.Marshallable.MarshalUnsafe. 437 func (i *Int64) MarshalUnsafe(dst []byte) []byte { 438 size := i.SizeBytes() 439 gohacks.Memmove(unsafe.Pointer(&dst[0]), unsafe.Pointer(i), uintptr(size)) 440 return dst[size:] 441 } 442 443 // UnmarshalUnsafe implements marshal.Marshallable.UnmarshalUnsafe. 444 func (i *Int64) UnmarshalUnsafe(src []byte) []byte { 445 size := i.SizeBytes() 446 gohacks.Memmove(unsafe.Pointer(i), unsafe.Pointer(&src[0]), uintptr(size)) 447 return src[size:] 448 } 449 450 // CopyOutN implements marshal.Marshallable.CopyOutN. 451 func (i *Int64) CopyOutN(cc marshal.CopyContext, addr hostarch.Addr, limit int) (int, error) { 452 // Construct a slice backed by dst's underlying memory. 453 var buf []byte 454 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 455 hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(i))) 456 hdr.Len = i.SizeBytes() 457 hdr.Cap = i.SizeBytes() 458 459 length, err := cc.CopyOutBytes(addr, buf[:limit]) // escapes: okay. 460 // Since we bypassed the compiler's escape analysis, indicate that i 461 // must live until the use above. 462 runtime.KeepAlive(i) // escapes: replaced by intrinsic. 463 return length, err 464 } 465 466 // CopyOut implements marshal.Marshallable.CopyOut. 467 func (i *Int64) CopyOut(cc marshal.CopyContext, addr hostarch.Addr) (int, error) { 468 return i.CopyOutN(cc, addr, i.SizeBytes()) 469 } 470 471 // CopyInN implements marshal.Marshallable.CopyInN. 472 func (i *Int64) CopyInN(cc marshal.CopyContext, addr hostarch.Addr, limit int) (int, error) { 473 // Construct a slice backed by dst's underlying memory. 474 var buf []byte 475 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 476 hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(i))) 477 hdr.Len = i.SizeBytes() 478 hdr.Cap = i.SizeBytes() 479 480 length, err := cc.CopyInBytes(addr, buf[:limit]) // escapes: okay. 481 // Since we bypassed the compiler's escape analysis, indicate that i 482 // must live until the use above. 483 runtime.KeepAlive(i) // escapes: replaced by intrinsic. 484 return length, err 485 } 486 487 // CopyIn implements marshal.Marshallable.CopyIn. 488 func (i *Int64) CopyIn(cc marshal.CopyContext, addr hostarch.Addr) (int, error) { 489 return i.CopyInN(cc, addr, i.SizeBytes()) 490 } 491 492 // WriteTo implements io.WriterTo.WriteTo. 493 func (i *Int64) WriteTo(writer io.Writer) (int64, error) { 494 // Construct a slice backed by dst's underlying memory. 495 var buf []byte 496 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 497 hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(i))) 498 hdr.Len = i.SizeBytes() 499 hdr.Cap = i.SizeBytes() 500 501 length, err := writer.Write(buf) 502 // Since we bypassed the compiler's escape analysis, indicate that i 503 // must live until the use above. 504 runtime.KeepAlive(i) // escapes: replaced by intrinsic. 505 return int64(length), err 506 } 507 508 // CheckedMarshal implements marshal.CheckedMarshallable.CheckedMarshal. 509 func (i *Int64) CheckedMarshal(dst []byte) ([]byte, bool) { 510 size := i.SizeBytes() 511 if size > len(dst) { 512 return dst, false 513 } 514 gohacks.Memmove(unsafe.Pointer(&dst[0]), unsafe.Pointer(i), uintptr(size)) 515 return dst[size:], true 516 } 517 518 // CheckedUnmarshal implements marshal.CheckedMarshallable.CheckedUnmarshal. 519 func (i *Int64) CheckedUnmarshal(src []byte) ([]byte, bool) { 520 size := i.SizeBytes() 521 if size > len(src) { 522 return src, false 523 } 524 gohacks.Memmove(unsafe.Pointer(i), unsafe.Pointer(&src[0]), uintptr(size)) 525 return src[size:], true 526 } 527 528 // CopyInt64SliceIn copies in a slice of int64 objects from the task's memory. 529 func CopyInt64SliceIn(cc marshal.CopyContext, addr hostarch.Addr, dst []int64) (int, error) { 530 count := len(dst) 531 if count == 0 { 532 return 0, nil 533 } 534 size := (*Int64)(nil).SizeBytes() 535 536 ptr := unsafe.Pointer(&dst) 537 val := gohacks.Noescape(unsafe.Pointer((*reflect.SliceHeader)(ptr).Data)) 538 539 // Construct a slice backed by dst's underlying memory. 540 var buf []byte 541 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 542 hdr.Data = uintptr(val) 543 hdr.Len = size * count 544 hdr.Cap = size * count 545 546 length, err := cc.CopyInBytes(addr, buf) // escapes: okay. 547 // Since we bypassed the compiler's escape analysis, indicate that dst 548 // must live until the use above. 549 runtime.KeepAlive(dst) // escapes: replaced by intrinsic. 550 return length, err 551 } 552 553 // CopyInt64SliceOut copies a slice of int64 objects to the task's memory. 554 func CopyInt64SliceOut(cc marshal.CopyContext, addr hostarch.Addr, src []int64) (int, error) { 555 count := len(src) 556 if count == 0 { 557 return 0, nil 558 } 559 size := (*Int64)(nil).SizeBytes() 560 561 ptr := unsafe.Pointer(&src) 562 val := gohacks.Noescape(unsafe.Pointer((*reflect.SliceHeader)(ptr).Data)) 563 564 // Construct a slice backed by dst's underlying memory. 565 var buf []byte 566 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 567 hdr.Data = uintptr(val) 568 hdr.Len = size * count 569 hdr.Cap = size * count 570 571 length, err := cc.CopyOutBytes(addr, buf) // escapes: okay. 572 // Since we bypassed the compiler's escape analysis, indicate that src 573 // must live until the use above. 574 runtime.KeepAlive(src) // escapes: replaced by intrinsic. 575 return length, err 576 } 577 578 // MarshalUnsafeInt64Slice is like Int64.MarshalUnsafe, but for a []Int64. 579 func MarshalUnsafeInt64Slice(src []Int64, dst []byte) []byte { 580 count := len(src) 581 if count == 0 { 582 return dst 583 } 584 size := (*Int64)(nil).SizeBytes() 585 586 buf := dst[:size*count] 587 gohacks.Memmove(unsafe.Pointer(&buf[0]), unsafe.Pointer(&src[0]), uintptr(len(buf))) 588 return dst[size*count:] 589 } 590 591 // UnmarshalUnsafeInt64Slice is like Int64.UnmarshalUnsafe, but for a []Int64. 592 func UnmarshalUnsafeInt64Slice(dst []Int64, src []byte) []byte { 593 count := len(dst) 594 if count == 0 { 595 return src 596 } 597 size := (*Int64)(nil).SizeBytes() 598 599 buf := src[:size*count] 600 gohacks.Memmove(unsafe.Pointer(&dst[0]), unsafe.Pointer(&buf[0]), uintptr(len(buf))) 601 return src[size*count:] 602 } 603 604 // SizeBytes implements marshal.Marshallable.SizeBytes. 605 //go:nosplit 606 func (i *Int8) SizeBytes() int { 607 return 1 608 } 609 610 // MarshalBytes implements marshal.Marshallable.MarshalBytes. 611 func (i *Int8) MarshalBytes(dst []byte) []byte { 612 dst[0] = byte(*i) 613 return dst[1:] 614 } 615 616 // UnmarshalBytes implements marshal.Marshallable.UnmarshalBytes. 617 func (i *Int8) UnmarshalBytes(src []byte) []byte { 618 *i = Int8(int8(src[0])) 619 return src[1:] 620 } 621 622 // Packed implements marshal.Marshallable.Packed. 623 //go:nosplit 624 func (i *Int8) Packed() bool { 625 // Scalar newtypes are always packed. 626 return true 627 } 628 629 // MarshalUnsafe implements marshal.Marshallable.MarshalUnsafe. 630 func (i *Int8) MarshalUnsafe(dst []byte) []byte { 631 size := i.SizeBytes() 632 gohacks.Memmove(unsafe.Pointer(&dst[0]), unsafe.Pointer(i), uintptr(size)) 633 return dst[size:] 634 } 635 636 // UnmarshalUnsafe implements marshal.Marshallable.UnmarshalUnsafe. 637 func (i *Int8) UnmarshalUnsafe(src []byte) []byte { 638 size := i.SizeBytes() 639 gohacks.Memmove(unsafe.Pointer(i), unsafe.Pointer(&src[0]), uintptr(size)) 640 return src[size:] 641 } 642 643 // CopyOutN implements marshal.Marshallable.CopyOutN. 644 func (i *Int8) CopyOutN(cc marshal.CopyContext, addr hostarch.Addr, limit int) (int, error) { 645 // Construct a slice backed by dst's underlying memory. 646 var buf []byte 647 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 648 hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(i))) 649 hdr.Len = i.SizeBytes() 650 hdr.Cap = i.SizeBytes() 651 652 length, err := cc.CopyOutBytes(addr, buf[:limit]) // escapes: okay. 653 // Since we bypassed the compiler's escape analysis, indicate that i 654 // must live until the use above. 655 runtime.KeepAlive(i) // escapes: replaced by intrinsic. 656 return length, err 657 } 658 659 // CopyOut implements marshal.Marshallable.CopyOut. 660 func (i *Int8) CopyOut(cc marshal.CopyContext, addr hostarch.Addr) (int, error) { 661 return i.CopyOutN(cc, addr, i.SizeBytes()) 662 } 663 664 // CopyInN implements marshal.Marshallable.CopyInN. 665 func (i *Int8) CopyInN(cc marshal.CopyContext, addr hostarch.Addr, limit int) (int, error) { 666 // Construct a slice backed by dst's underlying memory. 667 var buf []byte 668 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 669 hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(i))) 670 hdr.Len = i.SizeBytes() 671 hdr.Cap = i.SizeBytes() 672 673 length, err := cc.CopyInBytes(addr, buf[:limit]) // escapes: okay. 674 // Since we bypassed the compiler's escape analysis, indicate that i 675 // must live until the use above. 676 runtime.KeepAlive(i) // escapes: replaced by intrinsic. 677 return length, err 678 } 679 680 // CopyIn implements marshal.Marshallable.CopyIn. 681 func (i *Int8) CopyIn(cc marshal.CopyContext, addr hostarch.Addr) (int, error) { 682 return i.CopyInN(cc, addr, i.SizeBytes()) 683 } 684 685 // WriteTo implements io.WriterTo.WriteTo. 686 func (i *Int8) WriteTo(writer io.Writer) (int64, error) { 687 // Construct a slice backed by dst's underlying memory. 688 var buf []byte 689 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 690 hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(i))) 691 hdr.Len = i.SizeBytes() 692 hdr.Cap = i.SizeBytes() 693 694 length, err := writer.Write(buf) 695 // Since we bypassed the compiler's escape analysis, indicate that i 696 // must live until the use above. 697 runtime.KeepAlive(i) // escapes: replaced by intrinsic. 698 return int64(length), err 699 } 700 701 // CheckedMarshal implements marshal.CheckedMarshallable.CheckedMarshal. 702 func (i *Int8) CheckedMarshal(dst []byte) ([]byte, bool) { 703 size := i.SizeBytes() 704 if size > len(dst) { 705 return dst, false 706 } 707 gohacks.Memmove(unsafe.Pointer(&dst[0]), unsafe.Pointer(i), uintptr(size)) 708 return dst[size:], true 709 } 710 711 // CheckedUnmarshal implements marshal.CheckedMarshallable.CheckedUnmarshal. 712 func (i *Int8) CheckedUnmarshal(src []byte) ([]byte, bool) { 713 size := i.SizeBytes() 714 if size > len(src) { 715 return src, false 716 } 717 gohacks.Memmove(unsafe.Pointer(i), unsafe.Pointer(&src[0]), uintptr(size)) 718 return src[size:], true 719 } 720 721 // CopyInt8SliceIn copies in a slice of int8 objects from the task's memory. 722 func CopyInt8SliceIn(cc marshal.CopyContext, addr hostarch.Addr, dst []int8) (int, error) { 723 count := len(dst) 724 if count == 0 { 725 return 0, nil 726 } 727 size := (*Int8)(nil).SizeBytes() 728 729 ptr := unsafe.Pointer(&dst) 730 val := gohacks.Noescape(unsafe.Pointer((*reflect.SliceHeader)(ptr).Data)) 731 732 // Construct a slice backed by dst's underlying memory. 733 var buf []byte 734 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 735 hdr.Data = uintptr(val) 736 hdr.Len = size * count 737 hdr.Cap = size * count 738 739 length, err := cc.CopyInBytes(addr, buf) // escapes: okay. 740 // Since we bypassed the compiler's escape analysis, indicate that dst 741 // must live until the use above. 742 runtime.KeepAlive(dst) // escapes: replaced by intrinsic. 743 return length, err 744 } 745 746 // CopyInt8SliceOut copies a slice of int8 objects to the task's memory. 747 func CopyInt8SliceOut(cc marshal.CopyContext, addr hostarch.Addr, src []int8) (int, error) { 748 count := len(src) 749 if count == 0 { 750 return 0, nil 751 } 752 size := (*Int8)(nil).SizeBytes() 753 754 ptr := unsafe.Pointer(&src) 755 val := gohacks.Noescape(unsafe.Pointer((*reflect.SliceHeader)(ptr).Data)) 756 757 // Construct a slice backed by dst's underlying memory. 758 var buf []byte 759 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 760 hdr.Data = uintptr(val) 761 hdr.Len = size * count 762 hdr.Cap = size * count 763 764 length, err := cc.CopyOutBytes(addr, buf) // escapes: okay. 765 // Since we bypassed the compiler's escape analysis, indicate that src 766 // must live until the use above. 767 runtime.KeepAlive(src) // escapes: replaced by intrinsic. 768 return length, err 769 } 770 771 // MarshalUnsafeInt8Slice is like Int8.MarshalUnsafe, but for a []Int8. 772 func MarshalUnsafeInt8Slice(src []Int8, dst []byte) []byte { 773 count := len(src) 774 if count == 0 { 775 return dst 776 } 777 size := (*Int8)(nil).SizeBytes() 778 779 buf := dst[:size*count] 780 gohacks.Memmove(unsafe.Pointer(&buf[0]), unsafe.Pointer(&src[0]), uintptr(len(buf))) 781 return dst[size*count:] 782 } 783 784 // UnmarshalUnsafeInt8Slice is like Int8.UnmarshalUnsafe, but for a []Int8. 785 func UnmarshalUnsafeInt8Slice(dst []Int8, src []byte) []byte { 786 count := len(dst) 787 if count == 0 { 788 return src 789 } 790 size := (*Int8)(nil).SizeBytes() 791 792 buf := src[:size*count] 793 gohacks.Memmove(unsafe.Pointer(&dst[0]), unsafe.Pointer(&buf[0]), uintptr(len(buf))) 794 return src[size*count:] 795 } 796 797 // SizeBytes implements marshal.Marshallable.SizeBytes. 798 //go:nosplit 799 func (u *Uint16) SizeBytes() int { 800 return 2 801 } 802 803 // MarshalBytes implements marshal.Marshallable.MarshalBytes. 804 func (u *Uint16) MarshalBytes(dst []byte) []byte { 805 hostarch.ByteOrder.PutUint16(dst[:2], uint16(*u)) 806 return dst[2:] 807 } 808 809 // UnmarshalBytes implements marshal.Marshallable.UnmarshalBytes. 810 func (u *Uint16) UnmarshalBytes(src []byte) []byte { 811 *u = Uint16(uint16(hostarch.ByteOrder.Uint16(src[:2]))) 812 return src[2:] 813 } 814 815 // Packed implements marshal.Marshallable.Packed. 816 //go:nosplit 817 func (u *Uint16) Packed() bool { 818 // Scalar newtypes are always packed. 819 return true 820 } 821 822 // MarshalUnsafe implements marshal.Marshallable.MarshalUnsafe. 823 func (u *Uint16) MarshalUnsafe(dst []byte) []byte { 824 size := u.SizeBytes() 825 gohacks.Memmove(unsafe.Pointer(&dst[0]), unsafe.Pointer(u), uintptr(size)) 826 return dst[size:] 827 } 828 829 // UnmarshalUnsafe implements marshal.Marshallable.UnmarshalUnsafe. 830 func (u *Uint16) UnmarshalUnsafe(src []byte) []byte { 831 size := u.SizeBytes() 832 gohacks.Memmove(unsafe.Pointer(u), unsafe.Pointer(&src[0]), uintptr(size)) 833 return src[size:] 834 } 835 836 // CopyOutN implements marshal.Marshallable.CopyOutN. 837 func (u *Uint16) CopyOutN(cc marshal.CopyContext, addr hostarch.Addr, limit int) (int, error) { 838 // Construct a slice backed by dst's underlying memory. 839 var buf []byte 840 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 841 hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(u))) 842 hdr.Len = u.SizeBytes() 843 hdr.Cap = u.SizeBytes() 844 845 length, err := cc.CopyOutBytes(addr, buf[:limit]) // escapes: okay. 846 // Since we bypassed the compiler's escape analysis, indicate that u 847 // must live until the use above. 848 runtime.KeepAlive(u) // escapes: replaced by intrinsic. 849 return length, err 850 } 851 852 // CopyOut implements marshal.Marshallable.CopyOut. 853 func (u *Uint16) CopyOut(cc marshal.CopyContext, addr hostarch.Addr) (int, error) { 854 return u.CopyOutN(cc, addr, u.SizeBytes()) 855 } 856 857 // CopyInN implements marshal.Marshallable.CopyInN. 858 func (u *Uint16) CopyInN(cc marshal.CopyContext, addr hostarch.Addr, limit int) (int, error) { 859 // Construct a slice backed by dst's underlying memory. 860 var buf []byte 861 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 862 hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(u))) 863 hdr.Len = u.SizeBytes() 864 hdr.Cap = u.SizeBytes() 865 866 length, err := cc.CopyInBytes(addr, buf[:limit]) // escapes: okay. 867 // Since we bypassed the compiler's escape analysis, indicate that u 868 // must live until the use above. 869 runtime.KeepAlive(u) // escapes: replaced by intrinsic. 870 return length, err 871 } 872 873 // CopyIn implements marshal.Marshallable.CopyIn. 874 func (u *Uint16) CopyIn(cc marshal.CopyContext, addr hostarch.Addr) (int, error) { 875 return u.CopyInN(cc, addr, u.SizeBytes()) 876 } 877 878 // WriteTo implements io.WriterTo.WriteTo. 879 func (u *Uint16) WriteTo(writer io.Writer) (int64, error) { 880 // Construct a slice backed by dst's underlying memory. 881 var buf []byte 882 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 883 hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(u))) 884 hdr.Len = u.SizeBytes() 885 hdr.Cap = u.SizeBytes() 886 887 length, err := writer.Write(buf) 888 // Since we bypassed the compiler's escape analysis, indicate that u 889 // must live until the use above. 890 runtime.KeepAlive(u) // escapes: replaced by intrinsic. 891 return int64(length), err 892 } 893 894 // CheckedMarshal implements marshal.CheckedMarshallable.CheckedMarshal. 895 func (u *Uint16) CheckedMarshal(dst []byte) ([]byte, bool) { 896 size := u.SizeBytes() 897 if size > len(dst) { 898 return dst, false 899 } 900 gohacks.Memmove(unsafe.Pointer(&dst[0]), unsafe.Pointer(u), uintptr(size)) 901 return dst[size:], true 902 } 903 904 // CheckedUnmarshal implements marshal.CheckedMarshallable.CheckedUnmarshal. 905 func (u *Uint16) CheckedUnmarshal(src []byte) ([]byte, bool) { 906 size := u.SizeBytes() 907 if size > len(src) { 908 return src, false 909 } 910 gohacks.Memmove(unsafe.Pointer(u), unsafe.Pointer(&src[0]), uintptr(size)) 911 return src[size:], true 912 } 913 914 // CopyUint16SliceIn copies in a slice of uint16 objects from the task's memory. 915 func CopyUint16SliceIn(cc marshal.CopyContext, addr hostarch.Addr, dst []uint16) (int, error) { 916 count := len(dst) 917 if count == 0 { 918 return 0, nil 919 } 920 size := (*Uint16)(nil).SizeBytes() 921 922 ptr := unsafe.Pointer(&dst) 923 val := gohacks.Noescape(unsafe.Pointer((*reflect.SliceHeader)(ptr).Data)) 924 925 // Construct a slice backed by dst's underlying memory. 926 var buf []byte 927 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 928 hdr.Data = uintptr(val) 929 hdr.Len = size * count 930 hdr.Cap = size * count 931 932 length, err := cc.CopyInBytes(addr, buf) // escapes: okay. 933 // Since we bypassed the compiler's escape analysis, indicate that dst 934 // must live until the use above. 935 runtime.KeepAlive(dst) // escapes: replaced by intrinsic. 936 return length, err 937 } 938 939 // CopyUint16SliceOut copies a slice of uint16 objects to the task's memory. 940 func CopyUint16SliceOut(cc marshal.CopyContext, addr hostarch.Addr, src []uint16) (int, error) { 941 count := len(src) 942 if count == 0 { 943 return 0, nil 944 } 945 size := (*Uint16)(nil).SizeBytes() 946 947 ptr := unsafe.Pointer(&src) 948 val := gohacks.Noescape(unsafe.Pointer((*reflect.SliceHeader)(ptr).Data)) 949 950 // Construct a slice backed by dst's underlying memory. 951 var buf []byte 952 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 953 hdr.Data = uintptr(val) 954 hdr.Len = size * count 955 hdr.Cap = size * count 956 957 length, err := cc.CopyOutBytes(addr, buf) // escapes: okay. 958 // Since we bypassed the compiler's escape analysis, indicate that src 959 // must live until the use above. 960 runtime.KeepAlive(src) // escapes: replaced by intrinsic. 961 return length, err 962 } 963 964 // MarshalUnsafeUint16Slice is like Uint16.MarshalUnsafe, but for a []Uint16. 965 func MarshalUnsafeUint16Slice(src []Uint16, dst []byte) []byte { 966 count := len(src) 967 if count == 0 { 968 return dst 969 } 970 size := (*Uint16)(nil).SizeBytes() 971 972 buf := dst[:size*count] 973 gohacks.Memmove(unsafe.Pointer(&buf[0]), unsafe.Pointer(&src[0]), uintptr(len(buf))) 974 return dst[size*count:] 975 } 976 977 // UnmarshalUnsafeUint16Slice is like Uint16.UnmarshalUnsafe, but for a []Uint16. 978 func UnmarshalUnsafeUint16Slice(dst []Uint16, src []byte) []byte { 979 count := len(dst) 980 if count == 0 { 981 return src 982 } 983 size := (*Uint16)(nil).SizeBytes() 984 985 buf := src[:size*count] 986 gohacks.Memmove(unsafe.Pointer(&dst[0]), unsafe.Pointer(&buf[0]), uintptr(len(buf))) 987 return src[size*count:] 988 } 989 990 // SizeBytes implements marshal.Marshallable.SizeBytes. 991 //go:nosplit 992 func (u *Uint32) SizeBytes() int { 993 return 4 994 } 995 996 // MarshalBytes implements marshal.Marshallable.MarshalBytes. 997 func (u *Uint32) MarshalBytes(dst []byte) []byte { 998 hostarch.ByteOrder.PutUint32(dst[:4], uint32(*u)) 999 return dst[4:] 1000 } 1001 1002 // UnmarshalBytes implements marshal.Marshallable.UnmarshalBytes. 1003 func (u *Uint32) UnmarshalBytes(src []byte) []byte { 1004 *u = Uint32(uint32(hostarch.ByteOrder.Uint32(src[:4]))) 1005 return src[4:] 1006 } 1007 1008 // Packed implements marshal.Marshallable.Packed. 1009 //go:nosplit 1010 func (u *Uint32) Packed() bool { 1011 // Scalar newtypes are always packed. 1012 return true 1013 } 1014 1015 // MarshalUnsafe implements marshal.Marshallable.MarshalUnsafe. 1016 func (u *Uint32) MarshalUnsafe(dst []byte) []byte { 1017 size := u.SizeBytes() 1018 gohacks.Memmove(unsafe.Pointer(&dst[0]), unsafe.Pointer(u), uintptr(size)) 1019 return dst[size:] 1020 } 1021 1022 // UnmarshalUnsafe implements marshal.Marshallable.UnmarshalUnsafe. 1023 func (u *Uint32) UnmarshalUnsafe(src []byte) []byte { 1024 size := u.SizeBytes() 1025 gohacks.Memmove(unsafe.Pointer(u), unsafe.Pointer(&src[0]), uintptr(size)) 1026 return src[size:] 1027 } 1028 1029 // CopyOutN implements marshal.Marshallable.CopyOutN. 1030 func (u *Uint32) CopyOutN(cc marshal.CopyContext, addr hostarch.Addr, limit int) (int, error) { 1031 // Construct a slice backed by dst's underlying memory. 1032 var buf []byte 1033 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 1034 hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(u))) 1035 hdr.Len = u.SizeBytes() 1036 hdr.Cap = u.SizeBytes() 1037 1038 length, err := cc.CopyOutBytes(addr, buf[:limit]) // escapes: okay. 1039 // Since we bypassed the compiler's escape analysis, indicate that u 1040 // must live until the use above. 1041 runtime.KeepAlive(u) // escapes: replaced by intrinsic. 1042 return length, err 1043 } 1044 1045 // CopyOut implements marshal.Marshallable.CopyOut. 1046 func (u *Uint32) CopyOut(cc marshal.CopyContext, addr hostarch.Addr) (int, error) { 1047 return u.CopyOutN(cc, addr, u.SizeBytes()) 1048 } 1049 1050 // CopyInN implements marshal.Marshallable.CopyInN. 1051 func (u *Uint32) CopyInN(cc marshal.CopyContext, addr hostarch.Addr, limit int) (int, error) { 1052 // Construct a slice backed by dst's underlying memory. 1053 var buf []byte 1054 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 1055 hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(u))) 1056 hdr.Len = u.SizeBytes() 1057 hdr.Cap = u.SizeBytes() 1058 1059 length, err := cc.CopyInBytes(addr, buf[:limit]) // escapes: okay. 1060 // Since we bypassed the compiler's escape analysis, indicate that u 1061 // must live until the use above. 1062 runtime.KeepAlive(u) // escapes: replaced by intrinsic. 1063 return length, err 1064 } 1065 1066 // CopyIn implements marshal.Marshallable.CopyIn. 1067 func (u *Uint32) CopyIn(cc marshal.CopyContext, addr hostarch.Addr) (int, error) { 1068 return u.CopyInN(cc, addr, u.SizeBytes()) 1069 } 1070 1071 // WriteTo implements io.WriterTo.WriteTo. 1072 func (u *Uint32) WriteTo(writer io.Writer) (int64, error) { 1073 // Construct a slice backed by dst's underlying memory. 1074 var buf []byte 1075 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 1076 hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(u))) 1077 hdr.Len = u.SizeBytes() 1078 hdr.Cap = u.SizeBytes() 1079 1080 length, err := writer.Write(buf) 1081 // Since we bypassed the compiler's escape analysis, indicate that u 1082 // must live until the use above. 1083 runtime.KeepAlive(u) // escapes: replaced by intrinsic. 1084 return int64(length), err 1085 } 1086 1087 // CheckedMarshal implements marshal.CheckedMarshallable.CheckedMarshal. 1088 func (u *Uint32) CheckedMarshal(dst []byte) ([]byte, bool) { 1089 size := u.SizeBytes() 1090 if size > len(dst) { 1091 return dst, false 1092 } 1093 gohacks.Memmove(unsafe.Pointer(&dst[0]), unsafe.Pointer(u), uintptr(size)) 1094 return dst[size:], true 1095 } 1096 1097 // CheckedUnmarshal implements marshal.CheckedMarshallable.CheckedUnmarshal. 1098 func (u *Uint32) CheckedUnmarshal(src []byte) ([]byte, bool) { 1099 size := u.SizeBytes() 1100 if size > len(src) { 1101 return src, false 1102 } 1103 gohacks.Memmove(unsafe.Pointer(u), unsafe.Pointer(&src[0]), uintptr(size)) 1104 return src[size:], true 1105 } 1106 1107 // CopyUint32SliceIn copies in a slice of uint32 objects from the task's memory. 1108 func CopyUint32SliceIn(cc marshal.CopyContext, addr hostarch.Addr, dst []uint32) (int, error) { 1109 count := len(dst) 1110 if count == 0 { 1111 return 0, nil 1112 } 1113 size := (*Uint32)(nil).SizeBytes() 1114 1115 ptr := unsafe.Pointer(&dst) 1116 val := gohacks.Noescape(unsafe.Pointer((*reflect.SliceHeader)(ptr).Data)) 1117 1118 // Construct a slice backed by dst's underlying memory. 1119 var buf []byte 1120 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 1121 hdr.Data = uintptr(val) 1122 hdr.Len = size * count 1123 hdr.Cap = size * count 1124 1125 length, err := cc.CopyInBytes(addr, buf) // escapes: okay. 1126 // Since we bypassed the compiler's escape analysis, indicate that dst 1127 // must live until the use above. 1128 runtime.KeepAlive(dst) // escapes: replaced by intrinsic. 1129 return length, err 1130 } 1131 1132 // CopyUint32SliceOut copies a slice of uint32 objects to the task's memory. 1133 func CopyUint32SliceOut(cc marshal.CopyContext, addr hostarch.Addr, src []uint32) (int, error) { 1134 count := len(src) 1135 if count == 0 { 1136 return 0, nil 1137 } 1138 size := (*Uint32)(nil).SizeBytes() 1139 1140 ptr := unsafe.Pointer(&src) 1141 val := gohacks.Noescape(unsafe.Pointer((*reflect.SliceHeader)(ptr).Data)) 1142 1143 // Construct a slice backed by dst's underlying memory. 1144 var buf []byte 1145 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 1146 hdr.Data = uintptr(val) 1147 hdr.Len = size * count 1148 hdr.Cap = size * count 1149 1150 length, err := cc.CopyOutBytes(addr, buf) // escapes: okay. 1151 // Since we bypassed the compiler's escape analysis, indicate that src 1152 // must live until the use above. 1153 runtime.KeepAlive(src) // escapes: replaced by intrinsic. 1154 return length, err 1155 } 1156 1157 // MarshalUnsafeUint32Slice is like Uint32.MarshalUnsafe, but for a []Uint32. 1158 func MarshalUnsafeUint32Slice(src []Uint32, dst []byte) []byte { 1159 count := len(src) 1160 if count == 0 { 1161 return dst 1162 } 1163 size := (*Uint32)(nil).SizeBytes() 1164 1165 buf := dst[:size*count] 1166 gohacks.Memmove(unsafe.Pointer(&buf[0]), unsafe.Pointer(&src[0]), uintptr(len(buf))) 1167 return dst[size*count:] 1168 } 1169 1170 // UnmarshalUnsafeUint32Slice is like Uint32.UnmarshalUnsafe, but for a []Uint32. 1171 func UnmarshalUnsafeUint32Slice(dst []Uint32, src []byte) []byte { 1172 count := len(dst) 1173 if count == 0 { 1174 return src 1175 } 1176 size := (*Uint32)(nil).SizeBytes() 1177 1178 buf := src[:size*count] 1179 gohacks.Memmove(unsafe.Pointer(&dst[0]), unsafe.Pointer(&buf[0]), uintptr(len(buf))) 1180 return src[size*count:] 1181 } 1182 1183 // SizeBytes implements marshal.Marshallable.SizeBytes. 1184 //go:nosplit 1185 func (u *Uint64) SizeBytes() int { 1186 return 8 1187 } 1188 1189 // MarshalBytes implements marshal.Marshallable.MarshalBytes. 1190 func (u *Uint64) MarshalBytes(dst []byte) []byte { 1191 hostarch.ByteOrder.PutUint64(dst[:8], uint64(*u)) 1192 return dst[8:] 1193 } 1194 1195 // UnmarshalBytes implements marshal.Marshallable.UnmarshalBytes. 1196 func (u *Uint64) UnmarshalBytes(src []byte) []byte { 1197 *u = Uint64(uint64(hostarch.ByteOrder.Uint64(src[:8]))) 1198 return src[8:] 1199 } 1200 1201 // Packed implements marshal.Marshallable.Packed. 1202 //go:nosplit 1203 func (u *Uint64) Packed() bool { 1204 // Scalar newtypes are always packed. 1205 return true 1206 } 1207 1208 // MarshalUnsafe implements marshal.Marshallable.MarshalUnsafe. 1209 func (u *Uint64) MarshalUnsafe(dst []byte) []byte { 1210 size := u.SizeBytes() 1211 gohacks.Memmove(unsafe.Pointer(&dst[0]), unsafe.Pointer(u), uintptr(size)) 1212 return dst[size:] 1213 } 1214 1215 // UnmarshalUnsafe implements marshal.Marshallable.UnmarshalUnsafe. 1216 func (u *Uint64) UnmarshalUnsafe(src []byte) []byte { 1217 size := u.SizeBytes() 1218 gohacks.Memmove(unsafe.Pointer(u), unsafe.Pointer(&src[0]), uintptr(size)) 1219 return src[size:] 1220 } 1221 1222 // CopyOutN implements marshal.Marshallable.CopyOutN. 1223 func (u *Uint64) CopyOutN(cc marshal.CopyContext, addr hostarch.Addr, limit int) (int, error) { 1224 // Construct a slice backed by dst's underlying memory. 1225 var buf []byte 1226 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 1227 hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(u))) 1228 hdr.Len = u.SizeBytes() 1229 hdr.Cap = u.SizeBytes() 1230 1231 length, err := cc.CopyOutBytes(addr, buf[:limit]) // escapes: okay. 1232 // Since we bypassed the compiler's escape analysis, indicate that u 1233 // must live until the use above. 1234 runtime.KeepAlive(u) // escapes: replaced by intrinsic. 1235 return length, err 1236 } 1237 1238 // CopyOut implements marshal.Marshallable.CopyOut. 1239 func (u *Uint64) CopyOut(cc marshal.CopyContext, addr hostarch.Addr) (int, error) { 1240 return u.CopyOutN(cc, addr, u.SizeBytes()) 1241 } 1242 1243 // CopyInN implements marshal.Marshallable.CopyInN. 1244 func (u *Uint64) CopyInN(cc marshal.CopyContext, addr hostarch.Addr, limit int) (int, error) { 1245 // Construct a slice backed by dst's underlying memory. 1246 var buf []byte 1247 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 1248 hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(u))) 1249 hdr.Len = u.SizeBytes() 1250 hdr.Cap = u.SizeBytes() 1251 1252 length, err := cc.CopyInBytes(addr, buf[:limit]) // escapes: okay. 1253 // Since we bypassed the compiler's escape analysis, indicate that u 1254 // must live until the use above. 1255 runtime.KeepAlive(u) // escapes: replaced by intrinsic. 1256 return length, err 1257 } 1258 1259 // CopyIn implements marshal.Marshallable.CopyIn. 1260 func (u *Uint64) CopyIn(cc marshal.CopyContext, addr hostarch.Addr) (int, error) { 1261 return u.CopyInN(cc, addr, u.SizeBytes()) 1262 } 1263 1264 // WriteTo implements io.WriterTo.WriteTo. 1265 func (u *Uint64) WriteTo(writer io.Writer) (int64, error) { 1266 // Construct a slice backed by dst's underlying memory. 1267 var buf []byte 1268 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 1269 hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(u))) 1270 hdr.Len = u.SizeBytes() 1271 hdr.Cap = u.SizeBytes() 1272 1273 length, err := writer.Write(buf) 1274 // Since we bypassed the compiler's escape analysis, indicate that u 1275 // must live until the use above. 1276 runtime.KeepAlive(u) // escapes: replaced by intrinsic. 1277 return int64(length), err 1278 } 1279 1280 // CheckedMarshal implements marshal.CheckedMarshallable.CheckedMarshal. 1281 func (u *Uint64) CheckedMarshal(dst []byte) ([]byte, bool) { 1282 size := u.SizeBytes() 1283 if size > len(dst) { 1284 return dst, false 1285 } 1286 gohacks.Memmove(unsafe.Pointer(&dst[0]), unsafe.Pointer(u), uintptr(size)) 1287 return dst[size:], true 1288 } 1289 1290 // CheckedUnmarshal implements marshal.CheckedMarshallable.CheckedUnmarshal. 1291 func (u *Uint64) CheckedUnmarshal(src []byte) ([]byte, bool) { 1292 size := u.SizeBytes() 1293 if size > len(src) { 1294 return src, false 1295 } 1296 gohacks.Memmove(unsafe.Pointer(u), unsafe.Pointer(&src[0]), uintptr(size)) 1297 return src[size:], true 1298 } 1299 1300 // CopyUint64SliceIn copies in a slice of uint64 objects from the task's memory. 1301 func CopyUint64SliceIn(cc marshal.CopyContext, addr hostarch.Addr, dst []uint64) (int, error) { 1302 count := len(dst) 1303 if count == 0 { 1304 return 0, nil 1305 } 1306 size := (*Uint64)(nil).SizeBytes() 1307 1308 ptr := unsafe.Pointer(&dst) 1309 val := gohacks.Noescape(unsafe.Pointer((*reflect.SliceHeader)(ptr).Data)) 1310 1311 // Construct a slice backed by dst's underlying memory. 1312 var buf []byte 1313 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 1314 hdr.Data = uintptr(val) 1315 hdr.Len = size * count 1316 hdr.Cap = size * count 1317 1318 length, err := cc.CopyInBytes(addr, buf) // escapes: okay. 1319 // Since we bypassed the compiler's escape analysis, indicate that dst 1320 // must live until the use above. 1321 runtime.KeepAlive(dst) // escapes: replaced by intrinsic. 1322 return length, err 1323 } 1324 1325 // CopyUint64SliceOut copies a slice of uint64 objects to the task's memory. 1326 func CopyUint64SliceOut(cc marshal.CopyContext, addr hostarch.Addr, src []uint64) (int, error) { 1327 count := len(src) 1328 if count == 0 { 1329 return 0, nil 1330 } 1331 size := (*Uint64)(nil).SizeBytes() 1332 1333 ptr := unsafe.Pointer(&src) 1334 val := gohacks.Noescape(unsafe.Pointer((*reflect.SliceHeader)(ptr).Data)) 1335 1336 // Construct a slice backed by dst's underlying memory. 1337 var buf []byte 1338 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 1339 hdr.Data = uintptr(val) 1340 hdr.Len = size * count 1341 hdr.Cap = size * count 1342 1343 length, err := cc.CopyOutBytes(addr, buf) // escapes: okay. 1344 // Since we bypassed the compiler's escape analysis, indicate that src 1345 // must live until the use above. 1346 runtime.KeepAlive(src) // escapes: replaced by intrinsic. 1347 return length, err 1348 } 1349 1350 // MarshalUnsafeUint64Slice is like Uint64.MarshalUnsafe, but for a []Uint64. 1351 func MarshalUnsafeUint64Slice(src []Uint64, dst []byte) []byte { 1352 count := len(src) 1353 if count == 0 { 1354 return dst 1355 } 1356 size := (*Uint64)(nil).SizeBytes() 1357 1358 buf := dst[:size*count] 1359 gohacks.Memmove(unsafe.Pointer(&buf[0]), unsafe.Pointer(&src[0]), uintptr(len(buf))) 1360 return dst[size*count:] 1361 } 1362 1363 // UnmarshalUnsafeUint64Slice is like Uint64.UnmarshalUnsafe, but for a []Uint64. 1364 func UnmarshalUnsafeUint64Slice(dst []Uint64, src []byte) []byte { 1365 count := len(dst) 1366 if count == 0 { 1367 return src 1368 } 1369 size := (*Uint64)(nil).SizeBytes() 1370 1371 buf := src[:size*count] 1372 gohacks.Memmove(unsafe.Pointer(&dst[0]), unsafe.Pointer(&buf[0]), uintptr(len(buf))) 1373 return src[size*count:] 1374 } 1375 1376 // SizeBytes implements marshal.Marshallable.SizeBytes. 1377 //go:nosplit 1378 func (u *Uint8) SizeBytes() int { 1379 return 1 1380 } 1381 1382 // MarshalBytes implements marshal.Marshallable.MarshalBytes. 1383 func (u *Uint8) MarshalBytes(dst []byte) []byte { 1384 dst[0] = byte(*u) 1385 return dst[1:] 1386 } 1387 1388 // UnmarshalBytes implements marshal.Marshallable.UnmarshalBytes. 1389 func (u *Uint8) UnmarshalBytes(src []byte) []byte { 1390 *u = Uint8(uint8(src[0])) 1391 return src[1:] 1392 } 1393 1394 // Packed implements marshal.Marshallable.Packed. 1395 //go:nosplit 1396 func (u *Uint8) Packed() bool { 1397 // Scalar newtypes are always packed. 1398 return true 1399 } 1400 1401 // MarshalUnsafe implements marshal.Marshallable.MarshalUnsafe. 1402 func (u *Uint8) MarshalUnsafe(dst []byte) []byte { 1403 size := u.SizeBytes() 1404 gohacks.Memmove(unsafe.Pointer(&dst[0]), unsafe.Pointer(u), uintptr(size)) 1405 return dst[size:] 1406 } 1407 1408 // UnmarshalUnsafe implements marshal.Marshallable.UnmarshalUnsafe. 1409 func (u *Uint8) UnmarshalUnsafe(src []byte) []byte { 1410 size := u.SizeBytes() 1411 gohacks.Memmove(unsafe.Pointer(u), unsafe.Pointer(&src[0]), uintptr(size)) 1412 return src[size:] 1413 } 1414 1415 // CopyOutN implements marshal.Marshallable.CopyOutN. 1416 func (u *Uint8) CopyOutN(cc marshal.CopyContext, addr hostarch.Addr, limit int) (int, error) { 1417 // Construct a slice backed by dst's underlying memory. 1418 var buf []byte 1419 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 1420 hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(u))) 1421 hdr.Len = u.SizeBytes() 1422 hdr.Cap = u.SizeBytes() 1423 1424 length, err := cc.CopyOutBytes(addr, buf[:limit]) // escapes: okay. 1425 // Since we bypassed the compiler's escape analysis, indicate that u 1426 // must live until the use above. 1427 runtime.KeepAlive(u) // escapes: replaced by intrinsic. 1428 return length, err 1429 } 1430 1431 // CopyOut implements marshal.Marshallable.CopyOut. 1432 func (u *Uint8) CopyOut(cc marshal.CopyContext, addr hostarch.Addr) (int, error) { 1433 return u.CopyOutN(cc, addr, u.SizeBytes()) 1434 } 1435 1436 // CopyInN implements marshal.Marshallable.CopyInN. 1437 func (u *Uint8) CopyInN(cc marshal.CopyContext, addr hostarch.Addr, limit int) (int, error) { 1438 // Construct a slice backed by dst's underlying memory. 1439 var buf []byte 1440 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 1441 hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(u))) 1442 hdr.Len = u.SizeBytes() 1443 hdr.Cap = u.SizeBytes() 1444 1445 length, err := cc.CopyInBytes(addr, buf[:limit]) // escapes: okay. 1446 // Since we bypassed the compiler's escape analysis, indicate that u 1447 // must live until the use above. 1448 runtime.KeepAlive(u) // escapes: replaced by intrinsic. 1449 return length, err 1450 } 1451 1452 // CopyIn implements marshal.Marshallable.CopyIn. 1453 func (u *Uint8) CopyIn(cc marshal.CopyContext, addr hostarch.Addr) (int, error) { 1454 return u.CopyInN(cc, addr, u.SizeBytes()) 1455 } 1456 1457 // WriteTo implements io.WriterTo.WriteTo. 1458 func (u *Uint8) WriteTo(writer io.Writer) (int64, error) { 1459 // Construct a slice backed by dst's underlying memory. 1460 var buf []byte 1461 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 1462 hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(u))) 1463 hdr.Len = u.SizeBytes() 1464 hdr.Cap = u.SizeBytes() 1465 1466 length, err := writer.Write(buf) 1467 // Since we bypassed the compiler's escape analysis, indicate that u 1468 // must live until the use above. 1469 runtime.KeepAlive(u) // escapes: replaced by intrinsic. 1470 return int64(length), err 1471 } 1472 1473 // CheckedMarshal implements marshal.CheckedMarshallable.CheckedMarshal. 1474 func (u *Uint8) CheckedMarshal(dst []byte) ([]byte, bool) { 1475 size := u.SizeBytes() 1476 if size > len(dst) { 1477 return dst, false 1478 } 1479 gohacks.Memmove(unsafe.Pointer(&dst[0]), unsafe.Pointer(u), uintptr(size)) 1480 return dst[size:], true 1481 } 1482 1483 // CheckedUnmarshal implements marshal.CheckedMarshallable.CheckedUnmarshal. 1484 func (u *Uint8) CheckedUnmarshal(src []byte) ([]byte, bool) { 1485 size := u.SizeBytes() 1486 if size > len(src) { 1487 return src, false 1488 } 1489 gohacks.Memmove(unsafe.Pointer(u), unsafe.Pointer(&src[0]), uintptr(size)) 1490 return src[size:], true 1491 } 1492 1493 // CopyUint8SliceIn copies in a slice of uint8 objects from the task's memory. 1494 func CopyUint8SliceIn(cc marshal.CopyContext, addr hostarch.Addr, dst []uint8) (int, error) { 1495 count := len(dst) 1496 if count == 0 { 1497 return 0, nil 1498 } 1499 size := (*Uint8)(nil).SizeBytes() 1500 1501 ptr := unsafe.Pointer(&dst) 1502 val := gohacks.Noescape(unsafe.Pointer((*reflect.SliceHeader)(ptr).Data)) 1503 1504 // Construct a slice backed by dst's underlying memory. 1505 var buf []byte 1506 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 1507 hdr.Data = uintptr(val) 1508 hdr.Len = size * count 1509 hdr.Cap = size * count 1510 1511 length, err := cc.CopyInBytes(addr, buf) // escapes: okay. 1512 // Since we bypassed the compiler's escape analysis, indicate that dst 1513 // must live until the use above. 1514 runtime.KeepAlive(dst) // escapes: replaced by intrinsic. 1515 return length, err 1516 } 1517 1518 // CopyUint8SliceOut copies a slice of uint8 objects to the task's memory. 1519 func CopyUint8SliceOut(cc marshal.CopyContext, addr hostarch.Addr, src []uint8) (int, error) { 1520 count := len(src) 1521 if count == 0 { 1522 return 0, nil 1523 } 1524 size := (*Uint8)(nil).SizeBytes() 1525 1526 ptr := unsafe.Pointer(&src) 1527 val := gohacks.Noescape(unsafe.Pointer((*reflect.SliceHeader)(ptr).Data)) 1528 1529 // Construct a slice backed by dst's underlying memory. 1530 var buf []byte 1531 hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) 1532 hdr.Data = uintptr(val) 1533 hdr.Len = size * count 1534 hdr.Cap = size * count 1535 1536 length, err := cc.CopyOutBytes(addr, buf) // escapes: okay. 1537 // Since we bypassed the compiler's escape analysis, indicate that src 1538 // must live until the use above. 1539 runtime.KeepAlive(src) // escapes: replaced by intrinsic. 1540 return length, err 1541 } 1542 1543 // MarshalUnsafeUint8Slice is like Uint8.MarshalUnsafe, but for a []Uint8. 1544 func MarshalUnsafeUint8Slice(src []Uint8, dst []byte) []byte { 1545 count := len(src) 1546 if count == 0 { 1547 return dst 1548 } 1549 size := (*Uint8)(nil).SizeBytes() 1550 1551 buf := dst[:size*count] 1552 gohacks.Memmove(unsafe.Pointer(&buf[0]), unsafe.Pointer(&src[0]), uintptr(len(buf))) 1553 return dst[size*count:] 1554 } 1555 1556 // UnmarshalUnsafeUint8Slice is like Uint8.UnmarshalUnsafe, but for a []Uint8. 1557 func UnmarshalUnsafeUint8Slice(dst []Uint8, src []byte) []byte { 1558 count := len(dst) 1559 if count == 0 { 1560 return src 1561 } 1562 size := (*Uint8)(nil).SizeBytes() 1563 1564 buf := src[:size*count] 1565 gohacks.Memmove(unsafe.Pointer(&dst[0]), unsafe.Pointer(&buf[0]), uintptr(len(buf))) 1566 return src[size*count:] 1567 } 1568