History

Implemented basic native shell - takes compiled Command modules Defined shell Command module - should be implemented to pass modules to native shell Updated intrinsic type descriptors so they are not allocated on VM load

arr committed 10 years ago

Commit 330522f1 parent 8506dc611 files · +251 −139Browse files

Showing the changes to src/vm/vm_memory.cpp (1 of 11 files). Show all

Unified · Split

src/vm/vm_memory.cpp+40−56
@@ -323,92 +323,76 @@ namespace · 322 unmodified lines
323323 {
324324 namespace hidden_type_desc
325325 {
326− std::shared_ptr<const type_descriptor_t> byte;
327− std::shared_ptr<const type_descriptor_t> short_word;
328− std::shared_ptr<const type_descriptor_t> word;
329− std::shared_ptr<const type_descriptor_t> short_real;
330− std::shared_ptr<const type_descriptor_t> real;
331− std::shared_ptr<const type_descriptor_t> big;
332− std::shared_ptr<const type_descriptor_t> pointer;
333−
334− std::shared_ptr<const type_descriptor_t> vm_array;
335− std::shared_ptr<const type_descriptor_t> vm_list;
336− std::shared_ptr<const type_descriptor_t> vm_channel;
337− std::shared_ptr<const type_descriptor_t> vm_string;
338−
339− std::shared_ptr<const type_descriptor_t> vm_module_ref;
340− std::shared_ptr<const type_descriptor_t> vm_stack;
341− std::shared_ptr<const type_descriptor_t> vm_thread;
326+ const type_descriptor_t byte{ sizeof(byte_t), 0, nullptr, type_descriptor_t::no_finalizer };
327+ const type_descriptor_t short_word{ sizeof(short_word_t), 0, nullptr, type_descriptor_t::no_finalizer };
328+ const type_descriptor_t word{ sizeof(word_t), 0, nullptr, type_descriptor_t::no_finalizer };
329+ const type_descriptor_t short_real{ sizeof(short_real_t), 0, nullptr, type_descriptor_t::no_finalizer };
330+ const type_descriptor_t real{ sizeof(real_t), 0, nullptr, type_descriptor_t::no_finalizer };
331+ const type_descriptor_t big{ sizeof(big_t), 0, nullptr, type_descriptor_t::no_finalizer };
332+
333+ const byte_t pointer_map[] = { 0x80 };
334+ const type_descriptor_t pointer{ sizeof(pointer_t), (sizeof(pointer_map) / sizeof(pointer_map[0])), pointer_map, type_descriptor_t::no_finalizer };
335+
336+ const type_descriptor_t vm_array{ 0, 0, nullptr, type_descriptor_t::no_finalizer };
337+ const type_descriptor_t vm_list{ 0, 0, nullptr, type_descriptor_t::no_finalizer };
338+ const type_descriptor_t vm_channel{ 0, 0, nullptr, type_descriptor_t::no_finalizer };
339+ const type_descriptor_t vm_string{ 0, 0, nullptr, type_descriptor_t::no_finalizer };
340+
341+ const type_descriptor_t vm_module_ref{ 0, 0, nullptr, type_descriptor_t::no_finalizer };
342+ const type_descriptor_t vm_stack{ 0, 0, nullptr, type_descriptor_t::no_finalizer };
343+ const type_descriptor_t vm_thread{ 0, 0, nullptr, type_descriptor_t::no_finalizer };
344+
345+ struct
346+ {
347+ void operator()(const type_descriptor_t *)
348+ {
349+ // Not allocated on heap
350+ }
351+ } deleter;
342352 }
343353 }
344354
345−std::atomic_bool intrinsic_type_desc::is_initialized{ false };
346−
347−void intrinsic_type_desc::initialize()
348−{
349− auto is_false = bool{ false };
350− if (!intrinsic_type_desc::is_initialized.compare_exchange_strong(is_false, true))
351− return;
352−
353− hidden_type_desc::byte = type_descriptor_t::create(sizeof(byte_t));
354− hidden_type_desc::short_word = type_descriptor_t::create(sizeof(short_word_t));
355− hidden_type_desc::word = type_descriptor_t::create(sizeof(word_t));
356− hidden_type_desc::short_real = type_descriptor_t::create(sizeof(short_real_t));
357− hidden_type_desc::real = type_descriptor_t::create(sizeof(real_t));
358− hidden_type_desc::big = type_descriptor_t::create(sizeof(big_t));
359− hidden_type_desc::pointer = type_descriptor_t::create(sizeof(pointer_t), std::vector<byte_t>{0x80});
360−
361− hidden_type_desc::vm_array = type_descriptor_t::create(0);
362− hidden_type_desc::vm_list = type_descriptor_t::create(0);
363− hidden_type_desc::vm_channel = type_descriptor_t::create(0);
364− hidden_type_desc::vm_string = type_descriptor_t::create(0);
365−
366− hidden_type_desc::vm_module_ref = type_descriptor_t::create(0);
367− hidden_type_desc::vm_stack = type_descriptor_t::create(0);
368− hidden_type_desc::vm_thread = type_descriptor_t::create(0);
369−}
370−
371355 template<>
372−static std::shared_ptr<const type_descriptor_t> intrinsic_type_desc::type<byte_t>() { return hidden_type_desc::byte; }
356+static std::shared_ptr<const type_descriptor_t> intrinsic_type_desc::type<byte_t>() { return{ &hidden_type_desc::byte, hidden_type_desc::deleter }; }
373357
374358 template<>
375−static std::shared_ptr<const type_descriptor_t> intrinsic_type_desc::type<short_word_t>() { return hidden_type_desc::short_word; }
359+static std::shared_ptr<const type_descriptor_t> intrinsic_type_desc::type<short_word_t>() { return{ &hidden_type_desc::short_word, hidden_type_desc::deleter }; }
376360
377361 template<>
378−static std::shared_ptr<const type_descriptor_t> intrinsic_type_desc::type<word_t>() { return hidden_type_desc::word; }
362+static std::shared_ptr<const type_descriptor_t> intrinsic_type_desc::type<word_t>() { return{ &hidden_type_desc::word, hidden_type_desc::deleter }; }
379363
380364 template<>
381−static std::shared_ptr<const type_descriptor_t> intrinsic_type_desc::type<short_real_t>() { return hidden_type_desc::short_real; }
365+static std::shared_ptr<const type_descriptor_t> intrinsic_type_desc::type<short_real_t>() { return{ &hidden_type_desc::short_real, hidden_type_desc::deleter }; }
382366
383367 template<>
384−static std::shared_ptr<const type_descriptor_t> intrinsic_type_desc::type<real_t>() { return hidden_type_desc::real; }
368+static std::shared_ptr<const type_descriptor_t> intrinsic_type_desc::type<real_t>() { return{ &hidden_type_desc::real, hidden_type_desc::deleter }; }
385369
386370 template<>
387−static std::shared_ptr<const type_descriptor_t> intrinsic_type_desc::type<big_t>() { return hidden_type_desc::big; }
371+static std::shared_ptr<const type_descriptor_t> intrinsic_type_desc::type<big_t>() { return{ &hidden_type_desc::big, hidden_type_desc::deleter }; }
388372
389373 template<>
390−static std::shared_ptr<const type_descriptor_t> intrinsic_type_desc::type<pointer_t>() { return hidden_type_desc::pointer; }
374+static std::shared_ptr<const type_descriptor_t> intrinsic_type_desc::type<pointer_t>() { return{ &hidden_type_desc::pointer, hidden_type_desc::deleter }; }
391375
392376 template<>
393−static std::shared_ptr<const type_descriptor_t> intrinsic_type_desc::type<vm_array_t>() { return hidden_type_desc::vm_array; }
377+static std::shared_ptr<const type_descriptor_t> intrinsic_type_desc::type<vm_array_t>() { return{ &hidden_type_desc::vm_array, hidden_type_desc::deleter }; }
394378
395379 template<>
396−static std::shared_ptr<const type_descriptor_t> intrinsic_type_desc::type<vm_list_t>() { return hidden_type_desc::vm_list; }
380+static std::shared_ptr<const type_descriptor_t> intrinsic_type_desc::type<vm_list_t>() { return{ &hidden_type_desc::vm_list, hidden_type_desc::deleter }; }
397381
398382 template<>
399−static std::shared_ptr<const type_descriptor_t> intrinsic_type_desc::type<vm_channel_t>() { return hidden_type_desc::vm_channel; }
383+static std::shared_ptr<const type_descriptor_t> intrinsic_type_desc::type<vm_channel_t>() { return{ &hidden_type_desc::vm_channel, hidden_type_desc::deleter }; }
400384
401385 template<>
402−static std::shared_ptr<const type_descriptor_t> intrinsic_type_desc::type<vm_string_t>() { return hidden_type_desc::vm_string; }
386+static std::shared_ptr<const type_descriptor_t> intrinsic_type_desc::type<vm_string_t>() { return{ &hidden_type_desc::vm_string, hidden_type_desc::deleter }; }
403387
404388 template<>
405−static std::shared_ptr<const type_descriptor_t> intrinsic_type_desc::type<vm_module_ref_t>() { return hidden_type_desc::vm_module_ref; }
389+static std::shared_ptr<const type_descriptor_t> intrinsic_type_desc::type<vm_module_ref_t>() { return{ &hidden_type_desc::vm_module_ref, hidden_type_desc::deleter }; }
406390
407391 template<>
408−static std::shared_ptr<const type_descriptor_t> intrinsic_type_desc::type<vm_stack_t>() { return hidden_type_desc::vm_stack; }
392+static std::shared_ptr<const type_descriptor_t> intrinsic_type_desc::type<vm_stack_t>() { return{ &hidden_type_desc::vm_stack, hidden_type_desc::deleter }; }
409393
410394 template<>
411−static std::shared_ptr<const type_descriptor_t> intrinsic_type_desc::type<vm_thread_t>() { return hidden_type_desc::vm_thread; }
395+static std::shared_ptr<const type_descriptor_t> intrinsic_type_desc::type<vm_thread_t>() { return{ &hidden_type_desc::vm_thread, hidden_type_desc::deleter }; }
412396
413397 vm_alloc_instance_finalizer_t type_descriptor_t::no_finalizer = nullptr;
414398