Return-Path: X-Original-To: apmail-commons-commits-archive@minotaur.apache.org Delivered-To: apmail-commons-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id E68FA944B for ; Sun, 9 Oct 2011 12:36:20 +0000 (UTC) Received: (qmail 54762 invoked by uid 500); 9 Oct 2011 12:36:20 -0000 Delivered-To: apmail-commons-commits-archive@commons.apache.org Received: (qmail 54706 invoked by uid 500); 9 Oct 2011 12:36:20 -0000 Mailing-List: contact commits-help@commons.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@commons.apache.org Delivered-To: mailing list commits@commons.apache.org Received: (qmail 54699 invoked by uid 99); 9 Oct 2011 12:36:20 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 09 Oct 2011 12:36:20 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 09 Oct 2011 12:36:19 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 3D9A82388AA9 for ; Sun, 9 Oct 2011 12:35:59 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1180595 - /commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/algorithmic/forward/ForwardModeAlgorithmicDifferentiator.java Date: Sun, 09 Oct 2011 12:35:59 -0000 To: commits@commons.apache.org From: luc@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20111009123559.3D9A82388AA9@eris.apache.org> Author: luc Date: Sun Oct 9 12:35:58 2011 New Revision: 1180595 URL: http://svn.apache.org/viewvc?rev=1180595&view=rev Log: Added a debug message displaying generated bytecode on VeryfyException. This message is intended for debug purposes only and should be removed once Nabla is complete. Modified: commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/algorithmic/forward/ForwardModeAlgorithmicDifferentiator.java Modified: commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/algorithmic/forward/ForwardModeAlgorithmicDifferentiator.java URL: http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/algorithmic/forward/ForwardModeAlgorithmicDifferentiator.java?rev=1180595&r1=1180594&r2=1180595&view=diff ============================================================================== --- commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/algorithmic/forward/ForwardModeAlgorithmicDifferentiator.java (original) +++ commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/algorithmic/forward/ForwardModeAlgorithmicDifferentiator.java Sun Oct 9 12:35:58 2011 @@ -19,6 +19,7 @@ package org.apache.commons.nabla.algorit import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.io.PrintWriter; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.HashMap; @@ -32,8 +33,10 @@ import org.apache.commons.nabla.core.Uni import org.apache.commons.nabla.core.UnivariateDifferentiable; import org.apache.commons.nabla.core.UnivariateDifferentiator; import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.tree.ClassNode; +import org.objectweb.asm.util.TraceClassVisitor; /** Algorithmic differentiator class in forward mode based on bytecode analysis. *

This class is an implementation of the {@link UnivariateDifferentiator} @@ -56,7 +59,9 @@ public class ForwardModeAlgorithmicDiffe /** UnivariateDifferentiable/UnivariateDerivative map. */ private final HashMap, - Class> map; + Class> map; + + private final HashMap byteCodeMap; /** Math implementation classes. */ private final Set mathClasses; @@ -67,6 +72,7 @@ public class ForwardModeAlgorithmicDiffe public ForwardModeAlgorithmicDifferentiator() { map = new HashMap, Class>(); + byteCodeMap = new HashMap(); mathClasses = new HashSet(); addMathImplementation(Math.class); addMathImplementation(StrictMath.class); @@ -120,6 +126,16 @@ public class ForwardModeAlgorithmicDiffe } catch (InvocationTargetException ite) { throw new DifferentiationException("class {0} instantiation from an instance of class {1} failed ({2})", derivativeClass.getName(), d.getClass().getName(), ite.getMessage()); + } catch (VerifyError ve) { + + // TODO: the following statements are for debug purposes only + final ClassReader reader = new ClassReader(byteCodeMap.get(derivativeClass.getName())); + final ClassVisitor visitor = new TraceClassVisitor(new PrintWriter(System.err)); + reader.accept(visitor, ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES); + + throw new DifferentiationException("class {0} code generated from an instance of class {1} is incorrect ({2})", + derivativeClass.getName(), d.getClass().getName(), ve.getMessage()); + } } @@ -179,7 +195,13 @@ public class ForwardModeAlgorithmicDiffe // create the derivative class final ClassNode derived = differentiator.getDerivedClass(); final ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_FRAMES); - return new DerivativeLoader(differentiableClass).defineClass(derived, writer); + final String name = derived.name.replace('/', '.'); + derived.accept(writer); + final byte[] bytecode = writer.toByteArray(); + Class dClass = + new DerivativeLoader(differentiableClass).defineClass(name, bytecode); + byteCodeMap.put(name, bytecode); + return dClass; } catch (IOException ioe) { throw new DifferentiationException("class {0} cannot be read ({1})", @@ -198,16 +220,13 @@ public class ForwardModeAlgorithmicDiffe } /** Define a derivative class. - * @param classNode differentiated class - * @param writer class writer + * @param name name of the differentiated class + * @param bytecode bytecode of the differentiated class * @return a generated derivative class */ @SuppressWarnings("unchecked") public Class - defineClass(final ClassNode classNode, final ClassWriter writer) { - final String name = classNode.name.replace('/', '.'); - classNode.accept(writer); - final byte[] bytecode = writer.toByteArray(); + defineClass(final String name, byte[] bytecode) { return (Class) defineClass(name, bytecode, 0, bytecode.length); } }