19258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org// Copyright 2006-2008 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// This files contains runtime support implemented in JavaScript. 643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// CAUTION: Some of the functions specified in this file are called 843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// directly from compiled code. These are the functions with names in 943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ALL CAPS. The compiled code passes the first argument in 'this' and 1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// it does not push the function onto the stack. This means that you 1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// cannot use contexts in all these functions. 1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/* ----------------------------------- 1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen - - - C o m p a r i s o n - - - 1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ----------------------------------- 1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen*/ 1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 19f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org// The following declarations are shared with other native JS files. 20f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org// They are all declared at this one spot to avoid redeclaration errors. 21f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar $Object = global.Object; 22f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar $Array = global.Array; 23f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar $String = global.String; 24f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar $Number = global.Number; 25f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar $Function = global.Function; 26f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.orgvar $Boolean = global.Boolean; 2788d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.orgvar $NaN = %GetRootNaN(); 2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 29fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// ECMA-262 Section 11.9.3. 3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction EQUALS(y) { 317c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org if (IS_STRING(this) && IS_STRING(y)) return %StringEquals(this, y); 3243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen var x = this; 3343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen while (true) { 3543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (IS_NUMBER(x)) { 36fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org while (true) { 37fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org if (IS_NUMBER(y)) return %NumberEquals(x, y); 38fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org if (IS_NULL_OR_UNDEFINED(y)) return 1; // not equal 3931c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org if (IS_SYMBOL(y)) return 1; // not equal 40fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org if (!IS_SPEC_OBJECT(y)) { 41fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org // String or boolean. 42fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org return %NumberEquals(x, %ToNumber(y)); 43fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org } 44fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org y = %ToPrimitive(y, NO_HINT); 45fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org } 4643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else if (IS_STRING(x)) { 47fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org while (true) { 48fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org if (IS_STRING(y)) return %StringEquals(x, y); 49f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org if (IS_SYMBOL(y)) return 1; // not equal 50fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org if (IS_NUMBER(y)) return %NumberEquals(%ToNumber(x), y); 51fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org if (IS_BOOLEAN(y)) return %NumberEquals(%ToNumber(x), %ToNumber(y)); 52fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org if (IS_NULL_OR_UNDEFINED(y)) return 1; // not equal 53fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org y = %ToPrimitive(y, NO_HINT); 54fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org } 55f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org } else if (IS_SYMBOL(x)) { 56f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (IS_SYMBOL(y)) return %_ObjectEquals(x, y) ? 0 : 1; 57f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return 1; // not equal 58fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org } else if (IS_BOOLEAN(x)) { 59fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org if (IS_BOOLEAN(y)) return %_ObjectEquals(x, y) ? 0 : 1; 60fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org if (IS_NULL_OR_UNDEFINED(y)) return 1; 6143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (IS_NUMBER(y)) return %NumberEquals(%ToNumber(x), y); 62fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org if (IS_STRING(y)) return %NumberEquals(%ToNumber(x), %ToNumber(y)); 63f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org if (IS_SYMBOL(y)) return 1; // not equal 64fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org // y is object. 65fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org x = %ToNumber(x); 6643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen y = %ToPrimitive(y, NO_HINT); 67fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org } else if (IS_NULL_OR_UNDEFINED(x)) { 68fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org return IS_NULL_OR_UNDEFINED(y) ? 0 : 1; 6943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 70fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org // x is an object. 714980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org if (IS_SPEC_OBJECT(y)) { 729258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org return %_ObjectEquals(x, y) ? 0 : 1; 739258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org } 74fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org if (IS_NULL_OR_UNDEFINED(y)) return 1; // not equal 75f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (IS_SYMBOL(y)) return 1; // not equal 76fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org if (IS_BOOLEAN(y)) y = %ToNumber(y); 7743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen x = %ToPrimitive(x, NO_HINT); 7843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 7943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 8041044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 8143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 8243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ECMA-262, section 11.9.4, page 56. 8343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction STRICT_EQUALS(x) { 8443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (IS_STRING(this)) { 8543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (!IS_STRING(x)) return 1; // not equal 8643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return %StringEquals(this, x); 87eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org } 889258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 897c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org if (IS_NUMBER(this)) { 907c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org if (!IS_NUMBER(x)) return 1; // not equal 917c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org return %NumberEquals(this, x); 92eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org } 939258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org 948ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org // If anything else gets here, we just do simple identity check. 958ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org // Objects (including functions), null, undefined and booleans were 968ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org // checked in the CompareStub, so there should be nothing left. 979258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org return %_ObjectEquals(this, x) ? 0 : 1; 9841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 9943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ECMA-262, section 11.8.5, page 53. The 'ncr' parameter is used as 10243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// the result when either (or both) the operands are NaN. 10343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction COMPARE(x, ncr) { 1040c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org var left; 10532d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org var right; 1060c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org // Fast cases for string, numbers and undefined compares. 1070c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org if (IS_STRING(this)) { 1080c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org if (IS_STRING(x)) return %_StringCompare(this, x); 1090c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org if (IS_UNDEFINED(x)) return ncr; 1100c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org left = this; 1110c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org } else if (IS_NUMBER(this)) { 1120c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org if (IS_NUMBER(x)) return %NumberCompare(this, x, ncr); 1130c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org if (IS_UNDEFINED(x)) return ncr; 1140c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org left = this; 1150c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org } else if (IS_UNDEFINED(this)) { 11632d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org if (!IS_UNDEFINED(x)) { 11732d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org %ToPrimitive(x, NUMBER_HINT); 11832d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org } 11932d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org return ncr; 12032d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org } else if (IS_UNDEFINED(x)) { 12132d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org %ToPrimitive(this, NUMBER_HINT); 12213bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org return ncr; 1230c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org } else { 1240c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org left = %ToPrimitive(this, NUMBER_HINT); 12513bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org } 12613bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 12732d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org right = %ToPrimitive(x, NUMBER_HINT); 1280c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org if (IS_STRING(left) && IS_STRING(right)) { 1290c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org return %_StringCompare(left, right); 13043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 1310c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org var left_number = %ToNumber(left); 1320c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org var right_number = %ToNumber(right); 1330c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org if (NUMBER_IS_NAN(left_number) || NUMBER_IS_NAN(right_number)) return ncr; 1340c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org return %NumberCompare(left_number, right_number, ncr); 13543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 13641044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 13743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 13843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 13943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 14043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/* ----------------------------------- 14143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen - - - A r i t h m e t i c - - - 14243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ----------------------------------- 14343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen*/ 14443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 14543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ECMA-262, section 11.6.1, page 50. 14643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction ADD(x) { 14743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Fast case: Check for number operands and do the addition. 1487c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org if (IS_NUMBER(this) && IS_NUMBER(x)) return %NumberAdd(this, x); 149ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org if (IS_STRING(this) && IS_STRING(x)) return %_StringAdd(this, x); 15041044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org 1517c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org // Default implementation. 15243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen var a = %ToPrimitive(this, NO_HINT); 15343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen var b = %ToPrimitive(x, NO_HINT); 154eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 15543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (IS_STRING(a)) { 156ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org return %_StringAdd(a, %ToString(b)); 15743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else if (IS_STRING(b)) { 158d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org return %_StringAdd(%NonStringToString(a), b); 15943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 16043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return %NumberAdd(%ToNumber(a), %ToNumber(b)); 16143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 16241044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 16343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 16443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1658ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org// Left operand (this) is already a string. 166eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction STRING_ADD_LEFT(y) { 16786f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org if (!IS_STRING(y)) { 168ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org if (IS_STRING_WRAPPER(y) && %_IsStringWrapperSafeForDefaultValueOf(y)) { 16986f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org y = %_ValueOf(y); 17086f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org } else { 17186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org y = IS_NUMBER(y) 1725c838251403b0be9a882540f1922577abba4c872ager@chromium.org ? %_NumberToString(y) 17386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org : %ToString(%ToPrimitive(y, NO_HINT)); 17486f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org } 17586f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org } 176ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org return %_StringAdd(this, y); 1778ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org} 1788ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org 1798ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org 180eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org// Right operand (y) is already a string. 181eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction STRING_ADD_RIGHT(y) { 18286f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org var x = this; 18386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org if (!IS_STRING(x)) { 184ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org if (IS_STRING_WRAPPER(x) && %_IsStringWrapperSafeForDefaultValueOf(x)) { 18586f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org x = %_ValueOf(x); 18686f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org } else { 18786f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org x = IS_NUMBER(x) 1885c838251403b0be9a882540f1922577abba4c872ager@chromium.org ? %_NumberToString(x) 18986f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org : %ToString(%ToPrimitive(x, NO_HINT)); 19086f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org } 19186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org } 192ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org return %_StringAdd(x, y); 1938ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org} 1948ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org 1958ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org 19643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ECMA-262, section 11.6.2, page 50. 197eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction SUB(y) { 198d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org var x = IS_NUMBER(this) ? this : %NonNumberToNumber(this); 199d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org if (!IS_NUMBER(y)) y = %NonNumberToNumber(y); 200eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org return %NumberSub(x, y); 20141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 20243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 20343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 20443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ECMA-262, section 11.5.1, page 48. 205eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction MUL(y) { 206d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org var x = IS_NUMBER(this) ? this : %NonNumberToNumber(this); 207d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org if (!IS_NUMBER(y)) y = %NonNumberToNumber(y); 208eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org return %NumberMul(x, y); 20941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 21043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 21143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 21243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ECMA-262, section 11.5.2, page 49. 213eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction DIV(y) { 214d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org var x = IS_NUMBER(this) ? this : %NonNumberToNumber(this); 215d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org if (!IS_NUMBER(y)) y = %NonNumberToNumber(y); 216eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org return %NumberDiv(x, y); 21741044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 21843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 21943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 22043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ECMA-262, section 11.5.3, page 49. 221eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction MOD(y) { 222d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org var x = IS_NUMBER(this) ? this : %NonNumberToNumber(this); 223d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org if (!IS_NUMBER(y)) y = %NonNumberToNumber(y); 224eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org return %NumberMod(x, y); 22541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 22643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 22743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 22843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 22943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/* ------------------------------------------- 23043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen - - - B i t o p e r a t i o n s - - - 23143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ------------------------------------------- 23243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen*/ 23343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 23443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ECMA-262, section 11.10, page 57. 235eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction BIT_OR(y) { 236d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org var x = IS_NUMBER(this) ? this : %NonNumberToNumber(this); 237d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org if (!IS_NUMBER(y)) y = %NonNumberToNumber(y); 238eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org return %NumberOr(x, y); 23941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 24043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 24143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 24243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ECMA-262, section 11.10, page 57. 243eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction BIT_AND(y) { 244eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org var x; 245eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org if (IS_NUMBER(this)) { 246eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org x = this; 247d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org if (!IS_NUMBER(y)) y = %NonNumberToNumber(y); 248eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org } else { 249d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org x = %NonNumberToNumber(this); 250eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // Make sure to convert the right operand to a number before 251eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // bailing out in the fast case, but after converting the 252eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // left operand. This ensures that valueOf methods on the right 253eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // operand are always executed. 254d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org if (!IS_NUMBER(y)) y = %NonNumberToNumber(y); 255eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // Optimize for the case where we end up AND'ing a value 256eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // that doesn't convert to a number. This is common in 257eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // certain benchmarks. 258eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org if (NUMBER_IS_NAN(x)) return 0; 259eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org } 260eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org return %NumberAnd(x, y); 26141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 26243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 26343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 26443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ECMA-262, section 11.10, page 57. 265eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction BIT_XOR(y) { 266d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org var x = IS_NUMBER(this) ? this : %NonNumberToNumber(this); 267d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org if (!IS_NUMBER(y)) y = %NonNumberToNumber(y); 268eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org return %NumberXor(x, y); 26941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 27043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 27143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 27243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ECMA-262, section 11.7.1, page 51. 273eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction SHL(y) { 274d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org var x = IS_NUMBER(this) ? this : %NonNumberToNumber(this); 275d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org if (!IS_NUMBER(y)) y = %NonNumberToNumber(y); 276eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org return %NumberShl(x, y); 27741044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 27843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 27943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 28043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ECMA-262, section 11.7.2, page 51. 281eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction SAR(y) { 282eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org var x; 283eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org if (IS_NUMBER(this)) { 284eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org x = this; 285d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org if (!IS_NUMBER(y)) y = %NonNumberToNumber(y); 286eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org } else { 287d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org x = %NonNumberToNumber(this); 288eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // Make sure to convert the right operand to a number before 289eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // bailing out in the fast case, but after converting the 290eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // left operand. This ensures that valueOf methods on the right 291eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // operand are always executed. 292d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org if (!IS_NUMBER(y)) y = %NonNumberToNumber(y); 293eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // Optimize for the case where we end up shifting a value 294eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // that doesn't convert to a number. This is common in 295eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // certain benchmarks. 296eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org if (NUMBER_IS_NAN(x)) return 0; 297eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org } 298eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org return %NumberSar(x, y); 29941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 30043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 30143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 30243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ECMA-262, section 11.7.3, page 52. 303eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgfunction SHR(y) { 304d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org var x = IS_NUMBER(this) ? this : %NonNumberToNumber(this); 305d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org if (!IS_NUMBER(y)) y = %NonNumberToNumber(y); 306eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org return %NumberShr(x, y); 30741044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 30843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 30943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 31043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 31143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/* ----------------------------- 31243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen - - - H e l p e r s - - - 31343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ----------------------------- 31443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen*/ 31543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 31643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ECMA-262, section 11.4.1, page 46. 31749edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.orgfunction DELETE(key, strict) { 318750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return %DeleteProperty(%ToObject(this), %ToName(key), strict); 31941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 32043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 32143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 32243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ECMA-262, section 11.8.7, page 54. 32343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction IN(x) { 3244980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org if (!IS_SPEC_OBJECT(x)) { 32543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen throw %MakeTypeError('invalid_in_operator_use', [this, x]); 32643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 327c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return %_IsNonNegativeSmi(this) ? 328750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org %HasElement(x, this) : %HasProperty(x, %ToName(this)); 32941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 33043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 33143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3327c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org// ECMA-262, section 11.8.6, page 54. To make the implementation more 3338ccb0be15fd0cd7e7804e90fa1ebf302cb7fa44bkasperl@chromium.org// efficient, the return value should be zero if the 'this' is an 3347c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org// instance of F, and non-zero if not. This makes it possible to avoid 3357c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org// an expensive ToBoolean conversion in the generated code. 33643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction INSTANCE_OF(F) { 33743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen var V = this; 33834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org if (!IS_SPEC_FUNCTION(F)) { 339935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org throw %MakeTypeError('instanceof_function_expected', [F]); 34043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 34143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 34243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // If V is not an object, return false. 3434980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org if (!IS_SPEC_OBJECT(V)) { 3447c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org return 1; 34543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 34643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 347394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // Check if function is bound, if so, get [[BoundFunction]] from it 348394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // and use that instead of F. 349394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com var bindings = %BoundFunctionGetBindings(F); 350394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com if (bindings) { 351394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com F = bindings[kBoundFunctionIndex]; // Always a non-bound function. 352394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com } 35343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Get the prototype of F; if it is not an object, throw an error. 35443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen var O = F.prototype; 3554980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org if (!IS_SPEC_OBJECT(O)) { 35643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen throw %MakeTypeError('instanceof_nonobject_proto', [O]); 35743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 35843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 35943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Return whether or not O is in the prototype chain of V. 3607c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org return %IsInPrototypeChain(O, V) ? 0 : 1; 36141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 36243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 36343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 36443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Filter a given key against an object by checking if the object 36543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// has a property with the given key; return the key as a string if 366ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org// it has. Otherwise returns 0 (smi). Used in for-in statements. 36743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction FILTER_KEY(key) { 368750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org var string = %ToName(key); 36943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (%HasProperty(this, string)) return string; 370ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return 0; 37141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 37243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 37343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 37443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction CALL_NON_FUNCTION() { 3755c838251403b0be9a882540f1922577abba4c872ager@chromium.org var delegate = %GetFunctionDelegate(this); 37643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (!IS_FUNCTION(delegate)) { 3775c838251403b0be9a882540f1922577abba4c872ager@chromium.org throw %MakeTypeError('called_non_callable', [typeof this]); 37843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 37934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org return %Apply(delegate, this, arguments, 0, %_ArgumentsLength()); 38005521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org} 38105521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org 38205521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org 38305521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.orgfunction CALL_NON_FUNCTION_AS_CONSTRUCTOR() { 3845c838251403b0be9a882540f1922577abba4c872ager@chromium.org var delegate = %GetConstructorDelegate(this); 38505521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org if (!IS_FUNCTION(delegate)) { 3865c838251403b0be9a882540f1922577abba4c872ager@chromium.org throw %MakeTypeError('called_non_callable', [typeof this]); 38705521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org } 38834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org return %Apply(delegate, this, arguments, 0, %_ArgumentsLength()); 38934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org} 39034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org 39134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org 39234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.orgfunction CALL_FUNCTION_PROXY() { 39334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org var arity = %_ArgumentsLength() - 1; 39434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org var proxy = %_Arguments(arity); // The proxy comes in as an additional arg. 39534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org var trap = %GetCallTrap(proxy); 39634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org return %Apply(trap, this, arguments, 0, arity); 39734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org} 39834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org 39934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org 400c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comfunction CALL_FUNCTION_PROXY_AS_CONSTRUCTOR() { 401c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com var proxy = this; 40234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org var trap = %GetConstructTrap(proxy); 403c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return %Apply(trap, this, arguments, 0, %_ArgumentsLength()); 40441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 40543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 40643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 40743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction APPLY_PREPARE(args) { 40843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen var length; 4093e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org // First check whether length is a positive Smi and args is an 4103e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org // array. This is the fast case. If this fails, we do the slow case 4113e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org // that takes care of more eventualities. 4122abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org if (IS_ARRAY(args)) { 41343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen length = args.length; 41434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org if (%_IsSmi(length) && length >= 0 && length < 0x800000 && 41534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org IS_SPEC_FUNCTION(this)) { 41643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return length; 41743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 41843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 41943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 42043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen length = (args == null) ? 0 : %ToUint32(args.length); 42143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 42243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // We can handle any number of apply arguments if the stack is 42343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // big enough, but sanity check the value to avoid overflow when 42443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // multiplying with pointer size. 42543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (length > 0x800000) { 4266a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org throw %MakeRangeError('stack_overflow', []); 42743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 42843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 42934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org if (!IS_SPEC_FUNCTION(this)) { 4301b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org throw %MakeTypeError('apply_non_function', 4311b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org [ %ToString(this), typeof this ]); 43243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 43343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 43443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Make sure the arguments list has the right type. 435394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com if (args != null && !IS_SPEC_OBJECT(args)) { 43643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen throw %MakeTypeError('apply_wrong_args', []); 43743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 4389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 43943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Return the length which is the number of arguments to copy to the 44043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // stack. It is guaranteed to be a small integer at this point. 44143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return length; 44241044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 44343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 44443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 445e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.orgfunction STACK_OVERFLOW(length) { 4466a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org throw %MakeRangeError('stack_overflow', []); 44741044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 44843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 44943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 45043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Convert the receiver to an object - forward to ToObject. 45143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction TO_OBJECT() { 45243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return %ToObject(this); 45341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 45443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 45543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 45643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Convert the receiver to a number - forward to ToNumber. 45743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction TO_NUMBER() { 45843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return %ToNumber(this); 45941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 46043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 46143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 46243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Convert the receiver to a string - forward to ToString. 46343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction TO_STRING() { 46443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return %ToString(this); 46541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 46643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 46743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 46843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/* ------------------------------------- 46943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen - - - C o n v e r s i o n s - - - 47043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ------------------------------------- 47143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen*/ 47243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 47343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ECMA-262, section 9.1, page 30. Use null/undefined for no hint, 47443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// (1) for number hint, and (2) for string hint. 47543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction ToPrimitive(x, hint) { 4767c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org // Fast case check. 4777c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org if (IS_STRING(x)) return x; 4787c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org // Normal behavior. 4794980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org if (!IS_SPEC_OBJECT(x)) return x; 480f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (IS_SYMBOL_WRAPPER(x)) throw MakeTypeError('symbol_to_primitive', []); 48143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (hint == NO_HINT) hint = (IS_DATE(x)) ? STRING_HINT : NUMBER_HINT; 48243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return (hint == NUMBER_HINT) ? %DefaultNumber(x) : %DefaultString(x); 48341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 48443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 48543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4865c838251403b0be9a882540f1922577abba4c872ager@chromium.org// ECMA-262, section 9.2, page 30 4875c838251403b0be9a882540f1922577abba4c872ager@chromium.orgfunction ToBoolean(x) { 4885c838251403b0be9a882540f1922577abba4c872ager@chromium.org if (IS_BOOLEAN(x)) return x; 4895c838251403b0be9a882540f1922577abba4c872ager@chromium.org if (IS_STRING(x)) return x.length != 0; 4905c838251403b0be9a882540f1922577abba4c872ager@chromium.org if (x == null) return false; 4915c838251403b0be9a882540f1922577abba4c872ager@chromium.org if (IS_NUMBER(x)) return !((x == 0) || NUMBER_IS_NAN(x)); 4925c838251403b0be9a882540f1922577abba4c872ager@chromium.org return true; 4935c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 4945c838251403b0be9a882540f1922577abba4c872ager@chromium.org 4955c838251403b0be9a882540f1922577abba4c872ager@chromium.org 49643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ECMA-262, section 9.3, page 31. 49743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction ToNumber(x) { 49843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (IS_NUMBER(x)) return x; 499d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org if (IS_STRING(x)) { 500d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org return %_HasCachedArrayIndex(x) ? %_GetCachedArrayIndex(x) 501d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org : %StringToNumber(x); 502d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org } 50343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (IS_BOOLEAN(x)) return x ? 1 : 0; 504690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org if (IS_UNDEFINED(x)) return NAN; 50531c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org if (IS_SYMBOL(x)) throw MakeTypeError('symbol_to_number', []); 50643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return (IS_NULL(x)) ? 0 : ToNumber(%DefaultNumber(x)); 50741044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 50843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 509d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgfunction NonNumberToNumber(x) { 510d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org if (IS_STRING(x)) { 511d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org return %_HasCachedArrayIndex(x) ? %_GetCachedArrayIndex(x) 512d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org : %StringToNumber(x); 513d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org } 514d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org if (IS_BOOLEAN(x)) return x ? 1 : 0; 515690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org if (IS_UNDEFINED(x)) return NAN; 51631c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org if (IS_SYMBOL(x)) throw MakeTypeError('symbol_to_number', []); 517d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org return (IS_NULL(x)) ? 0 : ToNumber(%DefaultNumber(x)); 518d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org} 519d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org 52043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 52143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ECMA-262, section 9.8, page 35. 52243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction ToString(x) { 52343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (IS_STRING(x)) return x; 5245c838251403b0be9a882540f1922577abba4c872ager@chromium.org if (IS_NUMBER(x)) return %_NumberToString(x); 52543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (IS_BOOLEAN(x)) return x ? 'true' : 'false'; 52643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (IS_UNDEFINED(x)) return 'undefined'; 527f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (IS_SYMBOL(x)) throw %MakeTypeError('symbol_to_string', []); 52843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return (IS_NULL(x)) ? 'null' : %ToString(%DefaultString(x)); 52941044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 53043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 531b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.orgfunction NonStringToString(x) { 532357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org if (IS_NUMBER(x)) return %_NumberToString(x); 533b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org if (IS_BOOLEAN(x)) return x ? 'true' : 'false'; 534b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org if (IS_UNDEFINED(x)) return 'undefined'; 535f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (IS_SYMBOL(x)) throw %MakeTypeError('symbol_to_string', []); 536b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org return (IS_NULL(x)) ? 'null' : %ToString(%DefaultString(x)); 537b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org} 538b95b98b0c30bcd40b657aa45f6cd75a46a4772adfschneider@chromium.org 53943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 540750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// ES6 symbols 541750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgfunction ToName(x) { 542750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return IS_SYMBOL(x) ? x : %ToString(x); 543750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} 544750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 545750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 54643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ECMA-262, section 9.9, page 36. 54743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction ToObject(x) { 54843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (IS_STRING(x)) return new $String(x); 54943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (IS_NUMBER(x)) return new $Number(x); 55043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (IS_BOOLEAN(x)) return new $Boolean(x); 551f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (IS_SYMBOL(x)) return %NewSymbolWrapper(x); 552b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org if (IS_NULL_OR_UNDEFINED(x) && !IS_UNDETECTABLE(x)) { 553e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org throw %MakeTypeError('undefined_or_null_to_object', []); 554b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 55543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return x; 55641044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 55743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 55843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 55943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ECMA-262, section 9.4, page 34. 56043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction ToInteger(x) { 56143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (%_IsSmi(x)) return x; 56243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return %NumberToInteger(ToNumber(x)); 56341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 56443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 56543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 566a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org// ES6, draft 08-24-14, section 7.1.15 567a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgfunction ToLength(arg) { 568a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org arg = ToInteger(arg); 569a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org if (arg < 0) return 0; 570a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org return arg < $Number.MAX_SAFE_INTEGER ? arg : $Number.MAX_SAFE_INTEGER; 571a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org} 572a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 573a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 57443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ECMA-262, section 9.6, page 34. 57543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction ToUint32(x) { 576769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com if (%_IsSmi(x) && x >= 0) return x; 57743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return %NumberToJSUint32(ToNumber(x)); 57841044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 57943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 58043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 58143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ECMA-262, section 9.5, page 34 58243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction ToInt32(x) { 58343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (%_IsSmi(x)) return x; 58443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return %NumberToJSInt32(ToNumber(x)); 58541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 58643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 58743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5885c838251403b0be9a882540f1922577abba4c872ager@chromium.org// ES5, section 9.12 5895c838251403b0be9a882540f1922577abba4c872ager@chromium.orgfunction SameValue(x, y) { 5905c838251403b0be9a882540f1922577abba4c872ager@chromium.org if (typeof x != typeof y) return false; 5915c838251403b0be9a882540f1922577abba4c872ager@chromium.org if (IS_NUMBER(x)) { 5925c838251403b0be9a882540f1922577abba4c872ager@chromium.org if (NUMBER_IS_NAN(x) && NUMBER_IS_NAN(y)) return true; 5939155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org // x is +0 and y is -0 or vice versa. 5940cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org if (x === 0 && y === 0 && %_IsMinusZero(x) != %_IsMinusZero(y)) { 5950cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org return false; 5960cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org } 5975c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 598d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org return x === y; 5995c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 6005c838251403b0be9a882540f1922577abba4c872ager@chromium.org 60143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 60243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/* --------------------------------- 60343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen - - - U t i l i t i e s - - - 60443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen --------------------------------- 60543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen*/ 60643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 60743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Returns if the given x is a primitive value - not an object or a 60843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// function. 60943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction IsPrimitive(x) { 6104980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org // Even though the type of null is "object", null is still 6114980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org // considered a primitive value. IS_SPEC_OBJECT handles this correctly 6124980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org // (i.e., it will return false if x is null). 6134980dff4208f9b77bc5320af43d7cc4b2a3d9688ricow@chromium.org return !IS_SPEC_OBJECT(x); 61441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 61543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 61643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 61743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ECMA-262, section 8.6.2.6, page 28. 61843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction DefaultNumber(x) { 6194c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (!IS_SYMBOL_WRAPPER(x)) { 6204c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org var valueOf = x.valueOf; 6214c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (IS_SPEC_FUNCTION(valueOf)) { 6224c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org var v = %_CallFunction(x, valueOf); 6234c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (%IsPrimitive(v)) return v; 6244c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org } 62543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6264c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org var toString = x.toString; 6274c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (IS_SPEC_FUNCTION(toString)) { 6284c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org var s = %_CallFunction(x, toString); 6294c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (%IsPrimitive(s)) return s; 6304c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org } 63143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 63243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen throw %MakeTypeError('cannot_convert_to_primitive', []); 63341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 63443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 63543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ECMA-262, section 8.6.2.6, page 28. 63643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenfunction DefaultString(x) { 6374c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (!IS_SYMBOL_WRAPPER(x)) { 6384c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org var toString = x.toString; 6394c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (IS_SPEC_FUNCTION(toString)) { 6404c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org var s = %_CallFunction(x, toString); 6414c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (%IsPrimitive(s)) return s; 6424c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org } 64343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6444c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org var valueOf = x.valueOf; 6454c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (IS_SPEC_FUNCTION(valueOf)) { 6464c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org var v = %_CallFunction(x, valueOf); 6474c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org if (%IsPrimitive(v)) return v; 6484c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org } 64943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 65043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen throw %MakeTypeError('cannot_convert_to_primitive', []); 65141044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org} 65243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgfunction ToPositiveInteger(x, rangeErrorName) { 6541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org var i = TO_INTEGER(x); 655af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org if (i < 0) throw MakeRangeError(rangeErrorName); 6561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return i; 6571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org} 6581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 65943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 66043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// NOTE: Setting the prototype for Array must take place as early as 66143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// possible due to code generation for array literals. When 66243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// generating code for a array literal a boilerplate array is created 6637304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org// that is cloned when running the code. It is essential that the 66443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// boilerplate gets the right prototype. 66543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen%FunctionSetPrototype($Array, new $Array(0)); 666