Fixed infinite recursion in Injector.toString().

git-svn-id: https://google-guice.googlecode.com/svn/trunk@364 d779f126-a31b-0410-b53b-1d3aecad763e
diff --git a/guice.ipr b/guice.ipr
index c76bd5c..9324bc7 100644
--- a/guice.ipr
+++ b/guice.ipr
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project version="4" relativePaths="true">
+<project version="4" relativePaths="false">
   <component name="AntConfiguration">
     <defaultAnt bundledAnt="true" />
     <buildFile url="file://$PROJECT_DIR$/build.xml">
diff --git a/src/com/google/inject/BinderImpl.java b/src/com/google/inject/BinderImpl.java
index a2444fb..34299b3 100644
--- a/src/com/google/inject/BinderImpl.java
+++ b/src/com/google/inject/BinderImpl.java
@@ -271,7 +271,10 @@
         proxyFactoryBuilder.create(), bindings, scopes);
 
     // Create default bindings.
-    bind(Injector.class, SourceProviders.UNKNOWN_SOURCE).toInstance(injector);
+    // We use toProvider() instead of toInstance() to avoid infinite recursion
+    // in toString().
+    bind(Injector.class, SourceProviders.UNKNOWN_SOURCE)
+        .toProvider(new InjectorProvider(injector));
 
     injector.setErrorHandler(configurationErrorHandler);
 
@@ -603,4 +606,21 @@
       return "Provider<Logger>";
     }
   }
+
+  static class InjectorProvider implements Provider<Injector> {
+
+    final Injector injector;
+
+    InjectorProvider(Injector injector) {
+      this.injector = injector;
+    }
+
+    public Injector get() {
+      return injector;
+    }
+
+    public String toString() {
+      return "Provider<Injector>";
+    }
+  }
 }
diff --git a/test/com/google/inject/InjectorTest.java b/test/com/google/inject/InjectorTest.java
index 23d13ce..06d2974 100644
--- a/test/com/google/inject/InjectorTest.java
+++ b/test/com/google/inject/InjectorTest.java
@@ -34,6 +34,10 @@
   @Retention(RUNTIME)
   @BindingAnnotation @interface I {}
 
+  public void testToStringDoesNotInfinitelyRecurse() {
+    Guice.createInjector().toString();
+  }
+
   public void testProviderMethods() throws CreationException {
     SampleSingleton singleton = new SampleSingleton();
     SampleSingleton other = new SampleSingleton();