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

Fri, 05 Jul 2013 14:38:04 +0530

author
sundar
date
Fri, 05 Jul 2013 14:38:04 +0530
changeset 414
ec84ba68ad39
parent 380
80c66d3fd872
child 418
36d6b6a3fbe0
permissions
-rw-r--r--

8019947: inherited property invalidation does not work with two globals in same context
Reviewed-by: jlaskey, lagergren, hannesw, attila

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

mercurial