3 class JSPrimitive extends JS {
4 public JS callMethod(JS method, JS arg0, JS arg1, JS arg2, JS[] rest, int alength) throws JSExn {
5 //#switch(JS.toString(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));
12 String s = coerceToString();
13 int slength = s.length();
15 //#switch(JS.toString(method))
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;
23 if (a > b) { int tmp = a; a = b; b = tmp; }
24 return JS.S(s.substring(a,b));
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;
32 if (len > slength - start) len = slength - start;
33 if (len <= 0) return JS.S("");
34 return JS.S(s.substring(start,start+len));
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));
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));
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());
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));
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));
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());
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;
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));
82 return super.callMethod(method,arg0,arg1,arg2,rest,alength);
85 public JS get(JS key) throws JSExn {
86 //#switch(JS.toString(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;
107 return super.get(key);