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