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.Immutable {
8 private static final JS.Method METHOD = new JS.Method();
10 public JS call(JS method, JS[] args) throws JSExn {
11 String s = coerceToString();
12 int slength = s.length();
14 //#switch(JSU.str(method))
15 case "toFixed": throw new JSExn("toFixed() not implemented");
16 case "toExponential": throw new JSExn("toExponential() not implemented");
17 case "toPrecision": throw new JSExn("toPrecision() not implemented");
18 case "toString": return this instanceof JSString ? this : JSU.S(JSU.toString(this));
20 int a = args.length >= 1 ? JSU.toInt(args[0]) : 0;
21 int b = args.length >= 2 ? JSU.toInt(args[1]) : 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 JSU.S(s.substring(a,b));
30 int start = args.length >= 1 ? JSU.toInt(args[0]) : 0;
31 int len = args.length >= 2 ? JSU.toInt(args[1]) : 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 JSU.S("");
37 return JSU.S(s.substring(start,start+len));
40 int p = args.length >= 1 ? JSU.toInt(args[0]) : 0;
41 if (p < 0 || p >= slength) return JSU.S("");
42 return JSU.S(s.substring(p,p+1));
45 int p = args.length >= 1 ? JSU.toInt(args[0]) : 0;
46 if (p < 0 || p >= slength) return JSU.N(Double.NaN);
47 return JSU.N(s.charAt(p));
50 StringBuffer sb = new StringBuffer(slength*2).append(s);
51 for (int i=0; i < args.length; i++) sb.append(args[i]);
52 return JSU.S(sb.toString());
55 String search = args.length >= 1 ? JSU.toString(args[0]) : "null";
56 int start = args.length >= 2 ? JSU.toInt(args[1]) : 0;
57 // Java's indexOf handles an out of bounds start index, it'll return -1
58 return JSU.N(s.indexOf(search,start));
61 String search = args.length >= 1 ? JSU.toString(args[0]) : "null";
62 int start = args.length >= 2 ? JSU.toInt(args[1]) : 0;
63 // Java's indexOf handles an out of bounds start index, it'll return -1
64 return JSU.N(s.lastIndexOf(search,start));
66 case "match": return JSRegexp.stringMatch(this,args[0]);
67 case "replace": return JSRegexp.stringReplace(this,args[0],args[1]);
68 case "search": return JSRegexp.stringSearch(this,args[0]);
69 case "split": return JSRegexp.stringSplit(this,args[0],args[1],args.length);
70 case "toLowerCase": return JSU.S(s.toLowerCase());
71 case "toUpperCase": return JSU.S(s.toUpperCase());
73 int a = args.length >= 1 ? JSU.toInt(args[0]) : 0;
74 int b = args.length >= 2 ? JSU.toInt(args[1]) : 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 JSU.S("");
82 return JSU.S(s.substring(a,b));
85 return super.call(method, args);
88 public JS get(JS key) throws JSExn {
89 //#switch(JSU.toString(key))
90 case "length": return JSU.N(JSU.toString(this).length());
91 case "substring": return METHOD;
92 case "charAt": return METHOD;
93 case "charCodeAt": return METHOD;
94 case "concat": return METHOD;
95 case "indexOf": return METHOD;
96 case "lastIndexOf": return METHOD;
97 case "match": return METHOD;
98 case "replace": return METHOD;
99 case "search": return METHOD;
100 case "slice": return METHOD;
101 case "split": return METHOD;
102 case "toLowerCase": return METHOD;
103 case "toUpperCase": return METHOD;
104 case "toString": return METHOD;
105 case "substr": return METHOD;
106 case "toPrecision": return METHOD;
107 case "toExponential": return METHOD;
108 case "toFixed": return METHOD;
110 return super.get(key);