aboutsummaryrefslogtreecommitdiff
path: root/externals/gridflow/base/source_filter.rb
diff options
context:
space:
mode:
Diffstat (limited to 'externals/gridflow/base/source_filter.rb')
-rw-r--r--externals/gridflow/base/source_filter.rb24
1 files changed, 13 insertions, 11 deletions
diff --git a/externals/gridflow/base/source_filter.rb b/externals/gridflow/base/source_filter.rb
index 59e24867..c55f4d95 100644
--- a/externals/gridflow/base/source_filter.rb
+++ b/externals/gridflow/base/source_filter.rb
@@ -1,14 +1,16 @@
+#!/usr/bin/env ruby
+
$keywords = %w(class decl def end grdecl)
$stack = []
$classes = []
ClassDecl = Struct.new(:name,:supername,:methods,:grins,:attrs,:info)
-MethodDecl = Struct.new(:rettype,:selector,:arglist,:minargs,:maxargs,:where)
+MethodDecl = Struct.new(:rettype,:selector,:arglist,:minargs,:maxargs,:where,:static)
Arg = Struct.new(:type,:name,:default)
class MethodDecl
def ==(o)
- return false unless rettype==o.rettype &&
+ return false unless rettype==o.rettype && static==o.static &&
maxargs==o.maxargs # && minargs==o.minargs
arglist.each_index{|i| arglist[i] == o.arglist[i] or return false }
return true
@@ -35,11 +37,11 @@ def handle_class(line)
end
def parse_methoddecl(line,term)
- /^(\w+)\s+(\w+)\s*\(([^\)]*)\)\s*#{term}/.match line or
+ /^(static\s)?\s*(\w+)\s+(\w+)\s*\(([^\)]*)\)\s*#{term}/.match line or
raise "syntax error #{where} #{line}"
- rettype,selector,arglist = $1,$2,$3
+ static,rettype,selector,arglist = $1,$2,$3,$4
arglist,minargs,maxargs = parse_arglist arglist
- MethodDecl.new(rettype,selector,arglist,minargs,maxargs,where)
+ MethodDecl.new(rettype,selector,arglist,minargs,maxargs,where,static)
end
def parse_arglist(arglist)
@@ -75,10 +77,9 @@ def handle_attr(line)
raise "missing \\class #{where}" if
not $stack[-1] or not ClassDecl===$stack[-1]
$stack[-1].attrs[name]=Arg.new(type,name,nil)
- Out.print line
- Out.puts "//FCS"
+ Out.print line.gsub(/\/\/.*$/,"") # hack!
handle_decl "void _0_#{name}_m (#{type} #{name});"
- Out.puts "# #{$linenumber}"
+# Out.puts "# #{$linenumber}"
end
def handle_decl(line)
@@ -88,16 +89,17 @@ def handle_decl(line)
m = parse_methoddecl(line,";\s*$")
$stack[-1].methods[m.selector] = m
+ Out.print "static " if m.static
Out.print "#{m.rettype} #{m.selector}(int argc, Ruby *argv"
Out.print "," if m.arglist.length>0
Out.print "#{unparse_arglist m.arglist});"
Out.puts "static Ruby #{m.selector}_wrap"+
"(int argc, Ruby *argv, Ruby rself);//FCS"
- Out.puts "# #{$linenumber+1}"
+# Out.puts "# #{$linenumber}"
end
def handle_def(line)
- m = parse_methoddecl(line,"\{?.*$")
+ m = parse_methoddecl(line,"\\{?.*$")
term = line[/\{.*/]
qlass = $stack[-1]
raise "missing \\class #{where}" if not qlass or not ClassDecl===qlass
@@ -176,7 +178,7 @@ def handle_classinfo(line)
c,s = frame.name,method.selector
"{ \"#{s}\",(RMethod)#{c}::#{s}_wrap }"
}.join(",")
- Out.puts "}; FClass ci#{cl} = { #{cl}_allocator, #{cl}_startup,"
+ Out.puts "}; static FClass ci#{cl} = { #{cl}_allocator, #{cl}_startup,"
Out.puts "#{cl.inspect}, COUNT(#{cl}_methods), #{cl}_methods };"
Out.puts "void #{frame.name}_startup (Ruby rself) "+line
end