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

Revision 3290, 5.1 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******************************************************************************/
17package com.sun.fortress.compiler.nativeInterface;
18
19import com.sun.fortress.interpreter.evaluator.values.FString;
20import com.sun.fortress.interpreter.evaluator.values.FInt;
21import com.sun.fortress.interpreter.evaluator.values.FLong;
22import com.sun.fortress.interpreter.evaluator.values.FChar;
23import com.sun.fortress.interpreter.evaluator.values.FFloat;
24import com.sun.fortress.interpreter.evaluator.values.FBool;
25
26/* This only handles some base types and strings.  We need to beef it up. */
27import java.util.ArrayList;
28import java.util.List;
29import java.util.Iterator;
30import java.util.NoSuchElementException;
31
32public class SignatureParser {
33    private List<String> arguments;
34    private List<String> fortressArguments;
35    private String result;
36    private String fortressResult;
37    private String signature;
38
39    private final String prefix = "com/sun/fortress/interpreter/evaluator/values/";
40
41       
42    // For now only one dimensional arrays
43    SignatureParser(String s) {
44        arguments = new ArrayList<String>();
45        fortressArguments = new ArrayList<String>();
46        signature = s;
47
48        if (s.charAt(0) != '(') error(s);
49        int index = 1;
50        int ch = s.charAt(index);
51
52        while (ch != ')') {
53            switch(ch) {
54            case 'B': error(s);
55            case 'S': error(s);
56            case '[': error(s);
57            case 'D': error(s);
58            case 'C':
59                arguments.add("C");
60                fortressArguments.add("L" + prefix + "FChar;");   
61                index++; break;
62            case 'F':
63                arguments.add("F");
64                fortressArguments.add("L" + prefix + "FFloat;"); 
65                index++;
66                break;
67            case 'I':
68                arguments.add("I");
69                fortressArguments.add("L" + prefix + "FInt;");   
70                index++;
71                break;
72            case 'J':
73                arguments.add("J");
74                fortressArguments.add("L" + prefix + "FLong;");   
75                index++;
76                break;
77            case 'Z':
78                arguments.add("Z");
79                fortressArguments.add("L" + prefix + "FBool;");
80                index++;
81                break;
82            case 'L':
83                int end = s.indexOf(';', index) + 1;
84                String javaType = s.substring(index, end);
85                arguments.add(javaType);
86                if (javaType.equals("Ljava/lang/String;")) {
87                    fortressArguments.add("L" + prefix + "FString;");
88                    index = end;
89                } else {
90                    error(s);
91                }
92                break;
93            default: error(s);
94            }
95            ch = s.charAt(index);
96        }
97
98        index++;
99        ch = s.charAt(index);
100
101        switch(ch) {
102        case 'B': error(s);
103        case 'S': error(s);
104        case '[': error(s);
105        case 'D': error(s);
106        case 'V': result = "V"; fortressResult = "L" + prefix + "FVoid;";    break;
107        case 'C': result = "C"; fortressResult = "L" + prefix + "FChar;";    break;
108        case 'F': result = "F"; fortressResult = "L" + prefix + "FFloat;";   break;
109        case 'I': result = "I"; fortressResult = "L" + prefix + "FInt;";     break;
110        case 'J': result = "J"; fortressResult = "L" + prefix + "FLong;";    break;
111        case 'Z': result = "Z"; fortressResult = "L" + prefix + "FBool;";    break;
112        case 'L':
113            int end = s.indexOf(';', index ) + 1;
114            String javaType = s.substring(index, end);
115            result = javaType;
116            if (javaType.equals("Ljava/lang/String;")) {
117                fortressResult = "L" + prefix + "FString;";
118            } else {
119                error(s);
120            }
121            break;
122        default: error(s);
123        }
124    }
125
126    List<String> getArguments() { return arguments;}
127    List<String> getFortressArguments() { return fortressArguments;}
128    String getResult() {return result;}
129    String getFortressResult() {return fortressResult;}
130
131    String getFortressifiedSignature() {
132        String result = "(";
133        // Don't forget the commas"
134        for (String s : fortressArguments)
135            result = result + s;
136        result = result + ")" + fortressResult;
137        return result;
138    }
139       
140    String getSignature() {
141        return signature;
142    }
143
144    void error(String s) {throw new RuntimeException("Bad Signature " + s);}
145
146}
Note: See TracBrowser for help on using the browser.