|
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 | |
|---|
| 6 | require "timeout" |
|---|
| 7 | class 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 | |
|---|
| 32 | end |
|---|
| 33 | |
|---|