root/trunk/ProjectFortress/src/com/sun/fortress/compiler/nativeInterface/FortressMethodAdapter.java @ 3290

Revision 3290, 4.4 KB (checked in by chf, 11 months ago)

preliminary native code wrapping

Line 
1/*******************************************************************************
2  Copyright 2009 Sun Microsystems, Inc.,
3  4150 Network Circle, Santa Clara, California 95054, U.S.A.
4  All rights reserved.
5
6  U.S. Government Rights - Commercial software.
7  Government users are subject to the Sun Microsystems, Inc. standard
8  license agreement and applicable provisions of the FAR and its supplements.
9
10  Use is subject to license terms.
11
12  This distribution may include materials developed by third parties.
13
14  Sun, Sun Microsystems, the Sun logo and Java are trademarks or registered
15  trademarks of Sun Microsystems, Inc. in the U.S. and other countries.
16******************************************************************************/
17
18package com.sun.fortress.compiler.nativeInterface;
19import java.util.*;
20
21import org.objectweb.asm.*;
22
23import com.sun.fortress.interpreter.evaluator.values.FString;
24import com.sun.fortress.interpreter.evaluator.values.FInt;
25import com.sun.fortress.interpreter.evaluator.values.FLong;
26
27
28public class FortressMethodAdapter extends ClassAdapter {
29
30    String className = "temp";
31    private final String prefix = "com/sun/fortress/interpreter/evaluator/values/";
32
33    public FortressMethodAdapter(ClassVisitor cv) {
34        super(cv);
35    }
36
37    public void visit(int version, int access, String name, String signature,
38                      String superName, String[] interfaces) {
39        cv.visit(version, access, name, signature, superName, interfaces);
40        className = name;
41    }
42
43    public MethodVisitor visitMethod(int access,
44                                     String name, String desc,
45                                     String signature, String[] exceptions) {
46        if (!name.equals("<init>")) {
47            generateNewBody(access, desc, signature, exceptions, name, name);
48        }
49        return super.visitMethod(access, name, desc, signature, exceptions);
50    }
51
52    private void generateNewBody(int access,
53                                 String desc, String signature,
54                                 String[] exceptions,
55                                 String name, String newName) {
56
57        SignatureParser sp = new SignatureParser(desc);
58        MethodVisitor mv = cv.visitMethod(access, name,
59                                          sp.getFortressifiedSignature(),
60                                          signature, exceptions);
61        mv.visitCode();
62        Label l0 = new Label();
63        mv.visitLabel(l0);
64        int count = 0;
65        List<String> args = sp.getFortressArguments();
66        for (String s : args) {
67            mv.visitVarInsn(Opcodes.ALOAD, count++);
68            if (s.equals("L" + prefix + "FString;")) {
69                mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, prefix + "FString", "toString",
70                                   "()Ljava/lang/String;");
71            } else if (s.equals("L" + prefix + "FLong")) {
72                mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, prefix + "FLong", "toLong",
73                                   "()J");
74            } else if (s.equals("L" + prefix + "FInt;")) {
75                mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, prefix + "FInt", "toInt",
76                                   "()I");
77            }
78        }
79        mv.visitMethodInsn(Opcodes.INVOKESTATIC,
80                           className,
81                           name,
82                           sp.getSignature());
83
84        //     mv.visitVarInsn(Opcodes.LSTORE, count);
85        if (sp.getFortressResult().equals("L" + prefix + "FString;"))
86            mv.visitMethodInsn(Opcodes.INVOKESPECIAL, prefix + "FString",
87                               "<init>", "(Ljava/lang/String;)LFString;");
88        else if (sp.getFortressResult().equals("L" + prefix + "FLong;"))
89            mv.visitMethodInsn(Opcodes.INVOKESPECIAL, prefix + "FLong",
90                               "<init>", "(J)LFLong;");
91        else if (sp.getFortressResult().equals("L" + prefix + "FInt;"))
92            mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "FInt",
93                               "<init>", "(I)LFInt;");
94        else if (sp.getFortressResult().equals("L" + prefix + "FVoid;")) {
95            mv.visitFieldInsn(Opcodes.GETSTATIC, prefix + "FVoid",
96                              "V", "L" + prefix + "FVoid;");
97        }
98        mv.visitInsn(Opcodes.ARETURN);
99        mv.visitMaxs(2,1);
100        mv.visitEnd();
101    }
102
103    public void visitEnd() {
104        super.visitEnd();
105    }
106}
Note: See TracBrowser for help on using the browser.