summaryrefslogtreecommitdiff
path: root/lib/irb/command/measure.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/irb/command/measure.rb')
-rw-r--r--lib/irb/command/measure.rb49
1 files changed, 49 insertions, 0 deletions
diff --git a/lib/irb/command/measure.rb b/lib/irb/command/measure.rb
new file mode 100644
index 0000000000..f96be20de8
--- /dev/null
+++ b/lib/irb/command/measure.rb
@@ -0,0 +1,49 @@
+module IRB
+ # :stopdoc:
+
+ module Command
+ class Measure < Base
+ include RubyArgsExtractor
+
+ category "Misc"
+ description "`measure` enables the mode to measure processing time. `measure :off` disables it."
+
+ def initialize(*args)
+ super(*args)
+ end
+
+ def execute(arg)
+ if arg&.match?(/^do$|^do[^\w]|^\{/)
+ warn 'Configure IRB.conf[:MEASURE_PROC] to add custom measure methods.'
+ return
+ end
+ args, kwargs = ruby_args(arg)
+ execute_internal(*args, **kwargs)
+ end
+
+ def execute_internal(type = nil, arg = nil)
+ # Please check IRB.init_config in lib/irb/init.rb that sets
+ # IRB.conf[:MEASURE_PROC] to register default "measure" methods,
+ # "measure :time" (abbreviated as "measure") and "measure :stackprof".
+
+ case type
+ when :off
+ IRB.unset_measure_callback(arg)
+ when :list
+ IRB.conf[:MEASURE_CALLBACKS].each do |type_name, _, arg_val|
+ puts "- #{type_name}" + (arg_val ? "(#{arg_val.inspect})" : '')
+ end
+ when :on
+ added = IRB.set_measure_callback(arg)
+ puts "#{added[0]} is added." if added
+ else
+ added = IRB.set_measure_callback(type, arg)
+ puts "#{added[0]} is added." if added
+ end
+ nil
+ end
+ end
+ end
+
+ # :startdoc:
+end