OLD | NEW |
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // This files contains runtime support implemented in JavaScript. | 5 // This files contains runtime support implemented in JavaScript. |
6 | 6 |
7 // CAUTION: Some of the functions specified in this file are called | 7 // CAUTION: Some of the functions specified in this file are called |
8 // directly from compiled code. These are the functions with names in | 8 // directly from compiled code. These are the functions with names in |
9 // ALL CAPS. The compiled code passes the first argument in 'this'. | 9 // ALL CAPS. The compiled code passes the first argument in 'this'. |
10 | 10 |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
143 | 143 |
144 // Strong mode COMPARE throws if an implicit conversion would be performed | 144 // Strong mode COMPARE throws if an implicit conversion would be performed |
145 function COMPARE_STRONG(x, ncr) { | 145 function COMPARE_STRONG(x, ncr) { |
146 if (IS_STRING(this) && IS_STRING(x)) return %_StringCompare(this, x); | 146 if (IS_STRING(this) && IS_STRING(x)) return %_StringCompare(this, x); |
147 if (IS_NUMBER(this) && IS_NUMBER(x)) return %NumberCompare(this, x, ncr); | 147 if (IS_NUMBER(this) && IS_NUMBER(x)) return %NumberCompare(this, x, ncr); |
148 | 148 |
149 throw %make_type_error(kStrongImplicitConversion); | 149 throw %make_type_error(kStrongImplicitConversion); |
150 } | 150 } |
151 | 151 |
152 | 152 |
153 | |
154 /* ----------------------------------- | |
155 - - - A r i t h m e t i c - - - | |
156 ----------------------------------- | |
157 */ | |
158 | |
159 // Left operand (this) is already a string. | |
160 function STRING_ADD_LEFT(y) { | |
161 if (!IS_STRING(y)) { | |
162 if (IS_STRING_WRAPPER(y) && %_IsStringWrapperSafeForDefaultValueOf(y)) { | |
163 y = %_ValueOf(y); | |
164 } else { | |
165 y = IS_NUMBER(y) | |
166 ? %_NumberToString(y) | |
167 : %to_string_fun(%to_primitive(y, NO_HINT)); | |
168 } | |
169 } | |
170 return %_StringAdd(this, y); | |
171 } | |
172 | |
173 | |
174 // Right operand (y) is already a string. | |
175 function STRING_ADD_RIGHT(y) { | |
176 var x = this; | |
177 if (!IS_STRING(x)) { | |
178 if (IS_STRING_WRAPPER(x) && %_IsStringWrapperSafeForDefaultValueOf(x)) { | |
179 x = %_ValueOf(x); | |
180 } else { | |
181 x = IS_NUMBER(x) | |
182 ? %_NumberToString(x) | |
183 : %to_string_fun(%to_primitive(x, NO_HINT)); | |
184 } | |
185 } | |
186 return %_StringAdd(x, y); | |
187 } | |
188 | |
189 | |
190 /* ----------------------------- | 153 /* ----------------------------- |
191 - - - H e l p e r s - - - | 154 - - - H e l p e r s - - - |
192 ----------------------------- | 155 ----------------------------- |
193 */ | 156 */ |
194 | 157 |
195 function APPLY_PREPARE(args) { | 158 function APPLY_PREPARE(args) { |
196 var length; | 159 var length; |
197 | 160 |
198 // First check that the receiver is callable. | 161 // First check that the receiver is callable. |
199 if (!IS_CALLABLE(this)) { | 162 if (!IS_CALLABLE(this)) { |
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
531 $toString = ToString; | 494 $toString = ToString; |
532 | 495 |
533 %InstallToContext([ | 496 %InstallToContext([ |
534 "apply_prepare_builtin", APPLY_PREPARE, | 497 "apply_prepare_builtin", APPLY_PREPARE, |
535 "compare_builtin", COMPARE, | 498 "compare_builtin", COMPARE, |
536 "compare_strong_builtin", COMPARE_STRONG, | 499 "compare_strong_builtin", COMPARE_STRONG, |
537 "concat_iterable_to_array_builtin", CONCAT_ITERABLE_TO_ARRAY, | 500 "concat_iterable_to_array_builtin", CONCAT_ITERABLE_TO_ARRAY, |
538 "equals_builtin", EQUALS, | 501 "equals_builtin", EQUALS, |
539 "reflect_apply_prepare_builtin", REFLECT_APPLY_PREPARE, | 502 "reflect_apply_prepare_builtin", REFLECT_APPLY_PREPARE, |
540 "reflect_construct_prepare_builtin", REFLECT_CONSTRUCT_PREPARE, | 503 "reflect_construct_prepare_builtin", REFLECT_CONSTRUCT_PREPARE, |
541 "string_add_left_builtin", STRING_ADD_LEFT, | |
542 "string_add_right_builtin", STRING_ADD_RIGHT, | |
543 ]); | 504 ]); |
544 | 505 |
545 %InstallToContext([ | 506 %InstallToContext([ |
546 "concat_iterable_to_array", ConcatIterableToArray, | 507 "concat_iterable_to_array", ConcatIterableToArray, |
547 "non_number_to_number", NonNumberToNumber, | 508 "non_number_to_number", NonNumberToNumber, |
548 "non_string_to_string", NonStringToString, | 509 "non_string_to_string", NonStringToString, |
549 "to_integer_fun", ToInteger, | 510 "to_integer_fun", ToInteger, |
550 "to_length_fun", ToLength, | 511 "to_length_fun", ToLength, |
551 "to_number_fun", ToNumber, | 512 "to_number_fun", ToNumber, |
552 "to_primitive", ToPrimitive, | 513 "to_primitive", ToPrimitive, |
553 "to_string_fun", ToString, | 514 "to_string_fun", ToString, |
554 ]); | 515 ]); |
555 | 516 |
556 utils.Export(function(to) { | 517 utils.Export(function(to) { |
557 to.ToBoolean = ToBoolean; | 518 to.ToBoolean = ToBoolean; |
558 to.ToLength = ToLength; | 519 to.ToLength = ToLength; |
559 to.ToNumber = ToNumber; | 520 to.ToNumber = ToNumber; |
560 to.ToPrimitive = ToPrimitive; | 521 to.ToPrimitive = ToPrimitive; |
561 to.ToString = ToString; | 522 to.ToString = ToString; |
562 }); | 523 }); |
563 | 524 |
564 }) | 525 }) |
OLD | NEW |