Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
BEGIN LICENSE BLOCK ***** Version: EPL 1.0/GPL 2.0/LGPL 2.1 The contents of this file are subject to the Eclipse Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.eclipse.org/legal/epl-v10.html Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. Copyright (C) 2008-2010 Wayne Meissner Alternatively, the contents of this file may be used under the terms of either of the GNU General Public License Version 2 or later (the "GPL"), or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), in which case the provisions of the GPL or the LGPL are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of either the GPL or the LGPL, and not to allow others to use your version of this file under the terms of the EPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the GPL or the LGPL. If you do not delete the provisions above, a recipient may use your version of this file under the terms of any one of the EPL, the GPL or the LGPL. END LICENSE BLOCK ***
 
 
 
 package org.jruby.cext;
 
 import org.jruby.Ruby;
A Handle represents an object made available to native code tied to it's runtime.
 
 public final class Handle extends Cleaner {
     private static final long FIXNUM_MAX = Integer.getInteger("sun.arch.data.model") == 64
             ? (. >> 1) : ((long. >> 1);
     private static final long FIXNUM_MIN = Integer.getInteger("sun.arch.data.model") == 64
             ? (. >> 1) : ((long. >> 1);
 
     private static final long FIXNUM_FLAG = 0x1L;
     private static final int FIXNUM_SHIFT = 1;
     private static final int SYMBOL_SHIFT = 8;
     private static final long SYMBOL_FLAG = 0xeL;
     private static final long Qfalse = 0L;
     private static final long Qtrue = 2L;
     private static final long Qnil = 4L;
     
 
     private final Ruby runtime;
     private final long address;
     
     static Handle newHandle(Ruby runtimeObject rubyObjectlong nativeHandle) {
         return new Handle(runtimerubyObjectnativeHandle);
     }
     
     private Handle(Ruby runtimeObject objlong address) {
         super(obj);
         this. = runtime;
         this. = address;
     }
     
     public final long getAddress() {
         return ;
     }
 
     @Override
     public boolean equals(Object obj) {
         if (obj == null) {
             return false;
         }
         if (getClass() != obj.getClass()) {
             return false;
         }
         final Handle other = (Handleobj;
         return this. == other.address;
     }
 
     @Override
     public int hashCode() {
         int hash = 3;
         hash = 37 * hash + (int) (this. ^ (this. >>> 32));
         return hash;
     }
 
     @Override
     public String toString() {
         return "Native ruby object " + Long.toString();
    }
    @Override
    void dispose() {
        Native.freeHandle();
    }

    
Retrieves the Handle object associated with a org.jruby.RubyObject. Retrieval is either done through the GC for Handles that have already been created, or depending on the object's native class index.
Fixnum's and Symbol's native Handles are created through bit-shifting on their values, File and Float Handles are created using special JNI methods. All other objects are passed to the generic Native.newHandle(org.jruby.runtime.builtin.IRubyObject,int) method.
Once a Handle has been created, it is registered with the GC to prevent garbage-collection during native method runs.
    static Handle valueOf(IRubyObject obj) {
        Handle h = GC.lookup(obj);
        if (h != null) {
            return h;
        }
        Ruby runtime = obj.getRuntime();
        long nativeHandle;
        if (obj instanceof RubyObject) {
            int type = ((RubyObjectobj).getNativeTypeIndex();
            switch (type) {
                case .: {
                    final long val = ((RubyFixnumobj).getLongValue();
                    nativeHandle = (val <=  && val >= )
                            ? ((val << ) | )
                            : Native.getInstance(runtime).newFixnumHandle(objval);
                    }
                    break;
                case .:
                    nativeHandle = Native.getInstance(runtime).newFloatHandle(obj, ((RubyNumericobj).getDoubleValue());
                    break;
                case .:
                    nativeHandle = ((long) ((RubySymbolobj).getId() << ) | ;
                    break;
                case .// RubyIO uses FILE as type index, matching MRI's T_FILE
                    nativeHandle = Native.getInstance(runtime).newIOHandle(obj,
                            (int)((RubyIOobj).fileno(runtime.getCurrentContext()).getLongValue(),
                            ((RubyIOobj).getOpenFile().getMode());
                    break;
                default:
                    nativeHandle = Native.getInstance(runtime).newHandle(objtype);
                    break;
            }
        } else {
            nativeHandle = Native.getInstance(runtime).newHandle(obj.);
        }
        Handle handle = newHandle(runtimeobjnativeHandle);
        GC.register(objhandle);
        return handle;
    }

    

Returns:
the native Handle's address associated with the given RubyObject.
    static long nativeHandle(IRubyObject obj) {
        if (obj.getClass() == RubyFixnum.class) {
            final long val = ((RubyFixnumobj).getLongValue();
            if (val <=  && val >= ) {
                return ((val << ) | );
            }
        
        } else if (obj.getClass() == RubySymbol.class) {
            return ((long) ((RubySymbolobj).getId() << ) | ;
        
        } else if (obj.getClass() == RubyBoolean.class) {
            return obj.isTrue() ?  : ;
        
        } else if (obj.getClass() == RubyNil.class) {
            return ;
        }
        return Handle.valueOf(obj).getAddress();
    }
New to GrepCode? Check out our FAQ X