History

Ensure a C++ object exists for all static const members of structs or create constexpr functions. - This is an attempt to adhere to the letter of the C++ specification.

arr committed 9 years ago

Commit af5c7a91 parent 4d839d714 files · +86 −64Browse files

Showing the changes to src/include (7 of 14 files). Show all

Unified · Split

7 files
  1. src/include/buffered_reader.h +3 −6
  2. src/include/builtin_module.h +6 −6
  3. src/include/disvm.h +3 −6
  4. src/include/module_reader.h +3 −3
  5. src/include/runtime.h +3 −3
  6. src/include/utf8.h +7 −7
  7. src/include/vm_asm.h +17 −8
src/include/buffered_reader.h+3−6
@@ -20,12 +20,9 @@ namespace disvm · 19 unmodified lines
2020 {
2121 class buffered_reader_t
2222 {
23− private: // static
24− static const std::size_t buffer_size = 64 * 1024; // 64k is an optimization for the Windows filesystem manager
25−
2623 public:
2724 buffered_reader_t(std::istream &stream)
28− : _buffer(buffered_reader_t::buffer_size)
25+ : _buffer(64 * 1024) // 64k is an optimization for the Windows filesystem manager
2926 , _current_index{ 0 }
3027 , _current_size{ 0 }
3128 , _stream{ stream }
@@ -141,10 +138,10 @@ namespace disvm · 109 unmodified lines
141138 if (_stream.fail())
142139 return 0;
143140
144− _stream.read(_buffer.data(), buffered_reader_t::buffer_size);
141+ _stream.read(_buffer.data(), _buffer.size());
145142
146143 // If the stream has failed, set the current size, otherwise the buffer size
147− _current_size = _stream.fail() ? static_cast<std::size_t>(_stream.gcount()) : buffered_reader_t::buffer_size;
144+ _current_size = _stream.fail() ? static_cast<std::size_t>(_stream.gcount()) : _buffer.size();
148145 }
149146
150147 return _current_size - _current_index;
src/include/builtin_module.h+6−6
@@ -61,23 +61,23 @@ namespace disvm · 60 unmodified lines
6161
6262 struct vm_frame_constants
6363 {
64− static const auto register_size_in_bytes = sizeof(word_t);
64+ static constexpr auto register_size_in_bytes() { return sizeof(word_t); }
6565
6666 // Includes registers on base frame plus the implied return register
67− static const auto default_register_count = (sizeof(vm_frame_base_alloc_t) / register_size_in_bytes) + 1;
67+ static constexpr auto default_register_count() { return (sizeof(vm_frame_base_alloc_t) / register_size_in_bytes()) + 1; }
6868
6969 // [SPEC] The fixed point registers are defined by their usage in the
7070 // Inferno implementation. They rely on the 'temp' registers defined below.
7171 // See fixed point opcodes in Inferno (libinterp/xec.c).
72− static const auto fixed_point_register_1_offset = default_register_count * register_size_in_bytes;
73− static const auto fixed_point_register_2_offset = fixed_point_register_1_offset + (2 * register_size_in_bytes);
72+ static constexpr auto fixed_point_register_1_offset() { return default_register_count() * register_size_in_bytes(); }
73+ static constexpr auto fixed_point_register_2_offset() { return fixed_point_register_1_offset() + (2 * register_size_in_bytes()); }
7474
7575 // [SPEC] The official Limbo compiler allocates additional 'temp' registers on all call frames.
7676 // See 'STemp', 'RTemp', and 'DTemp' in Inferno (limbo/limbo.h)
77− static const auto limbo_temp_register_count = 3;
77+ static constexpr auto limbo_temp_register_count() { return 3; }
7878
7979 // Define the first argument offset in a Limbo compiler generated call frame.
80− static const auto limbo_first_arg_register_offset = (default_register_count + limbo_temp_register_count) * register_size_in_bytes;
80+ static constexpr auto limbo_first_arg_register_offset() { return (default_register_count() + limbo_temp_register_count()) * register_size_in_bytes(); }
8181 };
8282
8383 //
src/include/disvm.h+3−6
@@ -55,12 +55,9 @@ namespace disvm · 54 unmodified lines
5555 class vm_t final
5656 {
5757 public: // static
58− static const uint32_t root_vm_thread_id = 0;
59−
60− static const uint32_t default_system_thread_count = 1;
61−
62− // The Inferno implementation defined the thread quanta as 2048 (include/interp.h)
63− static const uint32_t default_thread_quanta = 2048;
58+ static const uint32_t root_vm_thread_id;
59+ static const uint32_t default_system_thread_count;
60+ static const uint32_t default_thread_quanta;
6461
6562 public:
6663 explicit vm_t(
src/include/module_reader.h+3−3
@@ -18,10 +18,10 @@ namespace disvm · 17 unmodified lines
1818 static_assert(sizeof(operand_t) == sizeof(runtime::word_t), "Operand and word should be the same size");
1919 static_assert(sizeof(operand_t) == sizeof(runtime::vm_pc_t), "Operand and VM program counter type should be the same size");
2020
21− struct magic_number_constants final
21+ namespace magic_number_constants
2222 {
23− static const auto xmagic = operand_t{ 819248 }; // Normal module (0xC8030)
24− static const auto smagic = operand_t{ 923426 }; // Signed module (0xE1722)
23+ const auto xmagic = operand_t{ 819248 }; // Normal module (0xC8030)
24+ const auto smagic = operand_t{ 923426 }; // Signed module (0xE1722)
2525 };
2626 }
2727 }
src/include/runtime.h+3−3
@@ -364,11 +364,11 @@ namespace disvm · 363 unmodified lines
364364 };
365365
366366 // Runtime constants
367− struct runtime_constants
367+ namespace runtime_constants
368368 {
369− static const auto nil = std::size_t{ 0 };
369+ const auto nil = std::size_t{ 0 };
370370
371− static const auto invalid_program_counter = vm_pc_t{ ~0 };
371+ const auto invalid_program_counter = vm_pc_t{ ~0 };
372372 };
373373
374374 // Addressing mode for middle instruction data
src/include/utf8.h+7−7
@@ -17,16 +17,16 @@ namespace disvm · 16 unmodified lines
1717 namespace utf8
1818 {
1919 // As defined in http://tools.ietf.org/html/rfc3629
20− struct constants
20+ namespace constants
2121 {
22− static const rune_t multi_byte_value_mask = 0x3f;
22+ const disvm::runtime::rune_t multi_byte_value_mask = 0x3f;
2323
24− static const rune_t max_codepoint_ascii = 0x7f;
25− static const rune_t max_codepoint_2_byte = 0x7ff;
26− static const rune_t max_codepoint_3_byte = 0xffff;
27− static const rune_t max_codepoint_4_byte = 0x10ffff;
24+ const disvm::runtime::rune_t max_codepoint_ascii = 0x7f;
25+ const disvm::runtime::rune_t max_codepoint_2_byte = 0x7ff;
26+ const disvm::runtime::rune_t max_codepoint_3_byte = 0xffff;
27+ const disvm::runtime::rune_t max_codepoint_4_byte = 0x10ffff;
2828
29− static const rune_t max_supported_codepoint = max_codepoint_4_byte;
29+ const disvm::runtime::rune_t max_supported_codepoint = max_codepoint_4_byte;
3030 };
3131
3232 // Compute the number of code points in the supplied string
src/include/vm_asm.h+17−8
@@ -46,7 +46,7 @@ namespace disvm · 45 unmodified lines
4646 static uint32_t compute_signature_hash(const char *);
4747
4848 // Type delimiter
49− static const char delim = ',';
49+ static const char delim;
5050
5151 public:
5252 std::string get_signature() const;
@@ -100,7 +100,7 @@ namespace disvm · 47 unmodified lines
100100 template<type_id_t T>
101101 struct Tbasic_type
102102 {
103− static const type_id_t id = T;
103+ static const type_id_t id;
104104
105105 constexpr operator type_id_t() const
106106 {
@@ -108,6 +108,9 @@ namespace disvm · 1 unmodified line
108108 }
109109 };
110110
111+ template<type_id_t T>
112+ const type_id_t Tbasic_type<T>::id = T;
113+
111114 using Tnone = Tbasic_type<type_id_t::none>;
112115 using Tbyte = Tbasic_type<type_id_t::byte>;
113116 using Tinteger = Tbasic_type<type_id_t::integer>;
@@ -164,7 +167,7 @@ namespace disvm · 50 unmodified lines
164167 class Ttype_ref final
165168 {
166169 public: // static
167− static const char id = '@';
170+ static const char id;
168171
169172 public:
170173 Ttype_ref(uint32_t num);
@@ -218,7 +221,7 @@ namespace disvm · 47 unmodified lines
218221 template <type_id_t ID>
219222 class Tnested_aggregate_type : public Tbasic_type<ID>
220223 {
221− public: // static
224+ public: // static
222225 static const char begin;
223226 static const char end;
224227
@@ -258,8 +261,8 @@ namespace disvm · 33 unmodified lines
258261 {
259262 public: // static
260263 static const char *tag_delim;
261− static const char begin = '(';
262− static const char end = ')';
264+ static const char begin;
265+ static const char end;
263266
264267 static Tadt_pick_tag create(const char *pick_tag, uint32_t adt_ref, std::initializer_list<const Tm> tms);
265268
@@ -325,8 +328,8 @@ namespace disvm · 59 unmodified lines
325328 class Tfunction_base_type final : public Tbasic_type<T>
326329 {
327330 public: // static
328− static const char begin = '(';
329− static const char end = ')';
331+ static const char begin;
332+ static const char end;
330333
331334 template<typename ...AT>
332335 static Tfunction_base_type create(AT... argTypes)
@@ -360,6 +363,12 @@ namespace disvm · 27 unmodified lines
360363 Tfunction_base_type() : _fully_defined{ false } { }
361364 };
362365
366+ template<type_id_t T>
367+ const char Tfunction_base_type<T>::begin = '(';
368+
369+ template<type_id_t T>
370+ const char Tfunction_base_type<T>::end = ')';
371+
363372 using Tfunction = Tfunction_base_type<type_id_t::function>;
364373 using Tfunction_varargs = Tfunction_base_type<type_id_t::function_varargs>;
365374