Method: ALib::Util#child_object

Defined in:
lib/alib-0.5.1/util.rb

#child_objectObject



1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
# File 'lib/alib-0.5.1/util.rb', line 1230

def child_object
#--{{{
  r, w = IO.pipe
  IO.popen('-') do |pipe|
    if pipe
      w.close
      buf = pipe.read
      Process.wait
      unless $? == 0
        loaded = Marshal.load r.read
        case loaded
          when Exception
            raise loaded
          else
            klass, message, backtrace = loaded
            e = klass.new message
            e.set_backtrace backtrace
            raise e
        end
      end
      Marshal.load(buf)
    else
      r.close
      begin
        print(Marshal.dump(yield))
      rescue Exception => e
        dumped =
          begin
            Marshal.dump e # we can't do this in ruby 1.8.1
          rescue
            Marshal.dump [e.class, e.message, e.backtrace]
          end
        w.write dumped
        exit! 42
      end
    end
  end
ensure
  r.close rescue nil
#--}}}
end