1 29 package org.jruby.evaluator; 30 31 import org.jruby.Ruby; 32 import org.jruby.RubyArray; 33 import org.jruby.runtime.builtin.IRubyObject; 34 35 39 public final class ValueConverter { 40 private Ruby runtime; 41 42 public ValueConverter(Ruby runtime) { 43 this.runtime = runtime; 44 } 45 46 public RubyArray singleToArray(IRubyObject value) { 47 if (value == null || value.isNil()) { 48 return runtime.newArray(0); 49 } else if (value instanceof RubyArray) { 50 if (((RubyArray)value).getLength() == 1) { 51 return (RubyArray) value; 52 } 53 return runtime.newArray(value); 54 } else { 55 return toArray(value); 56 } 57 } 58 59 public IRubyObject arrayToSingle(IRubyObject value, boolean useUndefined) { 60 if (!(value instanceof RubyArray)) { 61 value = toArray(value); 62 } 63 switch (((RubyArray)value).getLength()) { 64 case 0: 65 return useUndefined ? null : runtime.getNil(); 66 case 1: 67 return ((RubyArray)value).eltInternal(0); 68 default: 69 return value; 70 } 71 } 72 73 public RubyArray singleToMultiple(IRubyObject value) { 74 if (value == null || value.isNil()) { 75 return runtime.newArray(0); 76 } else if (value instanceof RubyArray) { 77 return (RubyArray) value; 78 } else { 79 return toArray(value); 80 } 81 } 82 83 public IRubyObject multipleToSingle(IRubyObject value) { 84 if (!(value instanceof RubyArray)) { 85 value = toArray(value); 86 } 87 switch (((RubyArray)value).getLength()) { 88 case 0: 89 return runtime.getNil(); 90 case 1: 91 if (!(((RubyArray)value).eltInternal(0) instanceof RubyArray)) { 92 return ((RubyArray)value).eltInternal(0); 93 } 94 default: 95 return value; 96 } 97 } 98 99 private RubyArray toArray(IRubyObject value) { 100 if (value.isNil()) { 101 return runtime.newArray(0); 102 } else if (value instanceof RubyArray) { 103 return (RubyArray)value; 104 } 105 if (value.respondsTo("to_ary")) { 106 return (RubyArray)value.convertType(RubyArray.class, "Array", "to_ary"); 107 } 108 return runtime.newArray(value); 109 } 110 } 111 | Popular Tags |