History

Create configuration struct for VM Add syscall failure exception - Create VM syscall failure message functions Respect the 'r' format verb Create module resolver interface Implement default module resolver interface Implement Sys.fildes() function

arr committed 9 years ago

Commit 232a6591 parent eb06d3d17 files · +416 −124Browse files

Showing the changes to src/vm/sys/Sysmod.cpp (1 of 17 files). Show all

Unified · Split

src/vm/sys/Sysmod.cpp+35−17
@@ -166,26 +166,26 @@ namespace · 165 unmodified lines
166166 return _fd_path;
167167 }
168168
169− word_t read(const word_t buffer_size_in_bytes, void *buffer)
169+ word_t read(disvm::vm_t &vm, const word_t buffer_size_in_bytes, void *buffer)
170170 {
171171 if (_istream == nullptr)
172172 throw vm_system_exception{ "File descriptor not open for read operation" };
173173
174174 _istream->read(static_cast<char *>(buffer), static_cast<const std::streamsize>(buffer_size_in_bytes));
175175 if (_istream->bad())
176− throw vm_user_exception{ "Read operation error" };
176+ throw vm_syscall_exception{ vm, "Read operation error" };
177177
178178 return static_cast<word_t>(_istream->gcount());
179179 }
180180
181− void write(const word_t buffer_size_in_bytes, void *buffer)
181+ void write(disvm::vm_t &vm, const word_t buffer_size_in_bytes, void *buffer)
182182 {
183183 if (_ostream == nullptr)
184184 throw vm_system_exception{ "File descriptor not open for write operation" };
185185
186186 _ostream->write(static_cast<char *>(buffer), static_cast<const std::streamsize>(buffer_size_in_bytes));
187187 if (_ostream->bad())
188− throw vm_user_exception{ "Write operation error" };
188+ throw vm_syscall_exception{ vm, "Write operation error" };
189189 }
190190
191191 big_t seek(const std::ios::seekdir start, const big_t offset)
@@ -470,7 +470,16 @@ void · 278 unmodified lines
470470 Sys_fildes(vm_registers_t &r, vm_t &vm)
471471 {
472472 auto &fp = r.stack.peek_frame()->base<F_Sys_fildes>();
473− throw vm_system_exception{ "Instruction not implemented" };
473+
474+ dec_ref_count_and_free(vm_alloc_t::from_allocation(*fp.ret));
475+ *fp.ret = nullptr;
476+
477+ auto fd = sys::fetch_fd_record(fp.fd);
478+ if (fd != nullptr)
479+ {
480+ fd->add_ref();
481+ *fp.ret = fd->get_allocation();
482+ }
474483 }
475484
476485 void
@@ -608,16 +617,16 @@ Sys_print(vm_registers_t &r, vm_t &vm) · 131 unmodified lines
608617
609618 auto static_buffer = std::array<char, 1024>{};
610619 auto msg_args = &fp.vargs;
611− auto written = sys::printf_to_buffer(*str, msg_args, fp_base, static_buffer.size(), static_buffer.data());
620+ auto written = sys::printf_to_buffer(vm, *str, msg_args, fp_base, static_buffer.size(), static_buffer.data());
612621 if (written >= 0)
613622 {
614− fd_stdout->write(written, static_buffer.data());
623+ fd_stdout->write(vm, written, static_buffer.data());
615624 }
616625 else
617626 {
618627 auto dynamic_buffer = std::vector<char>(static_buffer.size() * 2);
619− written = sys::printf_to_dynamic_buffer(*str, msg_args, fp_base, dynamic_buffer);
620− fd_stdout->write(written, dynamic_buffer.data());
628+ written = sys::printf_to_dynamic_buffer(vm, *str, msg_args, fp_base, dynamic_buffer);
629+ fd_stdout->write(vm, written, dynamic_buffer.data());
621630 }
622631
623632 *fp.ret = written;
@@ -657,7 +666,7 @@ Sys_read(vm_registers_t &r, vm_t &vm) · 33 unmodified lines
657666 assert(fd_alloc->alloc_type == T_FD);
658667
659668 auto fd = fd_alloc->get_allocation<vm_fd_t>();
660− *fp.ret = fd->read(n, buffer->at(0));
669+ *fp.ret = fd->read(vm, n, buffer->at(0));
661670 }
662671
663672 void
@@ -729,19 +738,28 @@ namespace · 65 unmodified lines
729738 bool is_delim(const runtime::rune_t c, const vm_string_t &delim)
730739 {
731740 const auto max = delim.get_length();
732− assert(max > 0);
733741
734742 // Optimization for 3 or less delimiters
735743 switch (max)
736744 {
737745 default:
738746 break;
739− case 1:
740− return (delim.get_rune(0) == c);
741− case 2:
742− return (delim.get_rune(0) == c) || (delim.get_rune(1) == c);
743747 case 3:
744− return (delim.get_rune(0) == c) || (delim.get_rune(1) == c) || (delim.get_rune(2) == c);
748+ if (delim.get_rune(2) != c)
749+ {
750+ case 2:
751+ if (delim.get_rune(1) != c)
752+ {
753+ case 1:
754+ if (delim.get_rune(0) != c)
755+ {
756+ case 0:
757+ return false;
758+ }
759+ }
760+ }
761+
762+ return true;
745763 }
746764
747765 for (auto i = word_t{ 0 }; i < max; ++i)
@@ -900,7 +918,7 @@ Sys_write(vm_registers_t &r, vm_t &vm) · 152 unmodified lines
900918 assert(fd_alloc->alloc_type == T_FD);
901919
902920 auto fd = fd_alloc->get_allocation<vm_fd_t>();
903− fd->write(n, buffer->at(0));
921+ fd->write(vm, n, buffer->at(0));
904922
905923 *fp.ret = n;
906924 }