Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Roblox
GitHub Repository: Roblox/luau
Path: blob/master/CodeGen/src/ByteUtils.h
2725 views
1
// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
2
#pragma once
3
4
#include "Luau/Common.h"
5
6
#if defined(LUAU_BIG_ENDIAN)
7
#include <endian.h>
8
#endif
9
10
#include <string.h>
11
12
inline uint8_t* writeu8(uint8_t* target, uint8_t value)
13
{
14
*target = value;
15
return target + sizeof(value);
16
}
17
18
inline uint8_t* writeu16(uint8_t* target, uint16_t value)
19
{
20
#if defined(LUAU_BIG_ENDIAN)
21
value = htole16(value);
22
#endif
23
24
memcpy(target, &value, sizeof(value));
25
return target + sizeof(value);
26
}
27
28
inline uint8_t* writeu32(uint8_t* target, uint32_t value)
29
{
30
#if defined(LUAU_BIG_ENDIAN)
31
value = htole32(value);
32
#endif
33
34
memcpy(target, &value, sizeof(value));
35
return target + sizeof(value);
36
}
37
38
inline uint8_t* writeu64(uint8_t* target, uint64_t value)
39
{
40
#if defined(LUAU_BIG_ENDIAN)
41
value = htole64(value);
42
#endif
43
44
memcpy(target, &value, sizeof(value));
45
return target + sizeof(value);
46
}
47
48
inline uint8_t* writeuleb128(uint8_t* target, uint64_t value)
49
{
50
do
51
{
52
uint8_t byte = value & 0x7f;
53
value >>= 7;
54
55
if (value)
56
byte |= 0x80;
57
58
*target++ = byte;
59
} while (value);
60
61
return target;
62
}
63
64
inline uint8_t* writef32(uint8_t* target, float value)
65
{
66
#if defined(LUAU_BIG_ENDIAN)
67
static_assert(sizeof(float) == sizeof(uint32_t), "type size must match to reinterpret data");
68
uint32_t data;
69
memcpy(&data, &value, sizeof(value));
70
writeu32(target, data);
71
#else
72
memcpy(target, &value, sizeof(value));
73
#endif
74
75
return target + sizeof(value);
76
}
77
78
inline uint8_t* writef64(uint8_t* target, double value)
79
{
80
#if defined(LUAU_BIG_ENDIAN)
81
static_assert(sizeof(double) == sizeof(uint64_t), "type size must match to reinterpret data");
82
uint64_t data;
83
memcpy(&data, &value, sizeof(value));
84
writeu64(target, data);
85
#else
86
memcpy(target, &value, sizeof(value));
87
#endif
88
89
return target + sizeof(value);
90
}
91
92