aboutsummaryrefslogtreecommitdiffstats
path: root/template
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-12-01 03:54:50 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-12-01 03:54:50 +0000
commitb718319b9c4d78c0922ab6c0589df91f61a5e10b (patch)
treedc1b84eeaa07f01195ca7ea5cfdde7b23afaa7eb /template
parent3c358d5f6da0ad382ab43ea86a4bdf0942bc4db2 (diff)
downloadruby-b718319b9c4d78c0922ab6c0589df91f61a5e10b.tar.gz
prelude.c.tmpl: split prelude code
* template/prelude.c.tmpl: split prelude code into blocks so that each elements do not exceed the string literal size limit in C89. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60953 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'template')
-rw-r--r--template/prelude.c.tmpl48
1 files changed, 38 insertions, 10 deletions
diff --git a/template/prelude.c.tmpl b/template/prelude.c.tmpl
index ef024fd05c..52f5968f19 100644
--- a/template/prelude.c.tmpl
+++ b/template/prelude.c.tmpl
@@ -6,6 +6,8 @@
# Ruby 1.9 feature should not be used.
class Prelude
+ LINE_LIMIT = 509 # by C89
+
C_ESC = {
"\\" => "\\\\",
'"' => '\"',
@@ -42,7 +44,10 @@ class Prelude
result = [@preludes.size, @vpath.strip(filename), lines, sub]
@vpath.foreach(filename) do |line|
@preludes[filename] ||= result
- line.sub!(/(?:^|\s+)\#(?:$|[#\s].*)/, '')
+ comment = ($1 || '' if line.sub!(/(?:^|\s+)\#(?:$|[#\s](.*))/, ''))
+ if line.size > LINE_LIMIT
+ raise "#{filename}:#{lines.size+1}: too long line"
+ end
line.sub!(/require(_relative)?\s*\(?\s*(["'])(.*?)(?:\.rb)?\2\)?/) do
orig, rel, path = $&, $2, $3
if rel
@@ -57,7 +62,7 @@ class Prelude
orig
end
end
- lines << c_esc(line)
+ lines << [line, comment]
end
result
end
@@ -67,7 +72,7 @@ Prelude.new(output && output[/\w+(?=_prelude.c\b)/] || 'prelude', ARGV, vpath).i
/* -*-c-*-
THIS FILE WAS AUTOGENERATED BY template/prelude.c.tmpl. DO NOT EDIT.
- sources: <%= @preludes.map {|n,*| prelude_base(n)}.join(', ') %>
+ sources: <%= @preludes.map {|n,*| prelude_base(n)}.join(', ') %><%=%>
*/
%unless @preludes.empty?
#include "ruby/ruby.h"
@@ -79,11 +84,34 @@ Prelude.new(output && output[/\w+(?=_prelude.c\b)/] || 'prelude', ARGV, vpath).i
% preludes.each {|i, prelude, lines, sub|
static const char prelude_name<%=i%><%=%>[] = <%=c_esc(prelude_name(*prelude))%><%=%>;
-static const char prelude_code<%=i%><%=%>[] =
-% lines.each {|line|
-<%=line%><%=%>
+static const struct {
+% size = beg = 0
+% lines.each_with_index {|(line, comment), n|
+% if size + line.size < Prelude::LINE_LIMIT
+% size += line.size
+% next
+% end
+ char L<%=beg%><%=%>[<%=size%><%=%>]; /* <%=beg+1%>..<%=n%> */
+% size = line.size
+% beg = n
% }
-;
+% if size > 0
+ char L<%=beg%><%=%>[<%=size%><%=%>]; /* <%=beg+1%>..<%=lines.size+1%> */
+% end
+} prelude_code<%=i%><%=%> = {
+% size = 0
+#line 1 <%=c_esc(prelude)%>
+% lines.each_with_index {|(line, comment), n|
+% if size + line.size >= Prelude::LINE_LIMIT
+% size = 0
+,
+#line <%=n+1%> <%=c_esc(prelude)%>
+% end
+% size += line.size
+<%=c_esc(line)%><%=%><%if comment%>/* <%=comment%> */<%end%>
+% }
+#line <%=_erbout.count("\n")+2%> "<%=@init_name%>.c"
+};
% }
% if @have_sublib
@@ -147,7 +175,7 @@ prelude_require(VALUE self, VALUE nth)
% @preludes.each_value do |i, prelude, lines, sub|
% if sub
case <%=i%><%=%>:
- code = rb_usascii_str_new(prelude_code<%=i%><%=%>, sizeof(prelude_code<%=i%><%=%>) - 1);
+ code = rb_usascii_str_new(prelude_code<%=i%><%=%>.L0, sizeof(prelude_code<%=i%><%=%>));
name = rb_usascii_str_new(prelude_name<%=i%><%=%>, sizeof(prelude_name<%=i%><%=%>) - 1);
break;
% end
@@ -181,7 +209,7 @@ Init_<%=@init_name%><%=%>(void)
% preludes.each do |i, prelude, lines, sub|
% next if sub
prelude_eval(
- rb_usascii_str_new(prelude_code<%=i%><%=%>, sizeof(prelude_code<%=i%><%=%>) - 1),
+ rb_usascii_str_new(prelude_code<%=i%><%=%>.L0, sizeof(prelude_code<%=i%><%=%>)),
rb_usascii_str_new(prelude_name<%=i%><%=%>, sizeof(prelude_name<%=i%><%=%>) - 1),
INT2FIX(1));
% end
@@ -191,7 +219,7 @@ Init_<%=@init_name%><%=%>(void)
#if 0
% preludes.length.times {|i|
- puts(prelude_code<%=i%><%=%>);
+ printf("%.*s", (int)sizeof(prelude_code<%=i%><%=%>), prelude_code<%=i%><%=%>.L0);
% }
#endif
%end