Safebox/lib/safebox/safebox.rb

46 lines
859 B
Ruby
Raw Normal View History

2010-03-20 23:53:57 +01:00
module Safebox
2010-03-21 00:24:24 +01:00
class <<self
def run *paras, &exe
exe = paras.shift unless exe
box = paras.shift || Class
Thread.new do
$SAFE = 4
this = box.new *paras
begin
[:value, String === exe ? this.instance_eval( exe, "Safebox") : this.instance_eval( &exe)]
2010-03-21 00:24:24 +01:00
rescue Object
[:exception, $!]
end
end.value
end
2010-03-20 23:53:57 +01:00
2010-03-21 00:24:24 +01:00
def create_class *paras, &exe
exe = paras.shift unless exe
self.run Class, *paras do
eval exe
self
end
2010-03-20 23:53:57 +01:00
end
2010-03-21 00:24:24 +01:00
alias new_class create_class
def on_exception exc
$stdout.puts "#{exc} (#{exc.class})\n\t#{exc.backtrace.join"\n\t"}"
rescue Object
on_exception $!
end
def eval *paras, &exe
2010-03-31 23:22:03 +02:00
type, value = self.run( *paras, &exe)
case type
when :exception
2010-03-31 23:22:03 +02:00
on_exception value
nil
2010-03-31 23:22:03 +02:00
when :value then value
else # Not possible
end
end
public :eval
2010-03-20 23:53:57 +01:00
end
end