Skip to content

Commit 45ea3ae

Browse files
authored
Merge pull request #43 from ruoso/improvements
Improvements
2 parents 875213b + e8bd411 commit 45ea3ae

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+509
-108
lines changed

.github/workflows/c-cpp.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ jobs:
1414
steps:
1515
- uses: actions/checkout@v3
1616
- name: build-depends
17-
run: sudo apt-get -y install libgtest-dev build-essential cmake libgtest-dev libuv1-dev
17+
run: sudo apt update && sudo apt -y install libgtest-dev build-essential cmake libgtest-dev libuv1-dev && sudo apt clean
1818
- name: configure
19-
run: mkdir build && cd build && cmake ../
19+
run: mkdir build && cd build && cmake ../ -DCMAKE_BUILD_TYPE=Debug
2020
- name: make
21-
run: make -C build/ VERBOSE=1
21+
run: make -j8 -C build/ VERBOSE=1
2222
- name: make test
23-
run: make -C build/ test VERBOSE=1
23+
run: ctest --test-dir build/ --output-on-failure

CMakeLists.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ add_library(
5858
src/networkprotocoldsl/operation.hpp
5959
src/networkprotocoldsl/operation/add.cpp
6060
src/networkprotocoldsl/operation/add.hpp
61+
src/networkprotocoldsl/operation/dictionaryget.cpp
62+
src/networkprotocoldsl/operation/dictionaryinitialize.cpp
63+
src/networkprotocoldsl/operation/dictionaryset.cpp
6164
src/networkprotocoldsl/operation/dynamiclist.cpp
6265
src/networkprotocoldsl/operation/dynamiclist.hpp
6366
src/networkprotocoldsl/operation/eq.cpp
@@ -110,6 +113,8 @@ add_library(
110113
src/networkprotocoldsl/operation/writeoctets.hpp
111114
src/networkprotocoldsl/operation/writestaticoctets.cpp
112115
src/networkprotocoldsl/operation/writestaticoctets.hpp
116+
src/networkprotocoldsl/operation/lexicalpadasdict.cpp
117+
src/networkprotocoldsl/operation/lexicalpadasdict.hpp
113118
src/networkprotocoldsl/parser/grammar/identifier.hpp
114119
src/networkprotocoldsl/parser/grammar/identifier.cpp
115120
src/networkprotocoldsl/parser/grammar/literals.hpp
@@ -195,6 +200,8 @@ add_library(
195200
src/networkprotocoldsl/operationconcepts.hpp
196201
src/networkprotocoldsl/optree.cpp
197202
src/networkprotocoldsl/optree.hpp
203+
src/networkprotocoldsl/print_optreenode.cpp
204+
src/networkprotocoldsl/print_optreenode.hpp
198205
src/networkprotocoldsl/value.cpp
199206
src/networkprotocoldsl/value.hpp
200207
)

src/networkprotocoldsl/executionstackframe.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
#include <networkprotocoldsl/executionstackframe.hpp>
22
#include <networkprotocoldsl/operationconcepts.hpp>
3+
#include <networkprotocoldsl/print_optreenode.hpp>
34
#include <networkprotocoldsl/value.hpp>
45

56
#include <cassert>
7+
#include <fstream>
8+
#include <iostream>
69
#include <memory>
10+
#include <thread>
711

812
namespace networkprotocoldsl {
913

@@ -141,8 +145,25 @@ bool ExecutionStackFrame::has_arguments_ready() {
141145

142146
std::shared_ptr<LexicalPad> ExecutionStackFrame::get_pad() { return pad; }
143147

148+
static std::string get_debug_stream_file_name() {
149+
std::thread::id this_id = std::this_thread::get_id();
150+
std::ostringstream ss;
151+
ss << "/tmp/thread_";
152+
ss << this_id;
153+
ss << "_debug.log";
154+
return ss.str();
155+
}
156+
157+
static void do_debug(ExecutionStackFrame *frame) {
158+
thread_local static std::ofstream debug_file(get_debug_stream_file_name(),
159+
std::ios_base::app);
160+
print_optreenode(frame->optreenode, debug_file, "> ", "| ");
161+
}
162+
144163
OperationResult ExecutionStackFrame::execute() {
145164
assert(has_arguments_ready());
165+
166+
do_debug(this);
146167
return std::visit(
147168
[this](auto &o) { return execute_specific_operation(this, o); },
148169
optreenode.operation);

src/networkprotocoldsl/executionstackframe.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@ using OperationContextVariant =
2222
* only happen when the right number of inputs has been provided.
2323
*/
2424
class ExecutionStackFrame {
25+
public:
2526
const OpTreeNode &optreenode;
27+
28+
private:
2629
std::shared_ptr<std::vector<Value>> accumulator;
2730
OperationContextVariant ctx;
2831
std::shared_ptr<LexicalPad> pad;

src/networkprotocoldsl/interpreterrunner.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ static bool handle_read(InterpreterContext &context,
4242
} else {
4343
if (context.eof.load()) {
4444
context.interpreter.handle_eof();
45+
signals.wake_up_for_output.notify();
46+
signals.wake_up_interpreter.notify();
47+
signals.wake_up_for_input.notify();
48+
signals.wake_up_for_callback.notify();
4549
} else {
4650
signals.wake_up_for_input.notify();
4751
}
@@ -52,6 +56,10 @@ static bool handle_read(InterpreterContext &context,
5256
bool handle_write(InterpreterContext &context, InterpreterSignals &signals) {
5357
if (context.eof.load()) {
5458
context.interpreter.handle_eof();
59+
signals.wake_up_for_output.notify();
60+
signals.wake_up_interpreter.notify();
61+
signals.wake_up_for_input.notify();
62+
signals.wake_up_for_callback.notify();
5563
return true;
5664
} else {
5765
auto buffer = context.interpreter.get_write_buffer();

src/networkprotocoldsl/lexer/tokenize.cpp

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
#include <cstdlib>
77
#include <functional>
88
#include <optional>
9+
#include <string>
910
#include <string_view>
11+
#include <unordered_map>
1012
#include <vector>
1113

1214
#include <lexertl/generator.hpp>
@@ -15,6 +17,40 @@
1517
namespace networkprotocoldsl::lexer {
1618
namespace {
1719

20+
// Function to unescape string literals
21+
std::string unescape_string(const std::string &str) {
22+
std::string result;
23+
result.reserve(str.size());
24+
for (size_t i = 0; i < str.size(); ++i) {
25+
if (str[i] == '\\' && i + 1 < str.size()) {
26+
switch (str[i + 1]) {
27+
case 'n':
28+
result += '\n';
29+
break;
30+
case 't':
31+
result += '\t';
32+
break;
33+
case 'r':
34+
result += '\r';
35+
break;
36+
case '\\':
37+
result += '\\';
38+
break;
39+
case '\"':
40+
result += '\"';
41+
break;
42+
default:
43+
result += str[i + 1];
44+
break;
45+
}
46+
++i;
47+
} else {
48+
result += str[i];
49+
}
50+
}
51+
return result;
52+
}
53+
1854
struct TokenRule {
1955
std::string_view pattern;
2056
std::function<void(std::vector<Token> &, const std::string_view &)> pusher;
@@ -36,10 +72,10 @@ const std::vector<TokenRule> token_rules = {
3672
[](TP_ARGS) {
3773
tokens.push_back(token::literal::Integer{std::atoi(str.data())});
3874
}},
39-
{"\\\"[^\"]*\\\"",
75+
{"\\\"([^\"\\\\]|\\\\.)*\\\"",
4076
[](TP_ARGS) {
4177
tokens.push_back(token::literal::String{
42-
std::string(str.substr(1, str.length() - 2))});
78+
unescape_string(std::string(str.substr(1, str.length() - 2)))});
4379
}},
4480
{">",
4581
[](TP_ARGS) {

src/networkprotocoldsl/lexicalpad.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,9 @@ void LexicalPad::initialize_global(const std::string &name, Value v) {
4242
}
4343
}
4444

45+
Value LexicalPad::as_dict() const {
46+
return value::Dictionary{
47+
std::make_shared<std::unordered_map<std::string, Value>>(pad)};
48+
}
49+
4550
} // namespace networkprotocoldsl

src/networkprotocoldsl/lexicalpad.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class LexicalPad {
2222
Value set(const std::string &name, Value v);
2323
void initialize(const std::string &name, Value v);
2424
void initialize_global(const std::string &name, Value v);
25+
Value as_dict() const;
2526
};
2627

2728
} // namespace networkprotocoldsl

src/networkprotocoldsl/operation.hpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
#define NETWORKPROTOCOLDSL_OPERATION_HPP
33

44
#include <networkprotocoldsl/operation/add.hpp>
5+
#include <networkprotocoldsl/operation/dictionaryget.hpp>
6+
#include <networkprotocoldsl/operation/dictionaryinitialize.hpp>
7+
#include <networkprotocoldsl/operation/dictionaryset.hpp>
58
#include <networkprotocoldsl/operation/dynamiclist.hpp>
69
#include <networkprotocoldsl/operation/eq.hpp>
710
#include <networkprotocoldsl/operation/functioncall.hpp>
@@ -11,6 +14,7 @@
1114
#include <networkprotocoldsl/operation/int32literal.hpp>
1215
#include <networkprotocoldsl/operation/inttoascii.hpp>
1316
#include <networkprotocoldsl/operation/lesserequal.hpp>
17+
#include <networkprotocoldsl/operation/lexicalpadasdict.hpp>
1418
#include <networkprotocoldsl/operation/lexicalpadget.hpp>
1519
#include <networkprotocoldsl/operation/lexicalpadinitialize.hpp>
1620
#include <networkprotocoldsl/operation/lexicalpadinitializeglobal.hpp>
@@ -52,7 +56,9 @@ using Operation = std::variant<
5256
operation::StaticCallable, operation::Subtract,
5357
operation::TerminateListIfReadAhead, operation::UnaryCallback,
5458
operation::WriteInt32Native, operation::WriteOctets,
55-
operation::WriteStaticOctets>;
59+
operation::WriteStaticOctets, operation::DictionaryInitialize,
60+
operation::DictionarySet, operation::DictionaryGet,
61+
operation::LexicalPadAsDict>;
5662

5763
} // namespace networkprotocoldsl
5864

src/networkprotocoldsl/operation/add.cpp

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,36 +5,21 @@ namespace networkprotocoldsl::operation {
55

66
static Value _add(int32_t lhs, int32_t rhs) { return rhs + lhs; }
77

8-
static Value _add(int32_t lhs, auto rhs) {
9-
return value::RuntimeError::TypeError;
10-
}
11-
12-
static Value _add(int32_t lhs, value::RuntimeError rhs) { return rhs; }
13-
14-
static Value _add(int32_t lhs, value::ControlFlowInstruction rhs) {
15-
return rhs;
16-
}
17-
18-
static Value _add(int32_t lhs, Value rhs) {
19-
return std::visit([&lhs](auto rhs_v) -> Value { return _add(lhs, rhs_v); },
20-
rhs);
21-
}
22-
23-
static Value _add(value::Callable lhs, auto rhs) {
24-
return value::RuntimeError::TypeError;
25-
}
8+
static Value _add(auto &, auto &) { return value::RuntimeError::TypeError; }
269

2710
static Value _add(value::RuntimeError lhs, auto rhs) { return lhs; }
2811

2912
static Value _add(value::ControlFlowInstruction lhs, auto rhs) { return lhs; }
3013

31-
template <typename LHS, typename RHS> static Value _add(LHS lhs, RHS rhs) {
32-
return value::RuntimeError::TypeError;
14+
static Value _add(int32_t lhs, value::RuntimeError rhs) { return rhs; }
15+
16+
static Value _add(int32_t lhs, value::ControlFlowInstruction rhs) {
17+
return rhs;
3318
}
3419

3520
Value Add::operator()(Arguments a) const {
36-
return std::visit([&a](auto lhs) { return _add(lhs, std::get<1>(a)); },
37-
std::get<0>(a));
21+
return std::visit([](auto lhs, auto rhs) { return _add(lhs, rhs); },
22+
std::get<0>(a), std::get<1>(a));
3823
}
3924

4025
} // namespace networkprotocoldsl::operation

0 commit comments

Comments
 (0)