< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotHostForeignCallsProvider.java

Print this page




   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 
  25 package org.graalvm.compiler.hotspot.meta;
  26 
  27 import static jdk.vm.ci.hotspot.HotSpotCallingConventionType.NativeCall;

  28 import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC;
  29 import static org.graalvm.compiler.core.target.Backend.ARITHMETIC_DREM;
  30 import static org.graalvm.compiler.core.target.Backend.ARITHMETIC_FREM;
  31 import static org.graalvm.compiler.hotspot.HotSpotBackend.BACKEDGE_EVENT;
  32 import static org.graalvm.compiler.hotspot.HotSpotBackend.BASE64_ENCODE_BLOCK;
  33 import static org.graalvm.compiler.hotspot.HotSpotBackend.COUNTERMODE_IMPL_CRYPT;
  34 import static org.graalvm.compiler.hotspot.HotSpotBackend.DECRYPT;
  35 import static org.graalvm.compiler.hotspot.HotSpotBackend.DECRYPT_BLOCK;
  36 import static org.graalvm.compiler.hotspot.HotSpotBackend.DECRYPT_BLOCK_WITH_ORIGINAL_KEY;
  37 import static org.graalvm.compiler.hotspot.HotSpotBackend.DECRYPT_WITH_ORIGINAL_KEY;
  38 import static org.graalvm.compiler.hotspot.HotSpotBackend.ENCRYPT;
  39 import static org.graalvm.compiler.hotspot.HotSpotBackend.ENCRYPT_BLOCK;
  40 import static org.graalvm.compiler.hotspot.HotSpotBackend.EXCEPTION_HANDLER;
  41 import static org.graalvm.compiler.hotspot.HotSpotBackend.GHASH_PROCESS_BLOCKS;
  42 import static org.graalvm.compiler.hotspot.HotSpotBackend.IC_MISS_HANDLER;
  43 import static org.graalvm.compiler.hotspot.HotSpotBackend.INITIALIZE_KLASS_BY_SYMBOL;
  44 import static org.graalvm.compiler.hotspot.HotSpotBackend.INVOCATION_EVENT;
  45 import static org.graalvm.compiler.hotspot.HotSpotBackend.MONTGOMERY_MULTIPLY;
  46 import static org.graalvm.compiler.hotspot.HotSpotBackend.MONTGOMERY_SQUARE;
  47 import static org.graalvm.compiler.hotspot.HotSpotBackend.MULTIPLY_TO_LEN;


  67 import static org.graalvm.compiler.hotspot.HotSpotBackend.VECTORIZED_MISMATCHED;
  68 import static org.graalvm.compiler.hotspot.HotSpotBackend.VM_ERROR;
  69 import static org.graalvm.compiler.hotspot.HotSpotBackend.WRONG_METHOD_HANDLER;
  70 import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.Reexecutability.NOT_REEXECUTABLE;
  71 import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.Reexecutability.REEXECUTABLE;
  72 import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.Reexecutability.REEXECUTABLE_ONLY_AFTER_EXCEPTION;
  73 import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.RegisterEffect.DESTROYS_REGISTERS;
  74 import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.RegisterEffect.PRESERVES_REGISTERS;
  75 import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.Transition.LEAF;
  76 import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.Transition.LEAF_NO_VZERO;
  77 import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.Transition.SAFEPOINT;
  78 import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.Transition.STACK_INSPECTABLE_LEAF;
  79 import static org.graalvm.compiler.hotspot.HotSpotHostBackend.DEOPTIMIZATION_HANDLER;
  80 import static org.graalvm.compiler.hotspot.HotSpotHostBackend.ENABLE_STACK_RESERVED_ZONE;
  81 import static org.graalvm.compiler.hotspot.HotSpotHostBackend.THROW_DELAYED_STACKOVERFLOW_ERROR;
  82 import static org.graalvm.compiler.hotspot.HotSpotHostBackend.UNCOMMON_TRAP_HANDLER;
  83 import static org.graalvm.compiler.hotspot.replacements.AssertionSnippets.ASSERTION_VM_MESSAGE_C;
  84 import static org.graalvm.compiler.hotspot.replacements.HotSpotG1WriteBarrierSnippets.G1WBPOSTCALL;
  85 import static org.graalvm.compiler.hotspot.replacements.HotSpotG1WriteBarrierSnippets.G1WBPRECALL;
  86 import static org.graalvm.compiler.hotspot.replacements.HotSpotG1WriteBarrierSnippets.VALIDATE_OBJECT;


  87 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.MARK_WORD_LOCATION;
  88 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.TLAB_END_LOCATION;
  89 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.TLAB_TOP_LOCATION;
  90 import static org.graalvm.compiler.hotspot.replacements.Log.LOG_OBJECT;
  91 import static org.graalvm.compiler.hotspot.replacements.Log.LOG_PRIMITIVE;
  92 import static org.graalvm.compiler.hotspot.replacements.Log.LOG_PRINTF;
  93 import static org.graalvm.compiler.hotspot.replacements.MonitorSnippets.MONITORENTER;
  94 import static org.graalvm.compiler.hotspot.replacements.MonitorSnippets.MONITOREXIT;
  95 import static org.graalvm.compiler.hotspot.replacements.NewObjectSnippets.DYNAMIC_NEW_INSTANCE;
  96 import static org.graalvm.compiler.hotspot.replacements.NewObjectSnippets.DYNAMIC_NEW_INSTANCE_OR_NULL;
  97 import static org.graalvm.compiler.hotspot.replacements.ThreadSubstitutions.THREAD_IS_INTERRUPTED;
  98 import static org.graalvm.compiler.hotspot.stubs.ExceptionHandlerStub.EXCEPTION_HANDLER_FOR_PC;
  99 import static org.graalvm.compiler.hotspot.stubs.StubUtil.VM_MESSAGE_C;
 100 import static org.graalvm.compiler.hotspot.stubs.UnwindExceptionToCallerStub.EXCEPTION_HANDLER_FOR_RETURN_ADDRESS;
 101 import static org.graalvm.compiler.nodes.java.ForeignCallDescriptors.REGISTER_FINALIZER;
 102 import static org.graalvm.compiler.replacements.nodes.BinaryMathIntrinsicNode.BinaryOperation.POW;
 103 import static org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation.COS;
 104 import static org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation.EXP;
 105 import static org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation.LOG;
 106 import static org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation.LOG10;


 399         if (c.useGHASHIntrinsics()) {
 400             registerForeignCall(GHASH_PROCESS_BLOCKS, c.ghashProcessBlocks, NativeCall, DESTROYS_REGISTERS, LEAF, REEXECUTABLE_ONLY_AFTER_EXCEPTION, NamedLocationIdentity.any());
 401         }
 402         if (c.useBase64Intrinsics()) {
 403             registerForeignCall(BASE64_ENCODE_BLOCK, c.base64EncodeBlock, NativeCall, DESTROYS_REGISTERS, LEAF, REEXECUTABLE_ONLY_AFTER_EXCEPTION, NamedLocationIdentity.any());
 404         }
 405         if (c.useMulAddIntrinsic()) {
 406             registerForeignCall(MUL_ADD, c.mulAdd, NativeCall, DESTROYS_REGISTERS, LEAF_NO_VZERO, REEXECUTABLE_ONLY_AFTER_EXCEPTION, NamedLocationIdentity.getArrayLocation(JavaKind.Int));
 407         }
 408         if (c.useMontgomeryMultiplyIntrinsic()) {
 409             registerForeignCall(MONTGOMERY_MULTIPLY, c.montgomeryMultiply, NativeCall, DESTROYS_REGISTERS, LEAF_NO_VZERO, REEXECUTABLE_ONLY_AFTER_EXCEPTION,
 410                             NamedLocationIdentity.getArrayLocation(JavaKind.Int));
 411         }
 412         if (c.useMontgomerySquareIntrinsic()) {
 413             registerForeignCall(MONTGOMERY_SQUARE, c.montgomerySquare, NativeCall, DESTROYS_REGISTERS, LEAF_NO_VZERO, REEXECUTABLE_ONLY_AFTER_EXCEPTION,
 414                             NamedLocationIdentity.getArrayLocation(JavaKind.Int));
 415         }
 416         if (c.useSquareToLenIntrinsic()) {
 417             registerForeignCall(SQUARE_TO_LEN, c.squareToLen, NativeCall, DESTROYS_REGISTERS, LEAF_NO_VZERO, REEXECUTABLE_ONLY_AFTER_EXCEPTION, NamedLocationIdentity.getArrayLocation(JavaKind.Int));
 418         }






 419 
 420         if (c.useAESIntrinsics) {
 421             /*
 422              * When the java.ext.dirs property is modified then the crypto classes might not be
 423              * found. If that's the case we ignore the ClassNotFoundException and continue since we
 424              * cannot replace a non-existing method anyway.
 425              */
 426             try {
 427                 // These stubs do callee saving
 428                 registerForeignCall(ENCRYPT_BLOCK, c.aescryptEncryptBlockStub, NativeCall, PRESERVES_REGISTERS, LEAF, REEXECUTABLE_ONLY_AFTER_EXCEPTION,
 429                                 NamedLocationIdentity.getArrayLocation(JavaKind.Byte));
 430                 registerForeignCall(DECRYPT_BLOCK, c.aescryptDecryptBlockStub, NativeCall, PRESERVES_REGISTERS, LEAF, REEXECUTABLE_ONLY_AFTER_EXCEPTION,
 431                                 NamedLocationIdentity.getArrayLocation(JavaKind.Byte));
 432                 registerForeignCall(DECRYPT_BLOCK_WITH_ORIGINAL_KEY, c.aescryptDecryptBlockStub, NativeCall, PRESERVES_REGISTERS, LEAF, REEXECUTABLE_ONLY_AFTER_EXCEPTION,
 433                                 NamedLocationIdentity.getArrayLocation(JavaKind.Byte));
 434             } catch (GraalError e) {
 435                 if (!(e.getCause() instanceof ClassNotFoundException)) {
 436                     throw e;
 437                 }
 438             }




   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 
  25 package org.graalvm.compiler.hotspot.meta;
  26 
  27 import static jdk.vm.ci.hotspot.HotSpotCallingConventionType.NativeCall;
  28 import static jdk.vm.ci.hotspot.HotSpotCallingConventionType.JavaCall;
  29 import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC;
  30 import static org.graalvm.compiler.core.target.Backend.ARITHMETIC_DREM;
  31 import static org.graalvm.compiler.core.target.Backend.ARITHMETIC_FREM;
  32 import static org.graalvm.compiler.hotspot.HotSpotBackend.BACKEDGE_EVENT;
  33 import static org.graalvm.compiler.hotspot.HotSpotBackend.BASE64_ENCODE_BLOCK;
  34 import static org.graalvm.compiler.hotspot.HotSpotBackend.COUNTERMODE_IMPL_CRYPT;
  35 import static org.graalvm.compiler.hotspot.HotSpotBackend.DECRYPT;
  36 import static org.graalvm.compiler.hotspot.HotSpotBackend.DECRYPT_BLOCK;
  37 import static org.graalvm.compiler.hotspot.HotSpotBackend.DECRYPT_BLOCK_WITH_ORIGINAL_KEY;
  38 import static org.graalvm.compiler.hotspot.HotSpotBackend.DECRYPT_WITH_ORIGINAL_KEY;
  39 import static org.graalvm.compiler.hotspot.HotSpotBackend.ENCRYPT;
  40 import static org.graalvm.compiler.hotspot.HotSpotBackend.ENCRYPT_BLOCK;
  41 import static org.graalvm.compiler.hotspot.HotSpotBackend.EXCEPTION_HANDLER;
  42 import static org.graalvm.compiler.hotspot.HotSpotBackend.GHASH_PROCESS_BLOCKS;
  43 import static org.graalvm.compiler.hotspot.HotSpotBackend.IC_MISS_HANDLER;
  44 import static org.graalvm.compiler.hotspot.HotSpotBackend.INITIALIZE_KLASS_BY_SYMBOL;
  45 import static org.graalvm.compiler.hotspot.HotSpotBackend.INVOCATION_EVENT;
  46 import static org.graalvm.compiler.hotspot.HotSpotBackend.MONTGOMERY_MULTIPLY;
  47 import static org.graalvm.compiler.hotspot.HotSpotBackend.MONTGOMERY_SQUARE;
  48 import static org.graalvm.compiler.hotspot.HotSpotBackend.MULTIPLY_TO_LEN;


  68 import static org.graalvm.compiler.hotspot.HotSpotBackend.VECTORIZED_MISMATCHED;
  69 import static org.graalvm.compiler.hotspot.HotSpotBackend.VM_ERROR;
  70 import static org.graalvm.compiler.hotspot.HotSpotBackend.WRONG_METHOD_HANDLER;
  71 import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.Reexecutability.NOT_REEXECUTABLE;
  72 import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.Reexecutability.REEXECUTABLE;
  73 import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.Reexecutability.REEXECUTABLE_ONLY_AFTER_EXCEPTION;
  74 import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.RegisterEffect.DESTROYS_REGISTERS;
  75 import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.RegisterEffect.PRESERVES_REGISTERS;
  76 import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.Transition.LEAF;
  77 import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.Transition.LEAF_NO_VZERO;
  78 import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.Transition.SAFEPOINT;
  79 import static org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage.Transition.STACK_INSPECTABLE_LEAF;
  80 import static org.graalvm.compiler.hotspot.HotSpotHostBackend.DEOPTIMIZATION_HANDLER;
  81 import static org.graalvm.compiler.hotspot.HotSpotHostBackend.ENABLE_STACK_RESERVED_ZONE;
  82 import static org.graalvm.compiler.hotspot.HotSpotHostBackend.THROW_DELAYED_STACKOVERFLOW_ERROR;
  83 import static org.graalvm.compiler.hotspot.HotSpotHostBackend.UNCOMMON_TRAP_HANDLER;
  84 import static org.graalvm.compiler.hotspot.replacements.AssertionSnippets.ASSERTION_VM_MESSAGE_C;
  85 import static org.graalvm.compiler.hotspot.replacements.HotSpotG1WriteBarrierSnippets.G1WBPOSTCALL;
  86 import static org.graalvm.compiler.hotspot.replacements.HotSpotG1WriteBarrierSnippets.G1WBPRECALL;
  87 import static org.graalvm.compiler.hotspot.replacements.HotSpotG1WriteBarrierSnippets.VALIDATE_OBJECT;
  88 import static org.graalvm.compiler.hotspot.replacements.ContinuationSubstitutions.CONTINUATION_DO_CONTINUE;
  89 import static org.graalvm.compiler.hotspot.replacements.ContinuationSubstitutions.CONTINUATION_YIELD;
  90 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.MARK_WORD_LOCATION;
  91 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.TLAB_END_LOCATION;
  92 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.TLAB_TOP_LOCATION;
  93 import static org.graalvm.compiler.hotspot.replacements.Log.LOG_OBJECT;
  94 import static org.graalvm.compiler.hotspot.replacements.Log.LOG_PRIMITIVE;
  95 import static org.graalvm.compiler.hotspot.replacements.Log.LOG_PRINTF;
  96 import static org.graalvm.compiler.hotspot.replacements.MonitorSnippets.MONITORENTER;
  97 import static org.graalvm.compiler.hotspot.replacements.MonitorSnippets.MONITOREXIT;
  98 import static org.graalvm.compiler.hotspot.replacements.NewObjectSnippets.DYNAMIC_NEW_INSTANCE;
  99 import static org.graalvm.compiler.hotspot.replacements.NewObjectSnippets.DYNAMIC_NEW_INSTANCE_OR_NULL;
 100 import static org.graalvm.compiler.hotspot.replacements.ThreadSubstitutions.THREAD_IS_INTERRUPTED;
 101 import static org.graalvm.compiler.hotspot.stubs.ExceptionHandlerStub.EXCEPTION_HANDLER_FOR_PC;
 102 import static org.graalvm.compiler.hotspot.stubs.StubUtil.VM_MESSAGE_C;
 103 import static org.graalvm.compiler.hotspot.stubs.UnwindExceptionToCallerStub.EXCEPTION_HANDLER_FOR_RETURN_ADDRESS;
 104 import static org.graalvm.compiler.nodes.java.ForeignCallDescriptors.REGISTER_FINALIZER;
 105 import static org.graalvm.compiler.replacements.nodes.BinaryMathIntrinsicNode.BinaryOperation.POW;
 106 import static org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation.COS;
 107 import static org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation.EXP;
 108 import static org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation.LOG;
 109 import static org.graalvm.compiler.replacements.nodes.UnaryMathIntrinsicNode.UnaryOperation.LOG10;


 402         if (c.useGHASHIntrinsics()) {
 403             registerForeignCall(GHASH_PROCESS_BLOCKS, c.ghashProcessBlocks, NativeCall, DESTROYS_REGISTERS, LEAF, REEXECUTABLE_ONLY_AFTER_EXCEPTION, NamedLocationIdentity.any());
 404         }
 405         if (c.useBase64Intrinsics()) {
 406             registerForeignCall(BASE64_ENCODE_BLOCK, c.base64EncodeBlock, NativeCall, DESTROYS_REGISTERS, LEAF, REEXECUTABLE_ONLY_AFTER_EXCEPTION, NamedLocationIdentity.any());
 407         }
 408         if (c.useMulAddIntrinsic()) {
 409             registerForeignCall(MUL_ADD, c.mulAdd, NativeCall, DESTROYS_REGISTERS, LEAF_NO_VZERO, REEXECUTABLE_ONLY_AFTER_EXCEPTION, NamedLocationIdentity.getArrayLocation(JavaKind.Int));
 410         }
 411         if (c.useMontgomeryMultiplyIntrinsic()) {
 412             registerForeignCall(MONTGOMERY_MULTIPLY, c.montgomeryMultiply, NativeCall, DESTROYS_REGISTERS, LEAF_NO_VZERO, REEXECUTABLE_ONLY_AFTER_EXCEPTION,
 413                             NamedLocationIdentity.getArrayLocation(JavaKind.Int));
 414         }
 415         if (c.useMontgomerySquareIntrinsic()) {
 416             registerForeignCall(MONTGOMERY_SQUARE, c.montgomerySquare, NativeCall, DESTROYS_REGISTERS, LEAF_NO_VZERO, REEXECUTABLE_ONLY_AFTER_EXCEPTION,
 417                             NamedLocationIdentity.getArrayLocation(JavaKind.Int));
 418         }
 419         if (c.useSquareToLenIntrinsic()) {
 420             registerForeignCall(SQUARE_TO_LEN, c.squareToLen, NativeCall, DESTROYS_REGISTERS, LEAF_NO_VZERO, REEXECUTABLE_ONLY_AFTER_EXCEPTION, NamedLocationIdentity.getArrayLocation(JavaKind.Int));
 421         }
 422 
 423         if (c.continuationThaw != 0) {
 424             registerForeignCall(CONTINUATION_DO_CONTINUE, c.continuationThaw, JavaCall, DESTROYS_REGISTERS, SAFEPOINT, NOT_REEXECUTABLE, any());
 425             registerForeignCall(CONTINUATION_YIELD, c.continuationDoYield, JavaCall, DESTROYS_REGISTERS, SAFEPOINT, NOT_REEXECUTABLE, any());
 426         }
 427 
 428 
 429         if (c.useAESIntrinsics) {
 430             /*
 431              * When the java.ext.dirs property is modified then the crypto classes might not be
 432              * found. If that's the case we ignore the ClassNotFoundException and continue since we
 433              * cannot replace a non-existing method anyway.
 434              */
 435             try {
 436                 // These stubs do callee saving
 437                 registerForeignCall(ENCRYPT_BLOCK, c.aescryptEncryptBlockStub, NativeCall, PRESERVES_REGISTERS, LEAF, REEXECUTABLE_ONLY_AFTER_EXCEPTION,
 438                                 NamedLocationIdentity.getArrayLocation(JavaKind.Byte));
 439                 registerForeignCall(DECRYPT_BLOCK, c.aescryptDecryptBlockStub, NativeCall, PRESERVES_REGISTERS, LEAF, REEXECUTABLE_ONLY_AFTER_EXCEPTION,
 440                                 NamedLocationIdentity.getArrayLocation(JavaKind.Byte));
 441                 registerForeignCall(DECRYPT_BLOCK_WITH_ORIGINAL_KEY, c.aescryptDecryptBlockStub, NativeCall, PRESERVES_REGISTERS, LEAF, REEXECUTABLE_ONLY_AFTER_EXCEPTION,
 442                                 NamedLocationIdentity.getArrayLocation(JavaKind.Byte));
 443             } catch (GraalError e) {
 444                 if (!(e.getCause() instanceof ClassNotFoundException)) {
 445                     throw e;
 446                 }
 447             }


< prev index next >