yarp 0.9.0 → 0.10.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 +15 -1
- data/Makefile +5 -1
- data/config.yml +156 -125
- data/docs/encoding.md +5 -5
- data/docs/serialization.md +2 -2
- data/ext/yarp/api_node.c +142 -98
- data/ext/yarp/extension.c +21 -7
- data/ext/yarp/extension.h +1 -1
- data/include/yarp/ast.h +327 -18
- data/include/yarp/defines.h +2 -1
- data/include/yarp/diagnostic.h +3 -3
- data/include/yarp/enc/yp_encoding.h +10 -10
- data/include/yarp/parser.h +19 -19
- data/include/yarp/regexp.h +1 -1
- data/include/yarp/unescape.h +4 -4
- data/include/yarp/util/yp_buffer.h +3 -0
- data/include/yarp/util/yp_char.h +16 -16
- data/include/yarp/util/yp_constant_pool.h +2 -2
- data/include/yarp/util/yp_newline_list.h +5 -5
- data/include/yarp/util/yp_string.h +4 -4
- data/include/yarp/util/yp_string_list.h +0 -3
- data/include/yarp/util/yp_strpbrk.h +1 -1
- data/include/yarp/version.h +2 -2
- data/include/yarp.h +5 -4
- data/lib/yarp/desugar_visitor.rb +59 -122
- data/lib/yarp/node.rb +230 -240
- data/lib/yarp/serialize.rb +16 -16
- data/lib/yarp.rb +5 -5
- data/src/diagnostic.c +1 -1
- data/src/enc/yp_big5.c +15 -42
- data/src/enc/yp_euc_jp.c +16 -43
- data/src/enc/yp_gbk.c +19 -46
- data/src/enc/yp_shift_jis.c +16 -43
- data/src/enc/yp_tables.c +36 -38
- data/src/enc/yp_unicode.c +20 -25
- data/src/enc/yp_windows_31j.c +16 -43
- data/src/node.c +1271 -899
- data/src/prettyprint.c +87 -48
- data/src/regexp.c +21 -21
- data/src/serialize.c +28 -15
- data/src/unescape.c +151 -121
- data/src/util/yp_buffer.c +7 -2
- data/src/util/yp_char.c +34 -34
- data/src/util/yp_constant_pool.c +4 -4
- data/src/util/yp_memchr.c +1 -1
- data/src/util/yp_newline_list.c +5 -4
- data/src/util/yp_string.c +22 -20
- data/src/util/yp_string_list.c +0 -6
- data/src/util/yp_strncasecmp.c +3 -6
- data/src/util/yp_strpbrk.c +8 -8
- data/src/yarp.c +355 -216
- data/yarp.gemspec +1 -1
- metadata +2 -2
data/src/prettyprint.c
CHANGED
@@ -312,7 +312,7 @@ prettyprint_node(yp_buffer_t *buffer, yp_parser_t *parser, yp_node_t *node) {
|
|
312
312
|
snprintf(flags_buffer, sizeof(flags_buffer), "+%d", node->flags >> 1);
|
313
313
|
yp_buffer_append_str(buffer, flags_buffer, strlen(flags_buffer));
|
314
314
|
yp_buffer_append_str(buffer, ", ", 2); yp_buffer_append_str(buffer, "\"", 1);
|
315
|
-
|
315
|
+
yp_buffer_append_bytes(buffer, yp_string_source(&((yp_call_node_t *)node)->name), yp_string_length(&((yp_call_node_t *)node)->name));
|
316
316
|
yp_buffer_append_str(buffer, "\"", 1);
|
317
317
|
yp_buffer_append_str(buffer, ")", 1);
|
318
318
|
break;
|
@@ -338,9 +338,9 @@ prettyprint_node(yp_buffer_t *buffer, yp_parser_t *parser, yp_node_t *node) {
|
|
338
338
|
prettyprint_node(buffer, parser, (yp_node_t *)((yp_call_operator_write_node_t *)node)->target);
|
339
339
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_location(buffer, parser, &((yp_call_operator_write_node_t *)node)->operator_loc);
|
340
340
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_node(buffer, parser, (yp_node_t *)((yp_call_operator_write_node_t *)node)->value);
|
341
|
-
yp_buffer_append_str(buffer, ", ", 2); char
|
342
|
-
snprintf(
|
343
|
-
yp_buffer_append_str(buffer,
|
341
|
+
yp_buffer_append_str(buffer, ", ", 2); char operator_buffer[12];
|
342
|
+
snprintf(operator_buffer, sizeof(operator_buffer), "%u", ((yp_call_operator_write_node_t *)node)->operator);
|
343
|
+
yp_buffer_append_str(buffer, operator_buffer, strlen(operator_buffer));
|
344
344
|
yp_buffer_append_str(buffer, ")", 1);
|
345
345
|
break;
|
346
346
|
}
|
@@ -404,14 +404,17 @@ prettyprint_node(yp_buffer_t *buffer, yp_parser_t *parser, yp_node_t *node) {
|
|
404
404
|
}
|
405
405
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_location(buffer, parser, &((yp_class_node_t *)node)->end_keyword_loc);
|
406
406
|
yp_buffer_append_str(buffer, ", ", 2); yp_buffer_append_str(buffer, "\"", 1);
|
407
|
-
|
407
|
+
yp_buffer_append_bytes(buffer, yp_string_source(&((yp_class_node_t *)node)->name), yp_string_length(&((yp_class_node_t *)node)->name));
|
408
408
|
yp_buffer_append_str(buffer, "\"", 1);
|
409
409
|
yp_buffer_append_str(buffer, ")", 1);
|
410
410
|
break;
|
411
411
|
}
|
412
412
|
case YP_NODE_CLASS_VARIABLE_AND_WRITE_NODE: {
|
413
413
|
yp_buffer_append_str(buffer, "ClassVariableAndWriteNode(", 26);
|
414
|
-
|
414
|
+
char name_buffer[12];
|
415
|
+
snprintf(name_buffer, sizeof(name_buffer), "%u", ((yp_class_variable_and_write_node_t *)node)->name);
|
416
|
+
yp_buffer_append_str(buffer, name_buffer, strlen(name_buffer));
|
417
|
+
yp_buffer_append_str(buffer, ", ", 2); prettyprint_location(buffer, parser, &((yp_class_variable_and_write_node_t *)node)->name_loc);
|
415
418
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_location(buffer, parser, &((yp_class_variable_and_write_node_t *)node)->operator_loc);
|
416
419
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_node(buffer, parser, (yp_node_t *)((yp_class_variable_and_write_node_t *)node)->value);
|
417
420
|
yp_buffer_append_str(buffer, ")", 1);
|
@@ -419,7 +422,10 @@ prettyprint_node(yp_buffer_t *buffer, yp_parser_t *parser, yp_node_t *node) {
|
|
419
422
|
}
|
420
423
|
case YP_NODE_CLASS_VARIABLE_OPERATOR_WRITE_NODE: {
|
421
424
|
yp_buffer_append_str(buffer, "ClassVariableOperatorWriteNode(", 31);
|
422
|
-
|
425
|
+
char name_buffer[12];
|
426
|
+
snprintf(name_buffer, sizeof(name_buffer), "%u", ((yp_class_variable_operator_write_node_t *)node)->name);
|
427
|
+
yp_buffer_append_str(buffer, name_buffer, strlen(name_buffer));
|
428
|
+
yp_buffer_append_str(buffer, ", ", 2); prettyprint_location(buffer, parser, &((yp_class_variable_operator_write_node_t *)node)->name_loc);
|
423
429
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_location(buffer, parser, &((yp_class_variable_operator_write_node_t *)node)->operator_loc);
|
424
430
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_node(buffer, parser, (yp_node_t *)((yp_class_variable_operator_write_node_t *)node)->value);
|
425
431
|
yp_buffer_append_str(buffer, ", ", 2); char operator_buffer[12];
|
@@ -430,7 +436,10 @@ prettyprint_node(yp_buffer_t *buffer, yp_parser_t *parser, yp_node_t *node) {
|
|
430
436
|
}
|
431
437
|
case YP_NODE_CLASS_VARIABLE_OR_WRITE_NODE: {
|
432
438
|
yp_buffer_append_str(buffer, "ClassVariableOrWriteNode(", 25);
|
433
|
-
|
439
|
+
char name_buffer[12];
|
440
|
+
snprintf(name_buffer, sizeof(name_buffer), "%u", ((yp_class_variable_or_write_node_t *)node)->name);
|
441
|
+
yp_buffer_append_str(buffer, name_buffer, strlen(name_buffer));
|
442
|
+
yp_buffer_append_str(buffer, ", ", 2); prettyprint_location(buffer, parser, &((yp_class_variable_or_write_node_t *)node)->name_loc);
|
434
443
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_location(buffer, parser, &((yp_class_variable_or_write_node_t *)node)->operator_loc);
|
435
444
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_node(buffer, parser, (yp_node_t *)((yp_class_variable_or_write_node_t *)node)->value);
|
436
445
|
yp_buffer_append_str(buffer, ")", 1);
|
@@ -438,17 +447,26 @@ prettyprint_node(yp_buffer_t *buffer, yp_parser_t *parser, yp_node_t *node) {
|
|
438
447
|
}
|
439
448
|
case YP_NODE_CLASS_VARIABLE_READ_NODE: {
|
440
449
|
yp_buffer_append_str(buffer, "ClassVariableReadNode(", 22);
|
450
|
+
char name_buffer[12];
|
451
|
+
snprintf(name_buffer, sizeof(name_buffer), "%u", ((yp_class_variable_read_node_t *)node)->name);
|
452
|
+
yp_buffer_append_str(buffer, name_buffer, strlen(name_buffer));
|
441
453
|
yp_buffer_append_str(buffer, ")", 1);
|
442
454
|
break;
|
443
455
|
}
|
444
456
|
case YP_NODE_CLASS_VARIABLE_TARGET_NODE: {
|
445
457
|
yp_buffer_append_str(buffer, "ClassVariableTargetNode(", 24);
|
458
|
+
char name_buffer[12];
|
459
|
+
snprintf(name_buffer, sizeof(name_buffer), "%u", ((yp_class_variable_target_node_t *)node)->name);
|
460
|
+
yp_buffer_append_str(buffer, name_buffer, strlen(name_buffer));
|
446
461
|
yp_buffer_append_str(buffer, ")", 1);
|
447
462
|
break;
|
448
463
|
}
|
449
464
|
case YP_NODE_CLASS_VARIABLE_WRITE_NODE: {
|
450
465
|
yp_buffer_append_str(buffer, "ClassVariableWriteNode(", 23);
|
451
|
-
|
466
|
+
char name_buffer[12];
|
467
|
+
snprintf(name_buffer, sizeof(name_buffer), "%u", ((yp_class_variable_write_node_t *)node)->name);
|
468
|
+
yp_buffer_append_str(buffer, name_buffer, strlen(name_buffer));
|
469
|
+
yp_buffer_append_str(buffer, ", ", 2); prettyprint_location(buffer, parser, &((yp_class_variable_write_node_t *)node)->name_loc);
|
452
470
|
yp_buffer_append_str(buffer, ", ", 2); if (((yp_class_variable_write_node_t *)node)->value == NULL) {
|
453
471
|
yp_buffer_append_str(buffer, "nil", 3);
|
454
472
|
} else {
|
@@ -822,8 +840,8 @@ prettyprint_node(yp_buffer_t *buffer, yp_parser_t *parser, yp_node_t *node) {
|
|
822
840
|
case YP_NODE_GLOBAL_VARIABLE_WRITE_NODE: {
|
823
841
|
yp_buffer_append_str(buffer, "GlobalVariableWriteNode(", 24);
|
824
842
|
prettyprint_location(buffer, parser, &((yp_global_variable_write_node_t *)node)->name_loc);
|
825
|
-
yp_buffer_append_str(buffer, ", ", 2); prettyprint_location(buffer, parser, &((yp_global_variable_write_node_t *)node)->operator_loc);
|
826
843
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_node(buffer, parser, (yp_node_t *)((yp_global_variable_write_node_t *)node)->value);
|
844
|
+
yp_buffer_append_str(buffer, ", ", 2); prettyprint_location(buffer, parser, &((yp_global_variable_write_node_t *)node)->operator_loc);
|
827
845
|
yp_buffer_append_str(buffer, ")", 1);
|
828
846
|
break;
|
829
847
|
}
|
@@ -922,7 +940,10 @@ prettyprint_node(yp_buffer_t *buffer, yp_parser_t *parser, yp_node_t *node) {
|
|
922
940
|
}
|
923
941
|
case YP_NODE_INSTANCE_VARIABLE_AND_WRITE_NODE: {
|
924
942
|
yp_buffer_append_str(buffer, "InstanceVariableAndWriteNode(", 29);
|
925
|
-
|
943
|
+
char name_buffer[12];
|
944
|
+
snprintf(name_buffer, sizeof(name_buffer), "%u", ((yp_instance_variable_and_write_node_t *)node)->name);
|
945
|
+
yp_buffer_append_str(buffer, name_buffer, strlen(name_buffer));
|
946
|
+
yp_buffer_append_str(buffer, ", ", 2); prettyprint_location(buffer, parser, &((yp_instance_variable_and_write_node_t *)node)->name_loc);
|
926
947
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_location(buffer, parser, &((yp_instance_variable_and_write_node_t *)node)->operator_loc);
|
927
948
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_node(buffer, parser, (yp_node_t *)((yp_instance_variable_and_write_node_t *)node)->value);
|
928
949
|
yp_buffer_append_str(buffer, ")", 1);
|
@@ -930,7 +951,10 @@ prettyprint_node(yp_buffer_t *buffer, yp_parser_t *parser, yp_node_t *node) {
|
|
930
951
|
}
|
931
952
|
case YP_NODE_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE: {
|
932
953
|
yp_buffer_append_str(buffer, "InstanceVariableOperatorWriteNode(", 34);
|
933
|
-
|
954
|
+
char name_buffer[12];
|
955
|
+
snprintf(name_buffer, sizeof(name_buffer), "%u", ((yp_instance_variable_operator_write_node_t *)node)->name);
|
956
|
+
yp_buffer_append_str(buffer, name_buffer, strlen(name_buffer));
|
957
|
+
yp_buffer_append_str(buffer, ", ", 2); prettyprint_location(buffer, parser, &((yp_instance_variable_operator_write_node_t *)node)->name_loc);
|
934
958
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_location(buffer, parser, &((yp_instance_variable_operator_write_node_t *)node)->operator_loc);
|
935
959
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_node(buffer, parser, (yp_node_t *)((yp_instance_variable_operator_write_node_t *)node)->value);
|
936
960
|
yp_buffer_append_str(buffer, ", ", 2); char operator_buffer[12];
|
@@ -941,7 +965,10 @@ prettyprint_node(yp_buffer_t *buffer, yp_parser_t *parser, yp_node_t *node) {
|
|
941
965
|
}
|
942
966
|
case YP_NODE_INSTANCE_VARIABLE_OR_WRITE_NODE: {
|
943
967
|
yp_buffer_append_str(buffer, "InstanceVariableOrWriteNode(", 28);
|
944
|
-
|
968
|
+
char name_buffer[12];
|
969
|
+
snprintf(name_buffer, sizeof(name_buffer), "%u", ((yp_instance_variable_or_write_node_t *)node)->name);
|
970
|
+
yp_buffer_append_str(buffer, name_buffer, strlen(name_buffer));
|
971
|
+
yp_buffer_append_str(buffer, ", ", 2); prettyprint_location(buffer, parser, &((yp_instance_variable_or_write_node_t *)node)->name_loc);
|
945
972
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_location(buffer, parser, &((yp_instance_variable_or_write_node_t *)node)->operator_loc);
|
946
973
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_node(buffer, parser, (yp_node_t *)((yp_instance_variable_or_write_node_t *)node)->value);
|
947
974
|
yp_buffer_append_str(buffer, ")", 1);
|
@@ -949,17 +976,26 @@ prettyprint_node(yp_buffer_t *buffer, yp_parser_t *parser, yp_node_t *node) {
|
|
949
976
|
}
|
950
977
|
case YP_NODE_INSTANCE_VARIABLE_READ_NODE: {
|
951
978
|
yp_buffer_append_str(buffer, "InstanceVariableReadNode(", 25);
|
979
|
+
char name_buffer[12];
|
980
|
+
snprintf(name_buffer, sizeof(name_buffer), "%u", ((yp_instance_variable_read_node_t *)node)->name);
|
981
|
+
yp_buffer_append_str(buffer, name_buffer, strlen(name_buffer));
|
952
982
|
yp_buffer_append_str(buffer, ")", 1);
|
953
983
|
break;
|
954
984
|
}
|
955
985
|
case YP_NODE_INSTANCE_VARIABLE_TARGET_NODE: {
|
956
986
|
yp_buffer_append_str(buffer, "InstanceVariableTargetNode(", 27);
|
987
|
+
char name_buffer[12];
|
988
|
+
snprintf(name_buffer, sizeof(name_buffer), "%u", ((yp_instance_variable_target_node_t *)node)->name);
|
989
|
+
yp_buffer_append_str(buffer, name_buffer, strlen(name_buffer));
|
957
990
|
yp_buffer_append_str(buffer, ")", 1);
|
958
991
|
break;
|
959
992
|
}
|
960
993
|
case YP_NODE_INSTANCE_VARIABLE_WRITE_NODE: {
|
961
994
|
yp_buffer_append_str(buffer, "InstanceVariableWriteNode(", 26);
|
962
|
-
|
995
|
+
char name_buffer[12];
|
996
|
+
snprintf(name_buffer, sizeof(name_buffer), "%u", ((yp_instance_variable_write_node_t *)node)->name);
|
997
|
+
yp_buffer_append_str(buffer, name_buffer, strlen(name_buffer));
|
998
|
+
yp_buffer_append_str(buffer, ", ", 2); prettyprint_location(buffer, parser, &((yp_instance_variable_write_node_t *)node)->name_loc);
|
963
999
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_node(buffer, parser, (yp_node_t *)((yp_instance_variable_write_node_t *)node)->value);
|
964
1000
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_location(buffer, parser, &((yp_instance_variable_write_node_t *)node)->operator_loc);
|
965
1001
|
yp_buffer_append_str(buffer, ")", 1);
|
@@ -1105,9 +1141,9 @@ prettyprint_node(yp_buffer_t *buffer, yp_parser_t *parser, yp_node_t *node) {
|
|
1105
1141
|
prettyprint_location(buffer, parser, &((yp_local_variable_and_write_node_t *)node)->name_loc);
|
1106
1142
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_location(buffer, parser, &((yp_local_variable_and_write_node_t *)node)->operator_loc);
|
1107
1143
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_node(buffer, parser, (yp_node_t *)((yp_local_variable_and_write_node_t *)node)->value);
|
1108
|
-
yp_buffer_append_str(buffer, ", ", 2); char
|
1109
|
-
snprintf(
|
1110
|
-
yp_buffer_append_str(buffer,
|
1144
|
+
yp_buffer_append_str(buffer, ", ", 2); char name_buffer[12];
|
1145
|
+
snprintf(name_buffer, sizeof(name_buffer), "%u", ((yp_local_variable_and_write_node_t *)node)->name);
|
1146
|
+
yp_buffer_append_str(buffer, name_buffer, strlen(name_buffer));
|
1111
1147
|
yp_buffer_append_str(buffer, ", ", 2); char depth_buffer[12];
|
1112
1148
|
snprintf(depth_buffer, sizeof(depth_buffer), "+%d", ((yp_local_variable_and_write_node_t *)node)->depth);
|
1113
1149
|
yp_buffer_append_str(buffer, depth_buffer, strlen(depth_buffer));
|
@@ -1119,12 +1155,12 @@ prettyprint_node(yp_buffer_t *buffer, yp_parser_t *parser, yp_node_t *node) {
|
|
1119
1155
|
prettyprint_location(buffer, parser, &((yp_local_variable_operator_write_node_t *)node)->name_loc);
|
1120
1156
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_location(buffer, parser, &((yp_local_variable_operator_write_node_t *)node)->operator_loc);
|
1121
1157
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_node(buffer, parser, (yp_node_t *)((yp_local_variable_operator_write_node_t *)node)->value);
|
1122
|
-
yp_buffer_append_str(buffer, ", ", 2); char
|
1123
|
-
snprintf(
|
1124
|
-
yp_buffer_append_str(buffer,
|
1125
|
-
yp_buffer_append_str(buffer, ", ", 2); char
|
1126
|
-
snprintf(
|
1127
|
-
yp_buffer_append_str(buffer,
|
1158
|
+
yp_buffer_append_str(buffer, ", ", 2); char name_buffer[12];
|
1159
|
+
snprintf(name_buffer, sizeof(name_buffer), "%u", ((yp_local_variable_operator_write_node_t *)node)->name);
|
1160
|
+
yp_buffer_append_str(buffer, name_buffer, strlen(name_buffer));
|
1161
|
+
yp_buffer_append_str(buffer, ", ", 2); char operator_buffer[12];
|
1162
|
+
snprintf(operator_buffer, sizeof(operator_buffer), "%u", ((yp_local_variable_operator_write_node_t *)node)->operator);
|
1163
|
+
yp_buffer_append_str(buffer, operator_buffer, strlen(operator_buffer));
|
1128
1164
|
yp_buffer_append_str(buffer, ", ", 2); char depth_buffer[12];
|
1129
1165
|
snprintf(depth_buffer, sizeof(depth_buffer), "+%d", ((yp_local_variable_operator_write_node_t *)node)->depth);
|
1130
1166
|
yp_buffer_append_str(buffer, depth_buffer, strlen(depth_buffer));
|
@@ -1136,9 +1172,9 @@ prettyprint_node(yp_buffer_t *buffer, yp_parser_t *parser, yp_node_t *node) {
|
|
1136
1172
|
prettyprint_location(buffer, parser, &((yp_local_variable_or_write_node_t *)node)->name_loc);
|
1137
1173
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_location(buffer, parser, &((yp_local_variable_or_write_node_t *)node)->operator_loc);
|
1138
1174
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_node(buffer, parser, (yp_node_t *)((yp_local_variable_or_write_node_t *)node)->value);
|
1139
|
-
yp_buffer_append_str(buffer, ", ", 2); char
|
1140
|
-
snprintf(
|
1141
|
-
yp_buffer_append_str(buffer,
|
1175
|
+
yp_buffer_append_str(buffer, ", ", 2); char name_buffer[12];
|
1176
|
+
snprintf(name_buffer, sizeof(name_buffer), "%u", ((yp_local_variable_or_write_node_t *)node)->name);
|
1177
|
+
yp_buffer_append_str(buffer, name_buffer, strlen(name_buffer));
|
1142
1178
|
yp_buffer_append_str(buffer, ", ", 2); char depth_buffer[12];
|
1143
1179
|
snprintf(depth_buffer, sizeof(depth_buffer), "+%d", ((yp_local_variable_or_write_node_t *)node)->depth);
|
1144
1180
|
yp_buffer_append_str(buffer, depth_buffer, strlen(depth_buffer));
|
@@ -1147,9 +1183,9 @@ prettyprint_node(yp_buffer_t *buffer, yp_parser_t *parser, yp_node_t *node) {
|
|
1147
1183
|
}
|
1148
1184
|
case YP_NODE_LOCAL_VARIABLE_READ_NODE: {
|
1149
1185
|
yp_buffer_append_str(buffer, "LocalVariableReadNode(", 22);
|
1150
|
-
char
|
1151
|
-
snprintf(
|
1152
|
-
yp_buffer_append_str(buffer,
|
1186
|
+
char name_buffer[12];
|
1187
|
+
snprintf(name_buffer, sizeof(name_buffer), "%u", ((yp_local_variable_read_node_t *)node)->name);
|
1188
|
+
yp_buffer_append_str(buffer, name_buffer, strlen(name_buffer));
|
1153
1189
|
yp_buffer_append_str(buffer, ", ", 2); char depth_buffer[12];
|
1154
1190
|
snprintf(depth_buffer, sizeof(depth_buffer), "+%d", ((yp_local_variable_read_node_t *)node)->depth);
|
1155
1191
|
yp_buffer_append_str(buffer, depth_buffer, strlen(depth_buffer));
|
@@ -1158,9 +1194,9 @@ prettyprint_node(yp_buffer_t *buffer, yp_parser_t *parser, yp_node_t *node) {
|
|
1158
1194
|
}
|
1159
1195
|
case YP_NODE_LOCAL_VARIABLE_TARGET_NODE: {
|
1160
1196
|
yp_buffer_append_str(buffer, "LocalVariableTargetNode(", 24);
|
1161
|
-
char
|
1162
|
-
snprintf(
|
1163
|
-
yp_buffer_append_str(buffer,
|
1197
|
+
char name_buffer[12];
|
1198
|
+
snprintf(name_buffer, sizeof(name_buffer), "%u", ((yp_local_variable_target_node_t *)node)->name);
|
1199
|
+
yp_buffer_append_str(buffer, name_buffer, strlen(name_buffer));
|
1164
1200
|
yp_buffer_append_str(buffer, ", ", 2); char depth_buffer[12];
|
1165
1201
|
snprintf(depth_buffer, sizeof(depth_buffer), "+%d", ((yp_local_variable_target_node_t *)node)->depth);
|
1166
1202
|
yp_buffer_append_str(buffer, depth_buffer, strlen(depth_buffer));
|
@@ -1169,14 +1205,14 @@ prettyprint_node(yp_buffer_t *buffer, yp_parser_t *parser, yp_node_t *node) {
|
|
1169
1205
|
}
|
1170
1206
|
case YP_NODE_LOCAL_VARIABLE_WRITE_NODE: {
|
1171
1207
|
yp_buffer_append_str(buffer, "LocalVariableWriteNode(", 23);
|
1172
|
-
char
|
1173
|
-
snprintf(
|
1174
|
-
yp_buffer_append_str(buffer,
|
1208
|
+
char name_buffer[12];
|
1209
|
+
snprintf(name_buffer, sizeof(name_buffer), "%u", ((yp_local_variable_write_node_t *)node)->name);
|
1210
|
+
yp_buffer_append_str(buffer, name_buffer, strlen(name_buffer));
|
1175
1211
|
yp_buffer_append_str(buffer, ", ", 2); char depth_buffer[12];
|
1176
1212
|
snprintf(depth_buffer, sizeof(depth_buffer), "+%d", ((yp_local_variable_write_node_t *)node)->depth);
|
1177
1213
|
yp_buffer_append_str(buffer, depth_buffer, strlen(depth_buffer));
|
1178
|
-
yp_buffer_append_str(buffer, ", ", 2); prettyprint_node(buffer, parser, (yp_node_t *)((yp_local_variable_write_node_t *)node)->value);
|
1179
1214
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_location(buffer, parser, &((yp_local_variable_write_node_t *)node)->name_loc);
|
1215
|
+
yp_buffer_append_str(buffer, ", ", 2); prettyprint_node(buffer, parser, (yp_node_t *)((yp_local_variable_write_node_t *)node)->value);
|
1180
1216
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_location(buffer, parser, &((yp_local_variable_write_node_t *)node)->operator_loc);
|
1181
1217
|
yp_buffer_append_str(buffer, ")", 1);
|
1182
1218
|
break;
|
@@ -1221,7 +1257,7 @@ prettyprint_node(yp_buffer_t *buffer, yp_parser_t *parser, yp_node_t *node) {
|
|
1221
1257
|
}
|
1222
1258
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_location(buffer, parser, &((yp_module_node_t *)node)->end_keyword_loc);
|
1223
1259
|
yp_buffer_append_str(buffer, ", ", 2); yp_buffer_append_str(buffer, "\"", 1);
|
1224
|
-
|
1260
|
+
yp_buffer_append_bytes(buffer, yp_string_source(&((yp_module_node_t *)node)->name), yp_string_length(&((yp_module_node_t *)node)->name));
|
1225
1261
|
yp_buffer_append_str(buffer, "\"", 1);
|
1226
1262
|
yp_buffer_append_str(buffer, ")", 1);
|
1227
1263
|
break;
|
@@ -1282,14 +1318,17 @@ prettyprint_node(yp_buffer_t *buffer, yp_parser_t *parser, yp_node_t *node) {
|
|
1282
1318
|
}
|
1283
1319
|
case YP_NODE_NUMBERED_REFERENCE_READ_NODE: {
|
1284
1320
|
yp_buffer_append_str(buffer, "NumberedReferenceReadNode(", 26);
|
1321
|
+
char number_buffer[12];
|
1322
|
+
snprintf(number_buffer, sizeof(number_buffer), "+%d", ((yp_numbered_reference_read_node_t *)node)->number);
|
1323
|
+
yp_buffer_append_str(buffer, number_buffer, strlen(number_buffer));
|
1285
1324
|
yp_buffer_append_str(buffer, ")", 1);
|
1286
1325
|
break;
|
1287
1326
|
}
|
1288
1327
|
case YP_NODE_OPTIONAL_PARAMETER_NODE: {
|
1289
1328
|
yp_buffer_append_str(buffer, "OptionalParameterNode(", 22);
|
1290
|
-
char
|
1291
|
-
snprintf(
|
1292
|
-
yp_buffer_append_str(buffer,
|
1329
|
+
char name_buffer[12];
|
1330
|
+
snprintf(name_buffer, sizeof(name_buffer), "%u", ((yp_optional_parameter_node_t *)node)->name);
|
1331
|
+
yp_buffer_append_str(buffer, name_buffer, strlen(name_buffer));
|
1293
1332
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_location(buffer, parser, &((yp_optional_parameter_node_t *)node)->name_loc);
|
1294
1333
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_location(buffer, parser, &((yp_optional_parameter_node_t *)node)->operator_loc);
|
1295
1334
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_node(buffer, parser, (yp_node_t *)((yp_optional_parameter_node_t *)node)->value);
|
@@ -1452,7 +1491,7 @@ prettyprint_node(yp_buffer_t *buffer, yp_parser_t *parser, yp_node_t *node) {
|
|
1452
1491
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_location(buffer, parser, &((yp_regular_expression_node_t *)node)->content_loc);
|
1453
1492
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_location(buffer, parser, &((yp_regular_expression_node_t *)node)->closing_loc);
|
1454
1493
|
yp_buffer_append_str(buffer, ", ", 2); yp_buffer_append_str(buffer, "\"", 1);
|
1455
|
-
|
1494
|
+
yp_buffer_append_bytes(buffer, yp_string_source(&((yp_regular_expression_node_t *)node)->unescaped), yp_string_length(&((yp_regular_expression_node_t *)node)->unescaped));
|
1456
1495
|
yp_buffer_append_str(buffer, "\"", 1);
|
1457
1496
|
yp_buffer_append_str(buffer, ", ", 2); char flags_buffer[12];
|
1458
1497
|
snprintf(flags_buffer, sizeof(flags_buffer), "+%d", node->flags >> 1);
|
@@ -1475,9 +1514,9 @@ prettyprint_node(yp_buffer_t *buffer, yp_parser_t *parser, yp_node_t *node) {
|
|
1475
1514
|
}
|
1476
1515
|
case YP_NODE_REQUIRED_PARAMETER_NODE: {
|
1477
1516
|
yp_buffer_append_str(buffer, "RequiredParameterNode(", 22);
|
1478
|
-
char
|
1479
|
-
snprintf(
|
1480
|
-
yp_buffer_append_str(buffer,
|
1517
|
+
char name_buffer[12];
|
1518
|
+
snprintf(name_buffer, sizeof(name_buffer), "%u", ((yp_required_parameter_node_t *)node)->name);
|
1519
|
+
yp_buffer_append_str(buffer, name_buffer, strlen(name_buffer));
|
1481
1520
|
yp_buffer_append_str(buffer, ")", 1);
|
1482
1521
|
break;
|
1483
1522
|
}
|
@@ -1583,7 +1622,7 @@ prettyprint_node(yp_buffer_t *buffer, yp_parser_t *parser, yp_node_t *node) {
|
|
1583
1622
|
case YP_NODE_SOURCE_FILE_NODE: {
|
1584
1623
|
yp_buffer_append_str(buffer, "SourceFileNode(", 15);
|
1585
1624
|
yp_buffer_append_str(buffer, "\"", 1);
|
1586
|
-
|
1625
|
+
yp_buffer_append_bytes(buffer, yp_string_source(&((yp_source_file_node_t *)node)->filepath), yp_string_length(&((yp_source_file_node_t *)node)->filepath));
|
1587
1626
|
yp_buffer_append_str(buffer, "\"", 1);
|
1588
1627
|
yp_buffer_append_str(buffer, ")", 1);
|
1589
1628
|
break;
|
@@ -1636,7 +1675,7 @@ prettyprint_node(yp_buffer_t *buffer, yp_parser_t *parser, yp_node_t *node) {
|
|
1636
1675
|
prettyprint_location(buffer, parser, &((yp_string_node_t *)node)->closing_loc);
|
1637
1676
|
}
|
1638
1677
|
yp_buffer_append_str(buffer, ", ", 2); yp_buffer_append_str(buffer, "\"", 1);
|
1639
|
-
|
1678
|
+
yp_buffer_append_bytes(buffer, yp_string_source(&((yp_string_node_t *)node)->unescaped), yp_string_length(&((yp_string_node_t *)node)->unescaped));
|
1640
1679
|
yp_buffer_append_str(buffer, "\"", 1);
|
1641
1680
|
yp_buffer_append_str(buffer, ")", 1);
|
1642
1681
|
break;
|
@@ -1685,7 +1724,7 @@ prettyprint_node(yp_buffer_t *buffer, yp_parser_t *parser, yp_node_t *node) {
|
|
1685
1724
|
prettyprint_location(buffer, parser, &((yp_symbol_node_t *)node)->closing_loc);
|
1686
1725
|
}
|
1687
1726
|
yp_buffer_append_str(buffer, ", ", 2); yp_buffer_append_str(buffer, "\"", 1);
|
1688
|
-
|
1727
|
+
yp_buffer_append_bytes(buffer, yp_string_source(&((yp_symbol_node_t *)node)->unescaped), yp_string_length(&((yp_symbol_node_t *)node)->unescaped));
|
1689
1728
|
yp_buffer_append_str(buffer, "\"", 1);
|
1690
1729
|
yp_buffer_append_str(buffer, ")", 1);
|
1691
1730
|
break;
|
@@ -1792,7 +1831,7 @@ prettyprint_node(yp_buffer_t *buffer, yp_parser_t *parser, yp_node_t *node) {
|
|
1792
1831
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_location(buffer, parser, &((yp_x_string_node_t *)node)->content_loc);
|
1793
1832
|
yp_buffer_append_str(buffer, ", ", 2); prettyprint_location(buffer, parser, &((yp_x_string_node_t *)node)->closing_loc);
|
1794
1833
|
yp_buffer_append_str(buffer, ", ", 2); yp_buffer_append_str(buffer, "\"", 1);
|
1795
|
-
|
1834
|
+
yp_buffer_append_bytes(buffer, yp_string_source(&((yp_x_string_node_t *)node)->unescaped), yp_string_length(&((yp_x_string_node_t *)node)->unescaped));
|
1796
1835
|
yp_buffer_append_str(buffer, "\"", 1);
|
1797
1836
|
yp_buffer_append_str(buffer, ")", 1);
|
1798
1837
|
break;
|
data/src/regexp.c
CHANGED
@@ -2,9 +2,9 @@
|
|
2
2
|
|
3
3
|
// This is the parser that is going to handle parsing regular expressions.
|
4
4
|
typedef struct {
|
5
|
-
const
|
6
|
-
const
|
7
|
-
const
|
5
|
+
const uint8_t *start;
|
6
|
+
const uint8_t *cursor;
|
7
|
+
const uint8_t *end;
|
8
8
|
yp_string_list_t *named_captures;
|
9
9
|
bool encoding_changed;
|
10
10
|
yp_encoding_t *encoding;
|
@@ -12,7 +12,7 @@ typedef struct {
|
|
12
12
|
|
13
13
|
// This initializes a new parser with the given source.
|
14
14
|
static void
|
15
|
-
yp_regexp_parser_init(yp_regexp_parser_t *parser, const
|
15
|
+
yp_regexp_parser_init(yp_regexp_parser_t *parser, const uint8_t *start, const uint8_t *end, yp_string_list_t *named_captures, bool encoding_changed, yp_encoding_t *encoding) {
|
16
16
|
*parser = (yp_regexp_parser_t) {
|
17
17
|
.start = start,
|
18
18
|
.cursor = start,
|
@@ -25,7 +25,7 @@ yp_regexp_parser_init(yp_regexp_parser_t *parser, const char *start, const char
|
|
25
25
|
|
26
26
|
// This appends a new string to the list of named captures.
|
27
27
|
static void
|
28
|
-
yp_regexp_parser_named_capture(yp_regexp_parser_t *parser, const
|
28
|
+
yp_regexp_parser_named_capture(yp_regexp_parser_t *parser, const uint8_t *start, const uint8_t *end) {
|
29
29
|
yp_string_t string;
|
30
30
|
yp_string_shared_init(&string, start, end);
|
31
31
|
yp_string_list_append(parser->named_captures, &string);
|
@@ -40,7 +40,7 @@ yp_regexp_char_is_eof(yp_regexp_parser_t *parser) {
|
|
40
40
|
|
41
41
|
// Optionally accept a char and consume it if it exists.
|
42
42
|
static inline bool
|
43
|
-
yp_regexp_char_accept(yp_regexp_parser_t *parser,
|
43
|
+
yp_regexp_char_accept(yp_regexp_parser_t *parser, uint8_t value) {
|
44
44
|
if (!yp_regexp_char_is_eof(parser) && *parser->cursor == value) {
|
45
45
|
parser->cursor++;
|
46
46
|
return true;
|
@@ -50,7 +50,7 @@ yp_regexp_char_accept(yp_regexp_parser_t *parser, char value) {
|
|
50
50
|
|
51
51
|
// Expect a character to be present and consume it.
|
52
52
|
static inline bool
|
53
|
-
yp_regexp_char_expect(yp_regexp_parser_t *parser,
|
53
|
+
yp_regexp_char_expect(yp_regexp_parser_t *parser, uint8_t value) {
|
54
54
|
if (!yp_regexp_char_is_eof(parser) && *parser->cursor == value) {
|
55
55
|
parser->cursor++;
|
56
56
|
return true;
|
@@ -60,12 +60,12 @@ yp_regexp_char_expect(yp_regexp_parser_t *parser, char value) {
|
|
60
60
|
|
61
61
|
// This advances the current token to the next instance of the given character.
|
62
62
|
static bool
|
63
|
-
yp_regexp_char_find(yp_regexp_parser_t *parser,
|
63
|
+
yp_regexp_char_find(yp_regexp_parser_t *parser, uint8_t value) {
|
64
64
|
if (yp_regexp_char_is_eof(parser)) {
|
65
65
|
return false;
|
66
66
|
}
|
67
67
|
|
68
|
-
const
|
68
|
+
const uint8_t *end = (const uint8_t *) yp_memchr(parser->cursor, value, (size_t) (parser->end - parser->cursor), parser->encoding_changed, parser->encoding);
|
69
69
|
if (end == NULL) {
|
70
70
|
return false;
|
71
71
|
}
|
@@ -107,7 +107,7 @@ yp_regexp_char_find(yp_regexp_parser_t *parser, char value) {
|
|
107
107
|
// consumed so we're in the start state.
|
108
108
|
static bool
|
109
109
|
yp_regexp_parse_range_quantifier(yp_regexp_parser_t *parser) {
|
110
|
-
const
|
110
|
+
const uint8_t *savepoint = parser->cursor;
|
111
111
|
|
112
112
|
enum {
|
113
113
|
YP_REGEXP_RANGE_QUANTIFIER_STATE_START,
|
@@ -252,7 +252,7 @@ yp_regexp_parse_character_set(yp_regexp_parser_t *parser) {
|
|
252
252
|
// A left bracket can either mean a POSIX class or a character set.
|
253
253
|
static bool
|
254
254
|
yp_regexp_parse_lbracket(yp_regexp_parser_t *parser) {
|
255
|
-
const
|
255
|
+
const uint8_t *reset = parser->cursor;
|
256
256
|
|
257
257
|
if ((parser->cursor + 2 < parser->end) && parser->cursor[0] == '[' && parser->cursor[1] == ':') {
|
258
258
|
parser->cursor++;
|
@@ -287,7 +287,7 @@ typedef enum {
|
|
287
287
|
|
288
288
|
// This is the set of options that are configurable on the regular expression.
|
289
289
|
typedef struct {
|
290
|
-
|
290
|
+
uint8_t values[YP_REGEXP_OPTION_STATE_SLOTS];
|
291
291
|
} yp_regexp_options_t;
|
292
292
|
|
293
293
|
// Initialize a new set of options to their default values.
|
@@ -305,9 +305,9 @@ yp_regexp_options_init(yp_regexp_options_t *options) {
|
|
305
305
|
// Attempt to add the given option to the set of options. Returns true if it was
|
306
306
|
// added, false if it was already present.
|
307
307
|
static bool
|
308
|
-
yp_regexp_options_add(yp_regexp_options_t *options,
|
308
|
+
yp_regexp_options_add(yp_regexp_options_t *options, uint8_t key) {
|
309
309
|
if (key >= YP_REGEXP_OPTION_STATE_SLOT_MINIMUM && key <= YP_REGEXP_OPTION_STATE_SLOT_MAXIMUM) {
|
310
|
-
key = (
|
310
|
+
key = (uint8_t) (key - YP_REGEXP_OPTION_STATE_SLOT_MINIMUM);
|
311
311
|
|
312
312
|
switch (options->values[key]) {
|
313
313
|
case YP_REGEXP_OPTION_STATE_INVALID:
|
@@ -328,9 +328,9 @@ yp_regexp_options_add(yp_regexp_options_t *options, unsigned char key) {
|
|
328
328
|
// Attempt to remove the given option from the set of options. Returns true if
|
329
329
|
// it was removed, false if it was already absent.
|
330
330
|
static bool
|
331
|
-
yp_regexp_options_remove(yp_regexp_options_t *options,
|
331
|
+
yp_regexp_options_remove(yp_regexp_options_t *options, uint8_t key) {
|
332
332
|
if (key >= YP_REGEXP_OPTION_STATE_SLOT_MINIMUM && key <= YP_REGEXP_OPTION_STATE_SLOT_MAXIMUM) {
|
333
|
-
key = (
|
333
|
+
key = (uint8_t) (key - YP_REGEXP_OPTION_STATE_SLOT_MINIMUM);
|
334
334
|
|
335
335
|
switch (options->values[key]) {
|
336
336
|
case YP_REGEXP_OPTION_STATE_INVALID:
|
@@ -431,7 +431,7 @@ yp_regexp_parse_group(yp_regexp_parser_t *parser) {
|
|
431
431
|
parser->cursor++;
|
432
432
|
break;
|
433
433
|
default: { // named capture group
|
434
|
-
const
|
434
|
+
const uint8_t *start = parser->cursor;
|
435
435
|
if (!yp_regexp_char_find(parser, '>')) {
|
436
436
|
return false;
|
437
437
|
}
|
@@ -441,7 +441,7 @@ yp_regexp_parse_group(yp_regexp_parser_t *parser) {
|
|
441
441
|
}
|
442
442
|
break;
|
443
443
|
case '\'': { // named capture group
|
444
|
-
const
|
444
|
+
const uint8_t *start = ++parser->cursor;
|
445
445
|
if (!yp_regexp_char_find(parser, '\'')) {
|
446
446
|
return false;
|
447
447
|
}
|
@@ -456,7 +456,7 @@ yp_regexp_parse_group(yp_regexp_parser_t *parser) {
|
|
456
456
|
break;
|
457
457
|
case 'i': case 'm': case 'x': case 'd': case 'a': case 'u': // options
|
458
458
|
while (!yp_regexp_char_is_eof(parser) && *parser->cursor != '-' && *parser->cursor != ':' && *parser->cursor != ')') {
|
459
|
-
if (!yp_regexp_options_add(&options,
|
459
|
+
if (!yp_regexp_options_add(&options, *parser->cursor)) {
|
460
460
|
return false;
|
461
461
|
}
|
462
462
|
parser->cursor++;
|
@@ -474,7 +474,7 @@ yp_regexp_parse_group(yp_regexp_parser_t *parser) {
|
|
474
474
|
case '-':
|
475
475
|
parser->cursor++;
|
476
476
|
while (!yp_regexp_char_is_eof(parser) && *parser->cursor != ':' && *parser->cursor != ')') {
|
477
|
-
if (!yp_regexp_options_remove(&options,
|
477
|
+
if (!yp_regexp_options_remove(&options, *parser->cursor)) {
|
478
478
|
return false;
|
479
479
|
}
|
480
480
|
parser->cursor++;
|
@@ -573,7 +573,7 @@ yp_regexp_parse_pattern(yp_regexp_parser_t *parser) {
|
|
573
573
|
// Parse a regular expression and extract the names of all of the named capture
|
574
574
|
// groups.
|
575
575
|
YP_EXPORTED_FUNCTION bool
|
576
|
-
yp_regexp_named_capture_group_names(const
|
576
|
+
yp_regexp_named_capture_group_names(const uint8_t *source, size_t size, yp_string_list_t *named_captures, bool encoding_changed, yp_encoding_t *encoding) {
|
577
577
|
yp_regexp_parser_t parser;
|
578
578
|
yp_regexp_parser_init(&parser, source, source + size, named_captures, encoding_changed, encoding);
|
579
579
|
return yp_regexp_parse_pattern(&parser);
|