yarp 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +36 -0
- data/CONTRIBUTING.md +4 -0
- data/{Makefile.in → Makefile} +3 -4
- data/README.md +1 -1
- data/config.yml +29 -7
- data/docs/build_system.md +4 -15
- data/docs/building.md +1 -5
- data/docs/encoding.md +1 -0
- data/docs/{extension.md → ruby_api.md} +6 -3
- data/docs/serialization.md +71 -24
- data/ext/yarp/api_node.c +38 -6
- data/ext/yarp/extconf.rb +15 -10
- data/ext/yarp/extension.c +2 -0
- data/ext/yarp/extension.h +1 -1
- data/include/yarp/ast.h +108 -104
- data/include/yarp/defines.h +0 -15
- data/include/yarp/enc/yp_encoding.h +1 -0
- data/include/yarp/util/yp_buffer.h +1 -0
- data/include/yarp/util/yp_string.h +5 -1
- data/include/yarp/version.h +2 -3
- data/include/yarp.h +4 -2
- data/lib/yarp/ffi.rb +211 -0
- data/lib/yarp/lex_compat.rb +16 -2
- data/lib/yarp/node.rb +169 -117
- data/lib/yarp/ripper_compat.rb +3 -3
- data/lib/yarp/serialize.rb +285 -92
- data/lib/yarp.rb +167 -2
- data/src/enc/yp_unicode.c +9 -0
- data/src/node.c +22 -0
- data/src/prettyprint.c +49 -30
- data/src/serialize.c +90 -17
- data/src/util/yp_string.c +8 -17
- data/src/yarp.c +181 -49
- data/yarp.gemspec +5 -5
- metadata +6 -6
- data/config.h.in +0 -25
- data/configure +0 -4487
data/src/serialize.c
CHANGED
@@ -5,10 +5,7 @@
|
|
5
5
|
/* if you are looking to modify the */
|
6
6
|
/* template */
|
7
7
|
/******************************************************************************/
|
8
|
-
#include "yarp
|
9
|
-
#include "yarp/diagnostic.h"
|
10
|
-
#include "yarp/parser.h"
|
11
|
-
#include "yarp/util/yp_buffer.h"
|
8
|
+
#include "yarp.h"
|
12
9
|
|
13
10
|
#include <stdio.h>
|
14
11
|
|
@@ -299,7 +296,7 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
|
|
299
296
|
} else {
|
300
297
|
yp_serialize_node(parser, (yp_node_t *)((yp_call_node_t *)node)->block, buffer);
|
301
298
|
}
|
302
|
-
yp_buffer_append_u32(buffer,
|
299
|
+
yp_buffer_append_u32(buffer, node->flags >> 1);
|
303
300
|
uint32_t name_length = yp_sizet_to_u32(yp_string_length(&((yp_call_node_t *)node)->name));
|
304
301
|
yp_buffer_append_u32(buffer, name_length);
|
305
302
|
yp_buffer_append_str(buffer, yp_string_source(&((yp_call_node_t *)node)->name), name_length);
|
@@ -496,10 +493,10 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
|
|
496
493
|
break;
|
497
494
|
}
|
498
495
|
case YP_NODE_DEF_NODE: {
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
496
|
+
// serialize length
|
497
|
+
// encoding of location u32s make us need to save this offset.
|
498
|
+
size_t length_offset = buffer->length;
|
499
|
+
yp_buffer_append_str(buffer, "\0\0\0\0", 4); /* consume 4 bytes, updated below */
|
503
500
|
serialize_location(parser, &((yp_def_node_t *)node)->name_loc, buffer);
|
504
501
|
if (((yp_def_node_t *)node)->receiver == NULL) {
|
505
502
|
yp_buffer_append_u8(buffer, 0);
|
@@ -552,9 +549,9 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
|
|
552
549
|
yp_buffer_append_u8(buffer, 1);
|
553
550
|
serialize_location(parser, &((yp_def_node_t *)node)->end_keyword_loc, buffer);
|
554
551
|
}
|
555
|
-
|
556
|
-
|
557
|
-
|
552
|
+
// serialize length
|
553
|
+
uint32_t length = yp_sizet_to_u32(buffer->length - offset - sizeof(uint32_t));
|
554
|
+
memcpy(buffer->value + length_offset, &length, sizeof(uint32_t));
|
558
555
|
break;
|
559
556
|
}
|
560
557
|
case YP_NODE_DEFINED_NODE: {
|
@@ -644,6 +641,21 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
|
|
644
641
|
}
|
645
642
|
break;
|
646
643
|
}
|
644
|
+
case YP_NODE_FLIP_FLOP_NODE: {
|
645
|
+
if (((yp_flip_flop_node_t *)node)->left == NULL) {
|
646
|
+
yp_buffer_append_u8(buffer, 0);
|
647
|
+
} else {
|
648
|
+
yp_serialize_node(parser, (yp_node_t *)((yp_flip_flop_node_t *)node)->left, buffer);
|
649
|
+
}
|
650
|
+
if (((yp_flip_flop_node_t *)node)->right == NULL) {
|
651
|
+
yp_buffer_append_u8(buffer, 0);
|
652
|
+
} else {
|
653
|
+
yp_serialize_node(parser, (yp_node_t *)((yp_flip_flop_node_t *)node)->right, buffer);
|
654
|
+
}
|
655
|
+
serialize_location(parser, &((yp_flip_flop_node_t *)node)->operator_loc, buffer);
|
656
|
+
yp_buffer_append_u32(buffer, node->flags >> 1);
|
657
|
+
break;
|
658
|
+
}
|
647
659
|
case YP_NODE_FLOAT_NODE: {
|
648
660
|
break;
|
649
661
|
}
|
@@ -851,7 +863,7 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
|
|
851
863
|
yp_serialize_node(parser, (yp_node_t *) ((yp_interpolated_regular_expression_node_t *)node)->parts.nodes[index], buffer);
|
852
864
|
}
|
853
865
|
serialize_location(parser, &((yp_interpolated_regular_expression_node_t *)node)->closing_loc, buffer);
|
854
|
-
yp_buffer_append_u32(buffer,
|
866
|
+
yp_buffer_append_u32(buffer, node->flags >> 1);
|
855
867
|
break;
|
856
868
|
}
|
857
869
|
case YP_NODE_INTERPOLATED_STRING_NODE: {
|
@@ -1192,7 +1204,7 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
|
|
1192
1204
|
yp_serialize_node(parser, (yp_node_t *)((yp_range_node_t *)node)->right, buffer);
|
1193
1205
|
}
|
1194
1206
|
serialize_location(parser, &((yp_range_node_t *)node)->operator_loc, buffer);
|
1195
|
-
yp_buffer_append_u32(buffer,
|
1207
|
+
yp_buffer_append_u32(buffer, node->flags >> 1);
|
1196
1208
|
break;
|
1197
1209
|
}
|
1198
1210
|
case YP_NODE_RATIONAL_NODE: {
|
@@ -1209,7 +1221,7 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
|
|
1209
1221
|
uint32_t unescaped_length = yp_sizet_to_u32(yp_string_length(&((yp_regular_expression_node_t *)node)->unescaped));
|
1210
1222
|
yp_buffer_append_u32(buffer, unescaped_length);
|
1211
1223
|
yp_buffer_append_str(buffer, yp_string_source(&((yp_regular_expression_node_t *)node)->unescaped), unescaped_length);
|
1212
|
-
yp_buffer_append_u32(buffer,
|
1224
|
+
yp_buffer_append_u32(buffer, node->flags >> 1);
|
1213
1225
|
break;
|
1214
1226
|
}
|
1215
1227
|
case YP_NODE_REQUIRED_DESTRUCTURED_PARAMETER_NODE: {
|
@@ -1443,7 +1455,7 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
|
|
1443
1455
|
} else {
|
1444
1456
|
yp_serialize_node(parser, (yp_node_t *)((yp_until_node_t *)node)->statements, buffer);
|
1445
1457
|
}
|
1446
|
-
yp_buffer_append_u32(buffer,
|
1458
|
+
yp_buffer_append_u32(buffer, node->flags >> 1);
|
1447
1459
|
break;
|
1448
1460
|
}
|
1449
1461
|
case YP_NODE_WHEN_NODE: {
|
@@ -1468,7 +1480,7 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
|
|
1468
1480
|
} else {
|
1469
1481
|
yp_serialize_node(parser, (yp_node_t *)((yp_while_node_t *)node)->statements, buffer);
|
1470
1482
|
}
|
1471
|
-
yp_buffer_append_u32(buffer,
|
1483
|
+
yp_buffer_append_u32(buffer, node->flags >> 1);
|
1472
1484
|
break;
|
1473
1485
|
}
|
1474
1486
|
case YP_NODE_X_STRING_NODE: {
|
@@ -1504,6 +1516,24 @@ yp_serialize_node(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
|
|
1504
1516
|
}
|
1505
1517
|
}
|
1506
1518
|
|
1519
|
+
void yp_serialize_comment(yp_parser_t *parser, yp_comment_t *comment, yp_buffer_t *buffer) {
|
1520
|
+
// serialize type
|
1521
|
+
yp_buffer_append_u8(buffer, (uint8_t) comment->type);
|
1522
|
+
|
1523
|
+
// serialize location
|
1524
|
+
yp_buffer_append_u32(buffer, yp_ptrdifft_to_u32(comment->start - parser->start));
|
1525
|
+
yp_buffer_append_u32(buffer, yp_ptrdifft_to_u32(comment->end - comment->start));
|
1526
|
+
}
|
1527
|
+
|
1528
|
+
void yp_serialize_comment_list(yp_parser_t *parser, yp_list_t list, yp_buffer_t *buffer) {
|
1529
|
+
yp_buffer_append_u32(buffer, yp_list_size(&list));
|
1530
|
+
|
1531
|
+
yp_comment_t *comment;
|
1532
|
+
for (comment = (yp_comment_t *) list.head; comment != NULL; comment = (yp_comment_t *) comment->node.next) {
|
1533
|
+
yp_serialize_comment(parser, comment, buffer);
|
1534
|
+
}
|
1535
|
+
}
|
1536
|
+
|
1507
1537
|
void yp_serialize_diagnostic(yp_parser_t *parser, yp_diagnostic_t *diagnostic, yp_buffer_t *buffer) {
|
1508
1538
|
// serialize message
|
1509
1539
|
size_t message_length = strlen(diagnostic->message);
|
@@ -1524,6 +1554,7 @@ void yp_serialize_diagnostic_list(yp_parser_t *parser, yp_list_t list, yp_buffer
|
|
1524
1554
|
}
|
1525
1555
|
}
|
1526
1556
|
|
1557
|
+
#line 145 "serialize.c.erb"
|
1527
1558
|
void
|
1528
1559
|
yp_serialize_content(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer) {
|
1529
1560
|
// First, serialize the encoding of the parser.
|
@@ -1531,6 +1562,9 @@ yp_serialize_content(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer)
|
|
1531
1562
|
yp_buffer_append_u32(buffer, yp_sizet_to_u32(encoding_length));
|
1532
1563
|
yp_buffer_append_str(buffer, parser->encoding.name, encoding_length);
|
1533
1564
|
|
1565
|
+
// Serialize the comments
|
1566
|
+
yp_serialize_comment_list(parser, parser->comment_list, buffer);
|
1567
|
+
|
1534
1568
|
// Serialize the errors
|
1535
1569
|
yp_serialize_diagnostic_list(parser, parser->error_list, buffer);
|
1536
1570
|
|
@@ -1574,3 +1608,42 @@ yp_serialize_content(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer)
|
|
1574
1608
|
}
|
1575
1609
|
}
|
1576
1610
|
}
|
1611
|
+
|
1612
|
+
static void
|
1613
|
+
serialize_token(void *data, yp_parser_t *parser, yp_token_t *token) {
|
1614
|
+
yp_buffer_t *buffer = (yp_buffer_t *) data;
|
1615
|
+
|
1616
|
+
yp_buffer_append_u32(buffer, token->type);
|
1617
|
+
yp_buffer_append_u32(buffer, yp_ptrdifft_to_u32(token->start - parser->start));
|
1618
|
+
yp_buffer_append_u32(buffer, yp_ptrdifft_to_u32(token->end - token->start));
|
1619
|
+
yp_buffer_append_u32(buffer, parser->lex_state);
|
1620
|
+
}
|
1621
|
+
|
1622
|
+
YP_EXPORTED_FUNCTION void
|
1623
|
+
yp_lex_serialize(const char *source, size_t size, const char *filepath, yp_buffer_t *buffer) {
|
1624
|
+
yp_parser_t parser;
|
1625
|
+
yp_parser_init(&parser, source, size, filepath);
|
1626
|
+
|
1627
|
+
yp_lex_callback_t lex_callback = (yp_lex_callback_t) {
|
1628
|
+
.data = (void *) buffer,
|
1629
|
+
.callback = serialize_token,
|
1630
|
+
};
|
1631
|
+
|
1632
|
+
parser.lex_callback = &lex_callback;
|
1633
|
+
yp_node_t *node = yp_parse(&parser);
|
1634
|
+
|
1635
|
+
// Append 0 to mark end of tokens
|
1636
|
+
yp_buffer_append_u32(buffer, 0);
|
1637
|
+
|
1638
|
+
// Serialize the comments
|
1639
|
+
yp_serialize_comment_list(&parser, parser.comment_list, buffer);
|
1640
|
+
|
1641
|
+
// Serialize the errors
|
1642
|
+
yp_serialize_diagnostic_list(&parser, parser.error_list, buffer);
|
1643
|
+
|
1644
|
+
// Serialize the warnings
|
1645
|
+
yp_serialize_diagnostic_list(&parser, parser.warning_list, buffer);
|
1646
|
+
|
1647
|
+
yp_node_destroy(&parser, node);
|
1648
|
+
yp_parser_free(&parser);
|
1649
|
+
}
|
data/src/util/yp_string.c
CHANGED
@@ -97,10 +97,8 @@ yp_string_free(yp_string_t *string) {
|
|
97
97
|
void *memory = (void *) string->source;
|
98
98
|
#if defined(_WIN32)
|
99
99
|
UnmapViewOfFile(memory);
|
100
|
-
#elif defined(HAVE_MMAP)
|
101
|
-
munmap(memory, string->length);
|
102
100
|
#else
|
103
|
-
|
101
|
+
munmap(memory, string->length);
|
104
102
|
#endif
|
105
103
|
}
|
106
104
|
}
|
@@ -180,28 +178,21 @@ yp_string_mapped_init(yp_string_t *string, const char *filepath) {
|
|
180
178
|
return true;
|
181
179
|
}
|
182
180
|
|
183
|
-
#ifdef HAVE_MMAP
|
184
181
|
source = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0);
|
185
182
|
if (source == MAP_FAILED) {
|
186
183
|
perror("Map failed");
|
187
184
|
return false;
|
188
185
|
}
|
189
|
-
#else
|
190
|
-
source = malloc(size);
|
191
|
-
if (source == NULL) {
|
192
|
-
return false;
|
193
|
-
}
|
194
|
-
|
195
|
-
ssize_t read_size = read(fd, (void *) source, size);
|
196
|
-
if (read_size < 0 || (size_t)read_size != size) {
|
197
|
-
perror("Read size is incorrect");
|
198
|
-
free((void *) source);
|
199
|
-
return false;
|
200
|
-
}
|
201
|
-
#endif
|
202
186
|
|
203
187
|
close(fd);
|
204
188
|
yp_string_mapped_init_internal(string, source, size);
|
205
189
|
return true;
|
206
190
|
#endif
|
207
191
|
}
|
192
|
+
|
193
|
+
// Returns the size of the yp_string_t struct. This is necessary to allocate the
|
194
|
+
// correct amount of memory in the FFI backend.
|
195
|
+
YP_EXPORTED_FUNCTION size_t
|
196
|
+
yp_string_sizeof(void) {
|
197
|
+
return sizeof(yp_string_t);
|
198
|
+
}
|