зеркало из https://github.com/mozilla/gecko-dev.git
Add Igor's changes to make generation of id strings by tool.
This commit is contained in:
Родитель
f8787df377
Коммит
64bdadc1e0
|
@ -48,52 +48,7 @@ import java.text.SimpleDateFormat;
|
|||
* See ECMA 15.9.
|
||||
* @author Mike McCabe
|
||||
*/
|
||||
public class NativeDate extends ScriptableObject {
|
||||
|
||||
public static void finishInit(Scriptable scope, FunctionObject ctor,
|
||||
Scriptable proto)
|
||||
throws PropertyException
|
||||
{
|
||||
if (thisTimeZone == null) {
|
||||
// j.u.TimeZone is synchronized, so setting class statics from it
|
||||
// should be OK.
|
||||
thisTimeZone = java.util.TimeZone.getDefault();
|
||||
LocalTZA = thisTimeZone.getRawOffset();
|
||||
}
|
||||
|
||||
// alias toUTCString to toGMTString
|
||||
((ScriptableObject) proto).defineProperty("toGMTString",
|
||||
proto.get("toUTCString", proto),
|
||||
ScriptableObject.DONTENUM);
|
||||
|
||||
// Set some method length values.
|
||||
// These functions need to be varargs, because their behavior
|
||||
// depends on the number of arguments they are called with.
|
||||
String[] specialLengthNames = { "setSeconds", "setUTCSeconds",
|
||||
"setMinutes", "setUTCMinutes",
|
||||
"setHours", "setUTCHours",
|
||||
"setMonth", "setUTCMonth",
|
||||
"setFullYear", "setUTCFullYear",
|
||||
};
|
||||
|
||||
short[] specialLengthValues = { 2, 2,
|
||||
3, 3,
|
||||
4, 4,
|
||||
2, 2,
|
||||
3, 3,
|
||||
};
|
||||
|
||||
for (int i=0; i < specialLengthNames.length; i++) {
|
||||
Object obj = proto.get(specialLengthNames[i], proto);
|
||||
((FunctionObject) obj).setLength(specialLengthValues[i]);
|
||||
}
|
||||
|
||||
// Set the value of the prototype Date to NaN ('invalid date');
|
||||
((NativeDate)proto).date = ScriptRuntime.NaN;
|
||||
}
|
||||
|
||||
public NativeDate() {
|
||||
}
|
||||
public class NativeDate extends IdScriptable {
|
||||
|
||||
public String getClassName() {
|
||||
return "Date";
|
||||
|
@ -105,6 +60,218 @@ public class NativeDate extends ScriptableObject {
|
|||
return super.getDefaultValue(typeHint);
|
||||
}
|
||||
|
||||
public void scopeInit(Context cx, Scriptable scope, boolean sealed) {
|
||||
|
||||
super.scopeInit(cx, scope, sealed);
|
||||
|
||||
// Set the value of the prototype Date to NaN ('invalid date');
|
||||
date = ScriptRuntime.NaN;
|
||||
|
||||
if (thisTimeZone == null) {
|
||||
// j.u.TimeZone is synchronized, so setting class statics from it
|
||||
// should be OK.
|
||||
thisTimeZone = java.util.TimeZone.getDefault();
|
||||
LocalTZA = thisTimeZone.getRawOffset();
|
||||
}
|
||||
}
|
||||
|
||||
protected void fillConstructorProperties
|
||||
(Context cx, IdFunction ctor, boolean sealed)
|
||||
{
|
||||
addIdFunctionProperty(ctor, "UTC", ConstructorId_UTC, sealed);
|
||||
addIdFunctionProperty(ctor, "parse", ConstructorId_parse, sealed);
|
||||
super.fillConstructorProperties(cx, ctor, sealed);
|
||||
}
|
||||
|
||||
public int methodArity(int methodId, IdFunction function) {
|
||||
switch (methodId) {
|
||||
case ConstructorId_UTC:
|
||||
case ConstructorId_parse:
|
||||
case CONSTRUCTOR_ID:
|
||||
case Id_setTime:
|
||||
case Id_setMilliseconds:
|
||||
case Id_setUTCMilliseconds:
|
||||
case Id_setDate:
|
||||
case Id_setUTCDate:
|
||||
case Id_setYear:
|
||||
return 1;
|
||||
|
||||
case Id_setSeconds:
|
||||
case Id_setUTCSeconds:
|
||||
case Id_setMonth:
|
||||
case Id_setUTCMonth:
|
||||
return 2;
|
||||
|
||||
case Id_setMinutes:
|
||||
case Id_setUTCMinutes:
|
||||
case Id_setFullYear:
|
||||
case Id_setUTCFullYear:
|
||||
return 3;
|
||||
|
||||
case Id_setHours:
|
||||
case Id_setUTCHours:
|
||||
return 4;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public Object execMethod
|
||||
(int methodId, IdFunction f,
|
||||
Context cx, Scriptable scope, Scriptable thisObj, Object[] args)
|
||||
throws JavaScriptException
|
||||
{
|
||||
switch (methodId) {
|
||||
case ConstructorId_UTC: return wrap_dbl
|
||||
(jsStaticFunction_UTC(cx, thisObj, args, f));
|
||||
|
||||
case ConstructorId_parse: return wrap_dbl
|
||||
(jsStaticFunction_parse(to_str(args, 0)));
|
||||
|
||||
case CONSTRUCTOR_ID:
|
||||
return jsConstructor(cx, args, f, thisObj == null);
|
||||
|
||||
case Id_toString: return realThis(thisObj, f, true).
|
||||
jsFunction_toString();
|
||||
|
||||
case Id_toTimeString: return realThis(thisObj, f, true).
|
||||
jsFunction_toTimeString();
|
||||
|
||||
case Id_toDateString: return realThis(thisObj, f, true).
|
||||
jsFunction_toDateString();
|
||||
|
||||
case Id_toLocaleString: return realThis(thisObj, f, true).
|
||||
jsFunction_toLocaleString();
|
||||
|
||||
case Id_toLocaleTimeString: return realThis(thisObj, f, true).
|
||||
jsFunction_toLocaleTimeString();
|
||||
|
||||
case Id_toLocaleDateString: return realThis(thisObj, f, true).
|
||||
jsFunction_toLocaleDateString();
|
||||
|
||||
case Id_toUTCString: return realThis(thisObj, f, true).
|
||||
jsFunction_toUTCString();
|
||||
|
||||
case Id_valueOf: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_valueOf());
|
||||
|
||||
case Id_getTime: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getTime());
|
||||
|
||||
case Id_getYear: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getYear());
|
||||
|
||||
case Id_getFullYear: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getFullYear());
|
||||
|
||||
case Id_getUTCFullYear: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getUTCFullYear());
|
||||
|
||||
case Id_getMonth: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getMonth());
|
||||
|
||||
case Id_getUTCMonth: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getUTCMonth());
|
||||
|
||||
case Id_getDate: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getDate());
|
||||
|
||||
case Id_getUTCDate: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getUTCDate());
|
||||
|
||||
case Id_getDay: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getDay());
|
||||
|
||||
case Id_getUTCDay: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getUTCDay());
|
||||
|
||||
case Id_getHours: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getHours());
|
||||
|
||||
case Id_getUTCHours: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getUTCHours());
|
||||
|
||||
case Id_getMinutes: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getMinutes());
|
||||
|
||||
case Id_getUTCMinutes: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getUTCMinutes());
|
||||
|
||||
case Id_getSeconds: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getSeconds());
|
||||
|
||||
case Id_getUTCSeconds: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getUTCSeconds());
|
||||
|
||||
case Id_getMilliseconds: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getMilliseconds());
|
||||
|
||||
case Id_getUTCMilliseconds: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getUTCMilliseconds());
|
||||
|
||||
case Id_getTimezoneOffset: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getTimezoneOffset());
|
||||
|
||||
case Id_setTime: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_setTime(to_dbl(args, 0)));
|
||||
|
||||
case Id_setMilliseconds: return wrap_dbl
|
||||
(jsFunction_setMilliseconds(cx, thisObj, args, f));
|
||||
|
||||
case Id_setUTCMilliseconds: return wrap_dbl(
|
||||
jsFunction_setUTCMilliseconds(cx, thisObj, args, f));
|
||||
|
||||
case Id_setSeconds: return wrap_dbl(
|
||||
jsFunction_setSeconds(cx, thisObj, args, f));
|
||||
|
||||
case Id_setUTCSeconds:return wrap_dbl(
|
||||
jsFunction_setUTCSeconds(cx, thisObj, args, f));
|
||||
|
||||
case Id_setMinutes: return wrap_dbl(
|
||||
jsFunction_setMinutes(cx, thisObj, args, f));
|
||||
|
||||
case Id_setUTCMinutes: return wrap_dbl(
|
||||
jsFunction_setUTCMinutes(cx, thisObj, args, f));
|
||||
|
||||
case Id_setHours: return wrap_dbl(
|
||||
jsFunction_setHours(cx, thisObj, args, f));
|
||||
|
||||
case Id_setUTCHours: return wrap_dbl(
|
||||
jsFunction_setUTCHours(cx, thisObj, args, f));
|
||||
|
||||
case Id_setDate: return wrap_dbl(
|
||||
jsFunction_setDate(cx, thisObj, args, f));
|
||||
|
||||
case Id_setUTCDate: return wrap_dbl(
|
||||
jsFunction_setUTCDate(cx, thisObj, args, f));
|
||||
|
||||
case Id_setMonth: return wrap_dbl(
|
||||
jsFunction_setMonth(cx, thisObj, args, f));
|
||||
|
||||
case Id_setUTCMonth: return wrap_dbl(
|
||||
jsFunction_setUTCMonth(cx, thisObj, args, f));
|
||||
|
||||
case Id_setFullYear: return wrap_dbl(
|
||||
jsFunction_setFullYear(cx, thisObj, args, f));
|
||||
|
||||
case Id_setUTCFullYear: return wrap_dbl(
|
||||
jsFunction_setUTCFullYear(cx, thisObj, args, f));
|
||||
|
||||
case Id_setYear: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_setYear(to_dbl(args, 0)));
|
||||
}
|
||||
|
||||
return Scriptable.NOT_FOUND;
|
||||
}
|
||||
|
||||
private NativeDate realThis(Scriptable thisObj, IdFunction f,
|
||||
boolean searchPrototype)
|
||||
{
|
||||
while (!(thisObj instanceof NativeDate)) {
|
||||
thisObj = nextInstanceCheck(thisObj, f, searchPrototype);
|
||||
}
|
||||
return (NativeDate)thisObj;
|
||||
}
|
||||
|
||||
/* ECMA helper functions */
|
||||
|
||||
private static final double HalfTimeDomain = 8.64e15;
|
||||
|
@ -1444,6 +1611,179 @@ public class NativeDate extends ScriptableObject {
|
|||
return this.date;
|
||||
}
|
||||
|
||||
protected int getMaxPrototypeMethodId() { return MAX_PROTOTYPE_METHOD; }
|
||||
|
||||
// #string_id_map#
|
||||
|
||||
protected int mapNameToMethodId(String s) {
|
||||
int id;
|
||||
// #generated# Last update: 2001-03-23 14:55:30 GMT+01:00
|
||||
L0: { id = 0; String X = null; int c;
|
||||
L: switch (s.length()) {
|
||||
case 6: X="getDay";id=Id_getDay; break L;
|
||||
case 7: switch (s.charAt(3)) {
|
||||
case 'D': c=s.charAt(0);
|
||||
if (c=='g') { X="getDate";id=Id_getDate; }
|
||||
else if (c=='s') { X="setDate";id=Id_setDate; }
|
||||
break L;
|
||||
case 'T': c=s.charAt(0);
|
||||
if (c=='g') { X="getTime";id=Id_getTime; }
|
||||
else if (c=='s') { X="setTime";id=Id_setTime; }
|
||||
break L;
|
||||
case 'Y': c=s.charAt(0);
|
||||
if (c=='g') { X="getYear";id=Id_getYear; }
|
||||
else if (c=='s') { X="setYear";id=Id_setYear; }
|
||||
break L;
|
||||
case 'u': X="valueOf";id=Id_valueOf; break L;
|
||||
} break L;
|
||||
case 8: c=s.charAt(0);
|
||||
if (c=='g') {
|
||||
c=s.charAt(7);
|
||||
if (c=='h') { X="getMonth";id=Id_getMonth; }
|
||||
else if (c=='s') { X="getHours";id=Id_getHours; }
|
||||
}
|
||||
else if (c=='s') {
|
||||
c=s.charAt(7);
|
||||
if (c=='h') { X="setMonth";id=Id_setMonth; }
|
||||
else if (c=='s') { X="setHours";id=Id_setHours; }
|
||||
}
|
||||
else if (c=='t') { X="toString";id=Id_toString; }
|
||||
break L;
|
||||
case 9: X="getUTCDay";id=Id_getUTCDay; break L;
|
||||
case 10: c=s.charAt(3);
|
||||
if (c=='M') {
|
||||
c=s.charAt(0);
|
||||
if (c=='g') { X="getMinutes";id=Id_getMinutes; }
|
||||
else if (c=='s') { X="setMinutes";id=Id_setMinutes; }
|
||||
}
|
||||
else if (c=='S') {
|
||||
c=s.charAt(0);
|
||||
if (c=='g') { X="getSeconds";id=Id_getSeconds; }
|
||||
else if (c=='s') { X="setSeconds";id=Id_setSeconds; }
|
||||
}
|
||||
else if (c=='U') {
|
||||
c=s.charAt(0);
|
||||
if (c=='g') { X="getUTCDate";id=Id_getUTCDate; }
|
||||
else if (c=='s') { X="setUTCDate";id=Id_setUTCDate; }
|
||||
}
|
||||
break L;
|
||||
case 11: switch (s.charAt(3)) {
|
||||
case 'F': c=s.charAt(0);
|
||||
if (c=='g') { X="getFullYear";id=Id_getFullYear; }
|
||||
else if (c=='s') { X="setFullYear";id=Id_setFullYear; }
|
||||
break L;
|
||||
case 'M': X="toGMTString";id=Id_toGMTString; break L;
|
||||
case 'T': X="toUTCString";id=Id_toUTCString; break L;
|
||||
case 'U': c=s.charAt(0);
|
||||
if (c=='g') {
|
||||
c=s.charAt(9);
|
||||
if (c=='r') { X="getUTCHours";id=Id_getUTCHours; }
|
||||
else if (c=='t') { X="getUTCMonth";id=Id_getUTCMonth; }
|
||||
}
|
||||
else if (c=='s') {
|
||||
c=s.charAt(9);
|
||||
if (c=='r') { X="setUTCHours";id=Id_setUTCHours; }
|
||||
else if (c=='t') { X="setUTCMonth";id=Id_setUTCMonth; }
|
||||
}
|
||||
break L;
|
||||
} break L;
|
||||
case 12: c=s.charAt(2);
|
||||
if (c=='D') { X="toDateString";id=Id_toDateString; }
|
||||
else if (c=='T') { X="toTimeString";id=Id_toTimeString; }
|
||||
break L;
|
||||
case 13: c=s.charAt(0);
|
||||
if (c=='g') {
|
||||
c=s.charAt(6);
|
||||
if (c=='M') { X="getUTCMinutes";id=Id_getUTCMinutes; }
|
||||
else if (c=='S') { X="getUTCSeconds";id=Id_getUTCSeconds; }
|
||||
}
|
||||
else if (c=='s') {
|
||||
c=s.charAt(6);
|
||||
if (c=='M') { X="setUTCMinutes";id=Id_setUTCMinutes; }
|
||||
else if (c=='S') { X="setUTCSeconds";id=Id_setUTCSeconds; }
|
||||
}
|
||||
break L;
|
||||
case 14: c=s.charAt(0);
|
||||
if (c=='g') { X="getUTCFullYear";id=Id_getUTCFullYear; }
|
||||
else if (c=='s') { X="setUTCFullYear";id=Id_setUTCFullYear; }
|
||||
else if (c=='t') { X="toLocaleString";id=Id_toLocaleString; }
|
||||
break L;
|
||||
case 15: c=s.charAt(0);
|
||||
if (c=='g') { X="getMilliseconds";id=Id_getMilliseconds; }
|
||||
else if (c=='s') { X="setMilliseconds";id=Id_setMilliseconds; }
|
||||
break L;
|
||||
case 17: X="getTimezoneOffset";id=Id_getTimezoneOffset; break L;
|
||||
case 18: c=s.charAt(0);
|
||||
if (c=='g') { X="getUTCMilliseconds";id=Id_getUTCMilliseconds; }
|
||||
else if (c=='s') { X="setUTCMilliseconds";id=Id_setUTCMilliseconds; }
|
||||
else if (c=='t') {
|
||||
c=s.charAt(8);
|
||||
if (c=='D') { X="toLocaleDateString";id=Id_toLocaleDateString; }
|
||||
else if (c=='T') { X="toLocaleTimeString";id=Id_toLocaleTimeString; }
|
||||
}
|
||||
break L;
|
||||
}
|
||||
if (X!=null && X!=s && !X.equals(s)) id = 0;
|
||||
}
|
||||
// #/generated#
|
||||
return id;
|
||||
}
|
||||
|
||||
private static final int
|
||||
ConstructorId_UTC = -2,
|
||||
ConstructorId_parse = -1,
|
||||
|
||||
Id_toString = 1,
|
||||
Id_toTimeString = 2,
|
||||
Id_toDateString = 3,
|
||||
Id_toLocaleString = 4,
|
||||
Id_toLocaleTimeString = 5,
|
||||
Id_toLocaleDateString = 6,
|
||||
Id_toUTCString = 7,
|
||||
Id_valueOf = 8,
|
||||
Id_getTime = 9,
|
||||
Id_getYear = 10,
|
||||
Id_getFullYear = 11,
|
||||
Id_getUTCFullYear = 12,
|
||||
Id_getMonth = 13,
|
||||
Id_getUTCMonth = 14,
|
||||
Id_getDate = 15,
|
||||
Id_getUTCDate = 16,
|
||||
Id_getDay = 17,
|
||||
Id_getUTCDay = 18,
|
||||
Id_getHours = 19,
|
||||
Id_getUTCHours = 20,
|
||||
Id_getMinutes = 21,
|
||||
Id_getUTCMinutes = 22,
|
||||
Id_getSeconds = 23,
|
||||
Id_getUTCSeconds = 24,
|
||||
Id_getMilliseconds = 25,
|
||||
Id_getUTCMilliseconds = 26,
|
||||
Id_getTimezoneOffset = 27,
|
||||
Id_setTime = 28,
|
||||
Id_setMilliseconds = 29,
|
||||
Id_setUTCMilliseconds = 30,
|
||||
Id_setSeconds = 31,
|
||||
Id_setUTCSeconds = 32,
|
||||
Id_setMinutes = 33,
|
||||
Id_setUTCMinutes = 34,
|
||||
Id_setHours = 35,
|
||||
Id_setUTCHours = 36,
|
||||
Id_setDate = 37,
|
||||
Id_setUTCDate = 38,
|
||||
Id_setMonth = 39,
|
||||
Id_setUTCMonth = 40,
|
||||
Id_setFullYear = 41,
|
||||
Id_setUTCFullYear = 42,
|
||||
Id_setYear = 43,
|
||||
|
||||
MAX_PROTOTYPE_METHOD = 43;
|
||||
|
||||
private static final int // Aliases
|
||||
Id_toGMTString = Id_toUTCString;
|
||||
|
||||
// #/string_id_map#
|
||||
|
||||
/* cached values */
|
||||
private static java.util.TimeZone thisTimeZone;
|
||||
private static double LocalTZA;
|
||||
|
|
|
@ -43,31 +43,16 @@ package org.mozilla.javascript;
|
|||
*/
|
||||
|
||||
public class NativeMath extends ScriptableObject
|
||||
implements IdFunction.Master
|
||||
implements IdFunction.Master, ScopeInitializer
|
||||
{
|
||||
|
||||
public static Scriptable init(Scriptable scope) {
|
||||
NativeMath m = new NativeMath();
|
||||
Context cx = Context.getContext();
|
||||
m.scopeInit(cx, scope, false);
|
||||
return m;
|
||||
}
|
||||
|
||||
public NativeMath() { }
|
||||
|
||||
public void scopeInit(Context cx, Scriptable scope, boolean sealed) {
|
||||
setPrototype(getObjectPrototype(scope));
|
||||
setParentScope(scope);
|
||||
if (sealed) {
|
||||
sealObject();
|
||||
}
|
||||
if (scope instanceof ScriptableObject) {
|
||||
((ScriptableObject)scope).defineProperty("Math", this,
|
||||
ScriptableObject.DONTENUM);
|
||||
}
|
||||
else {
|
||||
scope.put("Math", scope, this);
|
||||
}
|
||||
ScriptableObject.defineProperty
|
||||
(scope, "Math", this, ScriptableObject.DONTENUM);
|
||||
}
|
||||
|
||||
public String getClassName() { return "Math"; }
|
||||
|
@ -268,7 +253,8 @@ public class NativeMath extends ScriptableObject
|
|||
for (int i = 0; i < args.length; i++) {
|
||||
double d = ScriptRuntime.toNumber(args[i]);
|
||||
if (d != d) return d;
|
||||
if (result < d) result = d;
|
||||
// if (result < d) result = d; does not work due to -0.0 >= +0.0
|
||||
result = Math.max(result, d);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
@ -280,6 +266,7 @@ public class NativeMath extends ScriptableObject
|
|||
for (int i = 0; i < args.length; i++) {
|
||||
double d = ScriptRuntime.toNumber(args[i]);
|
||||
if (d != d) return d;
|
||||
// if (result > d) result = d; does not work due to -0.0 >= +0.0
|
||||
result = Math.min(result, d);
|
||||
}
|
||||
return result;
|
||||
|
@ -324,64 +311,54 @@ public class NativeMath extends ScriptableObject
|
|||
|
||||
private double js_tan(double x) { return Math.tan(x); }
|
||||
|
||||
private static int nameToId(String s) {
|
||||
int c;
|
||||
int id = 0;
|
||||
String guess = null;
|
||||
L:switch (s.length()) {
|
||||
case 1: if (s.charAt(0)=='E') return Id_E;
|
||||
break L;
|
||||
case 2: if (s.charAt(0)=='P'&&s.charAt(1)=='I') return Id_PI;
|
||||
break L;
|
||||
case 3: switch (s.charAt(0)) {
|
||||
case 'L': if (s.charAt(1)=='N'&&s.charAt(2)=='2') return Id_LN2;
|
||||
break L;
|
||||
case 'a': if (s.charAt(1)=='b'&&s.charAt(2)=='s') return Id_abs;
|
||||
break L;
|
||||
case 'c': if (s.charAt(1)=='o'&&s.charAt(2)=='s') return Id_cos;
|
||||
break L;
|
||||
case 'e': if (s.charAt(1)=='x'&&s.charAt(2)=='p') return Id_exp;
|
||||
break L;
|
||||
case 'l': if (s.charAt(1)=='o'&&s.charAt(2)=='g') return Id_log;
|
||||
break L;
|
||||
case 'm': c=s.charAt(1);
|
||||
if (c=='a') { if (s.charAt(2)=='x') return Id_max; }
|
||||
else if (c=='i') { if (s.charAt(2)=='n') return Id_min; }
|
||||
break L;
|
||||
case 'p': if (s.charAt(1)=='o'&&s.charAt(2)=='w') return Id_pow;
|
||||
break L;
|
||||
case 's': if (s.charAt(1)=='i'&&s.charAt(2)=='n') return Id_sin;
|
||||
break L;
|
||||
case 't': if (s.charAt(1)=='a'&&s.charAt(2)=='n') return Id_tan;
|
||||
break L;
|
||||
}
|
||||
break L;
|
||||
case 4: switch (s.charAt(1)) {
|
||||
case 'N': guess="LN10";id=Id_LN10; break L;
|
||||
case 'c': guess="acos";id=Id_acos; break L;
|
||||
case 's': guess="asin";id=Id_asin; break L;
|
||||
case 't': guess="atan";id=Id_atan; break L;
|
||||
case 'e': guess="ceil";id=Id_ceil; break L;
|
||||
case 'q': guess="sqrt";id=Id_sqrt; break L;
|
||||
}
|
||||
break L;
|
||||
case 5: switch (s.charAt(0)) {
|
||||
case 'S': guess="SQRT2";id=Id_SQRT2; break L;
|
||||
case 'L': guess="LOG2E";id=Id_LOG2E; break L;
|
||||
case 'a': guess="atan2";id=Id_atan2; break L;
|
||||
case 'f': guess="floor";id=Id_floor; break L;
|
||||
case 'r': guess="round";id=Id_round; break L;
|
||||
}
|
||||
break L;
|
||||
case 6: c=s.charAt(0);
|
||||
if (c=='L') { guess="LOG10E";id=Id_LOG10E; }
|
||||
else if (c=='r') { guess="random";id=Id_random; }
|
||||
break L;
|
||||
case 7: guess="SQRT1_2";id=Id_SQRT1_2;
|
||||
break L;
|
||||
}
|
||||
// #string_id_map#
|
||||
|
||||
return (guess != null && s.equals(guess)) ? id : 0;
|
||||
private static int nameToId(String s) {
|
||||
int id;
|
||||
// #generated# Last update: 2001-03-23 13:50:14 GMT+01:00
|
||||
L0: { id = 0; String X = null; int c;
|
||||
L: switch (s.length()) {
|
||||
case 1: if (s.charAt(0)=='E') {id=Id_E; break L0;} break L;
|
||||
case 2: if (s.charAt(0)=='P' && s.charAt(1)=='I') {id=Id_PI; break L0;} break L;
|
||||
case 3: switch (s.charAt(0)) {
|
||||
case 'L': if (s.charAt(2)=='2' && s.charAt(1)=='N') {id=Id_LN2; break L0;} break L;
|
||||
case 'a': if (s.charAt(2)=='s' && s.charAt(1)=='b') {id=Id_abs; break L0;} break L;
|
||||
case 'c': if (s.charAt(2)=='s' && s.charAt(1)=='o') {id=Id_cos; break L0;} break L;
|
||||
case 'e': if (s.charAt(2)=='p' && s.charAt(1)=='x') {id=Id_exp; break L0;} break L;
|
||||
case 'l': if (s.charAt(2)=='g' && s.charAt(1)=='o') {id=Id_log; break L0;} break L;
|
||||
case 'm': c=s.charAt(2);
|
||||
if (c=='n') { if (s.charAt(1)=='i') {id=Id_min; break L0;} }
|
||||
else if (c=='x') { if (s.charAt(1)=='a') {id=Id_max; break L0;} }
|
||||
break L;
|
||||
case 'p': if (s.charAt(2)=='w' && s.charAt(1)=='o') {id=Id_pow; break L0;} break L;
|
||||
case 's': if (s.charAt(2)=='n' && s.charAt(1)=='i') {id=Id_sin; break L0;} break L;
|
||||
case 't': if (s.charAt(2)=='n' && s.charAt(1)=='a') {id=Id_tan; break L0;} break L;
|
||||
} break L;
|
||||
case 4: switch (s.charAt(1)) {
|
||||
case 'N': X="LN10";id=Id_LN10; break L;
|
||||
case 'c': X="acos";id=Id_acos; break L;
|
||||
case 'e': X="ceil";id=Id_ceil; break L;
|
||||
case 'q': X="sqrt";id=Id_sqrt; break L;
|
||||
case 's': X="asin";id=Id_asin; break L;
|
||||
case 't': X="atan";id=Id_atan; break L;
|
||||
} break L;
|
||||
case 5: switch (s.charAt(0)) {
|
||||
case 'L': X="LOG2E";id=Id_LOG2E; break L;
|
||||
case 'S': X="SQRT2";id=Id_SQRT2; break L;
|
||||
case 'a': X="atan2";id=Id_atan2; break L;
|
||||
case 'f': X="floor";id=Id_floor; break L;
|
||||
case 'r': X="round";id=Id_round; break L;
|
||||
} break L;
|
||||
case 6: c=s.charAt(0);
|
||||
if (c=='L') { X="LOG10E";id=Id_LOG10E; }
|
||||
else if (c=='r') { X="random";id=Id_random; }
|
||||
break L;
|
||||
case 7: X="SQRT1_2";id=Id_SQRT1_2; break L;
|
||||
}
|
||||
if (X!=null && X!=s && !X.equals(s)) id = 0;
|
||||
}
|
||||
// #/generated#
|
||||
return id;
|
||||
}
|
||||
|
||||
private static final int
|
||||
|
@ -415,6 +392,8 @@ public class NativeMath extends ScriptableObject
|
|||
Id_SQRT1_2 = 25,
|
||||
Id_SQRT2 = 26;
|
||||
|
||||
// #/string_id_map#
|
||||
|
||||
private static final Double
|
||||
E = new Double(Math.E),
|
||||
PI = new Double(Math.PI),
|
||||
|
|
|
@ -0,0 +1,51 @@
|
|||
/* -*- Mode: java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express oqr
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is Rhino code, released
|
||||
* May 6, 1999.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1997-1999 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Igor Bukanov
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License (the "GPL"), in which case the
|
||||
* provisions of the GPL are applicable instead of those above.
|
||||
* If you wish to allow use of your version of this file only
|
||||
* under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this
|
||||
* file under either the NPL or the GPL.
|
||||
*/
|
||||
|
||||
package org.mozilla.javascript;
|
||||
|
||||
/**
|
||||
* Indicate that implementation instance performs initializations for scope
|
||||
*/
|
||||
|
||||
public interface ScopeInitializer {
|
||||
|
||||
/**
|
||||
* Initialize scope.
|
||||
* If sealed is true, seal any script object added to scope directly
|
||||
* or as a property of some other object.
|
||||
*/
|
||||
public void scopeInit(Context cx, Scriptable scope, boolean sealed);
|
||||
|
||||
}
|
|
@ -606,12 +606,15 @@ public abstract class ScriptableObject implements Scriptable {
|
|||
/**
|
||||
* Defines JavaScript objects from a Java class that implements Scriptable.
|
||||
*
|
||||
* If the given class implements the <code>ScopeInitializer</code>
|
||||
* interface, then its instance is constructed and <code>scopeInit</code>
|
||||
* is called upon it and no further initialization is done.
|
||||
*
|
||||
* If the given class has a method
|
||||
* <pre>
|
||||
* static void init(Scriptable scope);</pre>
|
||||
*
|
||||
* then it is invoked and no further initialization is done and the
|
||||
* result of the invocation will be returned.<p>
|
||||
* then it is invoked and no further initialization is done.<p>
|
||||
*
|
||||
* However, if no such a method is found, then the class's constructors and
|
||||
* methods are used to initialize a class in the following manner.<p>
|
||||
|
@ -737,6 +740,13 @@ public abstract class ScriptableObject implements Scriptable {
|
|||
InvocationTargetException, ClassDefinitionException,
|
||||
PropertyException
|
||||
{
|
||||
if (ScopeInitializerClass.isAssignableFrom(clazz)) {
|
||||
ScopeInitializer setup = (ScopeInitializer)clazz.newInstance();
|
||||
Context cx = Context.getContext();
|
||||
setup.scopeInit(cx, scope, sealed);
|
||||
return;
|
||||
}
|
||||
|
||||
Method[] methods = FunctionObject.getMethodList(clazz);
|
||||
for (int i=0; i < methods.length; i++) {
|
||||
if (!methods[i].getName().equals("init"))
|
||||
|
@ -981,11 +991,7 @@ public abstract class ScriptableObject implements Scriptable {
|
|||
Scriptable dest = prefix == staticFunctionPrefix
|
||||
? ctor
|
||||
: proto;
|
||||
if (dest instanceof ScriptableObject) {
|
||||
((ScriptableObject) dest).defineProperty(name, f, DONTENUM);
|
||||
} else {
|
||||
dest.put(name, dest, f);
|
||||
}
|
||||
defineProperty(dest, name, f, DONTENUM);
|
||||
if (sealed) {
|
||||
f.sealObject();
|
||||
f.addPropertyAttribute(READONLY);
|
||||
|
@ -1030,6 +1036,25 @@ public abstract class ScriptableObject implements Scriptable {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility method to add properties to arbitrary Scriptable object.
|
||||
* If destination is instance of ScriptableObject, calls
|
||||
* defineProperty there, otherwise calls put in destination
|
||||
* ignoring attributes
|
||||
*/
|
||||
public static void defineProperty(Scriptable destination,
|
||||
String propertyName, Object value,
|
||||
int attributes)
|
||||
{
|
||||
if (destination instanceof ScriptableObject) {
|
||||
ScriptableObject obj = (ScriptableObject)destination;
|
||||
obj.defineProperty(propertyName, value, attributes);
|
||||
}
|
||||
else {
|
||||
destination.put(propertyName, destination, value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Define a JavaScript property with getter and setter side effects.
|
||||
*
|
||||
|
@ -1762,4 +1787,5 @@ public abstract class ScriptableObject implements Scriptable {
|
|||
boolean setterReturnsValue;
|
||||
}
|
||||
|
||||
private static final Class ScopeInitializerClass = ScopeInitializer.class;
|
||||
}
|
||||
|
|
|
@ -71,6 +71,12 @@ public class ToolErrorReporter implements ErrorReporter {
|
|||
return getMessage(messageId, args);
|
||||
}
|
||||
|
||||
public static String getMessage(String messageId, Object arg1, Object arg2)
|
||||
{
|
||||
Object[] args = { arg1, arg2 };
|
||||
return getMessage(messageId, args);
|
||||
}
|
||||
|
||||
public static String getMessage(String messageId, Object[] args) {
|
||||
Context cx = Context.getCurrentContext();
|
||||
Locale locale = cx == null ? Locale.getDefault() : cx.getLocale();
|
||||
|
|
|
@ -48,52 +48,7 @@ import java.text.SimpleDateFormat;
|
|||
* See ECMA 15.9.
|
||||
* @author Mike McCabe
|
||||
*/
|
||||
public class NativeDate extends ScriptableObject {
|
||||
|
||||
public static void finishInit(Scriptable scope, FunctionObject ctor,
|
||||
Scriptable proto)
|
||||
throws PropertyException
|
||||
{
|
||||
if (thisTimeZone == null) {
|
||||
// j.u.TimeZone is synchronized, so setting class statics from it
|
||||
// should be OK.
|
||||
thisTimeZone = java.util.TimeZone.getDefault();
|
||||
LocalTZA = thisTimeZone.getRawOffset();
|
||||
}
|
||||
|
||||
// alias toUTCString to toGMTString
|
||||
((ScriptableObject) proto).defineProperty("toGMTString",
|
||||
proto.get("toUTCString", proto),
|
||||
ScriptableObject.DONTENUM);
|
||||
|
||||
// Set some method length values.
|
||||
// These functions need to be varargs, because their behavior
|
||||
// depends on the number of arguments they are called with.
|
||||
String[] specialLengthNames = { "setSeconds", "setUTCSeconds",
|
||||
"setMinutes", "setUTCMinutes",
|
||||
"setHours", "setUTCHours",
|
||||
"setMonth", "setUTCMonth",
|
||||
"setFullYear", "setUTCFullYear",
|
||||
};
|
||||
|
||||
short[] specialLengthValues = { 2, 2,
|
||||
3, 3,
|
||||
4, 4,
|
||||
2, 2,
|
||||
3, 3,
|
||||
};
|
||||
|
||||
for (int i=0; i < specialLengthNames.length; i++) {
|
||||
Object obj = proto.get(specialLengthNames[i], proto);
|
||||
((FunctionObject) obj).setLength(specialLengthValues[i]);
|
||||
}
|
||||
|
||||
// Set the value of the prototype Date to NaN ('invalid date');
|
||||
((NativeDate)proto).date = ScriptRuntime.NaN;
|
||||
}
|
||||
|
||||
public NativeDate() {
|
||||
}
|
||||
public class NativeDate extends IdScriptable {
|
||||
|
||||
public String getClassName() {
|
||||
return "Date";
|
||||
|
@ -105,6 +60,218 @@ public class NativeDate extends ScriptableObject {
|
|||
return super.getDefaultValue(typeHint);
|
||||
}
|
||||
|
||||
public void scopeInit(Context cx, Scriptable scope, boolean sealed) {
|
||||
|
||||
super.scopeInit(cx, scope, sealed);
|
||||
|
||||
// Set the value of the prototype Date to NaN ('invalid date');
|
||||
date = ScriptRuntime.NaN;
|
||||
|
||||
if (thisTimeZone == null) {
|
||||
// j.u.TimeZone is synchronized, so setting class statics from it
|
||||
// should be OK.
|
||||
thisTimeZone = java.util.TimeZone.getDefault();
|
||||
LocalTZA = thisTimeZone.getRawOffset();
|
||||
}
|
||||
}
|
||||
|
||||
protected void fillConstructorProperties
|
||||
(Context cx, IdFunction ctor, boolean sealed)
|
||||
{
|
||||
addIdFunctionProperty(ctor, "UTC", ConstructorId_UTC, sealed);
|
||||
addIdFunctionProperty(ctor, "parse", ConstructorId_parse, sealed);
|
||||
super.fillConstructorProperties(cx, ctor, sealed);
|
||||
}
|
||||
|
||||
public int methodArity(int methodId, IdFunction function) {
|
||||
switch (methodId) {
|
||||
case ConstructorId_UTC:
|
||||
case ConstructorId_parse:
|
||||
case CONSTRUCTOR_ID:
|
||||
case Id_setTime:
|
||||
case Id_setMilliseconds:
|
||||
case Id_setUTCMilliseconds:
|
||||
case Id_setDate:
|
||||
case Id_setUTCDate:
|
||||
case Id_setYear:
|
||||
return 1;
|
||||
|
||||
case Id_setSeconds:
|
||||
case Id_setUTCSeconds:
|
||||
case Id_setMonth:
|
||||
case Id_setUTCMonth:
|
||||
return 2;
|
||||
|
||||
case Id_setMinutes:
|
||||
case Id_setUTCMinutes:
|
||||
case Id_setFullYear:
|
||||
case Id_setUTCFullYear:
|
||||
return 3;
|
||||
|
||||
case Id_setHours:
|
||||
case Id_setUTCHours:
|
||||
return 4;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public Object execMethod
|
||||
(int methodId, IdFunction f,
|
||||
Context cx, Scriptable scope, Scriptable thisObj, Object[] args)
|
||||
throws JavaScriptException
|
||||
{
|
||||
switch (methodId) {
|
||||
case ConstructorId_UTC: return wrap_dbl
|
||||
(jsStaticFunction_UTC(cx, thisObj, args, f));
|
||||
|
||||
case ConstructorId_parse: return wrap_dbl
|
||||
(jsStaticFunction_parse(to_str(args, 0)));
|
||||
|
||||
case CONSTRUCTOR_ID:
|
||||
return jsConstructor(cx, args, f, thisObj == null);
|
||||
|
||||
case Id_toString: return realThis(thisObj, f, true).
|
||||
jsFunction_toString();
|
||||
|
||||
case Id_toTimeString: return realThis(thisObj, f, true).
|
||||
jsFunction_toTimeString();
|
||||
|
||||
case Id_toDateString: return realThis(thisObj, f, true).
|
||||
jsFunction_toDateString();
|
||||
|
||||
case Id_toLocaleString: return realThis(thisObj, f, true).
|
||||
jsFunction_toLocaleString();
|
||||
|
||||
case Id_toLocaleTimeString: return realThis(thisObj, f, true).
|
||||
jsFunction_toLocaleTimeString();
|
||||
|
||||
case Id_toLocaleDateString: return realThis(thisObj, f, true).
|
||||
jsFunction_toLocaleDateString();
|
||||
|
||||
case Id_toUTCString: return realThis(thisObj, f, true).
|
||||
jsFunction_toUTCString();
|
||||
|
||||
case Id_valueOf: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_valueOf());
|
||||
|
||||
case Id_getTime: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getTime());
|
||||
|
||||
case Id_getYear: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getYear());
|
||||
|
||||
case Id_getFullYear: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getFullYear());
|
||||
|
||||
case Id_getUTCFullYear: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getUTCFullYear());
|
||||
|
||||
case Id_getMonth: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getMonth());
|
||||
|
||||
case Id_getUTCMonth: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getUTCMonth());
|
||||
|
||||
case Id_getDate: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getDate());
|
||||
|
||||
case Id_getUTCDate: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getUTCDate());
|
||||
|
||||
case Id_getDay: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getDay());
|
||||
|
||||
case Id_getUTCDay: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getUTCDay());
|
||||
|
||||
case Id_getHours: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getHours());
|
||||
|
||||
case Id_getUTCHours: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getUTCHours());
|
||||
|
||||
case Id_getMinutes: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getMinutes());
|
||||
|
||||
case Id_getUTCMinutes: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getUTCMinutes());
|
||||
|
||||
case Id_getSeconds: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getSeconds());
|
||||
|
||||
case Id_getUTCSeconds: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getUTCSeconds());
|
||||
|
||||
case Id_getMilliseconds: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getMilliseconds());
|
||||
|
||||
case Id_getUTCMilliseconds: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getUTCMilliseconds());
|
||||
|
||||
case Id_getTimezoneOffset: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_getTimezoneOffset());
|
||||
|
||||
case Id_setTime: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_setTime(to_dbl(args, 0)));
|
||||
|
||||
case Id_setMilliseconds: return wrap_dbl
|
||||
(jsFunction_setMilliseconds(cx, thisObj, args, f));
|
||||
|
||||
case Id_setUTCMilliseconds: return wrap_dbl(
|
||||
jsFunction_setUTCMilliseconds(cx, thisObj, args, f));
|
||||
|
||||
case Id_setSeconds: return wrap_dbl(
|
||||
jsFunction_setSeconds(cx, thisObj, args, f));
|
||||
|
||||
case Id_setUTCSeconds:return wrap_dbl(
|
||||
jsFunction_setUTCSeconds(cx, thisObj, args, f));
|
||||
|
||||
case Id_setMinutes: return wrap_dbl(
|
||||
jsFunction_setMinutes(cx, thisObj, args, f));
|
||||
|
||||
case Id_setUTCMinutes: return wrap_dbl(
|
||||
jsFunction_setUTCMinutes(cx, thisObj, args, f));
|
||||
|
||||
case Id_setHours: return wrap_dbl(
|
||||
jsFunction_setHours(cx, thisObj, args, f));
|
||||
|
||||
case Id_setUTCHours: return wrap_dbl(
|
||||
jsFunction_setUTCHours(cx, thisObj, args, f));
|
||||
|
||||
case Id_setDate: return wrap_dbl(
|
||||
jsFunction_setDate(cx, thisObj, args, f));
|
||||
|
||||
case Id_setUTCDate: return wrap_dbl(
|
||||
jsFunction_setUTCDate(cx, thisObj, args, f));
|
||||
|
||||
case Id_setMonth: return wrap_dbl(
|
||||
jsFunction_setMonth(cx, thisObj, args, f));
|
||||
|
||||
case Id_setUTCMonth: return wrap_dbl(
|
||||
jsFunction_setUTCMonth(cx, thisObj, args, f));
|
||||
|
||||
case Id_setFullYear: return wrap_dbl(
|
||||
jsFunction_setFullYear(cx, thisObj, args, f));
|
||||
|
||||
case Id_setUTCFullYear: return wrap_dbl(
|
||||
jsFunction_setUTCFullYear(cx, thisObj, args, f));
|
||||
|
||||
case Id_setYear: return wrap_dbl(realThis(thisObj, f, true).
|
||||
jsFunction_setYear(to_dbl(args, 0)));
|
||||
}
|
||||
|
||||
return Scriptable.NOT_FOUND;
|
||||
}
|
||||
|
||||
private NativeDate realThis(Scriptable thisObj, IdFunction f,
|
||||
boolean searchPrototype)
|
||||
{
|
||||
while (!(thisObj instanceof NativeDate)) {
|
||||
thisObj = nextInstanceCheck(thisObj, f, searchPrototype);
|
||||
}
|
||||
return (NativeDate)thisObj;
|
||||
}
|
||||
|
||||
/* ECMA helper functions */
|
||||
|
||||
private static final double HalfTimeDomain = 8.64e15;
|
||||
|
@ -1444,6 +1611,179 @@ public class NativeDate extends ScriptableObject {
|
|||
return this.date;
|
||||
}
|
||||
|
||||
protected int getMaxPrototypeMethodId() { return MAX_PROTOTYPE_METHOD; }
|
||||
|
||||
// #string_id_map#
|
||||
|
||||
protected int mapNameToMethodId(String s) {
|
||||
int id;
|
||||
// #generated# Last update: 2001-03-23 14:55:30 GMT+01:00
|
||||
L0: { id = 0; String X = null; int c;
|
||||
L: switch (s.length()) {
|
||||
case 6: X="getDay";id=Id_getDay; break L;
|
||||
case 7: switch (s.charAt(3)) {
|
||||
case 'D': c=s.charAt(0);
|
||||
if (c=='g') { X="getDate";id=Id_getDate; }
|
||||
else if (c=='s') { X="setDate";id=Id_setDate; }
|
||||
break L;
|
||||
case 'T': c=s.charAt(0);
|
||||
if (c=='g') { X="getTime";id=Id_getTime; }
|
||||
else if (c=='s') { X="setTime";id=Id_setTime; }
|
||||
break L;
|
||||
case 'Y': c=s.charAt(0);
|
||||
if (c=='g') { X="getYear";id=Id_getYear; }
|
||||
else if (c=='s') { X="setYear";id=Id_setYear; }
|
||||
break L;
|
||||
case 'u': X="valueOf";id=Id_valueOf; break L;
|
||||
} break L;
|
||||
case 8: c=s.charAt(0);
|
||||
if (c=='g') {
|
||||
c=s.charAt(7);
|
||||
if (c=='h') { X="getMonth";id=Id_getMonth; }
|
||||
else if (c=='s') { X="getHours";id=Id_getHours; }
|
||||
}
|
||||
else if (c=='s') {
|
||||
c=s.charAt(7);
|
||||
if (c=='h') { X="setMonth";id=Id_setMonth; }
|
||||
else if (c=='s') { X="setHours";id=Id_setHours; }
|
||||
}
|
||||
else if (c=='t') { X="toString";id=Id_toString; }
|
||||
break L;
|
||||
case 9: X="getUTCDay";id=Id_getUTCDay; break L;
|
||||
case 10: c=s.charAt(3);
|
||||
if (c=='M') {
|
||||
c=s.charAt(0);
|
||||
if (c=='g') { X="getMinutes";id=Id_getMinutes; }
|
||||
else if (c=='s') { X="setMinutes";id=Id_setMinutes; }
|
||||
}
|
||||
else if (c=='S') {
|
||||
c=s.charAt(0);
|
||||
if (c=='g') { X="getSeconds";id=Id_getSeconds; }
|
||||
else if (c=='s') { X="setSeconds";id=Id_setSeconds; }
|
||||
}
|
||||
else if (c=='U') {
|
||||
c=s.charAt(0);
|
||||
if (c=='g') { X="getUTCDate";id=Id_getUTCDate; }
|
||||
else if (c=='s') { X="setUTCDate";id=Id_setUTCDate; }
|
||||
}
|
||||
break L;
|
||||
case 11: switch (s.charAt(3)) {
|
||||
case 'F': c=s.charAt(0);
|
||||
if (c=='g') { X="getFullYear";id=Id_getFullYear; }
|
||||
else if (c=='s') { X="setFullYear";id=Id_setFullYear; }
|
||||
break L;
|
||||
case 'M': X="toGMTString";id=Id_toGMTString; break L;
|
||||
case 'T': X="toUTCString";id=Id_toUTCString; break L;
|
||||
case 'U': c=s.charAt(0);
|
||||
if (c=='g') {
|
||||
c=s.charAt(9);
|
||||
if (c=='r') { X="getUTCHours";id=Id_getUTCHours; }
|
||||
else if (c=='t') { X="getUTCMonth";id=Id_getUTCMonth; }
|
||||
}
|
||||
else if (c=='s') {
|
||||
c=s.charAt(9);
|
||||
if (c=='r') { X="setUTCHours";id=Id_setUTCHours; }
|
||||
else if (c=='t') { X="setUTCMonth";id=Id_setUTCMonth; }
|
||||
}
|
||||
break L;
|
||||
} break L;
|
||||
case 12: c=s.charAt(2);
|
||||
if (c=='D') { X="toDateString";id=Id_toDateString; }
|
||||
else if (c=='T') { X="toTimeString";id=Id_toTimeString; }
|
||||
break L;
|
||||
case 13: c=s.charAt(0);
|
||||
if (c=='g') {
|
||||
c=s.charAt(6);
|
||||
if (c=='M') { X="getUTCMinutes";id=Id_getUTCMinutes; }
|
||||
else if (c=='S') { X="getUTCSeconds";id=Id_getUTCSeconds; }
|
||||
}
|
||||
else if (c=='s') {
|
||||
c=s.charAt(6);
|
||||
if (c=='M') { X="setUTCMinutes";id=Id_setUTCMinutes; }
|
||||
else if (c=='S') { X="setUTCSeconds";id=Id_setUTCSeconds; }
|
||||
}
|
||||
break L;
|
||||
case 14: c=s.charAt(0);
|
||||
if (c=='g') { X="getUTCFullYear";id=Id_getUTCFullYear; }
|
||||
else if (c=='s') { X="setUTCFullYear";id=Id_setUTCFullYear; }
|
||||
else if (c=='t') { X="toLocaleString";id=Id_toLocaleString; }
|
||||
break L;
|
||||
case 15: c=s.charAt(0);
|
||||
if (c=='g') { X="getMilliseconds";id=Id_getMilliseconds; }
|
||||
else if (c=='s') { X="setMilliseconds";id=Id_setMilliseconds; }
|
||||
break L;
|
||||
case 17: X="getTimezoneOffset";id=Id_getTimezoneOffset; break L;
|
||||
case 18: c=s.charAt(0);
|
||||
if (c=='g') { X="getUTCMilliseconds";id=Id_getUTCMilliseconds; }
|
||||
else if (c=='s') { X="setUTCMilliseconds";id=Id_setUTCMilliseconds; }
|
||||
else if (c=='t') {
|
||||
c=s.charAt(8);
|
||||
if (c=='D') { X="toLocaleDateString";id=Id_toLocaleDateString; }
|
||||
else if (c=='T') { X="toLocaleTimeString";id=Id_toLocaleTimeString; }
|
||||
}
|
||||
break L;
|
||||
}
|
||||
if (X!=null && X!=s && !X.equals(s)) id = 0;
|
||||
}
|
||||
// #/generated#
|
||||
return id;
|
||||
}
|
||||
|
||||
private static final int
|
||||
ConstructorId_UTC = -2,
|
||||
ConstructorId_parse = -1,
|
||||
|
||||
Id_toString = 1,
|
||||
Id_toTimeString = 2,
|
||||
Id_toDateString = 3,
|
||||
Id_toLocaleString = 4,
|
||||
Id_toLocaleTimeString = 5,
|
||||
Id_toLocaleDateString = 6,
|
||||
Id_toUTCString = 7,
|
||||
Id_valueOf = 8,
|
||||
Id_getTime = 9,
|
||||
Id_getYear = 10,
|
||||
Id_getFullYear = 11,
|
||||
Id_getUTCFullYear = 12,
|
||||
Id_getMonth = 13,
|
||||
Id_getUTCMonth = 14,
|
||||
Id_getDate = 15,
|
||||
Id_getUTCDate = 16,
|
||||
Id_getDay = 17,
|
||||
Id_getUTCDay = 18,
|
||||
Id_getHours = 19,
|
||||
Id_getUTCHours = 20,
|
||||
Id_getMinutes = 21,
|
||||
Id_getUTCMinutes = 22,
|
||||
Id_getSeconds = 23,
|
||||
Id_getUTCSeconds = 24,
|
||||
Id_getMilliseconds = 25,
|
||||
Id_getUTCMilliseconds = 26,
|
||||
Id_getTimezoneOffset = 27,
|
||||
Id_setTime = 28,
|
||||
Id_setMilliseconds = 29,
|
||||
Id_setUTCMilliseconds = 30,
|
||||
Id_setSeconds = 31,
|
||||
Id_setUTCSeconds = 32,
|
||||
Id_setMinutes = 33,
|
||||
Id_setUTCMinutes = 34,
|
||||
Id_setHours = 35,
|
||||
Id_setUTCHours = 36,
|
||||
Id_setDate = 37,
|
||||
Id_setUTCDate = 38,
|
||||
Id_setMonth = 39,
|
||||
Id_setUTCMonth = 40,
|
||||
Id_setFullYear = 41,
|
||||
Id_setUTCFullYear = 42,
|
||||
Id_setYear = 43,
|
||||
|
||||
MAX_PROTOTYPE_METHOD = 43;
|
||||
|
||||
private static final int // Aliases
|
||||
Id_toGMTString = Id_toUTCString;
|
||||
|
||||
// #/string_id_map#
|
||||
|
||||
/* cached values */
|
||||
private static java.util.TimeZone thisTimeZone;
|
||||
private static double LocalTZA;
|
||||
|
|
|
@ -43,31 +43,16 @@ package org.mozilla.javascript;
|
|||
*/
|
||||
|
||||
public class NativeMath extends ScriptableObject
|
||||
implements IdFunction.Master
|
||||
implements IdFunction.Master, ScopeInitializer
|
||||
{
|
||||
|
||||
public static Scriptable init(Scriptable scope) {
|
||||
NativeMath m = new NativeMath();
|
||||
Context cx = Context.getContext();
|
||||
m.scopeInit(cx, scope, false);
|
||||
return m;
|
||||
}
|
||||
|
||||
public NativeMath() { }
|
||||
|
||||
public void scopeInit(Context cx, Scriptable scope, boolean sealed) {
|
||||
setPrototype(getObjectPrototype(scope));
|
||||
setParentScope(scope);
|
||||
if (sealed) {
|
||||
sealObject();
|
||||
}
|
||||
if (scope instanceof ScriptableObject) {
|
||||
((ScriptableObject)scope).defineProperty("Math", this,
|
||||
ScriptableObject.DONTENUM);
|
||||
}
|
||||
else {
|
||||
scope.put("Math", scope, this);
|
||||
}
|
||||
ScriptableObject.defineProperty
|
||||
(scope, "Math", this, ScriptableObject.DONTENUM);
|
||||
}
|
||||
|
||||
public String getClassName() { return "Math"; }
|
||||
|
@ -268,7 +253,8 @@ public class NativeMath extends ScriptableObject
|
|||
for (int i = 0; i < args.length; i++) {
|
||||
double d = ScriptRuntime.toNumber(args[i]);
|
||||
if (d != d) return d;
|
||||
if (result < d) result = d;
|
||||
// if (result < d) result = d; does not work due to -0.0 >= +0.0
|
||||
result = Math.max(result, d);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
@ -280,6 +266,7 @@ public class NativeMath extends ScriptableObject
|
|||
for (int i = 0; i < args.length; i++) {
|
||||
double d = ScriptRuntime.toNumber(args[i]);
|
||||
if (d != d) return d;
|
||||
// if (result > d) result = d; does not work due to -0.0 >= +0.0
|
||||
result = Math.min(result, d);
|
||||
}
|
||||
return result;
|
||||
|
@ -324,64 +311,54 @@ public class NativeMath extends ScriptableObject
|
|||
|
||||
private double js_tan(double x) { return Math.tan(x); }
|
||||
|
||||
private static int nameToId(String s) {
|
||||
int c;
|
||||
int id = 0;
|
||||
String guess = null;
|
||||
L:switch (s.length()) {
|
||||
case 1: if (s.charAt(0)=='E') return Id_E;
|
||||
break L;
|
||||
case 2: if (s.charAt(0)=='P'&&s.charAt(1)=='I') return Id_PI;
|
||||
break L;
|
||||
case 3: switch (s.charAt(0)) {
|
||||
case 'L': if (s.charAt(1)=='N'&&s.charAt(2)=='2') return Id_LN2;
|
||||
break L;
|
||||
case 'a': if (s.charAt(1)=='b'&&s.charAt(2)=='s') return Id_abs;
|
||||
break L;
|
||||
case 'c': if (s.charAt(1)=='o'&&s.charAt(2)=='s') return Id_cos;
|
||||
break L;
|
||||
case 'e': if (s.charAt(1)=='x'&&s.charAt(2)=='p') return Id_exp;
|
||||
break L;
|
||||
case 'l': if (s.charAt(1)=='o'&&s.charAt(2)=='g') return Id_log;
|
||||
break L;
|
||||
case 'm': c=s.charAt(1);
|
||||
if (c=='a') { if (s.charAt(2)=='x') return Id_max; }
|
||||
else if (c=='i') { if (s.charAt(2)=='n') return Id_min; }
|
||||
break L;
|
||||
case 'p': if (s.charAt(1)=='o'&&s.charAt(2)=='w') return Id_pow;
|
||||
break L;
|
||||
case 's': if (s.charAt(1)=='i'&&s.charAt(2)=='n') return Id_sin;
|
||||
break L;
|
||||
case 't': if (s.charAt(1)=='a'&&s.charAt(2)=='n') return Id_tan;
|
||||
break L;
|
||||
}
|
||||
break L;
|
||||
case 4: switch (s.charAt(1)) {
|
||||
case 'N': guess="LN10";id=Id_LN10; break L;
|
||||
case 'c': guess="acos";id=Id_acos; break L;
|
||||
case 's': guess="asin";id=Id_asin; break L;
|
||||
case 't': guess="atan";id=Id_atan; break L;
|
||||
case 'e': guess="ceil";id=Id_ceil; break L;
|
||||
case 'q': guess="sqrt";id=Id_sqrt; break L;
|
||||
}
|
||||
break L;
|
||||
case 5: switch (s.charAt(0)) {
|
||||
case 'S': guess="SQRT2";id=Id_SQRT2; break L;
|
||||
case 'L': guess="LOG2E";id=Id_LOG2E; break L;
|
||||
case 'a': guess="atan2";id=Id_atan2; break L;
|
||||
case 'f': guess="floor";id=Id_floor; break L;
|
||||
case 'r': guess="round";id=Id_round; break L;
|
||||
}
|
||||
break L;
|
||||
case 6: c=s.charAt(0);
|
||||
if (c=='L') { guess="LOG10E";id=Id_LOG10E; }
|
||||
else if (c=='r') { guess="random";id=Id_random; }
|
||||
break L;
|
||||
case 7: guess="SQRT1_2";id=Id_SQRT1_2;
|
||||
break L;
|
||||
}
|
||||
// #string_id_map#
|
||||
|
||||
return (guess != null && s.equals(guess)) ? id : 0;
|
||||
private static int nameToId(String s) {
|
||||
int id;
|
||||
// #generated# Last update: 2001-03-23 13:50:14 GMT+01:00
|
||||
L0: { id = 0; String X = null; int c;
|
||||
L: switch (s.length()) {
|
||||
case 1: if (s.charAt(0)=='E') {id=Id_E; break L0;} break L;
|
||||
case 2: if (s.charAt(0)=='P' && s.charAt(1)=='I') {id=Id_PI; break L0;} break L;
|
||||
case 3: switch (s.charAt(0)) {
|
||||
case 'L': if (s.charAt(2)=='2' && s.charAt(1)=='N') {id=Id_LN2; break L0;} break L;
|
||||
case 'a': if (s.charAt(2)=='s' && s.charAt(1)=='b') {id=Id_abs; break L0;} break L;
|
||||
case 'c': if (s.charAt(2)=='s' && s.charAt(1)=='o') {id=Id_cos; break L0;} break L;
|
||||
case 'e': if (s.charAt(2)=='p' && s.charAt(1)=='x') {id=Id_exp; break L0;} break L;
|
||||
case 'l': if (s.charAt(2)=='g' && s.charAt(1)=='o') {id=Id_log; break L0;} break L;
|
||||
case 'm': c=s.charAt(2);
|
||||
if (c=='n') { if (s.charAt(1)=='i') {id=Id_min; break L0;} }
|
||||
else if (c=='x') { if (s.charAt(1)=='a') {id=Id_max; break L0;} }
|
||||
break L;
|
||||
case 'p': if (s.charAt(2)=='w' && s.charAt(1)=='o') {id=Id_pow; break L0;} break L;
|
||||
case 's': if (s.charAt(2)=='n' && s.charAt(1)=='i') {id=Id_sin; break L0;} break L;
|
||||
case 't': if (s.charAt(2)=='n' && s.charAt(1)=='a') {id=Id_tan; break L0;} break L;
|
||||
} break L;
|
||||
case 4: switch (s.charAt(1)) {
|
||||
case 'N': X="LN10";id=Id_LN10; break L;
|
||||
case 'c': X="acos";id=Id_acos; break L;
|
||||
case 'e': X="ceil";id=Id_ceil; break L;
|
||||
case 'q': X="sqrt";id=Id_sqrt; break L;
|
||||
case 's': X="asin";id=Id_asin; break L;
|
||||
case 't': X="atan";id=Id_atan; break L;
|
||||
} break L;
|
||||
case 5: switch (s.charAt(0)) {
|
||||
case 'L': X="LOG2E";id=Id_LOG2E; break L;
|
||||
case 'S': X="SQRT2";id=Id_SQRT2; break L;
|
||||
case 'a': X="atan2";id=Id_atan2; break L;
|
||||
case 'f': X="floor";id=Id_floor; break L;
|
||||
case 'r': X="round";id=Id_round; break L;
|
||||
} break L;
|
||||
case 6: c=s.charAt(0);
|
||||
if (c=='L') { X="LOG10E";id=Id_LOG10E; }
|
||||
else if (c=='r') { X="random";id=Id_random; }
|
||||
break L;
|
||||
case 7: X="SQRT1_2";id=Id_SQRT1_2; break L;
|
||||
}
|
||||
if (X!=null && X!=s && !X.equals(s)) id = 0;
|
||||
}
|
||||
// #/generated#
|
||||
return id;
|
||||
}
|
||||
|
||||
private static final int
|
||||
|
@ -415,6 +392,8 @@ public class NativeMath extends ScriptableObject
|
|||
Id_SQRT1_2 = 25,
|
||||
Id_SQRT2 = 26;
|
||||
|
||||
// #/string_id_map#
|
||||
|
||||
private static final Double
|
||||
E = new Double(Math.E),
|
||||
PI = new Double(Math.PI),
|
||||
|
|
|
@ -0,0 +1,51 @@
|
|||
/* -*- Mode: java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express oqr
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is Rhino code, released
|
||||
* May 6, 1999.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1997-1999 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Igor Bukanov
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the
|
||||
* terms of the GNU Public License (the "GPL"), in which case the
|
||||
* provisions of the GPL are applicable instead of those above.
|
||||
* If you wish to allow use of your version of this file only
|
||||
* under the terms of the GPL and not to allow others to use your
|
||||
* version of this file under the NPL, indicate your decision by
|
||||
* deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this
|
||||
* file under either the NPL or the GPL.
|
||||
*/
|
||||
|
||||
package org.mozilla.javascript;
|
||||
|
||||
/**
|
||||
* Indicate that implementation instance performs initializations for scope
|
||||
*/
|
||||
|
||||
public interface ScopeInitializer {
|
||||
|
||||
/**
|
||||
* Initialize scope.
|
||||
* If sealed is true, seal any script object added to scope directly
|
||||
* or as a property of some other object.
|
||||
*/
|
||||
public void scopeInit(Context cx, Scriptable scope, boolean sealed);
|
||||
|
||||
}
|
|
@ -606,12 +606,15 @@ public abstract class ScriptableObject implements Scriptable {
|
|||
/**
|
||||
* Defines JavaScript objects from a Java class that implements Scriptable.
|
||||
*
|
||||
* If the given class implements the <code>ScopeInitializer</code>
|
||||
* interface, then its instance is constructed and <code>scopeInit</code>
|
||||
* is called upon it and no further initialization is done.
|
||||
*
|
||||
* If the given class has a method
|
||||
* <pre>
|
||||
* static void init(Scriptable scope);</pre>
|
||||
*
|
||||
* then it is invoked and no further initialization is done and the
|
||||
* result of the invocation will be returned.<p>
|
||||
* then it is invoked and no further initialization is done.<p>
|
||||
*
|
||||
* However, if no such a method is found, then the class's constructors and
|
||||
* methods are used to initialize a class in the following manner.<p>
|
||||
|
@ -737,6 +740,13 @@ public abstract class ScriptableObject implements Scriptable {
|
|||
InvocationTargetException, ClassDefinitionException,
|
||||
PropertyException
|
||||
{
|
||||
if (ScopeInitializerClass.isAssignableFrom(clazz)) {
|
||||
ScopeInitializer setup = (ScopeInitializer)clazz.newInstance();
|
||||
Context cx = Context.getContext();
|
||||
setup.scopeInit(cx, scope, sealed);
|
||||
return;
|
||||
}
|
||||
|
||||
Method[] methods = FunctionObject.getMethodList(clazz);
|
||||
for (int i=0; i < methods.length; i++) {
|
||||
if (!methods[i].getName().equals("init"))
|
||||
|
@ -981,11 +991,7 @@ public abstract class ScriptableObject implements Scriptable {
|
|||
Scriptable dest = prefix == staticFunctionPrefix
|
||||
? ctor
|
||||
: proto;
|
||||
if (dest instanceof ScriptableObject) {
|
||||
((ScriptableObject) dest).defineProperty(name, f, DONTENUM);
|
||||
} else {
|
||||
dest.put(name, dest, f);
|
||||
}
|
||||
defineProperty(dest, name, f, DONTENUM);
|
||||
if (sealed) {
|
||||
f.sealObject();
|
||||
f.addPropertyAttribute(READONLY);
|
||||
|
@ -1030,6 +1036,25 @@ public abstract class ScriptableObject implements Scriptable {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility method to add properties to arbitrary Scriptable object.
|
||||
* If destination is instance of ScriptableObject, calls
|
||||
* defineProperty there, otherwise calls put in destination
|
||||
* ignoring attributes
|
||||
*/
|
||||
public static void defineProperty(Scriptable destination,
|
||||
String propertyName, Object value,
|
||||
int attributes)
|
||||
{
|
||||
if (destination instanceof ScriptableObject) {
|
||||
ScriptableObject obj = (ScriptableObject)destination;
|
||||
obj.defineProperty(propertyName, value, attributes);
|
||||
}
|
||||
else {
|
||||
destination.put(propertyName, destination, value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Define a JavaScript property with getter and setter side effects.
|
||||
*
|
||||
|
@ -1762,4 +1787,5 @@ public abstract class ScriptableObject implements Scriptable {
|
|||
boolean setterReturnsValue;
|
||||
}
|
||||
|
||||
private static final Class ScopeInitializerClass = ScopeInitializer.class;
|
||||
}
|
||||
|
|
|
@ -71,6 +71,12 @@ public class ToolErrorReporter implements ErrorReporter {
|
|||
return getMessage(messageId, args);
|
||||
}
|
||||
|
||||
public static String getMessage(String messageId, Object arg1, Object arg2)
|
||||
{
|
||||
Object[] args = { arg1, arg2 };
|
||||
return getMessage(messageId, args);
|
||||
}
|
||||
|
||||
public static String getMessage(String messageId, Object[] args) {
|
||||
Context cx = Context.getCurrentContext();
|
||||
Locale locale = cx == null ? Locale.getDefault() : cx.getLocale();
|
||||
|
|
Загрузка…
Ссылка в новой задаче