automatically try call(JS[]) if method
[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 call(JS method, JS[] args) throws JSExn {
11         String s = coerceToString();
12         int slength = s.length();
13
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));
19         case "substring": {
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;
24             if (a < 0) a = 0;
25             if (b < 0) b = 0;
26             if (a > b) { int tmp = a; a = b; b = tmp; }
27             return JSU.S(s.substring(a,b));
28         }
29         case "substr": {
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;
34             if (len < 0) len = 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));
38         }
39         case "charAt": {
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));
43         }
44         case "charCodeAt": {
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));
48         }
49         case "concat": {
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());
53         }
54         case "indexOf": {
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));
59         }
60         case "lastIndexOf": {
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));            
65         }
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());
72         case "slice": {
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;
77             if (a < 0) a = 0;
78             if (b < 0) b = 0;
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));
83         }
84         //#end
85         return super.call(method, args);
86     }
87     
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;
109         //#end
110         return super.get(key);
111     }
112 }