You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@abdera.apache.org by jm...@apache.org on 2006/07/07 00:08:33 UTC
svn commit: r419720 [4/5] - in /incubator/abdera/java/trunk/build: ./ tools/
tools/retroweaver/ tools/retroweaver/docs/ tools/retroweaver/docs/guide/
tools/retroweaver/docs/images/ tools/retroweaver/lib/
tools/retroweaver/release/ tools/retroweaver/src...
Added: incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/gui/RetroWeaverGui.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/gui/RetroWeaverGui.java?rev=419720&view=auto
==============================================================================
--- incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/gui/RetroWeaverGui.java (added)
+++ incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/gui/RetroWeaverGui.java Thu Jul 6 15:08:30 2006
@@ -0,0 +1,369 @@
+package com.rc.retroweaver.gui;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.awt.Toolkit;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.StringTokenizer;
+
+import javax.swing.BorderFactory;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JFileChooser;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
+import javax.swing.JTextField;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+
+import org.objectweb.asm.commons.EmptyVisitor;
+
+import com.rc.retroweaver.RefVerifier;
+import com.rc.retroweaver.RetroWeaver;
+import com.rc.retroweaver.Weaver;
+import com.rc.retroweaver.event.VerifierListener;
+import com.rc.retroweaver.event.WeaveListener;
+
+/**
+ * A simple graphical user interface for Retroweaver.
+ */
+public class RetroWeaverGui extends JPanel implements WeaveListener,
+ VerifierListener {
+
+ public static void main(String[] args) {
+ String defaultPath = "";
+
+ if (args.length > 0) {
+ if (args[0].equals("-console")) {
+ String a[] = new String[args.length - 1];
+ System.arraycopy(args, 1, a, 0, args.length - 1);
+ Weaver.main(a);
+ return;
+ }
+ defaultPath = args[0];
+ }
+
+ String version = Weaver.getVersion();
+ showInJFrame("RetroWeaver " + version, new RetroWeaverGui(defaultPath));
+ }
+
+ private static void showInJFrame(String title, Component contents) {
+ JFrame frame = new JFrame(title);
+ frame.getContentPane().add(contents);
+ frame.setSize(400, 300);
+ centerOnScreen(frame);
+ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ frame.setVisible(true);
+ }
+
+ private static void centerOnScreen(JFrame frame) {
+ Dimension frameSize = frame.getSize();
+ Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
+ int x = (screenSize.width - frameSize.width) / 2;
+ int y = (screenSize.height - frameSize.height) / 2;
+ frame.setLocation(x, y);
+ }
+
+ public RetroWeaverGui(String defaultPath) {
+ super(new BorderLayout());
+ refClassPath = new JTextField();
+ add(createParameterSection(), BorderLayout.NORTH);
+ add(createMessageArea(), BorderLayout.CENTER);
+ add(createSouthSection(), BorderLayout.SOUTH);
+ pathField.setText(defaultPath);
+ }
+
+ public void weavingStarted(String msg) {
+ messages.append("[RetroWeaver] " + msg + "\n");
+ messageScrollPane.getVerticalScrollBar().setValue(
+ messageScrollPane.getVerticalScrollBar().getMaximum());
+ }
+
+ public void weavingPath(String sourcePath) {
+ String pathAsString = path.getAbsolutePath();
+ if (sourcePath.startsWith(pathAsString)) {
+ sourcePath = sourcePath.substring(pathAsString.length());
+ }
+ messages.append("[RetroWeaver] Weaving " + sourcePath + "\n");
+ messageScrollPane.getVerticalScrollBar().setValue(
+ messageScrollPane.getVerticalScrollBar().getMaximum());
+ }
+
+ public void weavingCompleted(String msg) {
+ messages.append("[RetroWeaver] " + msg + "\n");
+ messageScrollPane.getVerticalScrollBar().setValue(
+ messageScrollPane.getVerticalScrollBar().getMaximum());
+ }
+
+ public void verifyPathStarted(String msg) {
+ displayVerifierMessage(msg);
+ }
+
+ public void verifyClassStarted(String msg) {
+ displayVerifierMessage(msg);
+ }
+
+ public void acceptWarning(String msg) {
+ displayVerifierMessage(msg);
+ }
+
+ public void displaySummary(int warningCount) {
+ displayVerifierMessage("Verification complete, " + warningCount
+ + " warning(s).");
+ }
+
+ private void displayVerifierMessage(String msg) {
+ messages.append("[RefVerifier] " + msg + "\n");
+ messageScrollPane.getVerticalScrollBar().setValue(
+ messageScrollPane.getVerticalScrollBar().getMaximum());
+ }
+
+ private Component createParameterSection() {
+ JPanel ret = new JPanel(new GridBagLayout());
+ addAt(ret, 0, 0, new JLabel("Source:"));
+ addAt(ret, 1, 0, GridBagConstraints.HORIZONTAL, 2, 0.0,
+ createPathField());
+ addAt(ret, 3, 0, createBrowse());
+ addAt(ret, 0, 1, new JLabel("Target:"));
+ addAt(ret, 1, 1, createTargetChooser());
+ addAt(ret, 2, 1, GridBagConstraints.HORIZONTAL, 1, 1.0, new JPanel());
+ addAt(ret, 0, 2, new JLabel("Ref Verify Classpath:"));
+ addAt(ret, 1, 2, GridBagConstraints.HORIZONTAL, 2, 0.0, refClassPath);
+ addAt(ret, 3, 2, GridBagConstraints.HORIZONTAL, 1, 1.0, new JPanel());
+ return ret;
+ }
+
+ private Component createSouthSection() {
+ JPanel ret = new JPanel(new BorderLayout());
+ ret.add(createActionButtons(), BorderLayout.CENTER);
+ ret.add(createStatus(), BorderLayout.SOUTH);
+ ret.setBorder(BorderFactory.createEmptyBorder(INSET_SIZE, INSET_SIZE,
+ INSET_SIZE, INSET_SIZE));
+ return ret;
+ }
+
+ private Component createActionButtons() {
+ JPanel ret = new JPanel(new FlowLayout(FlowLayout.RIGHT));
+ ret.add(createTransform());
+ ret.add(createExit());
+ return ret;
+ }
+
+ private Component createPathField() {
+ pathField = new JTextField();
+ pathField.getDocument().addDocumentListener(new DocumentListener() {
+ public void insertUpdate(DocumentEvent e) {
+ doPathChanged();
+ }
+
+ public void removeUpdate(DocumentEvent e) {
+ doPathChanged();
+ }
+
+ public void changedUpdate(DocumentEvent e) {
+ // do nothing
+ }
+ });
+ return pathField;
+ }
+
+ private Component createBrowse() {
+ browse = new JButton("Browse...");
+ browse.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ doBrowse();
+ }
+ });
+ return browse;
+ }
+
+ private Component createTargetChooser() {
+ targetCombo = new JComboBox(new String[] { "1.4", "1.3", "1.2" });
+ targetCombo.setSelectedIndex(0);
+ targetCombo.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ status.setText(READY);
+ }
+ });
+ return targetCombo;
+ }
+
+ private Component createTransform() {
+ transform = new JButton("Transform");
+ transform.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ doTransform();
+ }
+ });
+ return transform;
+ }
+
+ private Component createExit() {
+ exit = new JButton("Exit");
+ exit.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ doExit();
+ }
+ });
+ return exit;
+ }
+
+ private Component createStatus() {
+ status = new JLabel(READY);
+ return status;
+ }
+
+ private Component createMessageArea() {
+ JPanel ret = new JPanel(new BorderLayout());
+ ret.setBorder(BorderFactory.createTitledBorder("Messages"));
+ messages = new JTextArea();
+ messageScrollPane = new JScrollPane(messages);
+ ret.add(messageScrollPane, BorderLayout.CENTER);
+ return ret;
+ }
+
+ private void addAt(Container container, int x, int y, Component component) {
+ addAt(container, x, y, 0, 1, 0.0, component);
+ }
+
+ private void addAt(Container container, int x, int y, int fill,
+ int gridwidth, double weightx, Component component) {
+ GridBagConstraints constraints = new GridBagConstraints();
+ constraints.gridx = x;
+ constraints.gridy = y;
+ constraints.fill = fill;
+ constraints.insets = INSETS;
+ constraints.gridwidth = gridwidth;
+ constraints.weightx = weightx;
+ container.add(component, constraints);
+ }
+
+ private void doTransform() {
+
+ if (runWeaverThread != null && runWeaverThread.isAlive()) {
+ JOptionPane
+ .showMessageDialog(this,
+ "RetroWeaver is already running, wait until it has finished ");
+ return;
+ }
+
+ path = new File(pathField.getText());
+
+ if (!path.exists()) {
+ status.setText("Error: Path \"" + path + "\" does not exist");
+ return;
+ }
+
+ version = VERSION_NUMBERS[targetCombo.getSelectedIndex()];
+ runWeaverThread = createWeaverThread();
+ runWeaverThread.start();
+ }
+
+ private void doBrowse() {
+ JFileChooser fileChooser = new JFileChooser();
+ fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
+
+ if (fileChooser.showOpenDialog(this) != JFileChooser.APPROVE_OPTION) {
+ return;
+ }
+
+ pathField.setText(fileChooser.getSelectedFile().getAbsolutePath());
+ status.setText(READY);
+ }
+
+ private void doExit() {
+ JFrame frame = (JFrame) getTopLevelAncestor();
+ frame.dispose();
+ }
+
+ private void doPathChanged() {
+ status.setText(READY);
+ }
+
+ private JButton transform;
+
+ private JButton browse;
+
+ private JTextField pathField;
+
+ private JTextField refClassPath;
+
+ private JComboBox targetCombo;
+
+ private JLabel status;
+
+ private JButton exit;
+
+ private JTextArea messages;
+
+ private int version;
+
+ private File path;
+
+ private JScrollPane messageScrollPane;
+
+ private static final String READY = "Ready";
+
+ private static final int INSET_SIZE = 3;
+
+ private static final Insets INSETS = new Insets(INSET_SIZE, INSET_SIZE,
+ INSET_SIZE, INSET_SIZE);
+
+ private static final int[] VERSION_NUMBERS = new int[] {
+ Weaver.VERSION_1_4, Weaver.VERSION_1_3, Weaver.VERSION_1_2 };
+
+ private Thread runWeaverThread;
+
+ private Thread createWeaverThread() {
+ return new Thread(new Runnable() {
+ public void run() {
+ Cursor oldCursor = getTopLevelAncestor().getCursor();
+ getTopLevelAncestor().setCursor(
+ Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+
+ try {
+ status.setText("Running");
+ RetroWeaver weaver = new RetroWeaver(version);
+ messages.setText("");
+ weaver.setListener(RetroWeaverGui.this);
+
+ String refCp = refClassPath.getText();
+
+ if (refCp.length() != 0) {
+ java.util.List<String> classpath = new ArrayList<String>();
+ StringTokenizer st = new StringTokenizer(refCp,
+ File.pathSeparator);
+ while (st.hasMoreTokens()) {
+ classpath.add(st.nextToken());
+ }
+ RefVerifier verifier = new RefVerifier(version, new EmptyVisitor(), classpath,
+ RetroWeaverGui.this);
+ weaver.setVerifier(verifier);
+ }
+
+ weaver.weave(path);
+
+ status.setText("Done");
+ } catch (Exception ex) {
+ status.setText("Error: " + ex.getMessage());
+ } finally {
+ getTopLevelAncestor().setCursor(oldCursor);
+ }
+ }
+ });
+ }
+}
Added: incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/optimizer/AnnotationConstantsCollector.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/optimizer/AnnotationConstantsCollector.java?rev=419720&view=auto
==============================================================================
--- incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/optimizer/AnnotationConstantsCollector.java (added)
+++ incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/optimizer/AnnotationConstantsCollector.java Thu Jul 6 15:08:30 2006
@@ -0,0 +1,150 @@
+/***
+ * ASM: a very small and fast Java bytecode manipulation framework
+ * Copyright (c) 2000-2005 INRIA, France Telecom
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.rc.retroweaver.optimizer;
+
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.Type;
+
+/**
+ * An {@link AnnotationVisitor} that collects the {@link Constant}s of the
+ * annotations it visits.
+ *
+ * @author Eric Bruneton
+ */
+public class AnnotationConstantsCollector implements AnnotationVisitor {
+
+ private AnnotationVisitor av;
+
+ private ConstantPool cp;
+
+ public AnnotationConstantsCollector(
+ final AnnotationVisitor av,
+ final ConstantPool cp)
+ {
+ this.av = av;
+ this.cp = cp;
+ }
+
+ public void visit(final String name, final Object value) {
+ if (name != null) {
+ cp.newUTF8(name);
+ }
+ if (value instanceof Byte) {
+ cp.newInteger(((Byte) value).byteValue());
+ } else if (value instanceof Boolean) {
+ cp.newInteger(((Boolean) value).booleanValue() ? 1 : 0);
+ } else if (value instanceof Character) {
+ cp.newInteger(((Character) value).charValue());
+ } else if (value instanceof Short) {
+ cp.newInteger(((Short) value).shortValue());
+ } else if (value instanceof Type) {
+ cp.newUTF8(((Type) value).getDescriptor());
+ } else if (value instanceof byte[]) {
+ byte[] v = (byte[]) value;
+ for (int i = 0; i < v.length; i++) {
+ cp.newInteger(v[i]);
+ }
+ } else if (value instanceof boolean[]) {
+ boolean[] v = (boolean[]) value;
+ for (int i = 0; i < v.length; i++) {
+ cp.newInteger(v[i] ? 1 : 0);
+ }
+ } else if (value instanceof short[]) {
+ short[] v = (short[]) value;
+ for (int i = 0; i < v.length; i++) {
+ cp.newInteger(v[i]);
+ }
+ } else if (value instanceof char[]) {
+ char[] v = (char[]) value;
+ for (int i = 0; i < v.length; i++) {
+ cp.newInteger(v[i]);
+ }
+ } else if (value instanceof int[]) {
+ int[] v = (int[]) value;
+ for (int i = 0; i < v.length; i++) {
+ cp.newInteger(v[i]);
+ }
+ } else if (value instanceof long[]) {
+ long[] v = (long[]) value;
+ for (int i = 0; i < v.length; i++) {
+ cp.newLong(v[i]);
+ }
+ } else if (value instanceof float[]) {
+ float[] v = (float[]) value;
+ for (int i = 0; i < v.length; i++) {
+ cp.newFloat(v[i]);
+ }
+ } else if (value instanceof double[]) {
+ double[] v = (double[]) value;
+ for (int i = 0; i < v.length; i++) {
+ cp.newDouble(v[i]);
+ }
+ } else {
+ cp.newConst(value);
+ }
+ av.visit(name, value);
+ }
+
+ public void visitEnum(
+ final String name,
+ final String desc,
+ final String value)
+ {
+ if (name != null) {
+ cp.newUTF8(name);
+ }
+ cp.newUTF8(desc);
+ cp.newUTF8(value);
+ av.visitEnum(name, desc, value);
+ }
+
+ public AnnotationVisitor visitAnnotation(
+ final String name,
+ final String desc)
+ {
+ if (name != null) {
+ cp.newUTF8(name);
+ }
+ cp.newUTF8(desc);
+ return new AnnotationConstantsCollector(av.visitAnnotation(name, desc),
+ cp);
+ }
+
+ public AnnotationVisitor visitArray(final String name) {
+ if (name != null) {
+ cp.newUTF8(name);
+ }
+ return new AnnotationConstantsCollector(av.visitArray(name), cp);
+ }
+
+ public void visitEnd() {
+ av.visitEnd();
+ }
+}
Added: incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/optimizer/ClassConstantsCollector.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/optimizer/ClassConstantsCollector.java?rev=419720&view=auto
==============================================================================
--- incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/optimizer/ClassConstantsCollector.java (added)
+++ incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/optimizer/ClassConstantsCollector.java Thu Jul 6 15:08:30 2006
@@ -0,0 +1,212 @@
+/***
+ * ASM: a very small and fast Java bytecode manipulation framework
+ * Copyright (c) 2000-2005 INRIA, France Telecom
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.rc.retroweaver.optimizer;
+
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.Attribute;
+import org.objectweb.asm.ClassAdapter;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+
+/**
+ * A {@link ClassVisitor} that collects the {@link Constant}s of the classes it
+ * visits.
+ *
+ * @author Eric Bruneton
+ */
+public class ClassConstantsCollector extends ClassAdapter {
+
+ private ConstantPool cp;
+
+ public ClassConstantsCollector(final ClassVisitor cv, final ConstantPool cp)
+ {
+ super(cv);
+ this.cp = cp;
+ }
+
+ public void visit(
+ final int version,
+ final int access,
+ final String name,
+ final String signature,
+ final String superName,
+ final String[] interfaces)
+ {
+ if ((access & Opcodes.ACC_DEPRECATED) != 0) {
+ cp.newUTF8("Deprecated");
+ }
+ if ((access & Opcodes.ACC_SYNTHETIC) != 0) {
+ cp.newUTF8("Synthetic");
+ }
+ cp.newClass(name);
+ if (signature != null) {
+ cp.newUTF8("Signature");
+ cp.newUTF8(signature);
+ }
+ if (superName != null) {
+ cp.newClass(superName);
+ }
+ if (interfaces != null) {
+ for (int i = 0; i < interfaces.length; ++i) {
+ cp.newClass(interfaces[i]);
+ }
+ }
+ cv.visit(version, access, name, signature, superName, interfaces);
+ }
+
+ public void visitSource(final String source, final String debug) {
+ if (source != null) {
+ cp.newUTF8("SourceFile");
+ cp.newUTF8(source);
+ }
+ if (debug != null) {
+ cp.newUTF8("SourceDebugExtension");
+ }
+ cv.visitSource(source, debug);
+ }
+
+ public void visitOuterClass(
+ final String owner,
+ final String name,
+ final String desc)
+ {
+ cp.newUTF8("EnclosingMethod");
+ cp.newClass(owner);
+ if (name != null && desc != null) {
+ cp.newNameType(name, desc);
+ }
+ cv.visitOuterClass(owner, name, desc);
+ }
+
+ public AnnotationVisitor visitAnnotation(
+ final String desc,
+ final boolean visible)
+ {
+ cp.newUTF8(desc);
+ if (visible) {
+ cp.newUTF8("RuntimeVisibleAnnotations");
+ } else {
+ cp.newUTF8("RuntimeInvisibleAnnotations");
+ }
+ return new AnnotationConstantsCollector(cv.visitAnnotation(desc,
+ visible), cp);
+ }
+
+ public void visitAttribute(final Attribute attr) {
+ // can do nothing
+ cv.visitAttribute(attr);
+ }
+
+ public void visitInnerClass(
+ final String name,
+ final String outerName,
+ final String innerName,
+ final int access)
+ {
+ cp.newUTF8("InnerClasses");
+ if (name != null) {
+ cp.newClass(name);
+ }
+ if (outerName != null) {
+ cp.newClass(outerName);
+ }
+ if (innerName != null) {
+ cp.newClass(innerName);
+ }
+ cv.visitInnerClass(name, outerName, innerName, access);
+ }
+
+ public FieldVisitor visitField(
+ final int access,
+ final String name,
+ final String desc,
+ final String signature,
+ final Object value)
+ {
+ if ((access & Opcodes.ACC_SYNTHETIC) != 0) {
+ cp.newUTF8("Synthetic");
+ }
+ if ((access & Opcodes.ACC_DEPRECATED) != 0) {
+ cp.newUTF8("Deprecated");
+ }
+ cp.newUTF8(name);
+ cp.newUTF8(desc);
+ if (signature != null) {
+ cp.newUTF8("Signature");
+ cp.newUTF8(signature);
+ }
+ if (value != null) {
+ cp.newConst(value);
+ }
+ return new FieldConstantsCollector(cv.visitField(access,
+ name,
+ desc,
+ signature,
+ value), cp);
+ }
+
+ public MethodVisitor visitMethod(
+ final int access,
+ final String name,
+ final String desc,
+ final String signature,
+ final String[] exceptions)
+ {
+ if ((access & Opcodes.ACC_SYNTHETIC) != 0) {
+ cp.newUTF8("Synthetic");
+ }
+ if ((access & Opcodes.ACC_DEPRECATED) != 0) {
+ cp.newUTF8("Deprecated");
+ }
+ cp.newUTF8(name);
+ cp.newUTF8(desc);
+ if (signature != null) {
+ cp.newUTF8("Signature");
+ cp.newUTF8(signature);
+ }
+ if (exceptions != null) {
+ cp.newUTF8("Exceptions");
+ for (int i = 0; i < exceptions.length; ++i) {
+ cp.newClass(exceptions[i]);
+ }
+ }
+ return new MethodConstantsCollector(cv.visitMethod(access,
+ name,
+ desc,
+ signature,
+ exceptions), cp);
+ }
+
+ public void visitEnd() {
+ cv.visitEnd();
+ }
+}
Added: incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/optimizer/Constant.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/optimizer/Constant.java?rev=419720&view=auto
==============================================================================
--- incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/optimizer/Constant.java (added)
+++ incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/optimizer/Constant.java Thu Jul 6 15:08:30 2006
@@ -0,0 +1,267 @@
+/***
+ * ASM: a very small and fast Java bytecode manipulation framework
+ * Copyright (c) 2000-2005 INRIA, France Telecom
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.rc.retroweaver.optimizer;
+
+import org.objectweb.asm.ClassWriter;
+
+/**
+ * A constant pool item.
+ *
+ * @author Eric Bruneton
+ */
+public
+class Constant {
+
+ /**
+ * Type of this constant pool item. A single class is used to represent all
+ * constant pool item types, in order to minimize the bytecode size of this
+ * package. The value of this field is I, J, F, D, S, s, C, T, G, M, or N
+ * (for Constant Integer, Long, Float, Double, STR, UTF8, Class, NameType,
+ * Fieldref, Methodref, or InterfaceMethodref constant pool items
+ * respectively).
+ */
+ char type;
+
+ /**
+ * Value of this item, for an integer item.
+ */
+ int intVal;
+
+ /**
+ * Value of this item, for a long item.
+ */
+ long longVal;
+
+ /**
+ * Value of this item, for a float item.
+ */
+ float floatVal;
+
+ /**
+ * Value of this item, for a double item.
+ */
+ double doubleVal;
+
+ /**
+ * First part of the value of this item, for items that do not hold a
+ * primitive value.
+ */
+ String strVal1;
+
+ /**
+ * Second part of the value of this item, for items that do not hold a
+ * primitive value.
+ */
+ String strVal2;
+
+ /**
+ * Third part of the value of this item, for items that do not hold a
+ * primitive value.
+ */
+ String strVal3;
+
+ /**
+ * The hash code value of this constant pool item.
+ */
+ int hashCode;
+
+ public Constant() {
+ }
+
+ public Constant(final Constant i) {
+ type = i.type;
+ intVal = i.intVal;
+ longVal = i.longVal;
+ floatVal = i.floatVal;
+ doubleVal = i.doubleVal;
+ strVal1 = i.strVal1;
+ strVal2 = i.strVal2;
+ strVal3 = i.strVal3;
+ hashCode = i.hashCode;
+ }
+
+ /**
+ * Sets this item to an integer item.
+ *
+ * @param intVal the value of this item.
+ */
+ void set(final int intVal) {
+ this.type = 'I';
+ this.intVal = intVal;
+ this.hashCode = 0x7FFFFFFF & (type + intVal);
+ }
+
+ /**
+ * Sets this item to a long item.
+ *
+ * @param longVal the value of this item.
+ */
+ void set(final long longVal) {
+ this.type = 'J';
+ this.longVal = longVal;
+ this.hashCode = 0x7FFFFFFF & (type + (int) longVal);
+ }
+
+ /**
+ * Sets this item to a float item.
+ *
+ * @param floatVal the value of this item.
+ */
+ void set(final float floatVal) {
+ this.type = 'F';
+ this.floatVal = floatVal;
+ this.hashCode = 0x7FFFFFFF & (type + (int) floatVal);
+ }
+
+ /**
+ * Sets this item to a double item.
+ *
+ * @param doubleVal the value of this item.
+ */
+ void set(final double doubleVal) {
+ this.type = 'D';
+ this.doubleVal = doubleVal;
+ this.hashCode = 0x7FFFFFFF & (type + (int) doubleVal);
+ }
+
+ /**
+ * Sets this item to an item that do not hold a primitive value.
+ *
+ * @param type the type of this item.
+ * @param strVal1 first part of the value of this item.
+ * @param strVal2 second part of the value of this item.
+ * @param strVal3 third part of the value of this item.
+ */
+ void set(
+ final char type,
+ final String strVal1,
+ final String strVal2,
+ final String strVal3)
+ {
+ this.type = type;
+ this.strVal1 = strVal1;
+ this.strVal2 = strVal2;
+ this.strVal3 = strVal3;
+ switch (type) {
+ case 's':
+ case 'S':
+ case 'C':
+ hashCode = 0x7FFFFFFF & (type + strVal1.hashCode());
+ return;
+ case 'T':
+ hashCode = 0x7FFFFFFF & (type + strVal1.hashCode()
+ * strVal2.hashCode());
+ return;
+ // case 'G':
+ // case 'M':
+ // case 'N':
+ default:
+ hashCode = 0x7FFFFFFF & (type + strVal1.hashCode()
+ * strVal2.hashCode() * strVal3.hashCode());
+ }
+ }
+
+ public
+ void write(final ClassWriter cw) {
+ switch (type) {
+ case 'I':
+ cw.newConst(new Integer(intVal));
+ break;
+ case 'J':
+ cw.newConst(new Long(longVal));
+ break;
+ case 'F':
+ cw.newConst(new Float(floatVal));
+ break;
+ case 'D':
+ cw.newConst(new Double(doubleVal));
+ break;
+ case 'S':
+ cw.newConst(strVal1);
+ break;
+ case 's':
+ cw.newUTF8(strVal1);
+ break;
+ case 'C':
+ cw.newClass(strVal1);
+ break;
+ case 'T':
+ cw.newNameType(strVal1, strVal2);
+ break;
+ case 'G':
+ cw.newField(strVal1, strVal2, strVal3);
+ break;
+ case 'M':
+ cw.newMethod(strVal1, strVal2, strVal3, false);
+ break;
+ case 'N':
+ cw.newMethod(strVal1, strVal2, strVal3, true);
+ break;
+ }
+ }
+
+ public boolean equals(final Object o) {
+ if (!(o instanceof Constant)) {
+ return false;
+ }
+ Constant c = (Constant) o;
+ if (c.type == type) {
+ switch (type) {
+ case 'I':
+ return c.intVal == intVal;
+ case 'J':
+ return c.longVal == longVal;
+ case 'F':
+ return c.floatVal == floatVal;
+ case 'D':
+ return c.doubleVal == doubleVal;
+ case 's':
+ case 'S':
+ case 'C':
+ return c.strVal1.equals(strVal1);
+ case 'T':
+ return c.strVal1.equals(strVal1)
+ && c.strVal2.equals(strVal2);
+ // case 'G':
+ // case 'M':
+ // case 'N':
+ default:
+ return c.strVal1.equals(strVal1)
+ && c.strVal2.equals(strVal2)
+ && c.strVal3.equals(strVal3);
+ }
+ }
+ return false;
+ }
+
+ public int hashCode() {
+ return hashCode;
+ }
+}
Added: incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/optimizer/ConstantComparator.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/optimizer/ConstantComparator.java?rev=419720&view=auto
==============================================================================
--- incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/optimizer/ConstantComparator.java (added)
+++ incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/optimizer/ConstantComparator.java Thu Jul 6 15:08:30 2006
@@ -0,0 +1,98 @@
+/***
+ * ASM: a very small and fast Java bytecode manipulation framework
+ * Copyright (c) 2000-2005 INRIA, France Telecom
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.rc.retroweaver.optimizer;
+
+import java.util.Comparator;
+
+ public class ConstantComparator implements Comparator<Constant> {
+
+ public int compare(final Constant c1, final Constant c2) {
+ int d = getSort(c1) - getSort(c2);
+ if (d == 0) {
+ switch (c1.type) {
+ case 'I':
+ return new Integer(c1.intVal).compareTo(new Integer(c2.intVal));
+ case 'J':
+ return new Long(c1.longVal).compareTo(new Long(c2.longVal));
+ case 'F':
+ return new Float(c1.floatVal).compareTo(new Float(c2.floatVal));
+ case 'D':
+ return new Double(c1.doubleVal).compareTo(new Double(c2.doubleVal));
+ case 's':
+ case 'S':
+ case 'C':
+ return c1.strVal1.compareTo(c2.strVal1);
+ case 'T':
+ d = c1.strVal1.compareTo(c2.strVal1);
+ if (d == 0) {
+ d = c1.strVal2.compareTo(c2.strVal2);
+ }
+ break;
+ default:
+ d = c1.strVal1.compareTo(c2.strVal1);
+ if (d == 0) {
+ d = c1.strVal2.compareTo(c2.strVal2);
+ if (d == 0) {
+ d = c1.strVal3.compareTo(c2.strVal3);
+ }
+ }
+ }
+ }
+ return d;
+ }
+
+ private int getSort(Constant c) {
+ switch (c.type) {
+ case 'I':
+ return 0;
+ case 'J':
+ return 1;
+ case 'F':
+ return 2;
+ case 'D':
+ return 3;
+ case 's':
+ return 4;
+ case 'S':
+ return 5;
+ case 'C':
+ return 6;
+ case 'T':
+ return 7;
+ case 'G':
+ return 8;
+ case 'M':
+ return 9;
+ default:
+ return 10;
+ }
+ }
+ }
+
Added: incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/optimizer/ConstantPool.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/optimizer/ConstantPool.java?rev=419720&view=auto
==============================================================================
--- incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/optimizer/ConstantPool.java (added)
+++ incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/optimizer/ConstantPool.java Thu Jul 6 15:08:30 2006
@@ -0,0 +1,194 @@
+/***
+ * ASM: a very small and fast Java bytecode manipulation framework
+ * Copyright (c) 2000-2005 INRIA, France Telecom
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.rc.retroweaver.optimizer;
+
+import java.util.HashMap;
+
+import org.objectweb.asm.Type;
+
+/**
+ * A constant pool.
+ *
+ * @author Eric Bruneton
+ */
+public class ConstantPool extends HashMap<Constant, Constant> {
+
+ private Constant key1 = new Constant();
+
+ private Constant key2 = new Constant();
+
+ private Constant key3 = new Constant();
+
+ public Constant newInteger(final int value) {
+ key1.set(value);
+ Constant result = get(key1);
+ if (result == null) {
+ result = new Constant(key1);
+ put(result);
+ }
+ return result;
+ }
+
+ public Constant newFloat(final float value) {
+ key1.set(value);
+ Constant result = get(key1);
+ if (result == null) {
+ result = new Constant(key1);
+ put(result);
+ }
+ return result;
+ }
+
+ public Constant newLong(final long value) {
+ key1.set(value);
+ Constant result = get(key1);
+ if (result == null) {
+ result = new Constant(key1);
+ put(result);
+ }
+ return result;
+ }
+
+ public Constant newDouble(final double value) {
+ key1.set(value);
+ Constant result = get(key1);
+ if (result == null) {
+ result = new Constant(key1);
+ put(result);
+ }
+ return result;
+ }
+
+ public Constant newUTF8(final String value) {
+ key1.set('s', value, null, null);
+ Constant result = get(key1);
+ if (result == null) {
+ result = new Constant(key1);
+ put(result);
+ }
+ return result;
+ }
+
+ private Constant newString(final String value) {
+ key2.set('S', value, null, null);
+ Constant result = get(key2);
+ if (result == null) {
+ newUTF8(value);
+ result = new Constant(key2);
+ put(result);
+ }
+ return result;
+ }
+
+ public Constant newClass(final String value) {
+ key2.set('C', value, null, null);
+ Constant result = get(key2);
+ if (result == null) {
+ newUTF8(value);
+ result = new Constant(key2);
+ put(result);
+ }
+ return result;
+ }
+
+ public Constant newConst(final Object cst) {
+ if (cst instanceof Integer) {
+ int val = ((Integer) cst).intValue();
+ return newInteger(val);
+ } else if (cst instanceof Float) {
+ float val = ((Float) cst).floatValue();
+ return newFloat(val);
+ } else if (cst instanceof Long) {
+ long val = ((Long) cst).longValue();
+ return newLong(val);
+ } else if (cst instanceof Double) {
+ double val = ((Double) cst).doubleValue();
+ return newDouble(val);
+ } else if (cst instanceof String) {
+ return newString((String) cst);
+ } else if (cst instanceof Type) {
+ Type t = (Type) cst;
+ return newClass(t.getSort() == Type.OBJECT
+ ? t.getInternalName()
+ : t.getDescriptor());
+ } else {
+ throw new IllegalArgumentException("value " + cst);
+ }
+ }
+
+ public Constant newField(
+ final String owner,
+ final String name,
+ final String desc)
+ {
+ key3.set('G', owner, name, desc);
+ Constant result = get(key3);
+ if (result == null) {
+ newClass(owner);
+ newNameType(name, desc);
+ result = new Constant(key3);
+ put(result);
+ }
+ return result;
+ }
+
+ public Constant newMethod(
+ final String owner,
+ final String name,
+ final String desc,
+ final boolean itf)
+ {
+ key3.set(itf ? 'N' : 'M', owner, name, desc);
+ Constant result = get(key3);
+ if (result == null) {
+ newClass(owner);
+ newNameType(name, desc);
+ result = new Constant(key3);
+ put(result);
+ }
+ return result;
+ }
+
+ public Constant newNameType(final String name, final String desc) {
+ key2.set('T', name, desc, null);
+ Constant result = get(key2);
+ if (result == null) {
+ newUTF8(name);
+ newUTF8(desc);
+ result = new Constant(key2);
+ put(result);
+ }
+ return result;
+ }
+
+ private void put(final Constant cst) {
+ put(cst, cst);
+ }
+}
Added: incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/optimizer/FieldConstantsCollector.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/optimizer/FieldConstantsCollector.java?rev=419720&view=auto
==============================================================================
--- incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/optimizer/FieldConstantsCollector.java (added)
+++ incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/optimizer/FieldConstantsCollector.java Thu Jul 6 15:08:30 2006
@@ -0,0 +1,76 @@
+/***
+ * ASM: a very small and fast Java bytecode manipulation framework
+ * Copyright (c) 2000-2005 INRIA, France Telecom
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.rc.retroweaver.optimizer;
+
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.Attribute;
+import org.objectweb.asm.FieldVisitor;
+
+/**
+ * A {@link FieldVisitor} that collects the {@link Constant}s of the fields it
+ * visits.
+ *
+ * @author Eric Bruneton
+ */
+public class FieldConstantsCollector implements FieldVisitor {
+
+ private FieldVisitor fv;
+
+ private ConstantPool cp;
+
+ public FieldConstantsCollector(final FieldVisitor fv, final ConstantPool cp)
+ {
+ this.fv = fv;
+ this.cp = cp;
+ }
+
+ public AnnotationVisitor visitAnnotation(
+ final String desc,
+ final boolean visible)
+ {
+ cp.newUTF8(desc);
+ if (visible) {
+ cp.newUTF8("RuntimeVisibleAnnotations");
+ } else {
+ cp.newUTF8("RuntimeInvisibleAnnotations");
+ }
+ return new AnnotationConstantsCollector(fv.visitAnnotation(desc,
+ visible), cp);
+ }
+
+ public void visitAttribute(final Attribute attr) {
+ // can do nothing
+ fv.visitAttribute(attr);
+ }
+
+ public void visitEnd() {
+ fv.visitEnd();
+ }
+}
Added: incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/optimizer/MethodConstantsCollector.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/optimizer/MethodConstantsCollector.java?rev=419720&view=auto
==============================================================================
--- incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/optimizer/MethodConstantsCollector.java (added)
+++ incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/optimizer/MethodConstantsCollector.java Thu Jul 6 15:08:30 2006
@@ -0,0 +1,168 @@
+/***
+ * ASM: a very small and fast Java bytecode manipulation framework
+ * Copyright (c) 2000-2005 INRIA, France Telecom
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.rc.retroweaver.optimizer;
+
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodAdapter;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+
+/**
+ * An {@link MethodVisitor} that collects the {@link Constant}s of the methods
+ * it visits.
+ *
+ * @author Eric Bruneton
+ */
+public class MethodConstantsCollector extends MethodAdapter {
+
+ private ConstantPool cp;
+
+ public MethodConstantsCollector(
+ final MethodVisitor mv,
+ final ConstantPool cp)
+ {
+ super(mv);
+ this.cp = cp;
+ }
+
+ public AnnotationVisitor visitAnnotationDefault() {
+ cp.newUTF8("AnnotationDefault");
+ return new AnnotationConstantsCollector(mv.visitAnnotationDefault(), cp);
+ }
+
+ public AnnotationVisitor visitAnnotation(
+ final String desc,
+ final boolean visible)
+ {
+ cp.newUTF8(desc);
+ if (visible) {
+ cp.newUTF8("RuntimeVisibleAnnotations");
+ } else {
+ cp.newUTF8("RuntimeInvisibleAnnotations");
+ }
+ return new AnnotationConstantsCollector(mv.visitAnnotation(desc,
+ visible), cp);
+ }
+
+ public AnnotationVisitor visitParameterAnnotation(
+ final int parameter,
+ final String desc,
+ final boolean visible)
+ {
+ cp.newUTF8(desc);
+ if (visible) {
+ cp.newUTF8("RuntimeVisibleParameterAnnotations");
+ } else {
+ cp.newUTF8("RuntimeInvisibleParameterAnnotations");
+ }
+ return new AnnotationConstantsCollector(mv.visitParameterAnnotation(parameter,
+ desc,
+ visible),
+ cp);
+ }
+
+ public void visitTypeInsn(final int opcode, final String desc) {
+ cp.newClass(desc);
+ mv.visitTypeInsn(opcode, desc);
+ }
+
+ public void visitFieldInsn(
+ final int opcode,
+ final String owner,
+ final String name,
+ final String desc)
+ {
+ cp.newField(owner, name, desc);
+ mv.visitFieldInsn(opcode, owner, name, desc);
+ }
+
+ public void visitMethodInsn(
+ final int opcode,
+ final String owner,
+ final String name,
+ final String desc)
+ {
+ boolean itf = opcode == Opcodes.INVOKEINTERFACE;
+ cp.newMethod(owner, name, desc, itf);
+ mv.visitMethodInsn(opcode, owner, name, desc);
+ }
+
+ public void visitLdcInsn(final Object cst) {
+ cp.newConst(cst);
+ mv.visitLdcInsn(cst);
+ }
+
+ public void visitMultiANewArrayInsn(final String desc, final int dims) {
+ cp.newClass(desc);
+ mv.visitMultiANewArrayInsn(desc, dims);
+ }
+
+ public void visitTryCatchBlock(
+ final Label start,
+ final Label end,
+ final Label handler,
+ final String type)
+ {
+ if (type != null) {
+ cp.newClass(type);
+ }
+ mv.visitTryCatchBlock(start, end, handler, type);
+ }
+
+ public void visitLocalVariable(
+ final String name,
+ final String desc,
+ final String signature,
+ final Label start,
+ final Label end,
+ final int index)
+ {
+ if (signature != null) {
+ cp.newUTF8("LocalVariableTypeTable");
+ cp.newUTF8(name);
+ cp.newUTF8(signature);
+ }
+ cp.newUTF8("LocalVariableTable");
+ cp.newUTF8(name);
+ cp.newUTF8(desc);
+ mv.visitLocalVariable(name, desc, signature, start, end, index);
+ }
+
+ public void visitLineNumber(final int line, final Label start) {
+ cp.newUTF8("LineNumberTable");
+ mv.visitLineNumber(line, start);
+ }
+
+ public void visitMaxs(final int maxStack, final int maxLocals) {
+ cp.newUTF8("Code");
+ mv.visitMaxs(maxStack, maxLocals);
+ }
+}
Added: incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/runtime/Autobox.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/runtime/Autobox.java?rev=419720&view=auto
==============================================================================
--- incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/runtime/Autobox.java (added)
+++ incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/runtime/Autobox.java Thu Jul 6 15:08:30 2006
@@ -0,0 +1,70 @@
+package com.rc.retroweaver.runtime;
+
+/**
+ * A replacement for the new boxing functions which were added for autoboxing in
+ * 1.5.
+ */
+public final class Autobox {
+
+ private static Byte[] byteVals = new Byte[256];
+
+ private static Character[] charVals = new Character[256];
+
+ private static Short[] shortVals = new Short[256];
+
+ private static Integer[] intVals = new Integer[256];
+
+ static {
+ for (int i = 0; i < 256; ++i) {
+ byte val = (byte) (i - 128);
+ byteVals[i] = new Byte(val);
+ charVals[i] = new Character((char) val);
+ shortVals[i] = new Short(val);
+ intVals[i] = new Integer(val);
+ }
+ }
+
+ public static Boolean valueOf(boolean b) {
+ return b ? Boolean.TRUE : Boolean.FALSE;
+ }
+
+ public static Byte valueOf(byte val) {
+ return byteVals[val + 128];
+ }
+
+ public static Character valueOf(char val) {
+ if (val >= -128 && val <= 127) {
+ return charVals[val + 128];
+ } else {
+ return new Character(val);
+ }
+ }
+
+ public static Short valueOf(short val) {
+ if (val >= -128 && val <= 127) {
+ return shortVals[val + 128];
+ } else {
+ return new Short(val);
+ }
+ }
+
+ public static Integer valueOf(int val) {
+ if (val >= -128 && val <= 127) {
+ return intVals[val + 128];
+ } else {
+ return new Integer(val);
+ }
+ }
+
+ public static Long valueOf(long l) {
+ return new Long(l);
+ }
+
+ public static Float valueOf(float f) {
+ return new Float(f);
+ }
+
+ public static Double valueOf(double d) {
+ return new Double(d);
+ }
+}
Added: incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/runtime/ClassMethods.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/runtime/ClassMethods.java?rev=419720&view=auto
==============================================================================
--- incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/runtime/ClassMethods.java (added)
+++ incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/runtime/ClassMethods.java Thu Jul 6 15:08:30 2006
@@ -0,0 +1,72 @@
+package com.rc.retroweaver.runtime;
+
+/**
+ * Replacements for methods added to java.lang.Class in Java 1.5.
+ */
+public final class ClassMethods {
+
+ /**
+ * Replacement for Class.asSubclass(Class).
+ *
+ * @param c a Class
+ * @param superclass another Class which must be a superclass of <i>c</i>
+ * @return <i>c</i>
+ * @throws java.lang.ClassCastException if <i>c</i> is
+ */
+ public static Class asSubclass(Class<?> c, Class<?> superclass) {
+ if (!superclass.isAssignableFrom(c)) {
+ throw new ClassCastException(superclass.getName());
+ }
+ return c;
+ }
+
+ /**
+ * Replacement for Class.cast(Object). Throws a ClassCastException if <i>obj</i>
+ * is not an instance of class <var>c</var>, or a subtype of <var>c</var>.
+ *
+ * @param c Class we want to cast <var>obj</var> to
+ * @param object object we want to cast
+ * @return The object, or <code>null</code> if the object is
+ * <code>null</code>.
+ * @throws java.lang.ClassCastException if <var>obj</var> is not
+ * <code>null</code> or an instance of <var>c</var>
+ */
+ public static Object cast(Class c, Object object) {
+ if (object == null || c.isInstance(object)) {
+ return object;
+ } else {
+ throw new ClassCastException(c.getName());
+ }
+ }
+
+ /**
+ * Replacement for Class.isEnum().
+ *
+ * @param class_ class we want to test.
+ * @return true if the class was declared as an Enum.
+ */
+ public static <T> boolean isEnum(Class<T> class_) {
+ Class c = class_.getSuperclass();
+
+ if (c == null) {
+ return false;
+ }
+
+ return Enum_.class.isAssignableFrom(c);
+ }
+
+ /**
+ * Replacement for Class.getEnumConstants().
+ *
+ * @param class_ class we want to get Enum constants for.
+ * @return The elements of this enum class or null if this does not represent an enum type.
+ */
+ public static <T> T[] getEnumConstants(Class<T> class_) {
+ if (!isEnum(class_)) {
+ return null;
+ }
+
+ return Enum_.getEnumValues(class_).clone();
+ }
+
+}
Added: incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/runtime/Enum_.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/runtime/Enum_.java?rev=419720&view=auto
==============================================================================
--- incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/runtime/Enum_.java (added)
+++ incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/runtime/Enum_.java Thu Jul 6 15:08:30 2006
@@ -0,0 +1,156 @@
+package com.rc.retroweaver.runtime;
+
+import java.io.InvalidObjectException;
+import java.io.ObjectStreamException;
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * A version of the 1.5 java.lang.Enum class for the 1.4 VM.
+ */
+public class Enum_<E extends Enum_<E>> implements Comparable<E>, Serializable {
+
+ private final transient int ordinal;
+
+ private final String name;
+
+ private static final Map<Class, Object[]> enumValues = new HashMap<Class, Object[]>();
+
+ protected Enum_(String name, int ordinal) {
+ this.name = name;
+ this.ordinal = ordinal;
+ }
+
+ protected static final void setEnumValues(Object[] values, Class c) {
+ synchronized(enumValues) {
+ enumValues.put(c, values);
+ }
+ }
+
+ protected static final <T> T[] getEnumValues(Class<T> class_) {
+ synchronized(enumValues) {
+ T[] values = (T[]) enumValues.get(class_);
+ if (values != null)
+ return values;
+ }
+
+ if (!class_.isEnum())
+ return null;
+
+ // force initialization of class_ as
+ // class loader may not have called static initializers yet
+ try {
+ Class.forName(class_.getName(), true, class_.getClassLoader());
+ } catch (ClassNotFoundException e) {
+ // can not happen: class_ has already been resolved.
+ }
+
+ synchronized(enumValues) {
+ return (T[]) enumValues.get(class_);
+ }
+ }
+
+ /**
+ * Implement serialization so we can get the singleton behavior we're
+ * looking for in enums.
+ */
+ protected Object readResolve() throws ObjectStreamException {
+ /*
+ * The implementation is based on "Java Object Serialization Specification",
+ * revision 1.5.0:
+ *
+ * only the name is saved, serialVersionUID is 0L for all enum types
+ * InvalidObjectException is raised if valueOf() raises IllegalArgumentException.
+ *
+ */
+
+ Class<E> c = getDeclaringClass();
+ /*
+ * Note: getClass() would not work for enum inner classes
+ * such as CMYK.Cyan in the test suite.
+ */
+ try {
+ return valueOf(c, name);
+ } catch (IllegalArgumentException iae) {
+ InvalidObjectException ioe = new InvalidObjectException(name + " is not a valid enum for " + c.getName());
+ try {
+ ioe.initCause(iae);
+ } catch (NoSuchMethodError nsm) {
+ // cause should be set according to the spec but it's only available in 1.4
+ }
+
+ throw ioe;
+ }
+ }
+
+ public static <T extends Enum_<T>> T valueOf(Class<T> enumType, String name) {
+
+ if (enumType == null) {
+ throw new NullPointerException("enumType is null");
+ }
+
+ if (name == null) {
+ throw new NullPointerException("name is null");
+ }
+
+ T[] enums = getEnumValues(enumType);
+
+ if (enums != null) {
+ for (T enum_ : enums) {
+ if (enum_.name.equals(name)) {
+ return enum_;
+ }
+ }
+ }
+
+ throw new IllegalArgumentException("No enum const " + enumType + "."
+ + name);
+ }
+
+ public final boolean equals(Object other) {
+ return other == this;
+ }
+
+ public final int hashCode() {
+ return System.identityHashCode(this);
+ }
+
+ public String toString() {
+ return name;
+ }
+
+ public final int compareTo(E e) {
+ Class c1 = getDeclaringClass();
+ Class c2 = e.getDeclaringClass();
+
+ if (c1 == c2) {
+ return ordinal - e.ordinal;
+ }
+
+ throw new ClassCastException();
+ }
+
+ protected final Object clone() throws CloneNotSupportedException {
+ throw new CloneNotSupportedException();
+ }
+
+ public final String name() {
+ return name;
+ }
+
+ public final int ordinal() {
+ return ordinal;
+ }
+
+ public final Class<E> getDeclaringClass() {
+ Class clazz = getClass();
+ Class superClass = clazz.getSuperclass();
+ if (superClass != Enum_.class) {
+ return superClass;
+ } else {
+ return clazz;
+ }
+ }
+
+}
Added: incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/runtime/IterableMethods.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/runtime/IterableMethods.java?rev=419720&view=auto
==============================================================================
--- incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/runtime/IterableMethods.java (added)
+++ incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/runtime/IterableMethods.java Thu Jul 6 15:08:30 2006
@@ -0,0 +1,53 @@
+package com.rc.retroweaver.runtime;
+
+import java.lang.reflect.Method;
+import java.util.Collection;
+import java.util.Iterator;
+
+/**
+ * Replacements for methods added to java.lang.Iterable in Java 1.5, used
+ * for targets of the "foreach" statement.
+ */
+public final class IterableMethods {
+
+ private IterableMethods() {
+ }
+
+ /**
+ * Returns an iterator for <code>iterable</code>.
+ *
+ * @param iterable the object to get the Iterator from
+ * @return an Iterator.
+ * @throws UnsupportedOperationException if an iterator method can not be found.
+ * @throws NullPointerException if <code>iterable</code> is null.
+ */
+ public static Iterator iterator(Object iterable) {
+ if (iterable == null) {
+ throw new NullPointerException();
+ }
+
+ if (iterable instanceof Collection) {
+ // core jdk classes implementing Iterable: they are not weaved but,
+ // at least in 1.5, they all implement Collection and as its iterator
+ // method exits in pre 1.5 jdks, a valid Iterator can be returned.
+ return ((Collection) iterable).iterator();
+ }
+
+ if (iterable instanceof Iterable_) {
+ // weaved classes inheriting from Iterable
+ return ((Iterable_) iterable).iterator();
+ }
+
+ // for future jdk Iterable classes not inheriting from Collection
+ // use reflection to try to get the iterator if it was present pre 1.5
+ try {
+ Method m = iterable.getClass().getMethod("iterator", (Class[]) null);
+ if (m != null)
+ return (Iterator) m.invoke(iterable, (Object[]) null);
+ } catch (Exception ignored) {
+ }
+
+ throw new UnsupportedOperationException("iterator call on " + iterable.getClass());
+ }
+
+}
Added: incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/runtime/Iterable_.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/runtime/Iterable_.java?rev=419720&view=auto
==============================================================================
--- incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/runtime/Iterable_.java (added)
+++ incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/runtime/Iterable_.java Thu Jul 6 15:08:30 2006
@@ -0,0 +1,10 @@
+package com.rc.retroweaver.runtime;
+
+import java.util.Iterator;
+
+/**
+ * A version of the 1.5 java.lang.Iterable class for the 1.4 VM.
+ */
+public interface Iterable_<E> {
+ Iterator<E> iterator();
+}
Added: incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/tests/AbstractTest.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/tests/AbstractTest.java?rev=419720&view=auto
==============================================================================
--- incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/tests/AbstractTest.java (added)
+++ incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/tests/AbstractTest.java Thu Jul 6 15:08:30 2006
@@ -0,0 +1,23 @@
+package com.rc.retroweaver.tests;
+
+import junit.framework.TestCase;
+
+public abstract class AbstractTest extends TestCase {
+
+ public void success() {
+ }
+
+ public void success(String msg) {
+ }
+
+ public void assertArraySameItems(String msg, Object[] a1, Object[] a2) {
+ if (a1 == null)
+ assertNull(msg, a2);
+ else if (a2 == null || a1.length != a2.length)
+ fail(msg);
+ else {
+ for (int i = 0; i < a1.length; i++)
+ assertSame(msg, a1[i], a2[i]);
+ }
+ }
+}
Added: incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/tests/AppendableTest.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/tests/AppendableTest.java?rev=419720&view=auto
==============================================================================
--- incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/tests/AppendableTest.java (added)
+++ incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/tests/AppendableTest.java Thu Jul 6 15:08:30 2006
@@ -0,0 +1,30 @@
+package com.rc.retroweaver.tests;
+
+public class AppendableTest extends AbstractTest {
+
+ public void testAppendable() {
+ try {
+ // Should generate a warning - implementing interface from 1.5
+ class Ap implements Appendable {
+ public Appendable append(char c) {
+ return null;
+ }
+
+ public Appendable append(CharSequence csq) {
+ return null;
+ }
+
+ public Appendable append(CharSequence csq, int start, int end) {
+ return null;
+ }
+ }
+
+ new Ap();
+
+ fail("testAppendable should raise a NoClassDefFoundError");
+ } catch (NoClassDefFoundError e) {
+ success("testAppendable");
+ }
+ }
+
+}
Added: incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/tests/AutoboxTest.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/tests/AutoboxTest.java?rev=419720&view=auto
==============================================================================
--- incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/tests/AutoboxTest.java (added)
+++ incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/tests/AutoboxTest.java Thu Jul 6 15:08:30 2006
@@ -0,0 +1,100 @@
+package com.rc.retroweaver.tests;
+
+/**
+ * Ensures that Retroweaver performs autoboxing conversions
+ */
+
+public class AutoboxTest extends AbstractTest {
+
+ public void testByte() {
+ Byte b;
+ b = -3;
+ assertEquals("ByteSmall", b.byteValue(), (byte) -3);
+ b = 3;
+ assertEquals("ByteSmall", b.byteValue(), (byte) 3);
+ }
+
+ public void testBoolean() {
+ Boolean bool;
+ bool = true;
+ assertTrue("BooleanTrue", bool.booleanValue());
+ bool = false;
+ assertFalse("BooleanFalse", bool.booleanValue());
+ }
+
+ public void testCharacter() {
+ Character c;
+ c = 'a';
+ assertEquals("CharacterSmall", c.charValue(), 'a');
+ c = '\u1000';
+ assertEquals("CharacterLarge", c.charValue(), '\u1000');
+ }
+
+ public void testShort() {
+ Short s;
+ s = -3;
+ assertEquals("ShortSmall", s.shortValue(), (short) -3);
+ s = 3;
+ assertEquals("ShortSmall", s.shortValue(), (short) 3);
+ s = 3000;
+ assertEquals("ShortLarge", s.shortValue(), (short) 3000);
+ }
+
+ public void testInteger() {
+ Integer i;
+ i = -3;
+ assertEquals("IntegerSmall", i.intValue(), -3);
+ i = 3;
+ assertEquals("IntegerSmall", i.intValue(), 3);
+ i = 3000;
+ assertEquals("IntegerLarge", i.intValue(), 3000);
+ }
+
+ public void testLong() {
+ Long l;
+ l = -3L;
+ assertEquals("Long", l.longValue(), -3L);
+ l = 3L;
+ assertEquals("Long", l.longValue(), 3L);
+ }
+
+ public void testFloat() {
+ Float f;
+ f = -3.2f;
+ assertEquals("Float", f.floatValue(), -3.2f);
+ f = 3.2f;
+ assertEquals("Float", f.floatValue(), 3.2f);
+ f = Float.NaN;
+ assertTrue("Float NaN", f.isNaN());
+ }
+
+ public void testDouble() {
+ Double d;
+ d = -3.2d;
+ assertEquals("Double", d.doubleValue(), -3.2d);
+ d = 3.2d;
+ assertEquals("Double", d.doubleValue(), 3.2d);
+ d = Double.NaN;
+ assertTrue("Double NaN", d.isNaN());
+ }
+
+ public void testIdentity() {
+ // tests cached values from lookup tables:
+ // check that same object is returned
+ Boolean b1, b2;
+ b1 = false; b2 = false; assertSame("Boolean", b1, b2);
+ b1 = true; b2 = true; assertSame("Boolean", b1, b2);
+
+ Byte byte1, byte2;
+ byte1 = 1; byte2 = 1; assertSame("Byte", byte1, byte2);
+
+ Character c1, c2;
+ c1 = 'c'; c2 = 'c'; assertSame("Character", c1, c2);
+
+ Short s1, s2;
+ s1 = 1; s2 = 1; assertSame("Short", s1, s2);
+
+ Integer i1, i2;
+ i1 = 1; i2 = 1; assertSame("Integer", i1, i2);
+ }
+}
Added: incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/tests/BigDecimalTest.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/tests/BigDecimalTest.java?rev=419720&view=auto
==============================================================================
--- incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/tests/BigDecimalTest.java (added)
+++ incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/tests/BigDecimalTest.java Thu Jul 6 15:08:30 2006
@@ -0,0 +1,23 @@
+package com.rc.retroweaver.tests;
+
+import java.math.BigDecimal;
+
+public class BigDecimalTest extends AbstractTest {
+
+ public void testInt() {
+ int i = Integer.MAX_VALUE;
+
+ BigDecimal bd = new BigDecimal(i);
+
+ assertEquals("testInt", bd.toString(), Integer.toString(i));
+ }
+
+ public void testLong() {
+ long l = Long.MAX_VALUE;
+
+ BigDecimal bd = new BigDecimal(l);
+
+ assertEquals("testLong", bd.toString(), Long.toString(l));
+ }
+
+}
Added: incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/tests/ClassLiteralTest.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/tests/ClassLiteralTest.java?rev=419720&view=auto
==============================================================================
--- incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/tests/ClassLiteralTest.java (added)
+++ incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/tests/ClassLiteralTest.java Thu Jul 6 15:08:30 2006
@@ -0,0 +1,70 @@
+package com.rc.retroweaver.tests;
+
+/**
+ * Ensures that Retroweaver translates LDC/LDC_W instructions for class literals
+ * correctly.
+ */
+
+public class ClassLiteralTest extends AbstractTest {
+
+ public void testClassLiteral() {
+ String name = ClassLiteralTest.class.getName();
+ assertEquals("testClassLiteral1", name,
+ "com.rc.retroweaver.tests.ClassLiteralTest");
+
+ name = String.class.getName();
+ assertEquals("testClassLiteral2", name, "java.lang.String");
+ }
+
+ public void testArrays() {
+ String name = ClassLiteralTest[].class.getName();
+ assertEquals("ClassLiteralTestArray", name,
+ "[Lcom.rc.retroweaver.tests.ClassLiteralTest;");
+ name = ClassLiteralTest[][].class.getName();
+ assertEquals("ClassLiteralTestArray2", name,
+ "[[Lcom.rc.retroweaver.tests.ClassLiteralTest;");
+
+ name = int[].class.getName();
+ assertEquals("intArray", name, "[I");
+ }
+
+ public void testInterface() {
+ Class clazz1 = String.class;
+ Class clazz2 = Integer.class;
+
+ assertEquals("testInterface class 1", clazz1, ClassLiteralTest1.clazz1);
+ assertEquals("testInterface class 2", clazz2, ClassLiteralTest1.clazz2);
+
+ assertEquals("testInterface interface 1", clazz1, ClassLiteralTest2.clazz1);
+ assertEquals("testInterface interface 2", clazz2, ClassLiteralTest2.clazz2);
+ }
+
+ public void testRetroweaverRuntime() {
+ assertTrue("testRetroweaverRuntime Enum", Enum.class.isAssignableFrom(LetterEnum.class));
+
+ assertEquals("testRetroweaverRuntime StringBuilder", StringBuilder.class, new StringBuilder().getClass());
+ }
+
+ public void testMissingClass() {
+ try {
+ Class clazz = MissingClass.class;
+ fail("Class should not be defined: " + clazz.getName());
+ } catch (NoClassDefFoundError e) {
+ success("testMissingClass");
+ }
+ }
+}
+
+class MissingClass {
+ // make sure class is not part of the weaved classes
+}
+
+class ClassLiteralTest1 {
+ static Class clazz1 = String.class;
+ static Class clazz2 = Integer.class;
+}
+
+interface ClassLiteralTest2 {
+ Class clazz1 = String.class;
+ Class clazz2 = Integer.class;
+}
Added: incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/tests/ClassMethodsTest.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/tests/ClassMethodsTest.java?rev=419720&view=auto
==============================================================================
--- incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/tests/ClassMethodsTest.java (added)
+++ incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/tests/ClassMethodsTest.java Thu Jul 6 15:08:30 2006
@@ -0,0 +1,76 @@
+package com.rc.retroweaver.tests;
+
+/**
+ * Test that calls to 1.5-only Class methods work correctly. Only a subset of
+ * these are actually handled!
+ */
+
+public class ClassMethodsTest extends AbstractTest {
+
+ public void testCast() {
+ Object obj = mystery();
+ assertEquals("testCast", B.class.cast(obj).f(), "B");
+ }
+
+ public void testInvalidCast() {
+ Object obj2 = mystery2();
+ try {
+ B.class.cast(obj2).f();
+ fail("testInvalidCast should raise a ClassCastException");
+ } catch (ClassCastException e) {
+ success("testInvalidCast");
+ }
+ }
+
+ public void testAsSubclass() throws Exception {
+ Class<? extends A> bAsA = getBAsA();
+ Class<? extends B> b = bAsA.asSubclass(B.class);
+
+ B bInstance = b.newInstance();
+ assertEquals("testAsSubclass", bInstance.f(), "B");
+
+ }
+
+ public void testInvalidAsSubclass() {
+ Class<? extends A> cAsA = getCAsA();
+ try {
+ cAsA.asSubclass(B.class);
+ fail("testInvalidAsSubclass should raise a ClassCastException");
+ } catch (ClassCastException e) {
+ success("testInvalidAsSubclass");
+ }
+ }
+
+ static abstract class A {
+ public abstract String f();
+ }
+
+ static class B extends A {
+ public String f() {
+ return "B";
+ }
+ }
+
+ static class C extends A {
+ public String f() {
+ return "C";
+ }
+ }
+
+ public Object mystery() {
+ return new B();
+ }
+
+ public Object mystery2() {
+ return new C();
+ }
+
+ public Class<? extends A> getBAsA() {
+ return B.class;
+ }
+
+ public Class<? extends A> getCAsA() {
+ return C.class;
+ }
+
+}
Added: incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/tests/CollectionsTest.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/tests/CollectionsTest.java?rev=419720&view=auto
==============================================================================
--- incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/tests/CollectionsTest.java (added)
+++ incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/tests/CollectionsTest.java Thu Jul 6 15:08:30 2006
@@ -0,0 +1,23 @@
+package com.rc.retroweaver.tests;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+public class CollectionsTest extends AbstractTest {
+
+ public void testEmptyList() {
+ List<Object> l = Collections.emptyList();
+ // replaced with Collections.EMPTY_LIST
+
+ assertEquals("testEmptyList", l.size(), 0);
+ }
+
+ public void testEmptySet() {
+ Set<Object> s = Collections.emptySet();
+ // replaced with Collections.EMPTY_SET
+
+ assertEquals("testEmptySet", s.size(), 0);
+ }
+
+}
Added: incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/tests/ConcurrentTest.java
URL: http://svn.apache.org/viewvc/incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/tests/ConcurrentTest.java?rev=419720&view=auto
==============================================================================
--- incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/tests/ConcurrentTest.java (added)
+++ incubator/abdera/java/trunk/build/tools/retroweaver/src/com/rc/retroweaver/tests/ConcurrentTest.java Thu Jul 6 15:08:30 2006
@@ -0,0 +1,28 @@
+package com.rc.retroweaver.tests;
+
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class ConcurrentTest extends AbstractTest {
+
+ public void testConcurrent() {
+ // Should not generate a warning
+ ConcurrentHashMap map = new ConcurrentHashMap();
+
+ assertNotNull("testConcurrent", map);
+ }
+
+ public void testConcurrentClassLiteral() {
+ ConcurrentHashMap map = new ConcurrentHashMap();
+ assertEquals("testConcurrentClassLiteral ConcurrentHashMap", ConcurrentHashMap.class, map.getClass());
+ }
+
+ public void testException() {
+ try {
+ throw new CancellationException();
+ } catch (CancellationException e) {
+ assertNotNull("testException", e);
+ }
+ }
+
+}