content: package e.s.java.lang;
  
  import i.RuntimeAssertionError;
  
  /**
   * All the exceptions in the guest environment need to be wrapped by something which is _actually_ a java.lang.Throwable.
   * When we need to look up the wrapper for a given type, we will prepend "e." to its qualified name.
   * Hence, this is the root of that entire hierarchy since all exceptions eventually reach back to "java.lang.Throwable".
   * 
   * NOTE:  The java.lang.* exception types have 3 occurrences, and this should be explained:
   * -"java.lang.*" - These are the real types and are only generated by the JVM.  We wrap them with a shadow object, as soon as we can.
   * -"org.aion.avm.java.lang.*" - These are shadow objects which we actually pass around and which can be accessed by the guest code.
   * -"e.java.lang.*" - These are just temporary wrappers of the shadow objects which only exist to satisfy
   * throw/catch semantics.
   * Only the "org.aion.avm.java.lang.*" instances are ever touched by user code.
   * 
   * The sub-classes of this are generated, since all sub-classes contain just the single unwrappable object.
   */
  public class Throwable extends java.lang.Throwable {
      private static final long serialVersionUID = 1L;
  
      private final Object wrapped;
  
      public Throwable(Object wrapped) {
          // There is no way that this should be created with a null.
          RuntimeAssertionError.assertTrue(null != wrapped);
          this.wrapped = wrapped;
      }
  
      public Object unwrap() {
          return this.wrapped;
      }
  }
  