@@ -1034,7 +1034,7 @@ pm_parser_optional_constant_id_token(pm_parser_t *parser, const pm_token_t *toke
1034
1034
*/
1035
1035
static pm_node_t *
1036
1036
pm_check_value_expression(pm_parser_t *parser, pm_node_t *node) {
1037
- pm_node_t* void_node = NULL;
1037
+ pm_node_t * void_node = NULL;
1038
1038
1039
1039
while (node != NULL) {
1040
1040
switch (PM_NODE_TYPE(node)) {
@@ -1050,24 +1050,43 @@ pm_check_value_expression(pm_parser_t *parser, pm_node_t *node) {
1050
1050
case PM_BEGIN_NODE: {
1051
1051
pm_begin_node_t *cast = (pm_begin_node_t *) node;
1052
1052
1053
- if (cast->statements == NULL && cast->ensure_clause != NULL) {
1054
- node = (pm_node_t *) cast->ensure_clause;
1055
- }
1056
- else {
1053
+ if (cast->ensure_clause != NULL) {
1057
1054
if (cast->rescue_clause != NULL) {
1058
- if (cast->rescue_clause->statements == NULL) {
1059
- return NULL;
1060
- }
1061
- else if (cast->else_clause != NULL) {
1062
- node = (pm_node_t *) cast->else_clause;
1055
+ pm_node_t *vn = pm_check_value_expression(parser, (pm_node_t *) cast->rescue_clause);
1056
+ if (vn != NULL) return vn;
1057
+ }
1058
+
1059
+ if (cast->statements != NULL) {
1060
+ pm_node_t *vn = pm_check_value_expression(parser, (pm_node_t *) cast->statements);
1061
+ if (vn != NULL) return vn;
1062
+ }
1063
+
1064
+ node = (pm_node_t *) cast->ensure_clause;
1065
+ } else if (cast->rescue_clause != NULL) {
1066
+ if (cast->statements == NULL) return NULL;
1067
+
1068
+ pm_node_t *vn = pm_check_value_expression(parser, (pm_node_t *) cast->statements);
1069
+ if (vn == NULL) return NULL;
1070
+ if (void_node == NULL) void_node = vn;
1071
+
1072
+ for (pm_rescue_node_t *rescue_clause = cast->rescue_clause; rescue_clause != NULL; rescue_clause = rescue_clause->subsequent) {
1073
+ pm_node_t *vn = pm_check_value_expression(parser, (pm_node_t *) rescue_clause->statements);
1074
+ if (vn == NULL) {
1075
+ void_node = NULL;
1076
+ break;
1063
1077
}
1064
- else {
1065
- node = (pm_node_t *) cast->statements ;
1078
+ if (void_node == NULL) {
1079
+ void_node = vn ;
1066
1080
}
1067
1081
}
1068
- else {
1069
- node = (pm_node_t *) cast->statements;
1082
+
1083
+ if (cast->else_clause != NULL) {
1084
+ node = (pm_node_t *) cast->else_clause;
1085
+ } else {
1086
+ return void_node;
1070
1087
}
1088
+ } else {
1089
+ node = (pm_node_t *) cast->statements;
1071
1090
}
1072
1091
1073
1092
break;
0 commit comments