herb 0.8.0-x86-linux-musl → 0.8.1-x86-linux-musl

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4c702d69d6eae0c4a4cf32eb9625bbdf4484f662ae710d9dc08b542f30e0030d
4
- data.tar.gz: f5c2c6690854b2b56564b56216f29e772bca7d8eccbc0b2585404b3d2bc9e483
3
+ metadata.gz: 05c3b4cba4c868a1d163860b89ec9682324a69191801b7f590b2d9529de8f837
4
+ data.tar.gz: 57970f4209e30a98a2b6415ab0edd16a8ebfdfab6f144eea00d15a4380027fb1
5
5
  SHA512:
6
- metadata.gz: e498757f9f7395592dc642867eab37ef530845ca5707bfa233269a8ee094ae2d18393847cdf83ae2dd3f1e1268db69be4fdfe9157cd6abe9a4212f25816a550b
7
- data.tar.gz: 3d51d47eb5eeec6fe6cb8bb46e6bd6b90956f8ff7cb38a0adc69b523748ff6446b6722bc9ec776c9c0c41e94b5ea1eabee48a6a6aa37bf2550a89bd6bbca8d10
6
+ metadata.gz: 0c8fe6e7a18cf3b3360c64f85122b8cd26beed4988feb2f6118b6c092215ee86e92c3b7d38600c73853bc810daeadbf9fe591fc4bcd25b54940973f243b2dbdd
7
+ data.tar.gz: 2d4aaf3bbb4547176cad361c54414374f0a1605469dda19984e116ae2f906a367054d416c92f71fe20559e9f98fe4a889f35d63c6b28f491bfac604ba0c40b81
data/ext/herb/nodes.c CHANGED
@@ -464,7 +464,7 @@ static VALUE rb_erb_content_node_from_c_struct(AST_ERB_CONTENT_NODE_T* erb_conte
464
464
  VALUE erb_content_node_tag_opening = rb_token_from_c_struct(erb_content_node->tag_opening);
465
465
  VALUE erb_content_node_content = rb_token_from_c_struct(erb_content_node->content);
466
466
  VALUE erb_content_node_tag_closing = rb_token_from_c_struct(erb_content_node->tag_closing);
467
- /* #<Herb::Template::AnalyzedRubyField:0x00007f0cf3050df0 @name="analyzed_ruby", @options={kind: nil}> */
467
+ /* #<Herb::Template::AnalyzedRubyField:0x00007fe440e010b0 @name="analyzed_ruby", @options={kind: nil}> */
468
468
  VALUE erb_content_node_analyzed_ruby = Qnil;
469
469
  VALUE erb_content_node_parsed = (erb_content_node->parsed) ? Qtrue : Qfalse;
470
470
  VALUE erb_content_node_valid = (erb_content_node->valid) ? Qtrue : Qfalse;
data/lib/herb/3.0/herb.so CHANGED
Binary file
data/lib/herb/3.1/herb.so CHANGED
Binary file
data/lib/herb/3.2/herb.so CHANGED
Binary file
data/lib/herb/3.3/herb.so CHANGED
Binary file
data/lib/herb/3.4/herb.so CHANGED
Binary file
data/lib/herb/version.rb CHANGED
@@ -2,5 +2,5 @@
2
2
  # typed: true
3
3
 
4
4
  module Herb
5
- VERSION = "0.8.0"
5
+ VERSION = "0.8.1"
6
6
  end
data/src/analyze.c CHANGED
@@ -90,6 +90,138 @@ static size_t process_subsequent_block(
90
90
  control_type_t parent_type
91
91
  );
92
92
 
93
+ typedef struct {
94
+ control_type_t type;
95
+ uint32_t offset;
96
+ bool found;
97
+ } earliest_control_keyword_t;
98
+
99
+ typedef struct {
100
+ earliest_control_keyword_t* result;
101
+ const uint8_t* source_start;
102
+ } location_walker_context_t;
103
+
104
+ static bool find_earliest_control_keyword_walker(const pm_node_t* node, void* data) {
105
+ if (!node) { return true; }
106
+
107
+ location_walker_context_t* context = (location_walker_context_t*) data;
108
+ earliest_control_keyword_t* result = context->result;
109
+
110
+ control_type_t current_type = CONTROL_TYPE_UNKNOWN;
111
+ uint32_t keyword_offset = UINT32_MAX;
112
+
113
+ switch (node->type) {
114
+ case PM_IF_NODE: {
115
+ pm_if_node_t* if_node = (pm_if_node_t*) node;
116
+ current_type = CONTROL_TYPE_IF;
117
+ keyword_offset = (uint32_t) (if_node->if_keyword_loc.start - context->source_start);
118
+ break;
119
+ }
120
+
121
+ case PM_UNLESS_NODE: {
122
+ pm_unless_node_t* unless_node = (pm_unless_node_t*) node;
123
+ current_type = CONTROL_TYPE_UNLESS;
124
+ keyword_offset = (uint32_t) (unless_node->keyword_loc.start - context->source_start);
125
+ break;
126
+ }
127
+
128
+ case PM_CASE_NODE: {
129
+ pm_case_node_t* case_node = (pm_case_node_t*) node;
130
+ current_type = CONTROL_TYPE_CASE;
131
+ keyword_offset = (uint32_t) (case_node->case_keyword_loc.start - context->source_start);
132
+ break;
133
+ }
134
+
135
+ case PM_CASE_MATCH_NODE: {
136
+ pm_case_match_node_t* case_match_node = (pm_case_match_node_t*) node;
137
+ current_type = CONTROL_TYPE_CASE_MATCH;
138
+ keyword_offset = (uint32_t) (case_match_node->case_keyword_loc.start - context->source_start);
139
+ break;
140
+ }
141
+
142
+ case PM_WHILE_NODE: {
143
+ pm_while_node_t* while_node = (pm_while_node_t*) node;
144
+ current_type = CONTROL_TYPE_WHILE;
145
+ keyword_offset = (uint32_t) (while_node->keyword_loc.start - context->source_start);
146
+ break;
147
+ }
148
+
149
+ case PM_UNTIL_NODE: {
150
+ pm_until_node_t* until_node = (pm_until_node_t*) node;
151
+ current_type = CONTROL_TYPE_UNTIL;
152
+ keyword_offset = (uint32_t) (until_node->keyword_loc.start - context->source_start);
153
+ break;
154
+ }
155
+
156
+ case PM_FOR_NODE: {
157
+ pm_for_node_t* for_node = (pm_for_node_t*) node;
158
+ current_type = CONTROL_TYPE_FOR;
159
+ keyword_offset = (uint32_t) (for_node->for_keyword_loc.start - context->source_start);
160
+ break;
161
+ }
162
+
163
+ case PM_BEGIN_NODE: {
164
+ pm_begin_node_t* begin_node = (pm_begin_node_t*) node;
165
+ current_type = CONTROL_TYPE_BEGIN;
166
+
167
+ if (begin_node->begin_keyword_loc.start != NULL) {
168
+ keyword_offset = (uint32_t) (begin_node->begin_keyword_loc.start - context->source_start);
169
+ } else {
170
+ keyword_offset = (uint32_t) (node->location.start - context->source_start);
171
+ }
172
+ break;
173
+ }
174
+
175
+ case PM_YIELD_NODE: {
176
+ current_type = CONTROL_TYPE_YIELD;
177
+ keyword_offset = (uint32_t) (node->location.start - context->source_start);
178
+ break;
179
+ }
180
+
181
+ case PM_CALL_NODE: {
182
+ pm_call_node_t* call = (pm_call_node_t*) node;
183
+
184
+ if (call->block != NULL) {
185
+ current_type = CONTROL_TYPE_BLOCK;
186
+ keyword_offset = (uint32_t) (node->location.start - context->source_start);
187
+ }
188
+ break;
189
+ }
190
+
191
+ case PM_NEXT_NODE:
192
+ case PM_BREAK_NODE:
193
+ case PM_RETURN_NODE: {
194
+ current_type = CONTROL_TYPE_UNKNOWN;
195
+ keyword_offset = (uint32_t) (node->location.start - context->source_start);
196
+ break;
197
+ }
198
+
199
+ default: break;
200
+ }
201
+
202
+ if (keyword_offset != UINT32_MAX) {
203
+ if (!result->found || keyword_offset < result->offset) {
204
+ result->type = current_type;
205
+ result->offset = keyword_offset;
206
+ result->found = true;
207
+ }
208
+ }
209
+
210
+ return true;
211
+ }
212
+
213
+ static control_type_t find_earliest_control_keyword(pm_node_t* root, const uint8_t* source_start) {
214
+ if (!root) { return CONTROL_TYPE_UNKNOWN; }
215
+
216
+ earliest_control_keyword_t result = { .type = CONTROL_TYPE_UNKNOWN, .offset = UINT32_MAX, .found = false };
217
+
218
+ location_walker_context_t context = { .result = &result, .source_start = source_start };
219
+
220
+ pm_visit_node(root, find_earliest_control_keyword_walker, &context);
221
+
222
+ return result.found ? result.type : CONTROL_TYPE_UNKNOWN;
223
+ }
224
+
93
225
  static control_type_t detect_control_type(AST_ERB_CONTENT_NODE_T* erb_node) {
94
226
  if (!erb_node || erb_node->base.type != AST_ERB_CONTENT_NODE) { return CONTROL_TYPE_UNKNOWN; }
95
227
 
@@ -99,26 +231,18 @@ static control_type_t detect_control_type(AST_ERB_CONTENT_NODE_T* erb_node) {
99
231
 
100
232
  if (ruby->valid) { return CONTROL_TYPE_UNKNOWN; }
101
233
 
102
- if (has_block_node(ruby)) { return CONTROL_TYPE_BLOCK; }
103
- if (has_if_node(ruby)) { return CONTROL_TYPE_IF; }
234
+ pm_node_t* root = ruby->root;
235
+
104
236
  if (has_elsif_node(ruby)) { return CONTROL_TYPE_ELSIF; }
105
237
  if (has_else_node(ruby)) { return CONTROL_TYPE_ELSE; }
106
238
  if (has_end(ruby)) { return CONTROL_TYPE_END; }
107
- if (has_case_node(ruby)) { return CONTROL_TYPE_CASE; }
108
- if (has_case_match_node(ruby)) { return CONTROL_TYPE_CASE_MATCH; }
109
239
  if (has_when_node(ruby)) { return CONTROL_TYPE_WHEN; }
110
240
  if (has_in_node(ruby)) { return CONTROL_TYPE_IN; }
111
- if (has_begin_node(ruby)) { return CONTROL_TYPE_BEGIN; }
112
241
  if (has_rescue_node(ruby)) { return CONTROL_TYPE_RESCUE; }
113
242
  if (has_ensure_node(ruby)) { return CONTROL_TYPE_ENSURE; }
114
- if (has_unless_node(ruby)) { return CONTROL_TYPE_UNLESS; }
115
- if (has_while_node(ruby)) { return CONTROL_TYPE_WHILE; }
116
- if (has_until_node(ruby)) { return CONTROL_TYPE_UNTIL; }
117
- if (has_for_node(ruby)) { return CONTROL_TYPE_FOR; }
118
243
  if (has_block_closing(ruby)) { return CONTROL_TYPE_BLOCK_CLOSE; }
119
- if (has_yield_node(ruby)) { return CONTROL_TYPE_YIELD; }
120
244
 
121
- return CONTROL_TYPE_UNKNOWN;
245
+ return find_earliest_control_keyword(root, ruby->parser.start);
122
246
  }
123
247
 
124
248
  static bool is_subsequent_type(control_type_t parent_type, control_type_t child_type) {
@@ -515,21 +639,7 @@ static size_t process_control_structure(
515
639
 
516
640
  index++;
517
641
 
518
- while (index < hb_array_size(array)) {
519
- AST_NODE_T* child = hb_array_get(array, index);
520
-
521
- if (!child) { break; }
522
-
523
- if (child->type == AST_ERB_CONTENT_NODE) {
524
- AST_ERB_CONTENT_NODE_T* child_erb = (AST_ERB_CONTENT_NODE_T*) child;
525
- control_type_t child_type = detect_control_type(child_erb);
526
-
527
- if (child_type == CONTROL_TYPE_END) { break; }
528
- }
529
-
530
- hb_array_append(else_children, child);
531
- index++;
532
- }
642
+ index = process_block_children(node, array, index, else_children, context, initial_type);
533
643
 
534
644
  hb_array_T* else_errors = next_erb->base.errors;
535
645
  next_erb->base.errors = NULL;
@@ -677,21 +787,7 @@ static size_t process_control_structure(
677
787
 
678
788
  index++;
679
789
 
680
- while (index < hb_array_size(array)) {
681
- AST_NODE_T* child = hb_array_get(array, index);
682
-
683
- if (!child) { break; }
684
-
685
- if (child->type == AST_ERB_CONTENT_NODE) {
686
- AST_ERB_CONTENT_NODE_T* child_erb = (AST_ERB_CONTENT_NODE_T*) child;
687
- control_type_t child_type = detect_control_type(child_erb);
688
-
689
- if (child_type == CONTROL_TYPE_ENSURE || child_type == CONTROL_TYPE_END) { break; }
690
- }
691
-
692
- hb_array_append(else_children, child);
693
- index++;
694
- }
790
+ index = process_block_children(node, array, index, else_children, context, initial_type);
695
791
 
696
792
  hb_array_T* else_errors = next_erb->base.errors;
697
793
  next_erb->base.errors = NULL;
@@ -110,12 +110,20 @@ bool search_block_nodes(const pm_node_t* node, void* data) {
110
110
  analyzed_ruby_T* analyzed = (analyzed_ruby_T*) data;
111
111
 
112
112
  if (node->type == PM_BLOCK_NODE) {
113
- analyzed->has_block_node = true;
114
- return true;
115
- } else {
116
- pm_visit_child_nodes(node, search_block_nodes, analyzed);
113
+ pm_block_node_t* block_node = (pm_block_node_t*) node;
114
+
115
+ size_t opening_length = block_node->opening_loc.end - block_node->opening_loc.start;
116
+
117
+ if ((opening_length == 2 && block_node->opening_loc.start[0] == 'd' && block_node->opening_loc.start[1] == 'o')
118
+ || (opening_length == 1 && block_node->opening_loc.start[0] == '{')) {
119
+ analyzed->has_block_node = true;
120
+
121
+ return true;
122
+ }
117
123
  }
118
124
 
125
+ pm_visit_child_nodes(node, search_block_nodes, analyzed);
126
+
119
127
  return false;
120
128
  }
121
129
 
@@ -29,6 +29,5 @@ size_t hb_buffer_capacity(const hb_buffer_T* buffer);
29
29
  size_t hb_buffer_sizeof(void);
30
30
 
31
31
  void hb_buffer_clear(hb_buffer_T* buffer);
32
- void hb_buffer_free(hb_buffer_T** buffer);
33
32
 
34
33
  #endif
@@ -1,6 +1,6 @@
1
1
  #ifndef HERB_VERSION_H
2
2
  #define HERB_VERSION_H
3
3
 
4
- #define HERB_VERSION "0.8.0"
4
+ #define HERB_VERSION "0.8.1"
5
5
 
6
6
  #endif
data/src/parser.c CHANGED
@@ -1301,17 +1301,15 @@ void match_tags_in_node_array(hb_array_T* nodes, hb_array_T* errors) {
1301
1301
 
1302
1302
  hb_array_T* processed = parser_build_elements_from_tags(nodes, errors);
1303
1303
 
1304
- while (hb_array_size(nodes) > 0) {
1305
- hb_array_remove(nodes, 0);
1306
- }
1304
+ nodes->size = 0;
1307
1305
 
1308
- for (size_t i = 0; i < hb_array_size(processed); i++) {
1306
+ for (size_t i = 0; i < processed->size; i++) {
1309
1307
  hb_array_append(nodes, hb_array_get(processed, i));
1310
1308
  }
1311
1309
 
1312
1310
  hb_array_free(&processed);
1313
1311
 
1314
- for (size_t i = 0; i < hb_array_size(nodes); i++) {
1312
+ for (size_t i = 0; i < nodes->size; i++) {
1315
1313
  AST_NODE_T* node = (AST_NODE_T*) hb_array_get(nodes, i);
1316
1314
  if (node == NULL) { continue; }
1317
1315
 
data/src/util/hb_buffer.c CHANGED
@@ -192,12 +192,3 @@ void hb_buffer_clear(hb_buffer_T* buffer) {
192
192
  buffer->length = 0;
193
193
  buffer->value[0] = '\0';
194
194
  }
195
-
196
- void hb_buffer_free(hb_buffer_T** buffer) {
197
- if (!buffer || !*buffer) { return; }
198
-
199
- if ((*buffer)->value != NULL) { free((*buffer)->value); }
200
-
201
- free(*buffer);
202
- *buffer = NULL;
203
- }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: herb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.8.1
5
5
  platform: x86-linux-musl
6
6
  authors:
7
7
  - Marco Roth