blob: e8c97ed7f6bc9f896bd2acef2b41eca5f8229e90 [file] [log] [blame]
# TODO: Perform more smart conversions
require 'cgi'
require 'pathname'
require 'common/Params'
require 'dbgp/InitPacket'
require 'dbgp/ErrorElement'
require 'dbgp/Communicator'
module XoredDebuggerUtils
#
# uri -> path
#
def uri_to_path(uri)
# File.expand_path
result = CGI.unescape(uri).sub('file:///', '')
if !Pathname.new(result).absolute?
result = '/' + result
end
return result
end
if RUBY_PLATFORM =~ /mswin/
PATH_SPLIT_RE = /[\/\\]/
else
PATH_SPLIT_RE = /\//
end
#
# path -> uri
#
def path_to_uri(path)
#puts 'path_to_uri ' + path
result = 'file://'
segments = path.split PATH_SPLIT_RE
index = 0
for segment in segments
#puts 'segment' + index.to_s + '=[' + segment + ']'
if (segment == '' && index == 0)
next
end
segment = escapeSegment(segment)
result += '/'
result += segment
#puts result
++index
end
return result
end
def escapeSegment(string)
string.gsub(/([^a-zA-Z0-9_.:-]+)/n) do
'%' + $1.unpack('H2' * $1.size).join('%').upcase
end
end
def normalize_path(path)
Pathname.new(path).expand_path.to_s
end
#
# Thread label
#
def get_thread_label(thread)
main_label = (thread == Thread.main ? ' (main)' : '' )
label = sprintf("Thread%s id=%d", main_label, thread.object_id)
# Can cause null pointer on JRuby
# priority = thread.priority
# if priority
# label = sprintf("%s, priority=%d", label, priority)
# end
label
end
# Helper method to remove debugger stack frame from child thread
def get_stack_depth(context)
if (context.thread != Thread.main)
# Hide debugger's frame
context.stack_frames_num - 1
else
context.stack_frames_num
end
end
end
module XoredDebugger
class InitError
include XoredDebuggerUtils
def initialize(code)
params = Params.instance
communicator = Communicator.new(Thread.current)
packet = InitPacket.new(params.key, get_thread_label(Thread.current), params.script)
packet.set_data(ErrorElement.new(code))
communicator.sendPacket(packet)
# wait until connection closed
begin
communicator.receiveCommand
rescue Exception
ensure
communicator.close
end
end
end
end