More optimizations to shrink code size.

git-svn-id: svn://10.0.0.236/trunk@147888 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
igor%mir2.org
2003-10-12 08:52:24 +00:00
parent d3a50c3ec7
commit ed628e2cd9
5 changed files with 263 additions and 324 deletions

View File

@@ -175,17 +175,22 @@ public class BaseFunction extends IdScriptable implements Function {
{
if (prototypeFlag) {
switch (methodId) {
case Id_constructor:
return jsConstructor(cx, scope, args);
case Id_constructor:
return jsConstructor(cx, scope, args);
case Id_toString:
return js_toString(cx, thisObj, args);
case Id_toString: {
int indent = ScriptRuntime.toInt32(args, 0);
Object x = thisObj.getDefaultValue(ScriptRuntime.FunctionClass);
if (x instanceof BaseFunction) {
return ((BaseFunction)x).decompile(cx, indent, false);
}
throw ScriptRuntime.typeError1("msg.incompat.call", "toString");
}
case Id_apply:
return applyOrCall(true, cx, scope, thisObj, args);
case Id_call:
return applyOrCall(false, cx, scope, thisObj, args);
case Id_apply:
case Id_call:
return applyOrCall(methodId == Id_apply, cx, scope,
thisObj, args);
}
}
return super.execMethod(methodId, f, cx, scope, thisObj, args);
@@ -426,17 +431,6 @@ public class BaseFunction extends IdScriptable implements Function {
return fn;
}
private static Object js_toString(Context cx, Scriptable thisObj,
Object[] args)
{
int indent = ScriptRuntime.toInt32(args, 0);
Object val = thisObj.getDefaultValue(ScriptRuntime.FunctionClass);
if (val instanceof BaseFunction) {
return ((BaseFunction)val).decompile(cx, indent, false);
}
throw ScriptRuntime.typeError1("msg.incompat.call", "toString");
}
/**
* Function.prototype.apply and Function.prototype.call
*

View File

@@ -90,20 +90,20 @@ final class NativeBoolean extends IdScriptable {
// Boolean(val) converts val to a boolean.
return wrap_boolean(b);
} else if (methodId == Id_toString) {
return realThis(thisObj, f).booleanValue ? "true" : "false";
return realThisBoolean(thisObj, f) ? "true" : "false";
} else if (methodId == Id_valueOf) {
return wrap_boolean(realThis(thisObj, f).booleanValue);
return wrap_boolean(realThisBoolean(thisObj, f));
}
}
return super.execMethod(methodId, f, cx, scope, thisObj, args);
}
private static NativeBoolean realThis(Scriptable thisObj, IdFunction f)
private static boolean realThisBoolean(Scriptable thisObj, IdFunction f)
{
if (!(thisObj instanceof NativeBoolean))
throw incompatibleCallError(f);
return (NativeBoolean)thisObj;
return ((NativeBoolean)thisObj).booleanValue;
}
protected String getIdName(int id) {

View File

@@ -159,37 +159,26 @@ final class NativeDate extends IdScriptable {
return wrap_double(date_parseString
(ScriptRuntime.toString(args, 0)));
case Id_constructor:
return jsConstructor(args, thisObj == null);
case Id_toString: {
double t = realThis(thisObj, f).date;
return date_format(t, FORMATSPEC_FULL);
}
case Id_toTimeString: {
double t = realThis(thisObj, f).date;
return date_format(t, FORMATSPEC_TIME);
case Id_constructor: {
// if called as a function, just return a string
// representing the current time.
if (thisObj != null)
return date_format(Now(), Id_toString);
return jsConstructor(args);
}
case Id_toString:
case Id_toTimeString:
case Id_toDateString: {
double t = realThis(thisObj, f).date;
return date_format(t, FORMATSPEC_DATE);
}
case Id_toLocaleString: {
double t = realThis(thisObj, f).date;
return js_toLocaleString(t);
}
case Id_toLocaleTimeString: {
double t = realThis(thisObj, f).date;
return js_toLocaleTimeString(t);
return date_format(t, methodId);
}
case Id_toLocaleString:
case Id_toLocaleTimeString:
case Id_toLocaleDateString: {
double t = realThis(thisObj, f).date;
return js_toLocaleDateString(t);
return toLocale_helper(t, methodId);
}
case Id_toUTCString: {
@@ -199,178 +188,143 @@ final class NativeDate extends IdScriptable {
}
case Id_valueOf:
return wrap_double(realThis(thisObj, f).date);
case Id_getTime:
return wrap_double(realThis(thisObj, f).date);
case Id_getYear: {
double t = realThis(thisObj, f).date;
if (t == t) { t = js_getYear(cx, t); }
return wrap_double(t);
}
case Id_getFullYear: {
double t = realThis(thisObj, f).date;
if (t == t) { t = YearFromTime(LocalTime(t)); }
return wrap_double(t);
}
case Id_getYear:
case Id_getFullYear:
case Id_getUTCFullYear: {
double t = realThis(thisObj, f).date;
if (t == t) { t = YearFromTime(t); }
return wrap_double(t);
}
case Id_getMonth: {
double t = realThis(thisObj, f).date;
if (t == t) { t = MonthFromTime(LocalTime(t)); }
if (t == t) {
if (methodId != Id_getUTCFullYear)
t = LocalTime(t);
t = YearFromTime(t);
if (methodId == Id_getYear) {
if (cx.hasFeature(
Context.FEATURE_NON_ECMA_GET_YEAR))
{
if (1900 <= t && t < 2000) {
t -= 1900;
}
} else {
t -= 1900;
}
}
}
return wrap_double(t);
}
case Id_getMonth:
case Id_getUTCMonth: {
double t = realThis(thisObj, f).date;
if (t == t) { t = MonthFromTime(t); }
return wrap_double(t);
}
case Id_getDate: {
double t = realThis(thisObj, f).date;
if (t == t) { t = DateFromTime(LocalTime(t)); }
if (t == t) {
if (methodId == Id_getMonth)
t = LocalTime(t);
t = MonthFromTime(t);
}
return wrap_double(t);
}
case Id_getDate:
case Id_getUTCDate: {
double t = realThis(thisObj, f).date;
if (t == t) { t = DateFromTime(t); }
return wrap_double(t);
}
case Id_getDay: {
double t = realThis(thisObj, f).date;
if (t == t) { t = WeekDay(LocalTime(t)); }
if (t == t) {
if (methodId == Id_getDate)
t = LocalTime(t);
t = DateFromTime(t);
}
return wrap_double(t);
}
case Id_getDay:
case Id_getUTCDay: {
double t = realThis(thisObj, f).date;
if (t == t) { t = WeekDay(t); }
return wrap_double(t);
}
case Id_getHours: {
double t = realThis(thisObj, f).date;
if (t == t) { t = HourFromTime(LocalTime(t)); }
if (t == t) {
if (methodId == Id_getDay)
t = LocalTime(t);
t = WeekDay(t);
}
return wrap_double(t);
}
case Id_getHours:
case Id_getUTCHours: {
double t = realThis(thisObj, f).date;
if (t == t) { t = HourFromTime(t); }
return wrap_double(t);
}
case Id_getMinutes: {
double t = realThis(thisObj, f).date;
if (t == t) { t = MinFromTime(LocalTime(t)); }
if (t == t) {
if (methodId == Id_getHours)
t = LocalTime(t);
t = HourFromTime(t);
}
return wrap_double(t);
}
case Id_getMinutes:
case Id_getUTCMinutes: {
double t = realThis(thisObj, f).date;
if (t == t) { t = MinFromTime(t); }
return wrap_double(t);
}
case Id_getSeconds: {
double t = realThis(thisObj, f).date;
if (t == t) { t = SecFromTime(LocalTime(t)); }
if (t == t) {
if (methodId == Id_getMinutes)
t = LocalTime(t);
t = MinFromTime(t);
}
return wrap_double(t);
}
case Id_getSeconds:
case Id_getUTCSeconds: {
double t = realThis(thisObj, f).date;
if (t == t) { t = SecFromTime(t); }
return wrap_double(t);
}
case Id_getMilliseconds: {
double t = realThis(thisObj, f).date;
if (t == t) { t = msFromTime(LocalTime(t)); }
if (t == t) {
if (methodId == Id_getSeconds)
t = LocalTime(t);
t = SecFromTime(t);
}
return wrap_double(t);
}
case Id_getMilliseconds:
case Id_getUTCMilliseconds: {
double t = realThis(thisObj, f).date;
if (t == t) { t = msFromTime(t); }
if (t == t) {
if (methodId == Id_getMilliseconds)
t = LocalTime(t);
t = msFromTime(t);
}
return wrap_double(t);
}
case Id_getTimezoneOffset: {
double t = realThis(thisObj, f).date;
if (t == t) { t = js_getTimezoneOffset(t); }
if (t == t) {
t = (t - LocalTime(t)) / msPerMinute;
}
return wrap_double(t);
}
case Id_setTime:
return wrap_double(realThis(thisObj, f).
js_setTime(ScriptRuntime.toNumber(args, 0)));
case Id_setTime: {
NativeDate real = realThis(thisObj, f);
double t = ScriptRuntime.toNumber(args, 0);
real.date = TimeClip(t);
return wrap_double(real.date);
}
case Id_setMilliseconds:
return wrap_double(realThis(thisObj, f).
makeTime(args, 1, true));
case Id_setUTCMilliseconds:
return wrap_double(realThis(thisObj, f).
makeTime(args, 1, false));
case Id_setSeconds:
return wrap_double(realThis(thisObj, f).
makeTime(args, 2, true));
case Id_setUTCSeconds:
return wrap_double(realThis(thisObj, f).
makeTime(args, 2, false));
case Id_setMinutes:
return wrap_double(realThis(thisObj, f).
makeTime(args, 3, true));
case Id_setUTCMinutes:
return wrap_double(realThis(thisObj, f).
makeTime(args, 3, false));
case Id_setHours:
return wrap_double(realThis(thisObj, f).
makeTime(args, 4, true));
case Id_setUTCHours:
return wrap_double(realThis(thisObj, f).
makeTime(args, 4, false));
return wrap_double(
realThis(thisObj, f).makeTime(args, methodId));
case Id_setDate:
return wrap_double(realThis(thisObj, f).
makeDate(args, 1, true));
case Id_setUTCDate:
return wrap_double(realThis(thisObj, f).
makeDate(args, 1, false));
case Id_setMonth:
return wrap_double(realThis(thisObj, f).
makeDate(args, 2, true));
case Id_setUTCMonth:
return wrap_double(realThis(thisObj, f).
makeDate(args, 2, false));
case Id_setFullYear:
return wrap_double(realThis(thisObj, f).
makeDate(args, 3, true));
case Id_setUTCFullYear:
return wrap_double(realThis(thisObj, f).
makeDate(args, 3, false));
return wrap_double(
realThis(thisObj, f).makeDate(args, methodId));
case Id_setYear:
return wrap_double(realThis(thisObj, f).
@@ -982,11 +936,7 @@ final class NativeDate extends IdScriptable {
}
}
private static final int FORMATSPEC_FULL = 0;
private static final int FORMATSPEC_DATE = 1;
private static final int FORMATSPEC_TIME = 2;
private static String date_format(double t, int format) {
private static String date_format(double t, int methodId) {
if (t != t)
return js_NaN_date_str;
@@ -997,7 +947,7 @@ final class NativeDate extends IdScriptable {
/* Tue Oct 31 2000 */
/* 09:41:40 GMT-0800 (PST) */
if (format != FORMATSPEC_TIME) {
if (methodId != Id_toTimeString) {
appendWeekDayName(result, WeekDay(local));
result.append(' ');
appendMonthName(result, MonthFromTime(local));
@@ -1010,11 +960,11 @@ final class NativeDate extends IdScriptable {
year = -year;
}
append0PaddedUint(result, year, 4);
if (format != FORMATSPEC_DATE)
if (methodId != Id_toDateString)
result.append(' ');
}
if (format != FORMATSPEC_DATE) {
if (methodId != Id_toDateString) {
append0PaddedUint(result, HourFromTime(local), 2);
result.append(':');
append0PaddedUint(result, MinFromTime(local), 2);
@@ -1049,12 +999,8 @@ final class NativeDate extends IdScriptable {
}
/* the javascript constructor */
private static Object jsConstructor(Object[] args, boolean inNewExpr) {
// if called as a function, just return a string
// representing the current time.
if (!inNewExpr)
return date_format(Now(), FORMATSPEC_FULL);
private static Object jsConstructor(Object[] args)
{
NativeDate obj = new NativeDate();
// if called as a constructor with no args,
@@ -1121,37 +1067,39 @@ final class NativeDate extends IdScriptable {
/* constants for toString, toUTCString */
private static final String js_NaN_date_str = "Invalid Date";
private static String toLocale_helper(double t,
java.text.DateFormat formatter)
private static String toLocale_helper(double t, int methodId)
{
if (t != t)
return js_NaN_date_str;
java.util.Date tempdate = new Date((long) t);
return formatter.format(tempdate);
}
private static String js_toLocaleString(double date) {
if (localeDateTimeFormatter == null) {
localeDateTimeFormatter =
DateFormat.getDateTimeInstance(DateFormat.LONG,
DateFormat.LONG);
java.text.DateFormat formatter;
switch (methodId) {
case Id_toLocaleString:
if (localeDateTimeFormatter == null) {
localeDateTimeFormatter
= DateFormat.getDateTimeInstance(DateFormat.LONG,
DateFormat.LONG);
}
formatter = localeDateTimeFormatter;
break;
case Id_toLocaleTimeString:
if (localeTimeFormatter == null) {
localeTimeFormatter
= DateFormat.getTimeInstance(DateFormat.LONG);
}
formatter = localeTimeFormatter;
break;
case Id_toLocaleDateString:
if (localeDateFormatter == null) {
localeDateFormatter
= DateFormat.getDateInstance(DateFormat.LONG);
}
formatter = localeDateFormatter;
break;
default: formatter = null; // unreachable
}
return toLocale_helper(date, localeDateTimeFormatter);
}
private static String js_toLocaleTimeString(double date) {
if (localeTimeFormatter == null)
localeTimeFormatter = DateFormat.getTimeInstance(DateFormat.LONG);
return toLocale_helper(date, localeTimeFormatter);
}
private static String js_toLocaleDateString(double date) {
if (localeDateFormatter == null)
localeDateFormatter = DateFormat.getDateInstance(DateFormat.LONG);
return toLocale_helper(date, localeDateFormatter);
return formatter.format(new Date((long) t));
}
private static String js_toUTCString(double date) {
@@ -1231,31 +1179,44 @@ final class NativeDate extends IdScriptable {
}
}
private static double js_getYear(Context cx, double date) {
private double makeTime(Object[] args, int methodId)
{
int maxargs;
boolean local = true;
switch (methodId) {
case Id_setUTCMilliseconds:
local = false;
// fallthrough
case Id_setMilliseconds:
maxargs = 1;
break;
int result = YearFromTime(LocalTime(date));
case Id_setUTCSeconds:
local = false;
// fallthrough
case Id_setSeconds:
maxargs = 2;
break;
if (cx.hasFeature(Context.FEATURE_NON_ECMA_GET_YEAR)) {
if (result >= 1900 && result < 2000) {
result -= 1900;
}
case Id_setUTCMinutes:
local = false;
// fallthrough
case Id_setMinutes:
maxargs = 3;
break;
case Id_setUTCHours:
local = false;
// fallthrough
case Id_setHours:
maxargs = 4;
break;
default:
Context.codeBug();
maxargs = 0;
}
else {
result -= 1900;
}
return result;
}
private static double js_getTimezoneOffset(double date) {
return (date - LocalTime(date)) / msPerMinute;
}
private double js_setTime(double time) {
this.date = TimeClip(time);
return this.date;
}
private double makeTime(Object[] args, int maxargs, boolean local) {
int i;
double conv[] = new double[4];
double hour, min, sec, msec;
@@ -1331,15 +1292,37 @@ final class NativeDate extends IdScriptable {
return date;
}
private double js_setHours(Object[] args) {
return makeTime(args, 4, true);
}
private double makeDate(Object[] args, int methodId)
{
int maxargs;
boolean local = true;
switch (methodId) {
case Id_setUTCDate:
local = false;
// fallthrough
case Id_setDate:
maxargs = 1;
break;
private double js_setUTCHours(Object[] args) {
return makeTime(args, 4, false);
}
case Id_setUTCMonth:
local = false;
// fallthrough
case Id_setMonth:
maxargs = 2;
break;
case Id_setUTCFullYear:
local = false;
// fallthrough
case Id_setFullYear:
maxargs = 3;
break;
default:
Context.codeBug();
maxargs = 0;
}
private double makeDate(Object[] args, int maxargs, boolean local) {
int i;
double conv[] = new double[3];
double year, month, day;

View File

@@ -173,11 +173,22 @@ final class NativeMath extends IdScriptable
break;
case Id_max:
x = js_max(args);
break;
case Id_min:
x = js_min(args);
x = (methodId == Id_max)
? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY;
for (int i = 0; i != args.length; ++i) {
double d = ScriptRuntime.toNumber(args[i]);
if (d != d) {
x = d; // NaN
break;
}
if (methodId == Id_max) {
// if (x < d) x = d; does not work due to -0.0 >= +0.0
x = Math.max(x, d);
} else {
x = Math.min(x, d);
}
}
break;
case Id_pow:
@@ -232,32 +243,6 @@ final class NativeMath extends IdScriptable
return wrap_double(x);
}
private double js_max(Object[] args) {
double result = Double.NEGATIVE_INFINITY;
if (args.length == 0)
return result;
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.max(result, d);
}
return result;
}
private double js_min(Object[] args) {
double result = Double.POSITIVE_INFINITY;
if (args.length == 0)
return result;
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;
}
// See Ecma 15.8.2.13
private double js_pow(double x, double y) {
double result;

View File

@@ -91,47 +91,68 @@ final class NativeObjectPrototype extends NativeObject
throws JavaScriptException
{
switch (methodId) {
case Id_constructor:
return jsConstructor(cx, args, f, thisObj == null);
case Id_constructor: {
if (thisObj != null) {
// BaseFunction.construct will set up parent, proto
return f.construct(cx, scope, args);
}
if (args.length == 0 || args[0] == null
|| args[0] == Undefined.instance)
{
return new NativeObject();
}
return ScriptRuntime.toObject(cx, scope, args[0]);
}
case Id_toString:
return js_toString(cx, thisObj);
case Id_toLocaleString:
// Not supported
case Id_toLocaleString: /* For now just alias toString */
return js_toString(cx, thisObj);
case Id_valueOf:
return thisObj;
case Id_hasOwnProperty:
return js_hasOwnProperty(thisObj, args);
case Id_hasOwnProperty: {
if (args.length != 0) {
String property = ScriptRuntime.toString(args[0]);
if (thisObj.has(property, thisObj))
return Boolean.TRUE;
}
return Boolean.FALSE;
}
case Id_propertyIsEnumerable:
return js_propertyIsEnumerable(cx, thisObj, args);
case Id_propertyIsEnumerable: {
if (args.length != 0) {
String name = ScriptRuntime.toString(args[0]);
if (thisObj.has(name, thisObj)) {
if (thisObj instanceof ScriptableObject) {
ScriptableObject so = (ScriptableObject)thisObj;
try {
int a = so.getAttributes(name, thisObj);
if ((a & ScriptableObject.DONTENUM) == 0) {
return Boolean.TRUE;
}
} catch (PropertyException x) { }
}
}
}
return Boolean.FALSE;
}
case Id_isPrototypeOf:
return js_isPrototypeOf(cx, thisObj, args);
case Id_isPrototypeOf: {
if (args.length != 0 && args[0] instanceof Scriptable) {
Scriptable v = (Scriptable) args[0];
do {
v = v.getPrototype();
if (v == thisObj)
return Boolean.TRUE;
} while (v != null);
}
return Boolean.FALSE;
}
}
return super.execMethod(methodId, f, cx, scope, thisObj, args);
}
private static Object jsConstructor(Context cx, Object[] args,
Function ctorObj, boolean inNewExpr)
throws JavaScriptException
{
if (!inNewExpr) {
// FunctionObject.construct will set up parent, proto
return ctorObj.construct(cx, ctorObj.getParentScope(), args);
}
if (args.length == 0 || args[0] == null
|| args[0] == Undefined.instance)
{
return new NativeObject();
}
return ScriptRuntime.toObject(cx, ctorObj.getParentScope(), args[0]);
}
static String toString(Scriptable thisObj)
{
Context cx = Context.getCurrentContext();
@@ -199,50 +220,6 @@ final class NativeObjectPrototype extends NativeObject
return result.toString();
}
private static Object js_hasOwnProperty(Scriptable thisObj, Object[] args)
{
if (args.length != 0) {
if (thisObj.has(ScriptRuntime.toString(args[0]), thisObj))
return Boolean.TRUE;
}
return Boolean.FALSE;
}
private static Object js_propertyIsEnumerable(Context cx,
Scriptable thisObj,
Object[] args)
{
if (args.length != 0) {
String name = ScriptRuntime.toString(args[0]);
if (thisObj.has(name, thisObj)) {
if (thisObj instanceof ScriptableObject) {
ScriptableObject so = (ScriptableObject)thisObj;
try {
int a = so.getAttributes(name, thisObj);
if ((a & ScriptableObject.DONTENUM) == 0) {
return Boolean.TRUE;
}
} catch (PropertyException x) { }
}
}
}
return Boolean.FALSE;
}
private static Object js_isPrototypeOf(Context cx, Scriptable thisObj,
Object[] args)
{
if (args.length != 0 && args[0] instanceof Scriptable) {
Scriptable v = (Scriptable) args[0];
do {
v = v.getPrototype();
if (v == thisObj)
return Boolean.TRUE;
} while (v != null);
}
return Boolean.FALSE;
}
protected String getIdName(int id)
{
switch (id) {