src/jdk/nashorn/internal/objects/NativeMath.java

Wed, 05 Jun 2013 12:17:10 +0200

author
attila
date
Wed, 05 Jun 2013 12:17:10 +0200
changeset 325
9374c04f38fe
parent 301
f69e76417211
child 380
80c66d3fd872
permissions
-rw-r--r--

8015961: Several small code-gardening fixes
Reviewed-by: lagergren, sundar

jlaskey@3 1 /*
jlaskey@7 2 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
jlaskey@3 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
jlaskey@3 4 *
jlaskey@3 5 * This code is free software; you can redistribute it and/or modify it
jlaskey@3 6 * under the terms of the GNU General Public License version 2 only, as
jlaskey@3 7 * published by the Free Software Foundation. Oracle designates this
jlaskey@3 8 * particular file as subject to the "Classpath" exception as provided
jlaskey@3 9 * by Oracle in the LICENSE file that accompanied this code.
jlaskey@3 10 *
jlaskey@3 11 * This code is distributed in the hope that it will be useful, but WITHOUT
jlaskey@3 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
jlaskey@3 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
jlaskey@3 14 * version 2 for more details (a copy is included in the LICENSE file that
jlaskey@3 15 * accompanied this code).
jlaskey@3 16 *
jlaskey@3 17 * You should have received a copy of the GNU General Public License version
jlaskey@3 18 * 2 along with this work; if not, write to the Free Software Foundation,
jlaskey@3 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
jlaskey@3 20 *
jlaskey@3 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
jlaskey@3 22 * or visit www.oracle.com if you need additional information or have any
jlaskey@3 23 * questions.
jlaskey@3 24 */
jlaskey@3 25
jlaskey@3 26 package jdk.nashorn.internal.objects;
jlaskey@3 27
jlaskey@3 28 import jdk.nashorn.internal.objects.annotations.Attribute;
jlaskey@3 29 import jdk.nashorn.internal.objects.annotations.Function;
jlaskey@3 30 import jdk.nashorn.internal.objects.annotations.Property;
jlaskey@3 31 import jdk.nashorn.internal.objects.annotations.ScriptClass;
jlaskey@3 32 import jdk.nashorn.internal.objects.annotations.SpecializedFunction;
jlaskey@3 33 import jdk.nashorn.internal.objects.annotations.Where;
jlaskey@3 34 import jdk.nashorn.internal.runtime.JSType;
jlaskey@3 35 import jdk.nashorn.internal.runtime.ScriptObject;
jlaskey@3 36
jlaskey@3 37 /**
jlaskey@3 38 * ECMA 15.8 The Math Object
jlaskey@3 39 *
jlaskey@3 40 */
jlaskey@3 41 @ScriptClass("Math")
jlaskey@3 42 public final class NativeMath extends ScriptObject {
jlaskey@3 43
jlaskey@3 44 NativeMath() {
jlaskey@3 45 this.setProto(Global.objectPrototype());
jlaskey@3 46 }
jlaskey@3 47
jlaskey@3 48 /** ECMA 15.8.1.1 - E, always a double constant. Not writable or configurable */
jlaskey@3 49 @Property(attributes = Attribute.NON_ENUMERABLE_CONSTANT, where = Where.CONSTRUCTOR)
jlaskey@3 50 public static final double E = Math.E;
jlaskey@3 51
jlaskey@3 52 /** ECMA 15.8.1.2 - LN10, always a double constant. Not writable or configurable */
jlaskey@3 53 @Property(attributes = Attribute.NON_ENUMERABLE_CONSTANT, where = Where.CONSTRUCTOR)
jlaskey@3 54 public static final double LN10 = 2.302585092994046;
jlaskey@3 55
jlaskey@3 56 /** ECMA 15.8.1.3 - LN2, always a double constant. Not writable or configurable */
jlaskey@3 57 @Property(attributes = Attribute.NON_ENUMERABLE_CONSTANT, where = Where.CONSTRUCTOR)
jlaskey@3 58 public static final double LN2 = 0.6931471805599453;
jlaskey@3 59
jlaskey@3 60 /** ECMA 15.8.1.4 - LOG2E, always a double constant. Not writable or configurable */
jlaskey@3 61 @Property(attributes = Attribute.NON_ENUMERABLE_CONSTANT, where = Where.CONSTRUCTOR)
jlaskey@3 62 public static final double LOG2E = 1.4426950408889634;
jlaskey@3 63
jlaskey@3 64 /** ECMA 15.8.1.5 - LOG10E, always a double constant. Not writable or configurable */
jlaskey@3 65 @Property(attributes = Attribute.NON_ENUMERABLE_CONSTANT, where = Where.CONSTRUCTOR)
jlaskey@3 66 public static final double LOG10E = 0.4342944819032518;
jlaskey@3 67
jlaskey@3 68 /** ECMA 15.8.1.6 - PI, always a double constant. Not writable or configurable */
jlaskey@3 69 @Property(attributes = Attribute.NON_ENUMERABLE_CONSTANT, where = Where.CONSTRUCTOR)
jlaskey@3 70 public static final double PI = Math.PI;
jlaskey@3 71
jlaskey@3 72 /** ECMA 15.8.1.7 - SQRT1_2, always a double constant. Not writable or configurable */
jlaskey@3 73 @Property(attributes = Attribute.NON_ENUMERABLE_CONSTANT, where = Where.CONSTRUCTOR)
jlaskey@3 74 public static final double SQRT1_2 = 0.7071067811865476;
jlaskey@3 75
jlaskey@3 76 /** ECMA 15.8.1.8 - SQRT2, always a double constant. Not writable or configurable */
jlaskey@3 77 @Property(attributes = Attribute.NON_ENUMERABLE_CONSTANT, where = Where.CONSTRUCTOR)
jlaskey@3 78 public static final double SQRT2 = 1.4142135623730951;
jlaskey@3 79
jlaskey@3 80 /**
jlaskey@3 81 * ECMA 15.8.2.1 abs(x)
jlaskey@3 82 *
jlaskey@3 83 * @param self self reference
jlaskey@3 84 * @param x argument
jlaskey@3 85 *
jlaskey@3 86 * @return abs of value
jlaskey@3 87 */
jlaskey@3 88 @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR)
jlaskey@3 89 public static Object abs(final Object self, final Object x) {
jlaskey@3 90 return Math.abs(JSType.toNumber(x));
jlaskey@3 91 }
jlaskey@3 92
jlaskey@3 93 /**
jlaskey@3 94 * ECMA 15.8.2.1 abs(x) - specialization for int values
jlaskey@3 95 *
jlaskey@3 96 * @param self self reference
jlaskey@3 97 * @param x argument
jlaskey@3 98 *
jlaskey@3 99 * @return abs of argument
jlaskey@3 100 */
jlaskey@3 101 @SpecializedFunction
jlaskey@3 102 public static int abs(final Object self, final int x) {
jlaskey@3 103 return Math.abs(x);
jlaskey@3 104 }
jlaskey@3 105
jlaskey@3 106 /**
jlaskey@3 107 * ECMA 15.8.2.1 abs(x) - specialization for long values
jlaskey@3 108 *
jlaskey@3 109 * @param self self reference
jlaskey@3 110 * @param x argument
jlaskey@3 111 *
jlaskey@3 112 * @return abs of argument
jlaskey@3 113 */
jlaskey@3 114 @SpecializedFunction
jlaskey@3 115 public static long abs(final Object self, final long x) {
jlaskey@3 116 return Math.abs(x);
jlaskey@3 117 }
jlaskey@3 118
jlaskey@3 119 /**
jlaskey@3 120 * ECMA 15.8.2.1 abs(x) - specialization for double values
jlaskey@3 121 *
jlaskey@3 122 * @param self self reference
jlaskey@3 123 * @param x argument
jlaskey@3 124 *
jlaskey@3 125 * @return abs of argument
jlaskey@3 126 */
jlaskey@3 127 @SpecializedFunction
jlaskey@3 128 public static double abs(final Object self, final double x) {
jlaskey@3 129 return Math.abs(x);
jlaskey@3 130 }
jlaskey@3 131
jlaskey@3 132 /**
jlaskey@3 133 * ECMA 15.8.2.2 acos(x)
jlaskey@3 134 *
jlaskey@3 135 * @param self self reference
jlaskey@3 136 * @param x argument
jlaskey@3 137 *
jlaskey@3 138 * @return acos of argument
jlaskey@3 139 */
jlaskey@3 140 @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR)
jlaskey@3 141 public static Object acos(final Object self, final Object x) {
jlaskey@3 142 return Math.acos(JSType.toNumber(x));
jlaskey@3 143 }
jlaskey@3 144
jlaskey@3 145 /**
jlaskey@3 146 * ECMA 15.8.2.2 acos(x) - specialization for double values
jlaskey@3 147 *
jlaskey@3 148 * @param self self reference
jlaskey@3 149 * @param x argument
jlaskey@3 150 *
jlaskey@3 151 * @return acos of argument
jlaskey@3 152 */
jlaskey@3 153 @SpecializedFunction
jlaskey@3 154 public static double acos(final Object self, final double x) {
jlaskey@3 155 return Math.acos(x);
jlaskey@3 156 }
jlaskey@3 157
jlaskey@3 158 /**
jlaskey@3 159 * ECMA 15.8.2.3 asin(x)
jlaskey@3 160 *
jlaskey@3 161 * @param self self reference
jlaskey@3 162 * @param x argument
jlaskey@3 163 *
jlaskey@3 164 * @return asin of argument
jlaskey@3 165 */
jlaskey@3 166 @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR)
jlaskey@3 167 public static Object asin(final Object self, final Object x) {
jlaskey@3 168 return Math.asin(JSType.toNumber(x));
jlaskey@3 169 }
jlaskey@3 170
jlaskey@3 171 /**
jlaskey@3 172 * ECMA 15.8.2.3 asin(x) - specialization for double values
jlaskey@3 173 *
jlaskey@3 174 * @param self self reference
jlaskey@3 175 * @param x argument
jlaskey@3 176 *
jlaskey@3 177 * @return asin of argument
jlaskey@3 178 */
jlaskey@3 179 @SpecializedFunction
jlaskey@3 180 public static double asin(final Object self, final double x) {
jlaskey@3 181 return Math.asin(x);
jlaskey@3 182 }
jlaskey@3 183
jlaskey@3 184 /**
jlaskey@3 185 * ECMA 15.8.2.4 atan(x)
jlaskey@3 186 *
jlaskey@3 187 * @param self self reference
jlaskey@3 188 * @param x argument
jlaskey@3 189 *
jlaskey@3 190 * @return atan of argument
jlaskey@3 191 */
jlaskey@3 192 @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR)
jlaskey@3 193 public static Object atan(final Object self, final Object x) {
jlaskey@3 194 return Math.atan(JSType.toNumber(x));
jlaskey@3 195 }
jlaskey@3 196
jlaskey@3 197 /**
jlaskey@3 198 * ECMA 15.8.2.4 atan(x) - specialization for double values
jlaskey@3 199 *
jlaskey@3 200 * @param self self reference
jlaskey@3 201 * @param x argument
jlaskey@3 202 *
jlaskey@3 203 * @return atan of argument
jlaskey@3 204 */
jlaskey@3 205 @SpecializedFunction
jlaskey@3 206 public static double atan(final Object self, final double x) {
jlaskey@3 207 return Math.atan(x);
jlaskey@3 208 }
jlaskey@3 209
jlaskey@3 210 /**
jlaskey@3 211 * ECMA 15.8.2.5 atan2(x,y)
jlaskey@3 212 *
jlaskey@3 213 * @param self self reference
jlaskey@3 214 * @param x first argument
jlaskey@3 215 * @param y second argument
jlaskey@3 216 *
jlaskey@3 217 * @return atan2 of x and y
jlaskey@3 218 */
jlaskey@3 219 @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR)
jlaskey@3 220 public static Object atan2(final Object self, final Object y, final Object x) {
jlaskey@3 221 return Math.atan2(JSType.toNumber(y), JSType.toNumber(x));
jlaskey@3 222 }
jlaskey@3 223
jlaskey@3 224 /**
jlaskey@3 225 * ECMA 15.8.2.5 atan2(x,y) - specialization for double values
jlaskey@3 226 *
jlaskey@3 227 * @param self self reference
jlaskey@3 228 * @param x first argument
jlaskey@3 229 * @param y second argument
jlaskey@3 230 *
jlaskey@3 231 * @return atan2 of x and y
jlaskey@3 232 */
jlaskey@3 233 @SpecializedFunction
jlaskey@3 234 public static double atan2(final Object self, final double y, final double x) {
jlaskey@3 235 return Math.atan2(y,x);
jlaskey@3 236 }
jlaskey@3 237
jlaskey@3 238 /**
jlaskey@3 239 * ECMA 15.8.2.6 ceil(x)
jlaskey@3 240 *
jlaskey@3 241 * @param self self reference
jlaskey@3 242 * @param x argument
jlaskey@3 243 *
jlaskey@3 244 * @return ceil of argument
jlaskey@3 245 */
jlaskey@3 246 @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR)
jlaskey@3 247 public static Object ceil(final Object self, final Object x) {
jlaskey@3 248 return Math.ceil(JSType.toNumber(x));
jlaskey@3 249 }
jlaskey@3 250
jlaskey@3 251 /**
jlaskey@3 252 * ECMA 15.8.2.6 ceil(x) - specialized version for ints
jlaskey@3 253 *
jlaskey@3 254 * @param self self reference
jlaskey@3 255 * @param x argument
jlaskey@3 256 *
jlaskey@3 257 * @return ceil of argument
jlaskey@3 258 */
jlaskey@3 259 @SpecializedFunction
jlaskey@3 260 public static int ceil(final Object self, final int x) {
jlaskey@3 261 return x;
jlaskey@3 262 }
jlaskey@3 263
jlaskey@3 264 /**
jlaskey@3 265 * ECMA 15.8.2.6 ceil(x) - specialized version for longs
jlaskey@3 266 *
jlaskey@3 267 * @param self self reference
jlaskey@3 268 * @param x argument
jlaskey@3 269 *
jlaskey@3 270 * @return ceil of argument
jlaskey@3 271 */
jlaskey@3 272 @SpecializedFunction
jlaskey@3 273 public static long ceil(final Object self, final long x) {
jlaskey@3 274 return x;
jlaskey@3 275 }
jlaskey@3 276
jlaskey@3 277 /**
jlaskey@3 278 * ECMA 15.8.2.6 ceil(x) - specialized version for doubles
jlaskey@3 279 *
jlaskey@3 280 * @param self self reference
jlaskey@3 281 * @param x argument
jlaskey@3 282 *
jlaskey@3 283 * @return ceil of argument
jlaskey@3 284 */
jlaskey@3 285 @SpecializedFunction
jlaskey@3 286 public static double ceil(final Object self, final double x) {
jlaskey@3 287 return Math.ceil(x);
jlaskey@3 288 }
jlaskey@3 289
jlaskey@3 290 /**
jlaskey@3 291 * ECMA 15.8.2.7 cos(x)
jlaskey@3 292 *
jlaskey@3 293 * @param self self reference
jlaskey@3 294 * @param x argument
jlaskey@3 295 *
jlaskey@3 296 * @return cos of argument
jlaskey@3 297 */
jlaskey@3 298 @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR)
jlaskey@3 299 public static Object cos(final Object self, final Object x) {
jlaskey@3 300 return Math.cos(JSType.toNumber(x));
jlaskey@3 301 }
jlaskey@3 302
jlaskey@3 303 /**
jlaskey@3 304 * ECMA 15.8.2.7 cos(x) - specialized version for doubles
jlaskey@3 305 *
jlaskey@3 306 * @param self self reference
jlaskey@3 307 * @param x argument
jlaskey@3 308 *
jlaskey@3 309 * @return cos of argument
jlaskey@3 310 */
jlaskey@3 311 @SpecializedFunction
jlaskey@3 312 public static double cos(final Object self, final double x) {
jlaskey@3 313 return Math.cos(x);
jlaskey@3 314 }
jlaskey@3 315
jlaskey@3 316 /**
jlaskey@3 317 * ECMA 15.8.2.8 exp(x)
jlaskey@3 318 *
jlaskey@3 319 * @param self self reference
jlaskey@3 320 * @param x argument
jlaskey@3 321 *
jlaskey@3 322 * @return exp of argument
jlaskey@3 323 */
jlaskey@3 324 @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR)
jlaskey@3 325 public static Object exp(final Object self, final Object x) {
jlaskey@3 326 return Math.exp(JSType.toNumber(x));
jlaskey@3 327 }
jlaskey@3 328
jlaskey@3 329 /**
jlaskey@3 330 * ECMA 15.8.2.9 floor(x)
jlaskey@3 331 *
jlaskey@3 332 * @param self self reference
jlaskey@3 333 * @param x argument
jlaskey@3 334 *
jlaskey@3 335 * @return floor of argument
jlaskey@3 336 */
jlaskey@3 337 @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR)
jlaskey@3 338 public static Object floor(final Object self, final Object x) {
jlaskey@3 339 return Math.floor(JSType.toNumber(x));
jlaskey@3 340 }
jlaskey@3 341
jlaskey@3 342 /**
jlaskey@3 343 * ECMA 15.8.2.9 floor(x) - specialized version for ints
jlaskey@3 344 *
jlaskey@3 345 * @param self self reference
jlaskey@3 346 * @param x argument
jlaskey@3 347 *
jlaskey@3 348 * @return floor of argument
jlaskey@3 349 */
jlaskey@3 350 @SpecializedFunction
jlaskey@3 351 public static int floor(final Object self, final int x) {
jlaskey@3 352 return x;
jlaskey@3 353 }
jlaskey@3 354
jlaskey@3 355 /**
jlaskey@3 356 * ECMA 15.8.2.9 floor(x) - specialized version for longs
jlaskey@3 357 *
jlaskey@3 358 * @param self self reference
jlaskey@3 359 * @param x argument
jlaskey@3 360 *
jlaskey@3 361 * @return floor of argument
jlaskey@3 362 */
jlaskey@3 363 @SpecializedFunction
jlaskey@3 364 public static long floor(final Object self, final long x) {
jlaskey@3 365 return x;
jlaskey@3 366 }
jlaskey@3 367
jlaskey@3 368 /**
jlaskey@3 369 * ECMA 15.8.2.9 floor(x) - specialized version for doubles
jlaskey@3 370 *
jlaskey@3 371 * @param self self reference
jlaskey@3 372 * @param x argument
jlaskey@3 373 *
jlaskey@3 374 * @return floor of argument
jlaskey@3 375 */
jlaskey@3 376 @SpecializedFunction
jlaskey@3 377 public static double floor(final Object self, final double x) {
jlaskey@3 378 return Math.floor(x);
jlaskey@3 379 }
jlaskey@3 380
jlaskey@3 381 /**
jlaskey@3 382 * ECMA 15.8.2.10 log(x)
jlaskey@3 383 *
jlaskey@3 384 * @param self self reference
jlaskey@3 385 * @param x argument
jlaskey@3 386 *
jlaskey@3 387 * @return log of argument
jlaskey@3 388 */
jlaskey@3 389 @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR)
jlaskey@3 390 public static Object log(final Object self, final Object x) {
jlaskey@3 391 return Math.log(JSType.toNumber(x));
jlaskey@3 392 }
jlaskey@3 393
jlaskey@3 394 /**
jlaskey@3 395 * ECMA 15.8.2.10 log(x) - specialized version for doubles
jlaskey@3 396 *
jlaskey@3 397 * @param self self reference
jlaskey@3 398 * @param x argument
jlaskey@3 399 *
jlaskey@3 400 * @return log of argument
jlaskey@3 401 */
jlaskey@3 402 @SpecializedFunction
jlaskey@3 403 public static double log(final Object self, final double x) {
jlaskey@3 404 return Math.log(x);
jlaskey@3 405 }
jlaskey@3 406
jlaskey@3 407 /**
jlaskey@3 408 * ECMA 15.8.2.11 max(x)
jlaskey@3 409 *
jlaskey@3 410 * @param self self reference
jlaskey@3 411 * @param args arguments
jlaskey@3 412 *
jlaskey@3 413 * @return the largest of the arguments, {@link Double#NEGATIVE_INFINITY} if no args given, or identity if one arg is given
jlaskey@3 414 */
jlaskey@3 415 @Function(arity = 2, attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR)
jlaskey@3 416 public static Object max(final Object self, final Object... args) {
jlaskey@3 417 switch (args.length) {
jlaskey@3 418 case 0:
jlaskey@3 419 return Double.NEGATIVE_INFINITY;
jlaskey@3 420 case 1:
jlaskey@3 421 return JSType.toNumber(args[0]);
jlaskey@3 422 default:
jlaskey@3 423 double res = JSType.toNumber(args[0]);
jlaskey@3 424 for (int i = 1; i < args.length; i++) {
jlaskey@3 425 res = Math.max(res, JSType.toNumber(args[i]));
jlaskey@3 426 }
jlaskey@3 427 return res;
jlaskey@3 428 }
jlaskey@3 429 }
jlaskey@3 430
jlaskey@3 431 /**
jlaskey@3 432 * ECMA 15.8.2.11 max(x) - specialized no args version
jlaskey@3 433 *
jlaskey@3 434 * @param self self reference
jlaskey@3 435 *
jlaskey@3 436 * @return {@link Double#NEGATIVE_INFINITY}
jlaskey@3 437 */
jlaskey@3 438 @SpecializedFunction
jlaskey@3 439 public static double max(final Object self) {
jlaskey@3 440 return Double.NEGATIVE_INFINITY;
jlaskey@3 441 }
jlaskey@3 442
jlaskey@3 443 /**
jlaskey@3 444 * ECMA 15.8.2.11 max(x) - specialized version for ints
jlaskey@3 445 *
jlaskey@3 446 * @param self self reference
jlaskey@3 447 * @param x first argument
jlaskey@3 448 * @param y second argument
jlaskey@3 449 *
jlaskey@3 450 * @return largest value of x and y
jlaskey@3 451 */
jlaskey@3 452 @SpecializedFunction
jlaskey@3 453 public static int max(final Object self, final int x, final int y) {
jlaskey@3 454 return Math.max(x, y);
jlaskey@3 455 }
jlaskey@3 456
jlaskey@3 457 /**
jlaskey@3 458 * ECMA 15.8.2.11 max(x) - specialized version for longs
jlaskey@3 459 *
jlaskey@3 460 * @param self self reference
jlaskey@3 461 * @param x first argument
jlaskey@3 462 * @param y second argument
jlaskey@3 463 *
jlaskey@3 464 * @return largest value of x and y
jlaskey@3 465 */
jlaskey@3 466 @SpecializedFunction
jlaskey@3 467 public static long max(final Object self, final long x, final long y) {
jlaskey@3 468 return Math.max(x, y);
jlaskey@3 469 }
jlaskey@3 470
jlaskey@3 471 /**
jlaskey@3 472 * ECMA 15.8.2.11 max(x) - specialized version for doubles
jlaskey@3 473 *
jlaskey@3 474 * @param self self reference
jlaskey@3 475 * @param x first argument
jlaskey@3 476 * @param y second argument
jlaskey@3 477 *
jlaskey@3 478 * @return largest value of x and y
jlaskey@3 479 */
jlaskey@3 480 @SpecializedFunction
jlaskey@3 481 public static double max(final Object self, final double x, final double y) {
jlaskey@3 482 return Math.max(x, y);
jlaskey@3 483 }
jlaskey@3 484
jlaskey@3 485 /**
jlaskey@3 486 * ECMA 15.8.2.12 min(x)
jlaskey@3 487 *
jlaskey@3 488 * @param self self reference
jlaskey@3 489 * @param args arguments
jlaskey@3 490 *
jlaskey@3 491 * @return the smallest of the arguments, {@link Double#NEGATIVE_INFINITY} if no args given, or identity if one arg is given
jlaskey@3 492 */
jlaskey@3 493 @Function(arity = 2, attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR)
jlaskey@3 494 public static Object min(final Object self, final Object... args) {
jlaskey@3 495 switch (args.length) {
jlaskey@3 496 case 0:
jlaskey@3 497 return Double.POSITIVE_INFINITY;
jlaskey@3 498 case 1:
jlaskey@3 499 return JSType.toNumber(args[0]);
jlaskey@3 500 default:
jlaskey@3 501 double res = JSType.toNumber(args[0]);
jlaskey@3 502 for (int i = 1; i < args.length; i++) {
jlaskey@3 503 res = Math.min(res, JSType.toNumber(args[i]));
jlaskey@3 504 }
jlaskey@3 505 return res;
jlaskey@3 506 }
jlaskey@3 507 }
jlaskey@3 508
jlaskey@3 509 /**
jlaskey@3 510 * ECMA 15.8.2.11 min(x) - specialized no args version
jlaskey@3 511 *
jlaskey@3 512 * @param self self reference
jlaskey@3 513 *
jlaskey@3 514 * @return {@link Double#POSITIVE_INFINITY}
jlaskey@3 515 */
jlaskey@3 516 @SpecializedFunction
jlaskey@3 517 public static double min(final Object self) {
jlaskey@3 518 return Double.POSITIVE_INFINITY;
jlaskey@3 519 }
jlaskey@3 520
jlaskey@3 521 /**
jlaskey@3 522 * ECMA 15.8.2.12 min(x) - specialized version for ints
jlaskey@3 523 *
jlaskey@3 524 * @param self self reference
jlaskey@3 525 * @param x first argument
jlaskey@3 526 * @param y second argument
jlaskey@3 527 *
jlaskey@3 528 * @return smallest value of x and y
jlaskey@3 529 */
jlaskey@3 530 @SpecializedFunction
jlaskey@3 531 public static int min(final Object self, final int x, final int y) {
jlaskey@3 532 return Math.min(x, y);
jlaskey@3 533 }
jlaskey@3 534
jlaskey@3 535 /**
jlaskey@3 536 * ECMA 15.8.2.12 min(x) - specialized version for longs
jlaskey@3 537 *
jlaskey@3 538 * @param self self reference
jlaskey@3 539 * @param x first argument
jlaskey@3 540 * @param y second argument
jlaskey@3 541 *
jlaskey@3 542 * @return smallest value of x and y
jlaskey@3 543 */
jlaskey@3 544 @SpecializedFunction
jlaskey@3 545 public static long min(final Object self, final long x, final long y) {
jlaskey@3 546 return Math.min(x, y);
jlaskey@3 547 }
jlaskey@3 548
jlaskey@3 549 /**
jlaskey@3 550 * ECMA 15.8.2.12 min(x) - specialized version for doubles
jlaskey@3 551 *
jlaskey@3 552 * @param self self reference
jlaskey@3 553 * @param x first argument
jlaskey@3 554 * @param y second argument
jlaskey@3 555 *
jlaskey@3 556 * @return smallest value of x and y
jlaskey@3 557 */
jlaskey@3 558 @SpecializedFunction
jlaskey@3 559 public static double min(final Object self, final double x, final double y) {
jlaskey@3 560 return Math.min(x, y);
jlaskey@3 561 }
jlaskey@3 562
jlaskey@3 563 /**
jlaskey@3 564 * ECMA 15.8.2.13 pow(x,y)
jlaskey@3 565 *
jlaskey@3 566 * @param self self reference
jlaskey@3 567 * @param x first argument
jlaskey@3 568 * @param y second argument
jlaskey@3 569 *
jlaskey@3 570 * @return x raised to the power of y
jlaskey@3 571 */
jlaskey@3 572 @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR)
jlaskey@3 573 public static Object pow(final Object self, final Object x, final Object y) {
jlaskey@3 574 return Math.pow(JSType.toNumber(x), JSType.toNumber(y));
jlaskey@3 575 }
jlaskey@3 576
jlaskey@3 577 /**
jlaskey@3 578 * ECMA 15.8.2.13 pow(x,y) - specialized version for doubles
jlaskey@3 579 *
jlaskey@3 580 * @param self self reference
jlaskey@3 581 * @param x first argument
jlaskey@3 582 * @param y second argument
jlaskey@3 583 *
jlaskey@3 584 * @return x raised to the power of y
jlaskey@3 585 */
jlaskey@3 586 @SpecializedFunction
jlaskey@3 587 public static double pow(final Object self, final double x, final double y) {
jlaskey@3 588 return Math.pow(x, y);
jlaskey@3 589 }
jlaskey@3 590
jlaskey@3 591 /**
jlaskey@3 592 * ECMA 15.8.2.14 random()
jlaskey@3 593 *
jlaskey@3 594 * @param self self reference
jlaskey@3 595 *
jlaskey@3 596 * @return random number in the range [0..1)
jlaskey@3 597 */
jlaskey@3 598 @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR)
jlaskey@3 599 public static Object random(final Object self) {
jlaskey@3 600 return Math.random();
jlaskey@3 601 }
jlaskey@3 602
jlaskey@3 603 /**
jlaskey@3 604 * ECMA 15.8.2.15 round(x)
jlaskey@3 605 *
jlaskey@3 606 * @param self self reference
jlaskey@3 607 * @param x argument
jlaskey@3 608 *
jlaskey@3 609 * @return x rounded
jlaskey@3 610 */
jlaskey@3 611 @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR)
jlaskey@3 612 public static Object round(final Object self, final Object x) {
lagergren@301 613 final double d = JSType.toNumber(x);
lagergren@301 614 if (Math.getExponent(d) >= 52) {
lagergren@301 615 return d;
jlaskey@3 616 }
lagergren@301 617 return Math.copySign(Math.floor(d + 0.5), d);
jlaskey@3 618 }
jlaskey@3 619
jlaskey@3 620 /**
jlaskey@3 621 * ECMA 15.8.2.16 sin(x)
jlaskey@3 622 *
jlaskey@3 623 * @param self self reference
jlaskey@3 624 * @param x argument
jlaskey@3 625 *
jlaskey@3 626 * @return sin of x
jlaskey@3 627 */
jlaskey@3 628 @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR)
jlaskey@3 629 public static Object sin(final Object self, final Object x) {
jlaskey@3 630 return Math.sin(JSType.toNumber(x));
jlaskey@3 631 }
jlaskey@3 632
jlaskey@3 633 /**
jlaskey@3 634 * ECMA 15.8.2.16 sin(x) - specialized version for doubles
jlaskey@3 635 *
jlaskey@3 636 * @param self self reference
jlaskey@3 637 * @param x argument
jlaskey@3 638 *
jlaskey@3 639 * @return sin of x
jlaskey@3 640 */
jlaskey@3 641 @SpecializedFunction
jlaskey@3 642 public static double sin(final Object self, final double x) {
jlaskey@3 643 return Math.sin(x);
jlaskey@3 644 }
jlaskey@3 645
jlaskey@3 646 /**
jlaskey@3 647 * ECMA 15.8.2.17 sqrt(x)
jlaskey@3 648 *
jlaskey@3 649 * @param self self reference
jlaskey@3 650 * @param x argument
jlaskey@3 651 *
jlaskey@3 652 * @return sqrt of x
jlaskey@3 653 */
jlaskey@3 654 @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR)
jlaskey@3 655 public static Object sqrt(final Object self, final Object x) {
jlaskey@3 656 return Math.sqrt(JSType.toNumber(x));
jlaskey@3 657 }
jlaskey@3 658
jlaskey@3 659 /**
jlaskey@3 660 * ECMA 15.8.2.17 sqrt(x) - specialized version for doubles
jlaskey@3 661 *
jlaskey@3 662 * @param self self reference
jlaskey@3 663 * @param x argument
jlaskey@3 664 *
jlaskey@3 665 * @return sqrt of x
jlaskey@3 666 */
jlaskey@3 667 @SpecializedFunction
jlaskey@3 668 public static double sqrt(final Object self, final double x) {
jlaskey@3 669 return Math.sqrt(x);
jlaskey@3 670 }
jlaskey@3 671
jlaskey@3 672 /**
jlaskey@3 673 * ECMA 15.8.2.18 tan(x)
jlaskey@3 674 *
jlaskey@3 675 * @param self self reference
jlaskey@3 676 * @param x argument
jlaskey@3 677 *
jlaskey@3 678 * @return tan of x
jlaskey@3 679 */
jlaskey@3 680 @Function(attributes = Attribute.NOT_ENUMERABLE, where=Where.CONSTRUCTOR)
jlaskey@3 681 public static Object tan(final Object self, final Object x) {
jlaskey@3 682 return Math.tan(JSType.toNumber(x));
jlaskey@3 683 }
jlaskey@3 684
jlaskey@3 685 /**
jlaskey@3 686 * ECMA 15.8.2.18 tan(x) - specialized version for doubles
jlaskey@3 687 *
jlaskey@3 688 * @param self self reference
jlaskey@3 689 * @param x argument
jlaskey@3 690 *
jlaskey@3 691 * @return tan of x
jlaskey@3 692 */
jlaskey@3 693 @SpecializedFunction
jlaskey@3 694 public static double tan(final Object self, final double x) {
jlaskey@3 695 return Math.tan(x);
jlaskey@3 696 }
jlaskey@3 697 }

mercurial