root/lang/ruby/safeeval/lib/safe_eval.rb @ 284

Revision 284, 0.7 kB (checked in by cho45, 5 years ago)

lang/ruby/safeeval:

SafeEval? gem

  • Property svn:executable set to *
Line 
1#!ruby
2
3# クラス化して Module.new.instance_eval するようにしてみる。
4# まだなんかあるかなぁ……
5
6require "timeout"
7class SafeEval
8
9        def self.eval(code, tm=1)
10                new.safe_eval(code, tm)
11        end
12
13        def safe_eval(code, tm=1)
14                result = nil
15                tg = nil
16                th = Thread.start do
17                        # スレッドグループを作り、
18                        # 新たなスレッドはすべてこれに所属させる。
19                        tg = ThreadGroup.new.add(Thread.current)
20                        $SAFE  = 4
21                        result = Module.new.instance_eval(code)
22                        true
23                end.join(tm)
24                # 生成されたスレッドをすべて削除
25                tg.list.each {|t| t.kill }
26                raise TimeoutError unless th # タイムアウトした場合 Thread は nil を返す
27                result
28        end
29
30        alias eval safe_eval
31
32end
33
Note: See TracBrowser for help on using the browser.