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.
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));
16 String s = coerceToString();
17 int slength = s.length();
19 //#switch(JS.toString(method))
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;
27 if (a > b) { int tmp = a; a = b; b = tmp; }
28 return JS.S(s.substring(a,b));
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;
36 if (len > slength - start) len = slength - start;
37 if (len <= 0) return JS.S("");
38 return JS.S(s.substring(start,start+len));
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));
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));
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());
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));
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));
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());
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;
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));
86 return super.callMethod(method,arg0,arg1,arg2,rest,alength);
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;
111 return super.get(key);