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 callMethod(JS method, JS[] args) throws JSExn {
11 //#switch(Script.str(method))
12 case "toFixed": throw new JSExn("toFixed() not implemented");
13 case "toExponential": throw new JSExn("toExponential() not implemented");
14 case "toPrecision": throw new JSExn("toPrecision() not implemented");
15 case "toString": return this instanceof JSString ? this : Script.S(Script.toString(this));
18 String s = coerceToString();
19 int slength = s.length();
21 //#switch(Script.toString(method))
23 int a = args.length >= 1 ? Script.toInt(args[0]) : 0;
24 int b = args.length >= 2 ? Script.toInt(args[1]) : slength;
25 if (a > slength) a = slength;
26 if (b > slength) b = slength;
29 if (a > b) { int tmp = a; a = b; b = tmp; }
30 return Script.S(s.substring(a,b));
33 int start = args.length >= 1 ? Script.toInt(args[0]) : 0;
34 int len = args.length >= 2 ? Script.toInt(args[1]) : Integer.MAX_VALUE;
35 if (start < 0) start = slength + start;
36 if (start < 0) start = 0;
38 if (len > slength - start) len = slength - start;
39 if (len <= 0) return Script.S("");
40 return Script.S(s.substring(start,start+len));
43 int p = args.length >= 1 ? Script.toInt(args[0]) : 0;
44 if (p < 0 || p >= slength) return Script.S("");
45 return Script.S(s.substring(p,p+1));
48 int p = args.length >= 1 ? Script.toInt(args[0]) : 0;
49 if (p < 0 || p >= slength) return Script.N(Double.NaN);
50 return Script.N(s.charAt(p));
53 StringBuffer sb = new StringBuffer(slength*2).append(s);
54 for (int i=0; i < args.length; i++) sb.append(args[i]);
55 return Script.S(sb.toString());
58 String search = args.length >= 1 ? Script.toString(args[0]) : "null";
59 int start = args.length >= 2 ? Script.toInt(args[1]) : 0;
60 // Java's indexOf handles an out of bounds start index, it'll return -1
61 return Script.N(s.indexOf(search,start));
64 String search = args.length >= 1 ? Script.toString(args[0]) : "null";
65 int start = args.length >= 2 ? Script.toInt(args[1]) : 0;
66 // Java's indexOf handles an out of bounds start index, it'll return -1
67 return Script.N(s.lastIndexOf(search,start));
69 case "match": return JSRegexp.stringMatch(this,args[0]);
70 case "replace": return JSRegexp.stringReplace(this,args[0],args[1]);
71 case "search": return JSRegexp.stringSearch(this,args[0]);
72 case "split": return JSRegexp.stringSplit(this,args[0],args[1],args.length);
73 case "toLowerCase": return Script.S(s.toLowerCase());
74 case "toUpperCase": return Script.S(s.toUpperCase());
76 int a = args.length >= 1 ? Script.toInt(args[0]) : 0;
77 int b = args.length >= 2 ? Script.toInt(args[1]) : slength;
78 if (a < 0) a = slength + a;
79 if (b < 0) b = slength + b;
82 if (a > slength) a = slength;
83 if (b > slength) b = slength;
84 if (a > b) return Script.S("");
85 return Script.S(s.substring(a,b));
88 return super.call(method, args);
91 public JS get(JS key) throws JSExn {
92 //#switch(Script.toString(key))
93 case "length": return Script.N(Script.toString(this).length());
94 case "substring": return METHOD;
95 case "charAt": return METHOD;
96 case "charCodeAt": return METHOD;
97 case "concat": return METHOD;
98 case "indexOf": return METHOD;
99 case "lastIndexOf": return METHOD;
100 case "match": return METHOD;
101 case "replace": return METHOD;
102 case "search": return METHOD;
103 case "slice": return METHOD;
104 case "split": return METHOD;
105 case "toLowerCase": return METHOD;
106 case "toUpperCase": return METHOD;
107 case "toString": return METHOD;
108 case "substr": return METHOD;
109 case "toPrecision": return METHOD;
110 case "toExponential": return METHOD;
111 case "toFixed": return METHOD;
113 return super.get(key);