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_);
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));
15 String s = coerceToString();
16 int slength = s.length();
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;
26 if (a > b) { int tmp = a; a = b; b = tmp; }
27 return JS.S(s.substring(a,b));
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;
35 if (len > slength - start) len = slength - start;
36 if (len <= 0) return JS.S("");
37 return JS.S(s.substring(start,start+len));
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));
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));
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());
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));
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));
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());
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;
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));
85 return super.callMethod(method_,arg0,arg1,arg2,rest,alength);
88 public JS get(JS key_) throws JSExn {
89 if(!JS.isString(key_)) return super.get(key_);
90 String key = JS.toString(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;
112 return super.get(key_);