Class: CGenerator::Library::RbDefineAccumulator

Inherits:
Accumulator
  • Object
show all
Defined in:
lib/cgen/cgen.rb

Instance Attribute Summary

Attributes inherited from Accumulator

#name, #parent

Instance Method Summary collapse

Methods inherited from Accumulator

#accept?, #add_one, #add_one_really, #initialize, #inspect, #inspect_one, #output, #output_one, #separator

Constructor Details

This class inherits a constructor from CGenerator::Accumulator

Instance Method Details

#add(spec) ⇒ Object



1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
# File 'lib/cgen/cgen.rb', line 1054

def add spec
  c_name  = spec[:c_name]
  mod     = spec[:mod]
  rb_name = spec[:rb_name]
  cfile   = spec[:cfile]
  
  meth_rec =
    if c_name
      @pile.find { |s| s[:c_name] == c_name }
    else
      @pile.find { |s| s[:mod] == mod and s[:rb_name] == rb_name }
    end
  
  if meth_rec
    meth_rec.update spec
  else
    meth_rec = spec
    
    unless rb_name
      raise ArgumentError, "define: must provide method name."
    end
    
    kind = @name.to_s.sub(/\Arb_define_/, "")
    if mod
      meth_rec[:mod_c_name] ||= @parent.declare_module(mod, cfile)  ## @parent ?
      meth_rec[:c_name] ||=
        ("#{CGenerator::make_c_name rb_name}" +
         "_#{meth_rec[:mod_c_name]}_#{kind}").intern
    else
      meth_rec[:c_name] ||=
        "#{CGenerator::make_c_name rb_name}_#{kind}".intern
    end
    meth_rec[:argc] ||= 0
    @pile << meth_rec
  end
  
  meth_rec[:c_name]
end

#to_sObject



1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
# File 'lib/cgen/cgen.rb', line 1093

def to_s
  @pile.collect { |m|
    rb_name = m[:rb_name]
    c_name  = m[:c_name]
    argc    = m[:argc]
    if m[:mod]
      mod_c_name = m[:mod_c_name]
      "#{@name}(#{mod_c_name}, \"#{rb_name}\", #{c_name}, #{argc});"
    else
      "#{@name}(\"#{rb_name}\", #{c_name}, #{argc});"
    end
  }.join "\n"
end