diff options
author | Nobuyoshi Nakada <[email protected]> | 2024-09-08 21:06:54 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <[email protected]> | 2024-09-08 23:16:46 +0900 |
commit | 70871fa6e3172d10d615174e9aa909d3e08687f0 (patch) | |
tree | 9037ab957a5fb8fd8c514a0b6644c303a0b8233a /template | |
parent | be84abffbaf315c7534ec4c76edc7b30c3ec8111 (diff) |
Extract `rb_builtin_find`
Refactor out the same code from `rb_builtin_ast_value` and
`pm_builtin_ast_value.
Diffstat (limited to 'template')
-rw-r--r-- | template/prelude.c.tmpl | 62 |
1 files changed, 9 insertions, 53 deletions
diff --git a/template/prelude.c.tmpl b/template/prelude.c.tmpl index 125a293423..63659c5a4d 100644 --- a/template/prelude.c.tmpl +++ b/template/prelude.c.tmpl @@ -58,7 +58,7 @@ class Prelude if line.size > LINE_LIMIT raise "#{filename}:#{lines.size+1}: too long line" end - line.sub!(/require(_relative)?\s*\(?\s*(["'])(.*?)(?:\.rb)?\2\)?/) do + line.sub!(/require(_relative)?\s*\(?\s*([\"\'])(.*?)(?:\.rb)?\2\)?/) do orig, rel, path = $&, $2, $3 if rel path = File.join(File.dirname(filename), path) @@ -141,73 +141,29 @@ COMPILER_WARNING_POP #define PRELUDE_NAME(n) rb_usascii_str_new_static(prelude_name##n, sizeof(prelude_name##n)-1) #define PRELUDE_CODE(n) rb_utf8_str_new_static(prelude_code##n.L0, sizeof(prelude_code##n)) -static VALUE -prelude_ast_value(VALUE name, VALUE code, int line) -{ - rb_ast_t *ast; - VALUE ast_value = rb_parser_compile_string_path(rb_parser_new(), name, code, line); - ast = rb_ruby_ast_data_get(ast_value); - if (!ast || !ast->body.root) { - if (ast) rb_ast_dispose(ast); - rb_exc_raise(rb_errinfo()); - } - return ast_value; -} - -static void -pm_prelude_load(pm_parse_result_t *result, VALUE name, VALUE code, int line) -{ - pm_options_line_set(&result->options, line); - VALUE error = pm_parse_string(result, code, name, NULL); - - if (!NIL_P(error)) { - pm_parse_result_free(result); - rb_exc_raise(error); - } -} - % end % if @builtin_count > 0 -#define PRELUDE_VAST(n, name_str, start_line) \ +#define PRELUDE_MATCH(n) \ (((sizeof(prelude_name<%='##'%><%=%>n) - prefix_len - 2) == namelen) && \ - (strncmp(prelude_name<%='##'%><%=%>n + prefix_len, feature_name, namelen) == 0) ? \ - prelude_ast_value((name_str) = PRELUDE_NAME(n), PRELUDE_CODE(n), start_line) : Qnil) + (strncmp(prelude_name<%='##'%><%=%>n + prefix_len, feature_name, namelen) == 0)) VALUE -rb_builtin_ast_value(const char *feature_name, VALUE *name_str) +rb_builtin_find(const char *feature_name, VALUE *name_str, int *start_line) { const size_t prefix_len = rb_strlen_lit("<internal:"); size_t namelen = strlen(feature_name); - VALUE ast_value = Qnil; -% @preludes.each_value do |i, prelude, lines, sub, start_line| -% if sub - if (!NIL_P(ast_value = PRELUDE_VAST(<%=i%><%=%>, *name_str, <%=start_line%>))) return ast_value; -% end -% end - return ast_value; -} - -bool -pm_builtin_ast_value(pm_parse_result_t *result, const char *feature_name, VALUE *name_str) -{ - const size_t prefix_len = rb_strlen_lit("<internal:"); - size_t namelen = strlen(feature_name); +#define PRELUDE_FOUND(n, l) \ + (*name_str = PRELUDE_NAME(n), *start_line = (l), PRELUDE_CODE(n)) % @preludes.each_value do |i, prelude, lines, sub, start_line| % if sub - if ( - (sizeof(prelude_name<%= i %>) - prefix_len - 2 == namelen) && - (strncmp(prelude_name<%= i %> + prefix_len, feature_name, namelen) == 0) - ) { - *name_str = PRELUDE_NAME(<%= i %>); - pm_prelude_load(result, *name_str, PRELUDE_CODE(<%= i %>), <%= start_line %>); - return true; - } + if (PRELUDE_MATCH(<%=i%>)) return PRELUDE_FOUND(<%=i%>, <%=start_line%>); % end % end +#undef PRELUDE_FOUND - return false; + return Qnil; } % end |