History

Merged in bitbucket/bug/9 (pull request #3)

Ensure a C++ object exists for all static const members of structs or create constexpr functions.

Aaron R Robinson committed 9 years ago

Commit 3cea79f2 parents 4d839d7 af5c7a914 files · +86 −64Browse files

Unified · Split

14 files
  1. src/asm/sbl_reader.cpp +13 −6
  2. src/asm/type_signature.cpp +6 −0
  3. src/exec/main.cpp +1 −1
  4. src/include/buffered_reader.h +3 −6
  5. src/include/builtin_module.h +6 −6
  6. src/include/disvm.h +3 −6
  7. src/include/module_reader.h +3 −3
  8. src/include/runtime.h +3 −3
  9. src/include/utf8.h +7 −7
  10. src/include/vm_asm.h +17 −8
  11. src/vm/execution_table.cpp +9 −9
  12. src/vm/module_reader.cpp +7 −7
  13. src/vm/stack.cpp +2 −2
  14. src/vm/vm.cpp +6 −0
src/asm/sbl_reader.cpp+13−6
@@ -96,12 +96,12 @@ namespace · 95 unmodified lines
9696
9797 struct type_table_t
9898 {
99− static const uint32_t string_table_mask = 0x80000000;
100− static const uint32_t inner_type_table_mask = 0x40000000;
101− static const uint32_t source_table_mask = 0x20000000;
102− static const uint32_t adt_table_mask = 0x10000000;
103− static const uint32_t tuple_type_mask = 0x08000000;
104− static const uint32_t types_mask = 0;
99+ static const uint32_t string_table_mask;
100+ static const uint32_t inner_type_table_mask;
101+ static const uint32_t source_table_mask;
102+ static const uint32_t adt_table_mask;
103+ static const uint32_t tuple_type_mask;
104+ static const uint32_t types_mask;
105105
106106 std::vector<type_t> types;
107107 std::vector<std::string> strings_table;
@@ -114,6 +114,13 @@ namespace · 6 unmodified lines
114114 const T &resolve_table_index(int32_t idx) const;
115115 };
116116
117+ const uint32_t type_table_t::string_table_mask = 0x80000000;
118+ const uint32_t type_table_t::inner_type_table_mask = 0x40000000;
119+ const uint32_t type_table_t::source_table_mask = 0x20000000;
120+ const uint32_t type_table_t::adt_table_mask = 0x10000000;
121+ const uint32_t type_table_t::tuple_type_mask = 0x08000000;
122+ const uint32_t type_table_t::types_mask = 0;
123+
117124 template<>
118125 const std::string &type_table_t::resolve_table_index<std::string>(int32_t idx) const
119126 {
src/asm/type_signature.cpp+6−0
@@ -34,6 +34,8 @@ namespace · 33 unmodified lines
3434 }
3535 }
3636
37+const char sig_stream_t::delim = ',';
38+
3739 uint32_t sig_stream_t::compute_signature_hash(const char *sig)
3840 {
3941 std::string sig_local{ sig };
@@ -124,6 +126,8 @@ sig_stream_t &disvm::assembly::sigkind::operator<<(sig_stream_t &os, const Tchan · 84 unmodified lines
124126 return os << c._s;
125127 }
126128
129+const char Ttype_ref::id = '@';
130+
127131 Ttype_ref::Ttype_ref(uint32_t num)
128132 : _num{ num }
129133 { }
@@ -155,6 +159,8 @@ sig_stream_t &disvm::assembly::sigkind::operator<<(sig_stream_t &os, const Tmodu · 25 unmodified lines
155159 }
156160
157161 const char *Tadt_pick_tag::tag_delim = "=>";
162+const char Tadt_pick_tag::begin = '(';
163+const char Tadt_pick_tag::end = ')';
158164
159165 Tadt_pick_tag Tadt_pick_tag::create(const char *pick_tag, uint32_t adt_ref, std::initializer_list<const Tm> tms)
160166 {
src/exec/main.cpp+1−1
@@ -102,7 +102,7 @@ namespace · 101 unmodified lines
102102 mp_base[1] = args->get_allocation();
103103
104104 // Define the frame offset for the argument
105− const auto first_arg_offset = vm_frame_constants::limbo_first_arg_register_offset;
105+ const auto first_arg_offset = vm_frame_constants::limbo_first_arg_register_offset();
106106
107107 e.code_section =
108108 {
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
src/vm/execution_table.cpp+9−9
@@ -579,15 +579,15 @@ namespace · 578 unmodified lines
579579 // Define case table constants
580580 // [SPEC]Table format is partially defined in Dis VM specification
581581 // [element count] ([low value (inc)][high value (exc)][program counter])* [fallback program counter]
582− struct case_op_constants
583− {
584− static const auto table_length_index = std::size_t{ 0 };
585− static const auto first_entry_index = std::size_t{ 1 };
586− static const auto entry_low_index = std::size_t{ 0 };
587− static const auto entry_high_index = std::size_t{ 1 };
588− static const auto entry_pc_index = std::size_t{ 2 };
589− static const auto entry_length = std::size_t{ 3 };
590− };
582+ namespace case_op_constants
583+ {
584+ const auto table_length_index = std::size_t{ 0 };
585+ const auto first_entry_index = std::size_t{ 1 };
586+ const auto entry_low_index = std::size_t{ 0 };
587+ const auto entry_high_index = std::size_t{ 1 };
588+ const auto entry_pc_index = std::size_t{ 2 };
589+ const auto entry_length = std::size_t{ 3 };
590+ }
591591
592592 template<typename PrimitiveType>
593593 void _case(vm_registers_t &r)
src/vm/module_reader.cpp+7−7
@@ -25,14 +25,14 @@ using namespace disvm::format; · 24 unmodified lines
2525 namespace
2626 {
2727 // constants used in module processing
28− struct module_constants
28+ namespace module_constants
2929 {
30− static const auto max_type_pointer_count = operand_t{ 128 * 1024 };
31− static const auto no_error_handle_type_desc = operand_t{ -1 };
32− static const auto no_entry_pc = vm_pc_t{ -1 };
33− static const auto vm_module_type_desc_number = std::size_t{ 0 };
34− static const auto max_module_name_bytes = std::size_t{ 128 }; // Including null
35− static const auto array_address_stack_size = std::size_t{ 4 };
30+ const auto max_type_pointer_count = operand_t{ 128 * 1024 };
31+ const auto no_error_handle_type_desc = operand_t{ -1 };
32+ const auto no_entry_pc = vm_pc_t{ -1 };
33+ const auto vm_module_type_desc_number = std::size_t{ 0 };
34+ const auto max_module_name_bytes = std::size_t{ 128 }; // Including null
35+ const auto array_address_stack_size = std::size_t{ 4 };
3636 };
3737
3838 // enumeration for types in the data section
src/vm/stack.cpp+2−2
@@ -161,7 +161,7 @@ vm_module_ref_t *&vm_frame_t::prev_module_ref() const · 160 unmodified lines
161161
162162 pointer_t vm_frame_t::fixed_point_register_1() const
163163 {
164− const auto offset = vm_frame_constants::fixed_point_register_1_offset;
164+ const auto offset = vm_frame_constants::fixed_point_register_1_offset();
165165 assert(offset < frame_type->size_in_bytes);
166166
167167 auto p = reinterpret_cast<uint8_t *>(base()) + offset;
@@ -170,7 +170,7 @@ pointer_t vm_frame_t::fixed_point_register_1() const · 2 unmodified lines
170170
171171 pointer_t vm_frame_t::fixed_point_register_2() const
172172 {
173− const auto offset = vm_frame_constants::fixed_point_register_2_offset;
173+ const auto offset = vm_frame_constants::fixed_point_register_2_offset();
174174 assert(offset < frame_type->size_in_bytes);
175175
176176 auto p = reinterpret_cast<uint8_t *>(base()) + offset;
src/vm/vm.cpp+6−0
@@ -20,6 +20,12 @@ · 19 unmodified lines
2020 using namespace disvm;
2121 using namespace disvm::runtime;
2222
23+const uint32_t vm_t::root_vm_thread_id = 0;
24+const uint32_t vm_t::default_system_thread_count = 1;
25+
26+// The Inferno implementation defined the thread quanta as 2048 (include/interp.h)
27+const uint32_t vm_t::default_thread_quanta = 2048;
28+
2329 vm_t::vm_t(
2430 create_vm_interface_callback_t<runtime::vm_scheduler_t> create_scheduler,
2531 create_vm_interface_callback_t<runtime::vm_garbage_collector_t> create_gc)