Beispiel #1
0
 @JRubyMethod(name = "_id2ref", required = 1, module = true, visibility = Visibility.PRIVATE)
 public static IRubyObject id2ref(IRubyObject recv, IRubyObject id) {
   Ruby runtime = id.getRuntime();
   if (!(id instanceof RubyFixnum)) {
     throw recv.getRuntime().newTypeError(id, recv.getRuntime().getFixnum());
   }
   RubyFixnum idFixnum = (RubyFixnum) id;
   long longId = idFixnum.getLongValue();
   if (longId == 0) {
     return runtime.getFalse();
   } else if (longId == 2) {
     return runtime.getTrue();
   } else if (longId == 4) {
     return runtime.getNil();
   } else if (longId % 2 != 0) {
     // odd
     return runtime.newFixnum((longId - 1) / 2);
   } else {
     if (runtime.isObjectSpaceEnabled()) {
       IRubyObject object = runtime.getObjectSpace().id2ref(longId);
       if (object == null) {
         return runtime.getNil();
       }
       return object;
     } else {
       runtime
           .getWarnings()
           .warn("ObjectSpace is disabled; _id2ref only supports immediates, pass -X+O to enable");
       return runtime.getNil();
     }
   }
 }
Beispiel #2
0
 @JRubyMethod(
     name = "define_finalizer",
     required = 1,
     optional = 1,
     frame = true,
     module = true,
     visibility = Visibility.PRIVATE)
 public static IRubyObject define_finalizer(IRubyObject recv, IRubyObject[] args, Block block) {
   Ruby runtime = recv.getRuntime();
   IRubyObject finalizer = null;
   if (args.length == 2) {
     finalizer = args[1];
     if (!finalizer.respondsTo("call")) {
       throw runtime.newArgumentError(
           "wrong type argument " + finalizer.getType() + " (should be callable)");
     }
   } else {
     finalizer = runtime.newProc(Block.Type.PROC, block);
   }
   IRubyObject obj = args[0];
   runtime.getObjectSpace().addFinalizer(obj, finalizer);
   return runtime.newArray(runtime.newFixnum(runtime.getSafeLevel()), finalizer);
 }