The patch looks good to me.  This paves the way for some lighter Core
objects plus one less barrier for lightweights (well the data side of
it).

-Tom

On Nov 26, 2007 5:57 AM, Charles Oliver Nutter <[EMAIL PROTECTED]> wrote:
> Attached is a patch that moves all the instance variable methods to a
> new interface. In their place, IRubyObject contains a new method
> getInstanceVariables which returns an InstanceVariables instance. In the
> case of RubyObject and descendants, this just returns 'this', minimizing
> the impact to that concrete hierarchy. But the result of removing the
> methods from the interface is that other implementations of IRubyObject
> can provide their own custom versions of InstanceVariables, or perhaps
> none at all; but at the very least they don't have to immediately
> implement all the ivar methods.
>
> I plan to do the same with the other variable types, but I'd like some
> review on this. It slows down ivar access, but only slightly (1/15 or so
> in my measurements, and it seems to even out on any non-trivial run). I
> think the benefits of a simple-to-implement IRubyObject interface
> outweigh a minor perf hit here.
>
> - Charlie
>
> Index: src/org/jruby/RubyUndef.java
> ===================================================================
> --- src/org/jruby/RubyUndef.java        (revision 5047)
> +++ src/org/jruby/RubyUndef.java        (working copy)
> @@ -8,6 +8,7 @@
>  import org.jruby.runtime.CallType;
>  import org.jruby.runtime.ThreadContext;
>  import org.jruby.runtime.builtin.IRubyObject;
> +import org.jruby.runtime.builtin.InstanceVariables;
>  import org.jruby.runtime.builtin.Variable;
>
>  public class RubyUndef implements IRubyObject {
> @@ -168,16 +169,6 @@
>          return null;
>      }
>
> -    @Deprecated
> -    public Map getInstanceVariables() {
> -        return null;
> -    }
> -
> -    @Deprecated
> -    public Map getInstanceVariablesSnapshot() {
> -        return null;
> -    }
> -
>      public Class getJavaClass() {
>          return null;
>      }
> @@ -266,27 +257,9 @@
>          return false;
>      }
>
> -    @Deprecated
> -    public Map safeGetInstanceVariables() {
> -        return null;
> -    }
> -
> -    @Deprecated
> -    public boolean safeHasInstanceVariables() {
> -        return false;
> -    }
> -
>      public void setFrozen(boolean b) {
>      }
>
> -    public IRubyObject setInstanceVariable(String string, IRubyObject 
> rubyObject) {
> -        return null;
> -    }
> -
> -    @Deprecated
> -    public void setInstanceVariables(Map instanceVariables) {
> -    }
> -
>      public void setMetaClass(RubyClass metaClass) {
>      }
>
> @@ -347,32 +320,8 @@
>          return null;
>      }
>
> -    public IRubyObject fastGetInstanceVariable(String name) {
> +    public InstanceVariables getInstanceVariables() {
>          return null;
>      }
>
> -    public boolean hasInstanceVariable(String name) {
> -        return false;
> -    }
> -
> -    public boolean fastHasInstanceVariable(String name) {
> -        return false;
> -    }
> -
> -    public IRubyObject fastSetInstanceVariable(String name, IRubyObject 
> value) {
> -        return null;
> -    }
> -
> -    public IRubyObject removeInstanceVariable(String name) {
> -        return null;
> -    }
> -
> -    public List<Variable<IRubyObject>> getInstanceVariableList() {
> -        return null;
> -    }
> -
> -    public List<String> getInstanceVariableNameList() {
> -        return null;
> -    }
> -
>  }
> Index: src/org/jruby/runtime/builtin/IRubyObject.java
> ===================================================================
> --- src/org/jruby/runtime/builtin/IRubyObject.java      (revision 5047)
> +++ src/org/jruby/runtime/builtin/IRubyObject.java      (working copy)
> @@ -312,22 +312,9 @@
>      //
>      // INSTANCE VARIABLE METHODS
>      //
> -
> -    boolean hasInstanceVariable(String name);
> -    boolean fastHasInstanceVariable(String internedName);
>
> -    IRubyObject getInstanceVariable(String name);
> -    IRubyObject fastGetInstanceVariable(String internedName);
> -
> -    IRubyObject setInstanceVariable(String name, IRubyObject value);
> -    IRubyObject fastSetInstanceVariable(String internedName, IRubyObject 
> value);
> +    InstanceVariables getInstanceVariables();
>
> -    IRubyObject removeInstanceVariable(String name);
> -
> -    List<Variable<IRubyObject>> getInstanceVariableList();
> -
> -    List<String> getInstanceVariableNameList();
> -
>      //
>      // INTERNAL VARIABLE METHODS
>      //
> Index: src/org/jruby/runtime/builtin/InstanceVariables.java
> ===================================================================
> --- src/org/jruby/runtime/builtin/InstanceVariables.java        (revision 0)
> +++ src/org/jruby/runtime/builtin/InstanceVariables.java        (revision 0)
> @@ -0,0 +1,33 @@
> +/*
> + * To change this template, choose Tools | Templates
> + * and open the template in the editor.
> + */
> +
> +package org.jruby.runtime.builtin;
> +
> +import java.util.List;
> +
> +/**
> + *
> + * @author headius
> + */
> +public interface InstanceVariables {
> +    //
> +    // INSTANCE VARIABLE METHODS
> +    //
> +
> +    boolean hasInstanceVariable(String name);
> +    boolean fastHasInstanceVariable(String internedName);
> +
> +    IRubyObject getInstanceVariable(String name);
> +    IRubyObject fastGetInstanceVariable(String internedName);
> +
> +    IRubyObject setInstanceVariable(String name, IRubyObject value);
> +    IRubyObject fastSetInstanceVariable(String internedName, IRubyObject 
> value);
> +
> +    IRubyObject removeInstanceVariable(String name);
> +
> +    List<Variable<IRubyObject>> getInstanceVariableList();
> +
> +    List<String> getInstanceVariableNameList();
> +}
> Index: src/org/jruby/RubyYAML.java
> ===================================================================
> --- src/org/jruby/RubyYAML.java (revision 5047)
> +++ src/org/jruby/RubyYAML.java (working copy)
> @@ -435,7 +435,7 @@
>              return self.toString().indexOf('\0') != -1 ? 
> self.getRuntime().getTrue() : self.getRuntime().getFalse();
>          }
>          private static org.jruby.yaml.JRubyRepresenter into(IRubyObject arg) 
> {
> -            IRubyObject jobj = arg.fastGetInstanceVariable("@java_object");
> +            IRubyObject jobj = 
> arg.getInstanceVariables().fastGetInstanceVariable("@java_object");
>              if(jobj != null) {
>                  return 
> (org.jruby.yaml.JRubyRepresenter)(((org.jruby.javasupport.JavaObject)jobj).getValue());
>              }
> Index: src/org/jruby/ext/Generator.java
> ===================================================================
> --- src/org/jruby/ext/Generator.java    (revision 5047)
> +++ src/org/jruby/ext/Generator.java    (working copy)
> @@ -227,8 +227,8 @@
>          // Generator#initialize
>          GeneratorData d = (GeneratorData)self.dataGetStruct();
>
> -        self.setInstanceVariable("@queue",self.getRuntime().newArray());
> -        self.setInstanceVariable("@index",self.getRuntime().newFixnum(0));
> +        
> self.getInstanceVariables().setInstanceVariable("@queue",self.getRuntime().newArray());
> +        
> self.getInstanceVariables().setInstanceVariable("@index",self.getRuntime().newFixnum(0));
>
>          if(Arity.checkArgumentCount(self.getRuntime(), args,0,1) == 1) {
>              d.setEnum(args[0]);
> @@ -240,7 +240,7 @@
>
>      public static IRubyObject yield(IRubyObject self, IRubyObject value, 
> Block block) {
>          // Generator#yield
> -        
> self.getInstanceVariable("@queue").callMethod(self.getRuntime().getCurrentContext(),"<<",value);
> +        
> self.getInstanceVariables().getInstanceVariable("@queue").callMethod(self.getRuntime().getCurrentContext(),"<<",value);
>          GeneratorData d = (GeneratorData)self.dataGetStruct();
>          d.doWait();
>          return self;
> @@ -260,7 +260,7 @@
>
>      public static IRubyObject index(IRubyObject self) {
>          // Generator#index
> -        return self.getInstanceVariable("@index");
> +        return self.getInstanceVariables().getInstanceVariable("@index");
>      }
>
>      public static IRubyObject next(IRubyObject self, Block block) {
> @@ -270,25 +270,25 @@
>              throw self.getRuntime().newEOFError();
>          }
>          d.generate();
> -        
> self.setInstanceVariable("@index",self.getInstanceVariable("@index").callMethod(self.getRuntime().getCurrentContext(),MethodIndex.OP_PLUS,
>  "+",self.getRuntime().newFixnum(1)));
> -        return 
> self.getInstanceVariable("@queue").callMethod(self.getRuntime().getCurrentContext(),"shift");
> +        
> self.getInstanceVariables().setInstanceVariable("@index",self.getInstanceVariables().getInstanceVariable("@index").callMethod(self.getRuntime().getCurrentContext(),MethodIndex.OP_PLUS,
>  "+",self.getRuntime().newFixnum(1)));
> +        return 
> self.getInstanceVariables().getInstanceVariable("@queue").callMethod(self.getRuntime().getCurrentContext(),"shift");
>      }
>
>      public static IRubyObject current(IRubyObject self, Block block) {
>              // Generator#current
> -        
> if(self.getInstanceVariable("@queue").callMethod(self.getRuntime().getCurrentContext(),MethodIndex.EMPTY_P,
>  "empty?").isTrue()) {
> +        
> if(self.getInstanceVariables().getInstanceVariable("@queue").callMethod(self.getRuntime().getCurrentContext(),MethodIndex.EMPTY_P,
>  "empty?").isTrue()) {
>              throw self.getRuntime().newEOFError();
>          }
> -        return 
> self.getInstanceVariable("@queue").callMethod(self.getRuntime().getCurrentContext(),"first");
> +        return 
> self.getInstanceVariables().getInstanceVariable("@queue").callMethod(self.getRuntime().getCurrentContext(),"first");
>      }
>
>      public static IRubyObject rewind(IRubyObject self, Block block) {
>          // Generator#rewind
> -        
> if(self.getInstanceVariable("@index").callMethod(self.getRuntime().getCurrentContext(),"nonzero?").isTrue())
>  {
> +        
> if(self.getInstanceVariables().getInstanceVariable("@index").callMethod(self.getRuntime().getCurrentContext(),"nonzero?").isTrue())
>  {
>              GeneratorData d = (GeneratorData)self.dataGetStruct();
>
> -            self.setInstanceVariable("@queue",self.getRuntime().newArray());
> -            
> self.setInstanceVariable("@index",self.getRuntime().newFixnum(0));
> +            
> self.getInstanceVariables().setInstanceVariable("@queue",self.getRuntime().newArray());
> +            
> self.getInstanceVariables().setInstanceVariable("@index",self.getRuntime().newFixnum(0));
>
>              d.start();
>          }
> Index: src/org/jruby/evaluator/AssignmentVisitor.java
> ===================================================================
> --- src/org/jruby/evaluator/AssignmentVisitor.java      (revision 5047)
> +++ src/org/jruby/evaluator/AssignmentVisitor.java      (working copy)
> @@ -181,7 +181,7 @@
>
>      private static void instAsgnNode(IRubyObject self, Node node, 
> IRubyObject value) {
>          InstAsgnNode iVisited = (InstAsgnNode)node;
> -        self.fastSetInstanceVariable(iVisited.getName(), value);
> +        
> self.getInstanceVariables().fastSetInstanceVariable(iVisited.getName(), 
> value);
>      }
>
>      private static void localAsgnNode(ThreadContext context, Node node, 
> IRubyObject value) {
> Index: src/org/jruby/evaluator/ASTInterpreter.java
> ===================================================================
> --- src/org/jruby/evaluator/ASTInterpreter.java (revision 5047)
> +++ src/org/jruby/evaluator/ASTInterpreter.java (working copy)
> @@ -1229,14 +1229,14 @@
>          InstAsgnNode iVisited = (InstAsgnNode) node;
>
>          IRubyObject result = evalInternal(runtime,context, 
> iVisited.getValueNode(), self, aBlock);
> -        self.fastSetInstanceVariable(iVisited.getName(), result);
> +        
> self.getInstanceVariables().fastSetInstanceVariable(iVisited.getName(), 
> result);
>
>          return result;
>      }
>
>      private static IRubyObject instVarNode(Ruby runtime, Node node, 
> IRubyObject self) {
>          InstVarNode iVisited = (InstVarNode) node;
> -        IRubyObject variable = 
> self.fastGetInstanceVariable(iVisited.getName());
> +        IRubyObject variable = 
> self.getInstanceVariables().fastGetInstanceVariable(iVisited.getName());
>
>          if (variable != null) return variable;
>
> @@ -2060,7 +2060,7 @@
>              }
>              return null;
>          case INSTVARNODE:
> -            if (self.fastHasInstanceVariable(((InstVarNode) 
> node).getName())) {
> +            if 
> (self.getInstanceVariables().fastHasInstanceVariable(((InstVarNode) 
> node).getName())) {
>                  return "instance-variable";
>              }
>              return null;
> Index: src/org/jruby/RubyJRuby.java
> ===================================================================
> --- src/org/jruby/RubyJRuby.java        (revision 5047)
> +++ src/org/jruby/RubyJRuby.java        (working copy)
> @@ -29,6 +29,8 @@
>  package org.jruby;
>
>  import java.io.IOException;
> +import java.io.PrintWriter;
> +import java.io.StringWriter;
>  import org.jruby.anno.JRubyMethod;
>
>  import org.jruby.javasupport.Java;
> @@ -46,6 +48,7 @@
>  import org.jruby.compiler.impl.StandardASMCompiler;
>  import org.jruby.runtime.InterpretedBlock;
>  import org.objectweb.asm.ClassReader;
> +import org.objectweb.asm.util.TraceClassVisitor;
>
>  /**
>   * Module which defines JRuby-specific methods for use.
> @@ -174,19 +177,19 @@
>      public static class JRubyCompiledScript {
>          @JRubyMethod(name = "to_s")
>          public static IRubyObject compiled_script_to_s(IRubyObject recv) {
> -            return recv.fastGetInstanceVariable("@original_script");
> +            return 
> recv.getInstanceVariables().fastGetInstanceVariable("@original_script");
>          }
>
>          @JRubyMethod(name = "inspect")
>          public static IRubyObject compiled_script_inspect(IRubyObject recv) {
> -            return recv.getRuntime().newString("#<JRuby::CompiledScript " + 
> recv.fastGetInstanceVariable("@name") + ">");
> +            return recv.getRuntime().newString("#<JRuby::CompiledScript " + 
> recv.getInstanceVariables().fastGetInstanceVariable("@name") + ">");
>          }
>
>          @JRubyMethod(name = "inspect_bytecode")
>          public static IRubyObject 
> compiled_script_inspect_bytecode(IRubyObject recv) {
> -            java.io.StringWriter sw = new java.io.StringWriter();
> -            org.objectweb.asm.ClassReader cr = new 
> org.objectweb.asm.ClassReader((byte[])org.jruby.javasupport.JavaUtil.convertRubyToJava(recv.fastGetInstanceVariable("@code"),byte[].class));
> -            org.objectweb.asm.util.TraceClassVisitor cv = new 
> org.objectweb.asm.util.TraceClassVisitor(new java.io.PrintWriter(sw));
> +            StringWriter sw = new StringWriter();
> +            ClassReader cr = new 
> ClassReader((byte[])org.jruby.javasupport.JavaUtil.convertRubyToJava(recv.getInstanceVariables().fastGetInstanceVariable("@code"),byte[].class));
> +            TraceClassVisitor cv = new TraceClassVisitor(new 
> PrintWriter(sw));
>              cr.accept(cv, ClassReader.SKIP_DEBUG);
>              return recv.getRuntime().newString(sw.toString());
>          }
> Index: src/org/jruby/javasupport/proxy/JavaProxyReflectionObject.java
> ===================================================================
> --- src/org/jruby/javasupport/proxy/JavaProxyReflectionObject.java      
> (revision 5047)
> +++ src/org/jruby/javasupport/proxy/JavaProxyReflectionObject.java      
> (working copy)
> @@ -83,7 +83,7 @@
>
>      public IRubyObject op_equal(IRubyObject other) {
>          if (!(other instanceof JavaProxyReflectionObject)) {
> -            other = other.fastGetInstanceVariable("@java_object");
> +            other = 
> other.getInstanceVariables().fastGetInstanceVariable("@java_object");
>              if (!(other instanceof JavaObject)) {
>                  return getRuntime().getFalse();
>              }
> @@ -107,7 +107,7 @@
>
>      public IRubyObject same(IRubyObject other) {
>          if (!(other instanceof JavaObject)) {
> -            other = other.fastGetInstanceVariable("@java_object");
> +            other = 
> other.getInstanceVariables().fastGetInstanceVariable("@java_object");
>              if (!(other instanceof JavaObject)) {
>                  return getRuntime().getFalse();
>              }
> Index: src/org/jruby/javasupport/proxy/JavaProxyClass.java
> ===================================================================
> --- src/org/jruby/javasupport/proxy/JavaProxyClass.java (revision 5047)
> +++ src/org/jruby/javasupport/proxy/JavaProxyClass.java (working copy)
> @@ -547,14 +547,14 @@
>                  if (skipRemainingClasses) continue;
>                  // we only collect methods and interfaces for
>                  // user-defined proxy classes.
> -                if (!ancestor.fastHasInstanceVariable("@java_proxy_class")) {
> +                if 
> (!ancestor.getInstanceVariables().fastHasInstanceVariable("@java_proxy_class"))
>  {
>                      skipRemainingClasses = true;
>                      continue;
>                  }
>
>                  // get JavaClass if this is the new proxy class; verify it
>                  // matches if this is a superclass proxy.
> -                IRubyObject var = 
> ancestor.fastGetInstanceVariable("@java_class");
> +                IRubyObject var = 
> ancestor.getInstanceVariables().fastGetInstanceVariable("@java_class");
>                  if (var == null) {
>                      throw runtime.newTypeError(
>                              "no java_class defined for proxy (or ancestor): 
> " + ancestor);
> @@ -572,7 +572,7 @@
>                              " (" + var + ")");
>                  }
>                  // get any included interfaces
> -                var = ancestor.fastGetInstanceVariable("@java_interfaces");
> +                var = 
> ancestor.getInstanceVariables().fastGetInstanceVariable("@java_interfaces");
>                  if (var != null && !(var instanceof RubyNil)) {
>                      if (!(var instanceof RubyArray)) {
>                          throw runtime.newTypeError(
> @@ -605,7 +605,7 @@
>
>                  // FIXME: shouldn't need @__java_ovrd_methods, just query 
> locally defined methods.
>
> -                var = 
> ancestor.fastGetInstanceVariable("@__java_ovrd_methods");
> +                var = 
> ancestor.getInstanceVariables().fastGetInstanceVariable("@__java_ovrd_methods");
>                  if (var == null) {
>                      // lock in the overridden methods for the new class, and 
> any as-yet
>                      // uninstantiated ancestor class.
> Index: src/org/jruby/javasupport/JavaClass.java
> ===================================================================
> --- src/org/jruby/javasupport/JavaClass.java    (revision 5047)
> +++ src/org/jruby/javasupport/JavaClass.java    (working copy)
> @@ -234,7 +234,7 @@
>                  javaField = new JavaField(getRuntime(),field);
>              }
>              return Java.java_to_ruby(self,
> -                    
> javaField.value(self.fastGetInstanceVariable("@java_object")),
> +                    
> javaField.value(self.getInstanceVariables().fastGetInstanceVariable("@java_object")),
>                      Block.NULL_BLOCK);
>          }
>          public Arity getArity() {
> @@ -256,7 +256,7 @@
>                  javaField = new JavaField(getRuntime(),field);
>              }
>              return Java.java_to_ruby(self,
> -                    
> javaField.set_value(self.fastGetInstanceVariable("@java_object"),
> +                    
> javaField.set_value(self.getInstanceVariables().fastGetInstanceVariable("@java_object"),
>                              
> Java.ruby_to_java(self,args[0],Block.NULL_BLOCK)),
>                      Block.NULL_BLOCK);
>          }
> @@ -416,7 +416,7 @@
>                  args = newArgs;
>              }
>              IRubyObject[] convertedArgs = new IRubyObject[len+1];
> -            convertedArgs[0] = self.fastGetInstanceVariable("@java_object");
> +            convertedArgs[0] = 
> self.getInstanceVariables().fastGetInstanceVariable("@java_object");
>              int i = len;
>              if (block.isGiven()) {
>                  convertedArgs[len] = args[len - 1];
> Index: src/org/jruby/javasupport/JavaObject.java
> ===================================================================
> --- src/org/jruby/javasupport/JavaObject.java   (revision 5047)
> +++ src/org/jruby/javasupport/JavaObject.java   (working copy)
> @@ -136,7 +136,7 @@
>
>      public IRubyObject op_equal(IRubyObject other) {
>          if (!(other instanceof JavaObject)) {
> -            other = other.fastGetInstanceVariable("@java_object");
> +            other = 
> other.getInstanceVariables().fastGetInstanceVariable("@java_object");
>              if (!(other instanceof JavaObject)) {
>                  return getRuntime().getFalse();
>              }
> @@ -152,7 +152,7 @@
>
>      public IRubyObject same(IRubyObject other) {
>          if (!(other instanceof JavaObject)) {
> -            other = other.fastGetInstanceVariable("@java_object");
> +            other = 
> other.getInstanceVariables().fastGetInstanceVariable("@java_object");
>              if (!(other instanceof JavaObject)) {
>                return getRuntime().getFalse();
>              }
> Index: src/org/jruby/javasupport/JavaArrayUtilities.java
> ===================================================================
> --- src/org/jruby/javasupport/JavaArrayUtilities.java   (revision 5047)
> +++ src/org/jruby/javasupport/JavaArrayUtilities.java   (working copy)
> @@ -51,7 +51,7 @@
>
>      public static IRubyObject bytes_to_ruby_string(IRubyObject recv, 
> IRubyObject wrappedObject) {
>          Ruby runtime = recv.getRuntime();
> -        IRubyObject byteArray = 
> wrappedObject.fastGetInstanceVariable("@java_object");
> +        IRubyObject byteArray = 
> wrappedObject.getInstanceVariables().fastGetInstanceVariable("@java_object");
>          if (!(byteArray instanceof JavaArray &&
>                  ((JavaArray)byteArray).getValue() instanceof byte[])) {
>              throw runtime.newTypeError("wrong argument type " + 
> wrappedObject.getMetaClass() +
> Index: src/org/jruby/javasupport/Java.java
> ===================================================================
> --- src/org/jruby/javasupport/Java.java (revision 5047)
> +++ src/org/jruby/javasupport/Java.java (working copy)
> @@ -125,7 +125,7 @@
>              }
>              final IRubyObject packageName;
>              // again, shouldn't happen. TODO: might want to throw exception 
> instead.
> -            if ((packageName = pkg.fastGetInstanceVariable("@package_name")) 
> == null) return null;
> +            if ((packageName = 
> pkg.getInstanceVariables().fastGetInstanceVariable("@package_name")) == null) 
> return null;
>
>              final Ruby runtime = pkg.getRuntime();
>              return (RubyClass)get_proxy_class(
> @@ -136,7 +136,7 @@
>          public RubyModule defineModuleUnder(final RubyModule pkg, final 
> String name) {
>              final IRubyObject packageName;
>              // again, shouldn't happen. TODO: might want to throw exception 
> instead.
> -            if ((packageName = pkg.fastGetInstanceVariable("@package_name")) 
> == null) return null;
> +            if ((packageName = 
> pkg.getInstanceVariables().fastGetInstanceVariable("@package_name")) == null) 
> return null;
>
>              final Ruby runtime = pkg.getRuntime();
>              return (RubyModule)get_interface_module(
> @@ -148,13 +148,13 @@
>      // JavaProxy
>      public static IRubyObject new_instance_for(IRubyObject recv, IRubyObject 
> java_object) {
>          IRubyObject new_instance = ((RubyClass)recv).allocate();
> -        new_instance.fastSetInstanceVariable("@java_object",java_object);
> +        
> new_instance.getInstanceVariables().fastSetInstanceVariable("@java_object",java_object);
>          return new_instance;
>      }
>
>      // If the proxy class itself is passed as a parameter this will be 
> called by Java#ruby_to_java
>      public static IRubyObject to_java_object(IRubyObject recv) {
> -        return recv.fastGetInstanceVariable("@java_class");
> +        return 
> recv.getInstanceVariables().fastGetInstanceVariable("@java_class");
>      }
>
>      // JavaUtilities
> @@ -168,7 +168,7 @@
>          // hacky workaround in case any users call this directly.
>          // most will have called JavaUtilities.extend_proxy instead.
>          
> recv.getRuntime().getWarnings().warn("JavaUtilities.add_proxy_extender is 
> deprecated - use JavaUtilities.extend_proxy instead");
> -        final IRubyObject javaClassVar = 
> extender.fastGetInstanceVariable("@java_class");
> +        final IRubyObject javaClassVar = 
> extender.getInstanceVariables().fastGetInstanceVariable("@java_class");
>          if (!(javaClassVar instanceof JavaClass)) {
>              throw recv.getRuntime().newArgumentError("extender does not have 
> a valid @java_class");
>          }
> @@ -738,7 +738,7 @@
>       */
>      public static IRubyObject ruby_to_java(final IRubyObject recv, 
> IRubyObject object, Block unusedBlock) {
>         if(object.respondsTo("to_java_object")) {
> -            IRubyObject result = 
> object.fastGetInstanceVariable("@java_object");
> +            IRubyObject result = 
> object.getInstanceVariables().fastGetInstanceVariable("@java_object");
>              if(result == null) {
>                  result = 
> object.callMethod(recv.getRuntime().getCurrentContext(), "to_java_object");
>              }
> Index: src/org/jruby/javasupport/util/RuntimeHelpers.java
> ===================================================================
> --- src/org/jruby/javasupport/util/RuntimeHelpers.java  (revision 5047)
> +++ src/org/jruby/javasupport/util/RuntimeHelpers.java  (working copy)
> @@ -788,7 +788,7 @@
>      }
>
>      public static IRubyObject getInstanceVariable(Ruby runtime, IRubyObject 
> self, String name) {
> -        IRubyObject result = self.getInstanceVariable(name);
> +        IRubyObject result = 
> self.getInstanceVariables().getInstanceVariable(name);
>
>          if (result != null) return result;
>
> @@ -799,7 +799,7 @@
>
>      public static IRubyObject fastGetInstanceVariable(Ruby runtime, 
> IRubyObject self, String internedName) {
>          IRubyObject result;
> -        if ((result = self.fastGetInstanceVariable(internedName)) != null) 
> return result;
> +        if ((result = 
> self.getInstanceVariables().fastGetInstanceVariable(internedName)) != null) 
> return result;
>
>          runtime.getWarnings().warning("instance variable " + internedName + 
> " not initialized");
>
> Index: src/org/jruby/RubyObject.java
> ===================================================================
> --- src/org/jruby/RubyObject.java       (revision 5047)
> +++ src/org/jruby/RubyObject.java       (working copy)
> @@ -68,6 +68,7 @@
>  import org.jruby.javasupport.util.RuntimeHelpers;
>  import org.jruby.runtime.ClassIndex;
>  import org.jruby.runtime.MethodIndex;
> +import org.jruby.runtime.builtin.InstanceVariables;
>  import org.jruby.runtime.marshal.CoreObjectType;
>  import org.jruby.util.TypeConverter;
>
> @@ -75,7 +76,7 @@
>   *
>   * @author  jpetersen
>   */
> -public class RubyObject implements Cloneable, IRubyObject, Serializable, 
> CoreObjectType {
> +public class RubyObject implements Cloneable, IRubyObject, Serializable, 
> CoreObjectType, InstanceVariables {
>
>      private RubyObject(){};
>      // An instance that never equals any other instance
> @@ -1260,6 +1261,10 @@
>      // INSTANCE VARIABLE API METHODS
>      //
>
> +    public InstanceVariables getInstanceVariables() {
> +        return this;
> +    }
> +
>      public boolean hasInstanceVariable(String name) {
>          assert IdUtil.isInstanceVariable(name);
>          return variableTableContains(name);
> @@ -1782,7 +1787,7 @@
>          out.writeInt(names.size());
>          for (String name : names) {
>              out.writeObject(name);
> -            out.writeObject(getInstanceVariable(name));
> +            
> out.writeObject(getInstanceVariables().getInstanceVariable(name));
>          }
>      }
>
> Index: src/org/jruby/RubyModule.java
> ===================================================================
> --- src/org/jruby/RubyModule.java       (revision 5047)
> +++ src/org/jruby/RubyModule.java       (working copy)
> @@ -946,7 +946,7 @@
>                  public IRubyObject call(ThreadContext context, IRubyObject 
> self, RubyModule clazz, String name, IRubyObject[] args, Block block) {
>                      if (args.length != 0) Arity.raiseArgumentError(runtime, 
> args.length, 0, 0);
>
> -                    IRubyObject variable = 
> self.fastGetInstanceVariable(variableName);
> +                    IRubyObject variable = 
> self.getInstanceVariables().fastGetInstanceVariable(variableName);
>
>                      return variable == null ? runtime.getNil() : variable;
>                  }
> @@ -965,7 +965,7 @@
>                      // ENEBO: Can anyone get args to be anything but length 
> 1?
>                      if (args.length != 1) Arity.raiseArgumentError(runtime, 
> args.length, 1, 1);
>
> -                    return self.fastSetInstanceVariable(variableName, 
> args[0]);
> +                    return 
> self.getInstanceVariables().fastSetInstanceVariable(variableName, args[0]);
>                  }
>
>                  public Arity getArity() {
> Index: src/org/jruby/compiler/impl/StandardASMCompiler.java
> ===================================================================
> --- src/org/jruby/compiler/impl/StandardASMCompiler.java        (revision 
> 5047)
> +++ src/org/jruby/compiler/impl/StandardASMCompiler.java        (working copy)
> @@ -84,15 +84,14 @@
>  import org.jruby.runtime.CallSite;
>  import org.jruby.runtime.CallType;
>  import org.jruby.runtime.CallbackFactory;
> -import org.jruby.runtime.CompiledBlock;
>  import org.jruby.runtime.CompiledBlockCallback;
> -import org.jruby.runtime.CompiledSharedScopeBlock;
>  import org.jruby.runtime.DynamicScope;
>  import org.jruby.runtime.Frame;
>  import org.jruby.runtime.MethodIndex;
>  import org.jruby.runtime.ThreadContext;
>  import org.jruby.runtime.Visibility;
>  import org.jruby.runtime.builtin.IRubyObject;
> +import org.jruby.runtime.builtin.InstanceVariables;
>  import org.jruby.util.ByteList;
>  import org.jruby.util.CodegenUtils;
>  import org.jruby.util.JRubyClassLoader;
> @@ -1185,7 +1184,8 @@
>              method.ldc(name);
>              method.swap();
>
> -            invokeIRubyObject("fastSetInstanceVariable", 
> cg.sig(IRubyObject.class, cg.params(String.class, IRubyObject.class)));
> +            invokeIRubyObject("getInstanceVariables", 
> cg.sig(InstanceVariables.class));
> +            method.invokeinterface(cg.p(InstanceVariables.class), 
> "fastSetInstanceVariable", cg.sig(IRubyObject.class, cg.params(String.class, 
> IRubyObject.class)));
>          }
>
>          public void retrieveGlobalVariable(String name) {
> @@ -1791,9 +1791,10 @@
>
>          public void isInstanceVariableDefined(String name, BranchCallback 
> trueBranch, BranchCallback falseBranch) {
>              loadSelf();
> +            invokeIRubyObject("getInstanceVariables", 
> cg.sig(InstanceVariables.class));
>              method.ldc(name);
>              //method.invokeinterface(cg.p(IRubyObject.class), 
> "getInstanceVariable", cg.sig(IRubyObject.class, cg.params(String.class)));
> -            method.invokeinterface(cg.p(IRubyObject.class), 
> "fastHasInstanceVariable", cg.sig(boolean.class, cg.params(String.class)));
> +            method.invokeinterface(cg.p(InstanceVariables.class), 
> "fastHasInstanceVariable", cg.sig(boolean.class, cg.params(String.class)));
>              Label trueLabel = new Label();
>              Label exitLabel = new Label();
>              //method.ifnonnull(trueLabel);
> @@ -1972,7 +1973,8 @@
>
>          public void getInstanceVariable(String name) {
>              method.ldc(name);
> -            method.invokeinterface(cg.p(IRubyObject.class), 
> "fastGetInstanceVariable", cg.sig(IRubyObject.class, 
> cg.params(String.class)));
> +            invokeIRubyObject("getInstanceVariables", 
> cg.sig(InstanceVariables.class));
> +            method.invokeinterface(cg.p(InstanceVariables.class), 
> "fastGetInstanceVariable", cg.sig(IRubyObject.class, 
> cg.params(String.class)));
>          }
>
>          public void getFrameName() {
> Index: src/org/jruby/ast/executable/YARVMachine.java
> ===================================================================
> --- src/org/jruby/ast/executable/YARVMachine.java       (revision 5047)
> +++ src/org/jruby/ast/executable/YARVMachine.java       (working copy)
> @@ -285,10 +285,10 @@
>                  context.getCurrentScope().setValue((int) 
> bytecodes[ip].l_op0, pop(), 0);
>                  break;
>              case YARVInstructions.GETINSTANCEVARIABLE:
> -                push(self.fastGetInstanceVariable(bytecodes[ip].s_op0));
> +                
> push(self.getInstanceVariables().fastGetInstanceVariable(bytecodes[ip].s_op0));
>                  break;
>              case YARVInstructions.SETINSTANCEVARIABLE:
> -                self.fastSetInstanceVariable(bytecodes[ip].s_op0, pop());
> +                
> self.getInstanceVariables().fastSetInstanceVariable(bytecodes[ip].s_op0, 
> pop());
>                  break;
>              case YARVInstructions.GETCLASSVARIABLE: {
>                  RubyModule rubyClass = context.getRubyClass();
>
>
> ---------------------------------------------------------------------
> To unsubscribe from this list please visit:
>
>     http://xircles.codehaus.org/manage_email
>



-- 
Blog: http://www.bloglines.com/blog/ThomasEEnebo
Email: [EMAIL PROTECTED] , [EMAIL PROTECTED]

---------------------------------------------------------------------
To unsubscribe from this list please visit:

    http://xircles.codehaus.org/manage_email

Reply via email to