class Metasm::Preprocessor::SpecialMacro

special object, handles __FILE__ __LINE__ __COUNTER__ __DATE__ __TIME__ macros

Attributes

name[RW]

Public Class Methods

new(raw) click to toggle source
# File metasm/preprocessor.rb, line 325
def initialize(raw)
        @name = Token.new(nil)
        @name.type = :string
        @name.raw = raw
end

Public Instance Methods

apply(lexer, name, emptyarglist, toklist=nil) click to toggle source
# File metasm/preprocessor.rb, line 331
def apply(lexer, name, emptyarglist, toklist=nil)
        tok = @name.dup
        tok.expanded_from = name.expanded_from.to_a + [name]
        case @name.raw
        when '__FILE__', '__DATE__', '__TIME__'      # returns a :quoted
                tok.type = :quoted
                tok.value = \
                case @name.raw
                when '__FILE__'
                        name = name.expanded_from.first if name.expanded_from
                        name.backtrace.to_a[-2].to_s
                when '__DATE__'; Time.now.strftime('%b %e %Y')
                when '__TIME__'; Time.now.strftime('%H:%M:%S')
                end
                tok.raw = tok.value.inspect
        when '__LINE__', '__COUNTER__'               # returns a :string
                tok.type = :string
                case @name.raw
                when '__LINE__'
                        name = name.expanded_from.first if name.expanded_from
                        tok.value = name.backtrace.to_a[-1]
                when '__COUNTER__'
                        tok.value = @counter ||= 0
                        @counter += 1
                end
                tok.raw = tok.value.to_s
        else raise name, 'internal error'
        end
        [tok]
end
args() click to toggle source
# File metasm/preprocessor.rb, line 321
def args ; end
body() click to toggle source
# File metasm/preprocessor.rb, line 322
def body ; [@name] end