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