diff --git a/luprex/cpp/core/enginewrapper.hpp b/luprex/cpp/core/enginewrapper.hpp index dcbce268..688ab496 100644 --- a/luprex/cpp/core/enginewrapper.hpp +++ b/luprex/cpp/core/enginewrapper.hpp @@ -33,6 +33,7 @@ enum class AccessKind { PROBE_LUA_CALL, CONNECT_TO_SERVER, VALIDATE_LUA_EXPR, + CHANNEL_PRINTS, }; class DrivenEngine; diff --git a/luprex/cpp/core/lpxclient.cpp b/luprex/cpp/core/lpxclient.cpp index eb538e40..feb36940 100644 --- a/luprex/cpp/core/lpxclient.cpp +++ b/luprex/cpp/core/lpxclient.cpp @@ -270,6 +270,13 @@ public: retpk->write_bytes(errmsg); break; } + case AccessKind::CHANNEL_PRINTS: { + world_to_asynchronous(); + if (print_channeler_.channel(world_->get_printbuffer(actor_id_), retpk)) { + send_invocation(print_channeler_.invocation(actor_id_)); + } + break; + } default: { util::dprint("Invalid event_access: ", int(kind)); } @@ -305,11 +312,6 @@ public: world_to_asynchronous(); } } - - // Channel print statements. - if (print_channeler_.channel(world_->get_printbuffer(actor_id_), stdostream())) { - send_invocation(print_channeler_.invocation(actor_id_)); - } } }; diff --git a/luprex/cpp/core/lpxserver.cpp b/luprex/cpp/core/lpxserver.cpp index b5f8f4f1..11a00251 100644 --- a/luprex/cpp/core/lpxserver.cpp +++ b/luprex/cpp/core/lpxserver.cpp @@ -63,6 +63,9 @@ public: // Export stuff to the graphics engine. set_visible_world_and_actor(master_.get(), admin_id_); + // Reset the print channeler. + print_channeler_.reset(); + // Trigger the loading of the lua source. rescan_lua_source(true); } @@ -194,6 +197,12 @@ public: retpk->write_bytes(errmsg); break; } + case AccessKind::CHANNEL_PRINTS: { + if (print_channeler_.channel(master_->get_printbuffer(admin_id_), retpk)) { + master_->invoke(print_channeler_.invocation(admin_id_)); + } + break; + } default: { stdostream() << "Invalid event_access: " << int(kind) << std::endl; } @@ -220,11 +229,6 @@ public: do_command(console_.get_command()); } - // Anything in the administrator printbuffer should go to stdostream. - if (print_channeler_.channel(master_->get_printbuffer(admin_id_), stdostream())) { - master_->invoke(print_channeler_.invocation(admin_id_)); - } - // Check for new incoming channels, set up client structures. while (true) { SharedChannel chan = new_incoming_channel(); diff --git a/luprex/cpp/core/luaconsole.cpp b/luprex/cpp/core/luaconsole.cpp index 602f5758..324210f7 100644 --- a/luprex/cpp/core/luaconsole.cpp +++ b/luprex/cpp/core/luaconsole.cpp @@ -91,7 +91,7 @@ void LuaConsole::add(eng::string line) { // Try to parse the lua expression { LuaVar result; - LuaDefStack LS(lua_state_, result); + LuaExtStack LS(lua_state_, result); eng::string errmsg = LS.load(result, partial, "stdin"); if (errmsg.empty()) { words_.push_back(lua_mode); diff --git a/luprex/cpp/core/printbuffer.cpp b/luprex/cpp/core/printbuffer.cpp index 4266a625..6c75c1a7 100644 --- a/luprex/cpp/core/printbuffer.cpp +++ b/luprex/cpp/core/printbuffer.cpp @@ -17,8 +17,7 @@ struct PrintBufferCore : public eng::opnew { // Line number of the first unchecked line in the buffer. All line // numbers including this one and beyond are unchecked. // "Unchecked" lines are lines in a non-authoritative model - // that haven't been verified through difference transmission. - + // that haven't been verified through difference transmission int first_unchecked_; // Constructor. @@ -180,13 +179,15 @@ void PrintBuffer::patch(StreamBuffer *sb, DebugCollector *dbc) { } } -bool PrintChanneler::channel(const PrintBuffer *printbuffer, std::ostream &ostream) { +bool PrintChanneler::channel(const PrintBuffer *printbuffer, StreamBuffer *sb) { if (printbuffer == nullptr) return false; if (printbuffer->first_line() > line_) { line_ = printbuffer->first_line(); } while (line_ < printbuffer->first_unchecked()) { - ostream << "|" << printbuffer->nth(line_) << std::endl; + sb->write_bytes("|"); + sb->write_bytes(printbuffer->nth(line_)); + sb->write_bytes("\n"); line_ += 1; } return line_ > printbuffer->first_line(); diff --git a/luprex/cpp/core/printbuffer.hpp b/luprex/cpp/core/printbuffer.hpp index c39316de..de9a8d96 100644 --- a/luprex/cpp/core/printbuffer.hpp +++ b/luprex/cpp/core/printbuffer.hpp @@ -152,7 +152,7 @@ public: // Copy any new lines from the printbuffer to the stdostream. // Update the current line number. Return true if the printbuffer // contains any lines that have already been channeled. - bool channel(const PrintBuffer *pb, std::ostream &ostream); + bool channel(const PrintBuffer *pb, StreamBuffer *sb); // Generate an invocation that removes unnecessary lines from the // printbuffer.