1 31 package org.jruby; 32 33 import org.jruby.runtime.Block; 34 import org.jruby.runtime.CallbackFactory; 35 import org.jruby.runtime.builtin.IRubyObject; 36 37 41 public class RubyPrecision { 42 43 public static RubyModule createPrecisionModule(Ruby runtime) { 44 RubyModule precisionModule = runtime.defineModule("Precision"); 45 CallbackFactory callbackFactory = runtime.callbackFactory(RubyPrecision.class); 46 precisionModule.defineSingletonMethod("append_features", callbackFactory.getSingletonMethod("append_features", RubyKernel.IRUBY_OBJECT)); 47 precisionModule.defineMethod("prec", callbackFactory.getSingletonMethod("prec", RubyKernel.IRUBY_OBJECT)); 48 precisionModule.defineMethod("prec_i", callbackFactory.getSingletonMethod("prec_i")); 49 precisionModule.defineMethod("prec_f", callbackFactory.getSingletonMethod("prec_f")); 50 return precisionModule; 51 } 52 53 public static IRubyObject induced_from(IRubyObject receiver, IRubyObject source) { 54 throw receiver.getRuntime().newTypeError("Undefined conversion from " + source.getMetaClass().getName() + " into " + ((RubyClass)receiver).getName()); 55 } 56 57 public static IRubyObject append_features(IRubyObject receiver, IRubyObject include, Block block) { 58 if (include instanceof RubyModule) { 59 ((RubyModule) include).includeModule(receiver); 60 CallbackFactory f = receiver.getRuntime().callbackFactory(RubyPrecision.class); 61 include.defineSingletonMethod("induced_from", f.getSingletonMethod("induced_from", RubyKernel.IRUBY_OBJECT)); 62 } 63 return receiver; 64 } 65 66 public static IRubyObject prec(IRubyObject receiver, IRubyObject type, Block block) { 67 return type.callMethod(receiver.getRuntime().getCurrentContext(), "induced_from", receiver); 68 } 69 70 public static IRubyObject prec_i(IRubyObject receiver, Block block) { 71 return receiver.getRuntime().getClass("Integer").callMethod(receiver.getRuntime().getCurrentContext(), "induced_from", receiver); 72 } 73 74 public static IRubyObject prec_f(IRubyObject receiver, Block block) { 75 return receiver.getRuntime().getClass("Float").callMethod(receiver.getRuntime().getCurrentContext(), "induced_from", receiver); 76 } 77 } 78 | Popular Tags |