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

Side by Side Diff: src/runtime.js

Issue 1102923002: [strong] Disallow implicit conversions for bitwise ops, shifts (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: cl feedback 2 Created 5 years, 7 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
« no previous file with comments | « src/ic/ic.cc ('k') | test/mjsunit/strong/implicit-conversions.js » ('j') | no next file with comments »
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 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // This files contains runtime support implemented in JavaScript. 5 // This files contains runtime support implemented in JavaScript.
6 6
7 // CAUTION: Some of the functions specified in this file are called 7 // CAUTION: Some of the functions specified in this file are called
8 // directly from compiled code. These are the functions with names in 8 // directly from compiled code. These are the functions with names in
9 // ALL CAPS. The compiled code passes the first argument in 'this'. 9 // ALL CAPS. The compiled code passes the first argument in 'this'.
10 10
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 */ 265 */
266 266
267 // ECMA-262, section 11.10, page 57. 267 // ECMA-262, section 11.10, page 57.
268 function BIT_OR(y) { 268 function BIT_OR(y) {
269 var x = IS_NUMBER(this) ? this : %NonNumberToNumber(this); 269 var x = IS_NUMBER(this) ? this : %NonNumberToNumber(this);
270 if (!IS_NUMBER(y)) y = %NonNumberToNumber(y); 270 if (!IS_NUMBER(y)) y = %NonNumberToNumber(y);
271 return %NumberOr(x, y); 271 return %NumberOr(x, y);
272 } 272 }
273 273
274 274
275 //ECMA-262, section 11.10, page 57.
276 function BIT_OR_STRONG(y) {
277 if (IS_NUMBER(this) && IS_NUMBER(y)) {
278 return %NumberOr(this, y);
279 }
280 throw %MakeTypeError('strong_implicit_cast');
281 }
282
283
275 // ECMA-262, section 11.10, page 57. 284 // ECMA-262, section 11.10, page 57.
276 function BIT_AND(y) { 285 function BIT_AND(y) {
277 var x; 286 var x;
278 if (IS_NUMBER(this)) { 287 if (IS_NUMBER(this)) {
279 x = this; 288 x = this;
280 if (!IS_NUMBER(y)) y = %NonNumberToNumber(y); 289 if (!IS_NUMBER(y)) y = %NonNumberToNumber(y);
281 } else { 290 } else {
282 x = %NonNumberToNumber(this); 291 x = %NonNumberToNumber(this);
283 // Make sure to convert the right operand to a number before 292 // Make sure to convert the right operand to a number before
284 // bailing out in the fast case, but after converting the 293 // bailing out in the fast case, but after converting the
285 // left operand. This ensures that valueOf methods on the right 294 // left operand. This ensures that valueOf methods on the right
286 // operand are always executed. 295 // operand are always executed.
287 if (!IS_NUMBER(y)) y = %NonNumberToNumber(y); 296 if (!IS_NUMBER(y)) y = %NonNumberToNumber(y);
288 // Optimize for the case where we end up AND'ing a value 297 // Optimize for the case where we end up AND'ing a value
289 // that doesn't convert to a number. This is common in 298 // that doesn't convert to a number. This is common in
290 // certain benchmarks. 299 // certain benchmarks.
291 if (NUMBER_IS_NAN(x)) return 0; 300 if (NUMBER_IS_NAN(x)) return 0;
292 } 301 }
293 return %NumberAnd(x, y); 302 return %NumberAnd(x, y);
294 } 303 }
295 304
296 305
306 //ECMA-262, section 11.10, page 57.
307 function BIT_AND_STRONG(y) {
308 if (IS_NUMBER(this) && IS_NUMBER(y)) {
309 return %NumberAnd(this, y);
310 }
311 throw %MakeTypeError('strong_implicit_cast');
312 }
313
314
297 // ECMA-262, section 11.10, page 57. 315 // ECMA-262, section 11.10, page 57.
298 function BIT_XOR(y) { 316 function BIT_XOR(y) {
299 var x = IS_NUMBER(this) ? this : %NonNumberToNumber(this); 317 var x = IS_NUMBER(this) ? this : %NonNumberToNumber(this);
300 if (!IS_NUMBER(y)) y = %NonNumberToNumber(y); 318 if (!IS_NUMBER(y)) y = %NonNumberToNumber(y);
301 return %NumberXor(x, y); 319 return %NumberXor(x, y);
302 } 320 }
303 321
304 322
323 //ECMA-262, section 11.10, page 57.
324 function BIT_XOR_STRONG(y) {
325 if (IS_NUMBER(this) && IS_NUMBER(y)) {
326 return %NumberXor(this, y);
327 }
328 throw %MakeTypeError('strong_implicit_cast');
329 }
330
331
305 // ECMA-262, section 11.7.1, page 51. 332 // ECMA-262, section 11.7.1, page 51.
306 function SHL(y) { 333 function SHL(y) {
307 var x = IS_NUMBER(this) ? this : %NonNumberToNumber(this); 334 var x = IS_NUMBER(this) ? this : %NonNumberToNumber(this);
308 if (!IS_NUMBER(y)) y = %NonNumberToNumber(y); 335 if (!IS_NUMBER(y)) y = %NonNumberToNumber(y);
309 return %NumberShl(x, y); 336 return %NumberShl(x, y);
310 } 337 }
311 338
312 339
340 //ECMA-262, section 11.7.1, page 51.
341 function SHL_STRONG(y) {
342 if (IS_NUMBER(this) && IS_NUMBER(y)) {
343 return %NumberShl(this, y);
344 }
345 throw %MakeTypeError('strong_implicit_cast');
346 }
347
348
313 // ECMA-262, section 11.7.2, page 51. 349 // ECMA-262, section 11.7.2, page 51.
314 function SAR(y) { 350 function SAR(y) {
315 var x; 351 var x;
316 if (IS_NUMBER(this)) { 352 if (IS_NUMBER(this)) {
317 x = this; 353 x = this;
318 if (!IS_NUMBER(y)) y = %NonNumberToNumber(y); 354 if (!IS_NUMBER(y)) y = %NonNumberToNumber(y);
319 } else { 355 } else {
320 x = %NonNumberToNumber(this); 356 x = %NonNumberToNumber(this);
321 // Make sure to convert the right operand to a number before 357 // Make sure to convert the right operand to a number before
322 // bailing out in the fast case, but after converting the 358 // bailing out in the fast case, but after converting the
323 // left operand. This ensures that valueOf methods on the right 359 // left operand. This ensures that valueOf methods on the right
324 // operand are always executed. 360 // operand are always executed.
325 if (!IS_NUMBER(y)) y = %NonNumberToNumber(y); 361 if (!IS_NUMBER(y)) y = %NonNumberToNumber(y);
326 // Optimize for the case where we end up shifting a value 362 // Optimize for the case where we end up shifting a value
327 // that doesn't convert to a number. This is common in 363 // that doesn't convert to a number. This is common in
328 // certain benchmarks. 364 // certain benchmarks.
329 if (NUMBER_IS_NAN(x)) return 0; 365 if (NUMBER_IS_NAN(x)) return 0;
330 } 366 }
331 return %NumberSar(x, y); 367 return %NumberSar(x, y);
332 } 368 }
333 369
334 370
371 //ECMA-262, section 11.7.2, page 51.
372 function SAR_STRONG(y) {
373 if (IS_NUMBER(this) && IS_NUMBER(y)) {
374 return %NumberSar(this, y);
375 }
376 throw %MakeTypeError('strong_implicit_cast');
377 }
378
379
335 // ECMA-262, section 11.7.3, page 52. 380 // ECMA-262, section 11.7.3, page 52.
336 function SHR(y) { 381 function SHR(y) {
337 var x = IS_NUMBER(this) ? this : %NonNumberToNumber(this); 382 var x = IS_NUMBER(this) ? this : %NonNumberToNumber(this);
338 if (!IS_NUMBER(y)) y = %NonNumberToNumber(y); 383 if (!IS_NUMBER(y)) y = %NonNumberToNumber(y);
339 return %NumberShr(x, y); 384 return %NumberShr(x, y);
340 } 385 }
341 386
342 387
388 //ECMA-262, section 11.7.3, page 52.
389 function SHR_STRONG(y) {
390 if (IS_NUMBER(this) && IS_NUMBER(y)) {
391 return %NumberShr(this, y);
392 }
393 throw %MakeTypeError('strong_implicit_cast');
394 }
395
343 396
344 /* ----------------------------- 397 /* -----------------------------
345 - - - H e l p e r s - - - 398 - - - H e l p e r s - - -
346 ----------------------------- 399 -----------------------------
347 */ 400 */
348 401
349 // ECMA-262, section 11.4.1, page 46. 402 // ECMA-262, section 11.4.1, page 46.
350 function DELETE(key, language_mode) { 403 function DELETE(key, language_mode) {
351 return %DeleteProperty(%ToObject(this), %ToName(key), language_mode); 404 return %DeleteProperty(%ToObject(this), %ToName(key), language_mode);
352 } 405 }
(...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after
813 866
814 /* ----------------------------------------------- 867 /* -----------------------------------------------
815 - - - J a v a S c r i p t S t u b s - - - 868 - - - J a v a S c r i p t S t u b s - - -
816 ----------------------------------------------- 869 -----------------------------------------------
817 */ 870 */
818 871
819 function STRING_LENGTH_STUB(name) { 872 function STRING_LENGTH_STUB(name) {
820 var receiver = this; // implicit first parameter 873 var receiver = this; // implicit first parameter
821 return %_StringGetLength(%_JSValueGetValue(receiver)); 874 return %_StringGetLength(%_JSValueGetValue(receiver));
822 } 875 }
OLDNEW
« no previous file with comments | « src/ic/ic.cc ('k') | test/mjsunit/strong/implicit-conversions.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698