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