Add Igor's changes to make generation of id strings by tool.

This commit is contained in:
nboyd%atg.com 2001-04-10 13:20:02 +00:00
Родитель f8787df377
Коммит 64bdadc1e0
10 изменённых файлов: 1086 добавлений и 282 удалений

Просмотреть файл

@ -18,7 +18,7 @@
* Copyright (C) 1997-1999 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
* Contributor(s):
* Norris Boyd
* Mike McCabe
*
@ -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;
@ -293,7 +460,7 @@ public class NativeDate extends ScriptableObject {
if (d <= (next += 30))
return d - step;
step = next;
return d - step;
}
@ -336,7 +503,7 @@ public class NativeDate extends ScriptableObject {
// Hardcode the assumption that the changeover always
// happens at 2:00 AM:
t += LocalTZA + (HourFromTime(t) <= 2 ? msPerHour : 0);
int year = YearFromTime(t);
double offset = thisTimeZone.getOffset(year > 0 ? 1 : 0,
year,
@ -344,12 +511,12 @@ public class NativeDate extends ScriptableObject {
DateFromTime(t),
WeekDay(t),
(int)TimeWithinDay(t));
if ((offset - LocalTZA) != 0)
return msPerHour;
else
return 0;
// return offset - LocalTZA;
// return offset - LocalTZA;
}
}
@ -798,7 +965,7 @@ public class NativeDate extends ScriptableObject {
for (int i = offsetStr.length(); i < 4; i++)
result.append("0");
result.append(offsetStr);
if (timeZoneFormatter == null)
timeZoneFormatter = new java.text.SimpleDateFormat("zzz");
@ -824,7 +991,7 @@ public class NativeDate extends ScriptableObject {
}
/* the javascript constructor */
public static Object jsConstructor(Context cx, Object[] args,
public static Object jsConstructor(Context cx, Object[] args,
Function ctorObj, boolean inNewExpr)
{
// if called as a function, just return a string
@ -844,7 +1011,7 @@ public class NativeDate extends ScriptableObject {
// if called with just one arg -
if (args.length == 1) {
double date;
if (args[0] instanceof Scriptable)
if (args[0] instanceof Scriptable)
args[0] = ((Scriptable) args[0]).getDefaultValue(null);
if (!(args[0] instanceof String)) {
// if it's not a string, use it as a millisecond date
@ -924,7 +1091,7 @@ public class NativeDate extends ScriptableObject {
{
if (t != t)
return js_NaN_date_str;
java.util.Date tempdate = new Date((long) t);
return formatter.format(tempdate);
}
@ -940,7 +1107,7 @@ public class NativeDate extends ScriptableObject {
public String jsFunction_toLocaleTimeString() {
if (localeTimeFormatter == null)
localeTimeFormatter = DateFormat.getTimeInstance(DateFormat.LONG);
return toLocale_helper(this.date, localeTimeFormatter);
}
@ -1145,7 +1312,7 @@ public class NativeDate extends ScriptableObject {
this.date = TimeClip(time);
return this.date;
}
private static NativeDate checkInstance(Scriptable obj,
Function funObj) {
if (obj == null || !(obj instanceof NativeDate)) {
@ -1154,7 +1321,7 @@ public class NativeDate extends ScriptableObject {
}
return (NativeDate) obj;
}
private static double makeTime(Scriptable dateObj, Object[] args,
int maxargs, boolean local,
Function funObj)
@ -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
@ -414,6 +391,8 @@ public class NativeMath extends ScriptableObject
Id_LOG10E = 24,
Id_SQRT1_2 = 25,
Id_SQRT2 = 26;
// #/string_id_map#
private static final Double
E = new Double(Math.E),

Просмотреть файл

@ -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();

Просмотреть файл

@ -18,7 +18,7 @@
* Copyright (C) 1997-1999 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
* Contributor(s):
* Norris Boyd
* Mike McCabe
*
@ -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;
@ -293,7 +460,7 @@ public class NativeDate extends ScriptableObject {
if (d <= (next += 30))
return d - step;
step = next;
return d - step;
}
@ -336,7 +503,7 @@ public class NativeDate extends ScriptableObject {
// Hardcode the assumption that the changeover always
// happens at 2:00 AM:
t += LocalTZA + (HourFromTime(t) <= 2 ? msPerHour : 0);
int year = YearFromTime(t);
double offset = thisTimeZone.getOffset(year > 0 ? 1 : 0,
year,
@ -344,12 +511,12 @@ public class NativeDate extends ScriptableObject {
DateFromTime(t),
WeekDay(t),
(int)TimeWithinDay(t));
if ((offset - LocalTZA) != 0)
return msPerHour;
else
return 0;
// return offset - LocalTZA;
// return offset - LocalTZA;
}
}
@ -798,7 +965,7 @@ public class NativeDate extends ScriptableObject {
for (int i = offsetStr.length(); i < 4; i++)
result.append("0");
result.append(offsetStr);
if (timeZoneFormatter == null)
timeZoneFormatter = new java.text.SimpleDateFormat("zzz");
@ -824,7 +991,7 @@ public class NativeDate extends ScriptableObject {
}
/* the javascript constructor */
public static Object jsConstructor(Context cx, Object[] args,
public static Object jsConstructor(Context cx, Object[] args,
Function ctorObj, boolean inNewExpr)
{
// if called as a function, just return a string
@ -844,7 +1011,7 @@ public class NativeDate extends ScriptableObject {
// if called with just one arg -
if (args.length == 1) {
double date;
if (args[0] instanceof Scriptable)
if (args[0] instanceof Scriptable)
args[0] = ((Scriptable) args[0]).getDefaultValue(null);
if (!(args[0] instanceof String)) {
// if it's not a string, use it as a millisecond date
@ -924,7 +1091,7 @@ public class NativeDate extends ScriptableObject {
{
if (t != t)
return js_NaN_date_str;
java.util.Date tempdate = new Date((long) t);
return formatter.format(tempdate);
}
@ -940,7 +1107,7 @@ public class NativeDate extends ScriptableObject {
public String jsFunction_toLocaleTimeString() {
if (localeTimeFormatter == null)
localeTimeFormatter = DateFormat.getTimeInstance(DateFormat.LONG);
return toLocale_helper(this.date, localeTimeFormatter);
}
@ -1145,7 +1312,7 @@ public class NativeDate extends ScriptableObject {
this.date = TimeClip(time);
return this.date;
}
private static NativeDate checkInstance(Scriptable obj,
Function funObj) {
if (obj == null || !(obj instanceof NativeDate)) {
@ -1154,7 +1321,7 @@ public class NativeDate extends ScriptableObject {
}
return (NativeDate) obj;
}
private static double makeTime(Scriptable dateObj, Object[] args,
int maxargs, boolean local,
Function funObj)
@ -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
@ -414,6 +391,8 @@ public class NativeMath extends ScriptableObject
Id_LOG10E = 24,
Id_SQRT1_2 = 25,
Id_SQRT2 = 26;
// #/string_id_map#
private static final Double
E = new Double(Math.E),

Просмотреть файл

@ -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();