summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/offlineasm/parser.rb
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
commit32761a6cee1d0dee366b885b7b9c777e67885688 (patch)
treed6bec92bebfb216f4126356e55518842c2f476a1 /Source/JavaScriptCore/offlineasm/parser.rb
parenta4e969f4965059196ca948db781e52f7cfebf19e (diff)
downloadWebKitGtk-tarball-32761a6cee1d0dee366b885b7b9c777e67885688.tar.gz
webkitgtk-2.4.11webkitgtk-2.4.11
Diffstat (limited to 'Source/JavaScriptCore/offlineasm/parser.rb')
-rw-r--r--Source/JavaScriptCore/offlineasm/parser.rb167
1 files changed, 27 insertions, 140 deletions
diff --git a/Source/JavaScriptCore/offlineasm/parser.rb b/Source/JavaScriptCore/offlineasm/parser.rb
index b44511245..3b9c67bed 100644
--- a/Source/JavaScriptCore/offlineasm/parser.rb
+++ b/Source/JavaScriptCore/offlineasm/parser.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2011, 2016 Apple Inc. All rights reserved.
+# Copyright (C) 2011 Apple Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -28,83 +28,19 @@ require "pathname"
require "registers"
require "self_hash"
-class SourceFile
- @@fileNames = []
-
- attr_reader :name, :fileNumber
-
- def SourceFile.outputDotFileList(outp)
- @@fileNames.each_index {
- | index |
- outp.puts "\".file #{index+1} \\\"#{@@fileNames[index]}\\\"\\n\""
- }
- end
-
- def initialize(fileName)
- @name = Pathname.new(fileName)
- pathName = "#{@name.realpath}"
- fileNumber = @@fileNames.index(pathName)
- if not fileNumber
- @@fileNames << pathName
- fileNumber = @@fileNames.length
- else
- fileNumber += 1 # File numbers are 1 based
- end
- @fileNumber = fileNumber
- end
-end
-
class CodeOrigin
- attr_reader :lineNumber
+ attr_reader :fileName, :lineNumber
- def initialize(sourceFile, lineNumber)
- @sourceFile = sourceFile
+ def initialize(fileName, lineNumber)
+ @fileName = fileName
@lineNumber = lineNumber
end
-
- def fileName
- @sourceFile.name
- end
-
- def debugDirective
- $emitWinAsm ? nil : "\".loc #{@sourceFile.fileNumber} #{lineNumber}\\n\""
- end
-
+
def to_s
"#{fileName}:#{lineNumber}"
end
end
-class IncludeFile
- @@includeDirs = []
-
- attr_reader :fileName
-
- def initialize(moduleName, defaultDir)
- directory = nil
- @@includeDirs.each {
- | includePath |
- fileName = includePath + (moduleName + ".asm")
- directory = includePath unless not File.file?(fileName)
- }
- if not directory
- directory = defaultDir
- end
-
- @fileName = directory + (moduleName + ".asm")
- end
-
- def self.processIncludeOptions()
- while ARGV[0][/^-I/]
- path = ARGV.shift[2..-1]
- if not path
- path = ARGV.shift
- end
- @@includeDirs << (path + "/")
- end
- end
-end
-
class Token
attr_reader :codeOrigin, :string
@@ -151,7 +87,8 @@ end
# The lexer. Takes a string and returns an array of tokens.
#
-def lex(str, file)
+def lex(str, fileName)
+ fileName = Pathname.new(fileName)
result = []
lineNumber = 1
annotation = nil
@@ -171,37 +108,35 @@ def lex(str, file)
# use of this for its cloopDo debugging utility even if
# enableInstrAnnotations is not enabled.
if annotation
- result << Annotation.new(CodeOrigin.new(file, lineNumber),
+ result << Annotation.new(CodeOrigin.new(fileName, lineNumber),
annotationType, annotation)
annotation = nil
end
- result << Token.new(CodeOrigin.new(file, lineNumber), $&)
+ result << Token.new(CodeOrigin.new(fileName, lineNumber), $&)
lineNumber += 1
when /\A[a-zA-Z]([a-zA-Z0-9_.]*)/
- result << Token.new(CodeOrigin.new(file, lineNumber), $&)
+ result << Token.new(CodeOrigin.new(fileName, lineNumber), $&)
when /\A\.([a-zA-Z0-9_]*)/
- result << Token.new(CodeOrigin.new(file, lineNumber), $&)
+ result << Token.new(CodeOrigin.new(fileName, lineNumber), $&)
when /\A_([a-zA-Z0-9_]*)/
- result << Token.new(CodeOrigin.new(file, lineNumber), $&)
+ result << Token.new(CodeOrigin.new(fileName, lineNumber), $&)
when /\A([ \t]+)/
# whitespace, ignore
whitespaceFound = true
str = $~.post_match
next
when /\A0x([0-9a-fA-F]+)/
- result << Token.new(CodeOrigin.new(file, lineNumber), $&.hex.to_s)
+ result << Token.new(CodeOrigin.new(fileName, lineNumber), $&.hex.to_s)
when /\A0([0-7]+)/
- result << Token.new(CodeOrigin.new(file, lineNumber), $&.oct.to_s)
+ result << Token.new(CodeOrigin.new(fileName, lineNumber), $&.oct.to_s)
when /\A([0-9]+)/
- result << Token.new(CodeOrigin.new(file, lineNumber), $&)
+ result << Token.new(CodeOrigin.new(fileName, lineNumber), $&)
when /\A::/
- result << Token.new(CodeOrigin.new(file, lineNumber), $&)
+ result << Token.new(CodeOrigin.new(fileName, lineNumber), $&)
when /\A[:,\(\)\[\]=\+\-~\|&^*]/
- result << Token.new(CodeOrigin.new(file, lineNumber), $&)
- when /\A".*"/
- result << Token.new(CodeOrigin.new(file, lineNumber), $&)
+ result << Token.new(CodeOrigin.new(fileName, lineNumber), $&)
else
- raise "Lexer error at #{CodeOrigin.new(file, lineNumber).to_s}, unexpected sequence #{str[0..20].inspect}"
+ raise "Lexer error at #{CodeOrigin.new(fileName, lineNumber).to_s}, unexpected sequence #{str[0..20].inspect}"
end
whitespaceFound = false
str = $~.post_match
@@ -218,13 +153,13 @@ def isRegister(token)
end
def isInstruction(token)
- INSTRUCTION_SET.member? token.string
+ token =~ INSTRUCTION_PATTERN
end
def isKeyword(token)
- token =~ /\A((true)|(false)|(if)|(then)|(else)|(elsif)|(end)|(and)|(or)|(not)|(global)|(macro)|(const)|(sizeof)|(error)|(include))\Z/ or
+ token =~ /\A((true)|(false)|(if)|(then)|(else)|(elsif)|(end)|(and)|(or)|(not)|(macro)|(const)|(sizeof)|(error)|(include))\Z/ or
token =~ REGISTER_PATTERN or
- isInstruction(token)
+ token =~ INSTRUCTION_PATTERN
end
def isIdentifier(token)
@@ -247,10 +182,6 @@ def isInteger(token)
token =~ /\A[0-9]/
end
-def isString(token)
- token =~ /\A".*"/
-end
-
#
# The parser. Takes an array of tokens and returns an AST. Methods
# other than parse(tokens) are not for public consumption.
@@ -436,10 +367,6 @@ class Parser
result = Immediate.new(@tokens[@idx].codeOrigin, @tokens[@idx].string.to_i)
@idx += 1
result
- elsif isString @tokens[@idx]
- result = StringLiteral.new(@tokens[@idx].codeOrigin, @tokens[@idx].string)
- @idx += 1
- result
elsif isIdentifier @tokens[@idx]
codeOrigin, names = parseColonColon
if names.size > 1
@@ -453,14 +380,6 @@ class Parser
@idx += 1
codeOrigin, names = parseColonColon
Sizeof.forName(codeOrigin, names.join('::'))
- elsif isLabel @tokens[@idx]
- result = LabelReference.new(@tokens[@idx].codeOrigin, Label.forName(@tokens[@idx].codeOrigin, @tokens[@idx].string))
- @idx += 1
- result
- elsif isLocalLabel @tokens[@idx]
- result = LocalLabelReference.new(@tokens[@idx].codeOrigin, LocalLabel.forName(@tokens[@idx].codeOrigin, @tokens[@idx].string))
- @idx += 1
- result
else
parseError
end
@@ -481,7 +400,7 @@ class Parser
end
def couldBeExpression
- @tokens[@idx] == "-" or @tokens[@idx] == "~" or @tokens[@idx] == "sizeof" or isInteger(@tokens[@idx]) or isString(@tokens[@idx]) or isVariable(@tokens[@idx]) or @tokens[@idx] == "("
+ @tokens[@idx] == "-" or @tokens[@idx] == "~" or @tokens[@idx] == "sizeof" or isInteger(@tokens[@idx]) or isVariable(@tokens[@idx]) or @tokens[@idx] == "("
end
def parseExpressionAdd
@@ -654,14 +573,6 @@ class Parser
body = parseSequence(/\Aend\Z/, "while inside of macro #{name}")
@idx += 1
list << Macro.new(codeOrigin, name, variables, body)
- elsif @tokens[@idx] == "global"
- codeOrigin = @tokens[@idx].codeOrigin
- @idx += 1
- skipNewLine
- parseError unless isLabel(@tokens[@idx])
- name = @tokens[@idx].string
- @idx += 1
- Label.setAsGlobal(codeOrigin, name)
elsif isInstruction @tokens[@idx]
codeOrigin = @tokens[@idx].codeOrigin
name = @tokens[@idx].string
@@ -766,7 +677,7 @@ class Parser
parseError unless @tokens[@idx] == ":"
# It's a label.
if isLabel name
- list << Label.forName(codeOrigin, name, true)
+ list << Label.forName(codeOrigin, name)
else
list << LocalLabel.forName(codeOrigin, name)
end
@@ -775,8 +686,9 @@ class Parser
@idx += 1
parseError unless isIdentifier(@tokens[@idx])
moduleName = @tokens[@idx].string
- fileName = IncludeFile.new(moduleName, @tokens[@idx].codeOrigin.fileName.dirname).fileName
+ fileName = @tokens[@idx].codeOrigin.fileName.dirname + (moduleName + ".asm")
@idx += 1
+ $stderr.puts "offlineasm: Including file #{fileName}"
list << parse(fileName)
else
parseError "Expecting terminal #{final} #{comment}"
@@ -784,33 +696,10 @@ class Parser
}
Sequence.new(firstCodeOrigin, list)
end
-
- def parseIncludes(final, comment)
- firstCodeOrigin = @tokens[@idx].codeOrigin
- fileList = []
- fileList << @tokens[@idx].codeOrigin.fileName
- loop {
- if (@idx == @tokens.length and not final) or (final and @tokens[@idx] =~ final)
- break
- elsif @tokens[@idx] == "include"
- @idx += 1
- parseError unless isIdentifier(@tokens[@idx])
- moduleName = @tokens[@idx].string
- fileName = IncludeFile.new(moduleName, @tokens[@idx].codeOrigin.fileName.dirname).fileName
- @idx += 1
-
- fileList << fileName
- else
- @idx += 1
- end
- }
-
- return fileList
- end
end
def parseData(data, fileName)
- parser = Parser.new(data, SourceFile.new(fileName))
+ parser = Parser.new(data, fileName)
parser.parseSequence(nil, "")
end
@@ -819,8 +708,6 @@ def parse(fileName)
end
def parseHash(fileName)
- parser = Parser.new(IO::read(fileName), SourceFile.new(fileName))
- fileList = parser.parseIncludes(nil, "")
- fileListHash(fileList)
+ dirHash(Pathname.new(fileName).dirname, /\.asm$/)
end