class Metasm::C::Enum
Attributes
backtrace[RW]
members[RW]
name => value
name[RW]
Public Instance Methods
align(parser)
click to toggle source
# File metasm/parse_c.rb, line 589 def align(parser) BaseType.new(:int).align(parser) end
arithmetic?()
click to toggle source
# File metasm/parse_c.rb, line 591 def arithmetic?; true end
compare_deep(o)
click to toggle source
# File metasm/parse_c.rb, line 624 def compare_deep(o) return true if o.object_id == self.object_id return if o.class != self.class or o.name != self.name or o.attributes != self.attributes members == o.members end
dump(scope, r=[CRenderString.new], dep=[])
click to toggle source
# File metasm/parse_c.rb, line 3747 def dump(scope, r=[CRenderString.new], dep=[]) if name r.last << @qualifier.map { |q| q.to_s << ' ' }.join if qualifier r.last << 'enum ' << @name dep |= [scope.struct_ancestors[@name]] [r, dep] else dump_def(scope, r, dep) end end
dump_def(scope, r=[CRenderString.new], dep=[])
click to toggle source
# File metasm/parse_c.rb, line 3758 def dump_def(scope, r=[CRenderString.new], dep=[]) r.last << @qualifier.map { |q| q.to_s << ' ' }.join if qualifier r.last << 'enum' r.last << ' ' << @name if name if members r.last << ' { ' val = -1 @members.sort_by { |m, v| v }.each { |m, v| r.last << ', ' if r.last[-2, 2] != '{ ' r.last << m if v != (val += 1) val = v r.last << ' = ' << val.to_s end } r.last << ' }' end [r, dep] end
dump_initializer(init, scope, r=[CRenderString.new], dep=[])
click to toggle source
Calls superclass method
Metasm::C::Type#dump_initializer
# File metasm/parse_c.rb, line 3778 def dump_initializer(init, scope, r=[CRenderString.new], dep=[]) if members and ( k = @members.index(init) or (init.kind_of? CExpression and not init.op and k = @members.index(init.rexpr)) ) r.last << k dep |= [scope.struct_ancestors[@name]] [r, dep] else super(init, scope, r, dep) end end
integral?()
click to toggle source
# File metasm/parse_c.rb, line 592 def integral?; true end
parse_members(parser, scope)
click to toggle source
# File metasm/parse_c.rb, line 595 def parse_members(parser, scope) val = -1 @members = {} loop do raise parser if not tok = parser.skipspaces break if tok.type == :punct and tok.raw == '}' name = tok.raw raise tok, 'bad enum name' if tok.type != :string or Keyword[name] or (?0..?9).include?(name[0]) raise parser if not tok = parser.skipspaces if tok.type == :punct and tok.raw == '=' raise tok || parser if not val = CExpression.parse(parser, scope, false) or not val = val.reduce(parser) or not tok = parser.skipspaces else val += 1 end raise tok, "enum value #{name} redefinition" if scope.symbol[name] and scope.symbol[name] != val @members[name] = val scope.symbol[name] = val if tok.type == :punct and tok.raw == '}' break elsif tok.type == :punct and tok.raw == ',' else raise tok, '"," or "}" expected' end end parse_attributes(parser) end
signed?()
click to toggle source
# File metasm/parse_c.rb, line 593 def signed?; false end