57f9c9ed076f8097233173af3b9bf39ed8a0356f
[org.ibex.js.git] / src / org / ibex / js / JSPrimitive.java
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.
4
5 package org.ibex.js;
6
7 class JSPrimitive extends JS.Immutable {
8     private static final JS.Method METHOD = new JS.Method();
9
10     public JS callMethod(JS method, JS[] args) throws JSExn {
11         //#switch(JSU.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 : JSU.S(JSU.toString(this));
16         //#end
17             
18         String s = coerceToString();
19         int slength = s.length();
20             
21         //#switch(JSU.toString(method))
22         case "substring": {
23             int a = args.length >= 1 ? JSU.toInt(args[0]) : 0;
24             int b = args.length >= 2 ? JSU.toInt(args[1]) : slength;
25             if (a > slength) a = slength;
26             if (b > slength) b = slength;
27             if (a < 0) a = 0;
28             if (b < 0) b = 0;
29             if (a > b) { int tmp = a; a = b; b = tmp; }
30             return JSU.S(s.substring(a,b));
31         }
32         case "substr": {
33             int start = args.length >= 1 ? JSU.toInt(args[0]) : 0;
34             int len = args.length >= 2 ? JSU.toInt(args[1]) : Integer.MAX_VALUE;
35             if (start < 0) start = slength + start;
36             if (start < 0) start = 0;
37             if (len < 0) len = 0;
38             if (len > slength - start) len = slength - start;
39             if (len <= 0) return JSU.S("");
40             return JSU.S(s.substring(start,start+len));
41         }
42         case "charAt": {
43             int p = args.length >= 1 ? JSU.toInt(args[0]) : 0;
44             if (p < 0 || p >= slength) return JSU.S("");
45             return JSU.S(s.substring(p,p+1));
46         }
47         case "charCodeAt": {
48             int p = args.length >= 1 ? JSU.toInt(args[0]) : 0;
49             if (p < 0 || p >= slength) return JSU.N(Double.NaN);
50             return JSU.N(s.charAt(p));
51         }
52         case "concat": {
53             StringBuffer sb = new StringBuffer(slength*2).append(s);
54             for (int i=0; i < args.length; i++) sb.append(args[i]);
55             return JSU.S(sb.toString());
56         }
57         case "indexOf": {
58             String search = args.length >= 1 ? JSU.toString(args[0]) : "null";
59             int start = args.length >= 2 ? JSU.toInt(args[1]) : 0;
60             // Java's indexOf handles an out of bounds start index, it'll return -1
61             return JSU.N(s.indexOf(search,start));
62         }
63         case "lastIndexOf": {
64             String search = args.length >= 1 ? JSU.toString(args[0]) : "null";
65             int start = args.length >= 2 ? JSU.toInt(args[1]) : 0;
66             // Java's indexOf handles an out of bounds start index, it'll return -1
67             return JSU.N(s.lastIndexOf(search,start));            
68         }
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 JSU.S(s.toLowerCase());
74         case "toUpperCase": return JSU.S(s.toUpperCase());
75         case "slice": {
76             int a = args.length >= 1 ? JSU.toInt(args[0]) : 0;
77             int b = args.length >= 2 ? JSU.toInt(args[1]) : slength;
78             if (a < 0) a = slength + a;
79             if (b < 0) b = slength + b;
80             if (a < 0) a = 0;
81             if (b < 0) b = 0;
82             if (a > slength) a = slength;
83             if (b > slength) b = slength;
84             if (a > b) return JSU.S("");
85             return JSU.S(s.substring(a,b));
86         }
87         //#end
88         return super.call(method, args);
89     }
90     
91     public JS get(JS key) throws JSExn {
92         //#switch(JSU.toString(key))
93         case "length": return JSU.N(JSU.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;
112         //#end
113         return super.get(key);
114     }
115 }