licensing update to APSL 2.0
[org.ibex.js.git] / src / org / ibex / js / JSPrimitive.java
1 // Copyright 2000-2005 the Contributors, as shown in the revision logs.
2 // Licensed under the Apache Public Source License 2.0 ("the License").
3 // You may not use this file except in compliance with the License.
4
5 package org.ibex.js;
6
7 class JSPrimitive extends JS {
8     public JS callMethod(JS method, JS arg0, JS arg1, JS arg2, JS[] rest, int alength) throws JSExn {
9         //#switch(JS.toString(method))
10         case "toFixed": throw new JSExn("toFixed() not implemented");
11         case "toExponential": throw new JSExn("toExponential() not implemented");
12         case "toPrecision": throw new JSExn("toPrecision() not implemented");
13         case "toString": return this instanceof JSString ? this : JS.S(JS.toString(this));
14         //#end
15             
16         String s = coerceToString();
17         int slength = s.length();
18             
19         //#switch(JS.toString(method))
20         case "substring": {
21             int a = alength >= 1 ? JS.toInt(arg0) : 0;
22             int b = alength >= 2 ? JS.toInt(arg1) : slength;
23             if (a > slength) a = slength;
24             if (b > slength) b = slength;
25             if (a < 0) a = 0;
26             if (b < 0) b = 0;
27             if (a > b) { int tmp = a; a = b; b = tmp; }
28             return JS.S(s.substring(a,b));
29         }
30         case "substr": {
31             int start = alength >= 1 ? JS.toInt(arg0) : 0;
32             int len = alength >= 2 ? JS.toInt(arg1) : Integer.MAX_VALUE;
33             if (start < 0) start = slength + start;
34             if (start < 0) start = 0;
35             if (len < 0) len = 0;
36             if (len > slength - start) len = slength - start;
37             if (len <= 0) return JS.S("");
38             return JS.S(s.substring(start,start+len));
39         }
40         case "charAt": {
41             int p = alength >= 1 ? JS.toInt(arg0) : 0;
42             if (p < 0 || p >= slength) return JS.S("");
43             return JS.S(s.substring(p,p+1));
44         }
45         case "charCodeAt": {
46             int p = alength >= 1 ? JS.toInt(arg0) : 0;
47             if (p < 0 || p >= slength) return JS.N(Double.NaN);
48             return JS.N(s.charAt(p));
49         }
50         case "concat": {
51             StringBuffer sb = new StringBuffer(slength*2).append(s);
52             for(int i=0;i<alength;i++) sb.append(i==0?arg0:i==1?arg1:i==2?arg2:rest[i-3]);
53             return JS.S(sb.toString());
54         }
55         case "indexOf": {
56             String search = alength >= 1 ? JS.toString(arg0) : "null";
57             int start = alength >= 2 ? JS.toInt(arg1) : 0;
58             // Java's indexOf handles an out of bounds start index, it'll return -1
59             return JS.N(s.indexOf(search,start));
60         }
61         case "lastIndexOf": {
62             String search = alength >= 1 ? JS.toString(arg0) : "null";
63             int start = alength >= 2 ? JS.toInt(arg1) : 0;
64             // Java's indexOf handles an out of bounds start index, it'll return -1
65             return JS.N(s.lastIndexOf(search,start));            
66         }
67         case "match": return JSRegexp.stringMatch(this,arg0);
68         case "replace": return JSRegexp.stringReplace(this,arg0,arg1);
69         case "search": return JSRegexp.stringSearch(this,arg0);
70         case "split": return JSRegexp.stringSplit(this,arg0,arg1,alength);
71         case "toLowerCase": return JS.S(s.toLowerCase());
72         case "toUpperCase": return JS.S(s.toUpperCase());
73         case "slice": {
74             int a = alength >= 1 ? JS.toInt(arg0) : 0;
75             int b = alength >= 2 ? JS.toInt(arg1) : slength;
76             if (a < 0) a = slength + a;
77             if (b < 0) b = slength + b;
78             if (a < 0) a = 0;
79             if (b < 0) b = 0;
80             if (a > slength) a = slength;
81             if (b > slength) b = slength;
82             if (a > b) return JS.S("");
83             return JS.S(s.substring(a,b));
84         }
85         //#end
86         return super.callMethod(method,arg0,arg1,arg2,rest,alength);
87     }
88     
89     public JS get(JS key) throws JSExn {
90         //#switch(JS.toString(key))
91         case "length": return JS.N(JS.toString(this).length());
92         case "substring": return METHOD;
93         case "charAt": return METHOD;
94         case "charCodeAt": return METHOD;
95         case "concat": return METHOD;
96         case "indexOf": return METHOD;
97         case "lastIndexOf": return METHOD; 
98         case "match": return METHOD;
99         case "replace": return METHOD;
100         case "search": return METHOD;
101         case "slice": return METHOD;
102         case "split": return METHOD;
103         case "toLowerCase": return METHOD; 
104         case "toUpperCase": return METHOD; 
105         case "toString": return METHOD; 
106         case "substr": return METHOD;  
107         case "toPrecision": return METHOD;
108         case "toExponential": return METHOD;
109         case "toFixed": return METHOD;
110         //#end
111         return super.get(key);
112     }
113 }