Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(51)

Side by Side Diff: src/math.js

Issue 126113: Change the implementation of Math.random to use George... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 11 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/ia32/codegen-ia32.cc ('k') | src/runtime.h » ('j') | src/v8.h » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. 1 // Copyright 2006-2008 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 26 matching lines...) Expand all
37 // Instance class name can only be set on functions. That is the only 37 // Instance class name can only be set on functions. That is the only
38 // purpose for MathConstructor. 38 // purpose for MathConstructor.
39 function MathConstructor() {} 39 function MathConstructor() {}
40 %FunctionSetInstanceClassName(MathConstructor, 'Math'); 40 %FunctionSetInstanceClassName(MathConstructor, 'Math');
41 const $Math = new MathConstructor(); 41 const $Math = new MathConstructor();
42 $Math.__proto__ = global.Object.prototype; 42 $Math.__proto__ = global.Object.prototype;
43 %SetProperty(global, "Math", $Math, DONT_ENUM); 43 %SetProperty(global, "Math", $Math, DONT_ENUM);
44 44
45 // ECMA 262 - 15.8.2.1 45 // ECMA 262 - 15.8.2.1
46 function MathAbs(x) { 46 function MathAbs(x) {
47 if (%_IsSmi(x)) { 47 if (%_IsSmi(x)) return x >= 0 ? x : -x;
48 return x >= 0 ? x : -x; 48 if (!IS_NUMBER(x)) x = ToNumber(x);
49 return %Math_abs(x);
50 }
51
52 // ECMA 262 - 15.8.2.2
53 function MathAcos(x) {
54 if (!IS_NUMBER(x)) x = ToNumber(x);
55 return %Math_acos(x);
56 }
57
58 // ECMA 262 - 15.8.2.3
59 function MathAsin(x) {
60 if (!IS_NUMBER(x)) x = ToNumber(x);
61 return %Math_asin(x);
62 }
63
64 // ECMA 262 - 15.8.2.4
65 function MathAtan(x) {
66 if (!IS_NUMBER(x)) x = ToNumber(x);
67 return %Math_atan(x);
68 }
69
70 // ECMA 262 - 15.8.2.5
71 function MathAtan2(x, y) {
72 if (!IS_NUMBER(x)) x = ToNumber(x);
73 if (!IS_NUMBER(y)) y = ToNumber(y);
74 return %Math_atan2(x, y);
75 }
76
77 // ECMA 262 - 15.8.2.6
78 function MathCeil(x) {
79 if (!IS_NUMBER(x)) x = ToNumber(x);
80 return %Math_ceil(x);
81 }
82
83 // ECMA 262 - 15.8.2.7
84 function MathCos(x) {
85 if (!IS_NUMBER(x)) x = ToNumber(x);
86 return %Math_cos(x);
87 }
88
89 // ECMA 262 - 15.8.2.8
90 function MathExp(x) {
91 if (!IS_NUMBER(x)) x = ToNumber(x);
92 return %Math_exp(x);
93 }
94
95 // ECMA 262 - 15.8.2.9
96 function MathFloor(x) {
97 if (!IS_NUMBER(x)) x = ToNumber(x);
98 if (0 < x && x <= 0xFFFFFFFF) {
99 // Numbers in the range [0, 2^32) can be floored by converting
100 // them to an unsigned 32-bit value using the shift operator.
101 // We avoid doing so for -0, because the result of Math.floor(-0)
102 // has to be -0, which wouldn't be the case with the shift.
103 return x << 0;
49 } else { 104 } else {
50 return %Math_abs(ToNumber(x)); 105 return %Math_floor(x);
51 } 106 }
52 } 107 }
53 108
54 // ECMA 262 - 15.8.2.2
55 function MathAcos(x) { return %Math_acos(ToNumber(x)); }
56
57 // ECMA 262 - 15.8.2.3
58 function MathAsin(x) { return %Math_asin(ToNumber(x)); }
59
60 // ECMA 262 - 15.8.2.4
61 function MathAtan(x) { return %Math_atan(ToNumber(x)); }
62
63 // ECMA 262 - 15.8.2.5
64 function MathAtan2(x, y) { return %Math_atan2(ToNumber(x), ToNumber(y)); }
65
66 // ECMA 262 - 15.8.2.6
67 function MathCeil(x) { return %Math_ceil(ToNumber(x)); }
68
69 // ECMA 262 - 15.8.2.7
70 function MathCos(x) { return %Math_cos(ToNumber(x)); }
71
72 // ECMA 262 - 15.8.2.8
73 function MathExp(x) { return %Math_exp(ToNumber(x)); }
74
75 // ECMA 262 - 15.8.2.9
76 function MathFloor(x) { return %Math_floor(ToNumber(x)); }
77
78 // ECMA 262 - 15.8.2.10 109 // ECMA 262 - 15.8.2.10
79 function MathLog(x) { return %Math_log(ToNumber(x)); } 110 function MathLog(x) {
111 if (!IS_NUMBER(x)) x = ToNumber(x);
112 return %Math_log(x);
113 }
80 114
81 // ECMA 262 - 15.8.2.11 115 // ECMA 262 - 15.8.2.11
82 function MathMax(arg1, arg2) { // length == 2 116 function MathMax(arg1, arg2) { // length == 2
83 var r = -$Infinity; 117 var r = -$Infinity;
84 for (var i = %_ArgumentsLength() - 1; i >= 0; --i) { 118 for (var i = %_ArgumentsLength() - 1; i >= 0; --i) {
85 var n = ToNumber(%_Arguments(i)); 119 var n = ToNumber(%_Arguments(i));
86 if (NUMBER_IS_NAN(n)) return n; 120 if (NUMBER_IS_NAN(n)) return n;
87 // Make sure +0 is consider greater than -0. 121 // Make sure +0 is consider greater than -0.
88 if (n > r || (n === 0 && r === 0 && (1 / n) > (1 / r))) r = n; 122 if (n > r || (n === 0 && r === 0 && (1 / n) > (1 / r))) r = n;
89 } 123 }
90 return r; 124 return r;
91 } 125 }
92 126
93 // ECMA 262 - 15.8.2.12 127 // ECMA 262 - 15.8.2.12
94 function MathMin(arg1, arg2) { // length == 2 128 function MathMin(arg1, arg2) { // length == 2
95 var r = $Infinity; 129 var r = $Infinity;
96 for (var i = %_ArgumentsLength() - 1; i >= 0; --i) { 130 for (var i = %_ArgumentsLength() - 1; i >= 0; --i) {
97 var n = ToNumber(%_Arguments(i)); 131 var n = ToNumber(%_Arguments(i));
98 if (NUMBER_IS_NAN(n)) return n; 132 if (NUMBER_IS_NAN(n)) return n;
99 // Make sure -0 is consider less than +0. 133 // Make sure -0 is consider less than +0.
100 if (n < r || (n === 0 && r === 0 && (1 / n) < (1 / r))) r = n; 134 if (n < r || (n === 0 && r === 0 && (1 / n) < (1 / r))) r = n;
101 } 135 }
102 return r; 136 return r;
103 } 137 }
104 138
105 // ECMA 262 - 15.8.2.13 139 // ECMA 262 - 15.8.2.13
106 function MathPow(x, y) { return %Math_pow(ToNumber(x), ToNumber(y)); } 140 function MathPow(x, y) {
141 if (!IS_NUMBER(x)) x = ToNumber(x);
142 if (!IS_NUMBER(y)) y = ToNumber(y);
143 return %Math_pow(x, y);
144 }
107 145
108 // ECMA 262 - 15.8.2.14 146 // ECMA 262 - 15.8.2.14
109 function MathRandom() { return %Math_random(); } 147 function MathRandom() {
148 return %_RandomPositiveSmi() / 0x40000000;
149 }
110 150
111 // ECMA 262 - 15.8.2.15 151 // ECMA 262 - 15.8.2.15
112 function MathRound(x) { return %Math_round(ToNumber(x)); } 152 function MathRound(x) {
153 if (!IS_NUMBER(x)) x = ToNumber(x);
154 return %Math_round(x);
155 }
113 156
114 // ECMA 262 - 15.8.2.16 157 // ECMA 262 - 15.8.2.16
115 function MathSin(x) { return %Math_sin(ToNumber(x)); } 158 function MathSin(x) {
159 if (!IS_NUMBER(x)) x = ToNumber(x);
160 return %Math_sin(x);
161 }
116 162
117 // ECMA 262 - 15.8.2.17 163 // ECMA 262 - 15.8.2.17
118 function MathSqrt(x) { return %Math_sqrt(ToNumber(x)); } 164 function MathSqrt(x) {
165 if (!IS_NUMBER(x)) x = ToNumber(x);
166 return %Math_sqrt(x);
167 }
119 168
120 // ECMA 262 - 15.8.2.18 169 // ECMA 262 - 15.8.2.18
121 function MathTan(x) { return %Math_tan(ToNumber(x)); } 170 function MathTan(x) {
171 if (!IS_NUMBER(x)) x = ToNumber(x);
172 return %Math_tan(x);
173 }
122 174
123 175
124 // ------------------------------------------------------------------- 176 // -------------------------------------------------------------------
125 177
126 function SetupMath() { 178 function SetupMath() {
127 // Setup math constants. 179 // Setup math constants.
128 // ECMA-262, section 15.8.1.1. 180 // ECMA-262, section 15.8.1.1.
129 %SetProperty($Math, 181 %SetProperty($Math,
130 "E", 182 "E",
131 2.7182818284590452354, 183 2.7182818284590452354,
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
181 "tan", MathTan, 233 "tan", MathTan,
182 "atan2", MathAtan2, 234 "atan2", MathAtan2,
183 "pow", MathPow, 235 "pow", MathPow,
184 "max", MathMax, 236 "max", MathMax,
185 "min", MathMin 237 "min", MathMin
186 )); 238 ));
187 }; 239 };
188 240
189 241
190 SetupMath(); 242 SetupMath();
OLDNEW
« no previous file with comments | « src/ia32/codegen-ia32.cc ('k') | src/runtime.h » ('j') | src/v8.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698