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

Side by Side Diff: src/builtins.cc

Issue 2126453002: [intrinsic] Drop the %_ValueOf intrinsic. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix noi18n build (narf) Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/builtins.h ('k') | src/code-stub-assembler.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 #include "src/builtins.h" 5 #include "src/builtins.h"
6 6
7 #include "src/api-arguments.h" 7 #include "src/api-arguments.h"
8 #include "src/api-natives.h" 8 #include "src/api-natives.h"
9 #include "src/api.h" 9 #include "src/api.h"
10 #include "src/base/ieee754.h" 10 #include "src/base/ieee754.h"
(...skipping 2225 matching lines...) Expand 10 before | Expand all | Expand 10 after
2236 HandleScope scope(isolate); 2236 HandleScope scope(isolate);
2237 JsonStringifier stringifier(isolate); 2237 JsonStringifier stringifier(isolate);
2238 Handle<Object> object = args.atOrUndefined(isolate, 1); 2238 Handle<Object> object = args.atOrUndefined(isolate, 1);
2239 Handle<Object> replacer = args.atOrUndefined(isolate, 2); 2239 Handle<Object> replacer = args.atOrUndefined(isolate, 2);
2240 Handle<Object> indent = args.atOrUndefined(isolate, 3); 2240 Handle<Object> indent = args.atOrUndefined(isolate, 3);
2241 RETURN_RESULT_OR_FAILURE(isolate, 2241 RETURN_RESULT_OR_FAILURE(isolate,
2242 stringifier.Stringify(object, replacer, indent)); 2242 stringifier.Stringify(object, replacer, indent));
2243 } 2243 }
2244 2244
2245 // ----------------------------------------------------------------------------- 2245 // -----------------------------------------------------------------------------
2246 // ES6 section 20.1 Number Objects
2247
2248 // ES6 section 20.1.3.2 Number.prototype.toExponential ( fractionDigits )
2249 BUILTIN(NumberPrototypeToExponential) {
2250 HandleScope scope(isolate);
2251 Handle<Object> value = args.at<Object>(0);
2252 Handle<Object> fraction_digits = args.atOrUndefined(isolate, 1);
2253
2254 // Unwrap the receiver {value}.
2255 if (value->IsJSValue()) {
2256 value = handle(Handle<JSValue>::cast(value)->value(), isolate);
2257 }
2258 if (!value->IsNumber()) {
2259 THROW_NEW_ERROR_RETURN_FAILURE(
2260 isolate, NewTypeError(MessageTemplate::kNotGeneric,
2261 isolate->factory()->NewStringFromAsciiChecked(
2262 "Number.prototype.toExponential")));
2263 }
2264 double const value_number = value->Number();
2265
2266 // Convert the {fraction_digits} to an integer first.
2267 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
2268 isolate, fraction_digits, Object::ToInteger(isolate, fraction_digits));
2269 double const fraction_digits_number = fraction_digits->Number();
2270
2271 if (std::isnan(value_number)) return isolate->heap()->nan_string();
2272 if (std::isinf(value_number)) {
2273 return (value_number < 0.0) ? isolate->heap()->minus_infinity_string()
2274 : isolate->heap()->infinity_string();
2275 }
2276 if (fraction_digits_number < 0.0 || fraction_digits_number > 20.0) {
2277 THROW_NEW_ERROR_RETURN_FAILURE(
2278 isolate, NewRangeError(MessageTemplate::kNumberFormatRange,
2279 isolate->factory()->NewStringFromAsciiChecked(
2280 "toExponential()")));
2281 }
2282 int const f = args.atOrUndefined(isolate, 1)->IsUndefined(isolate)
2283 ? -1
2284 : static_cast<int>(fraction_digits_number);
2285 char* const str = DoubleToExponentialCString(value_number, f);
2286 Handle<String> result = isolate->factory()->NewStringFromAsciiChecked(str);
2287 DeleteArray(str);
2288 return *result;
2289 }
2290
2291 // ES6 section 20.1.3.3 Number.prototype.toFixed ( fractionDigits )
2292 BUILTIN(NumberPrototypeToFixed) {
2293 HandleScope scope(isolate);
2294 Handle<Object> value = args.at<Object>(0);
2295 Handle<Object> fraction_digits = args.atOrUndefined(isolate, 1);
2296
2297 // Unwrap the receiver {value}.
2298 if (value->IsJSValue()) {
2299 value = handle(Handle<JSValue>::cast(value)->value(), isolate);
2300 }
2301 if (!value->IsNumber()) {
2302 THROW_NEW_ERROR_RETURN_FAILURE(
2303 isolate, NewTypeError(MessageTemplate::kNotGeneric,
2304 isolate->factory()->NewStringFromAsciiChecked(
2305 "Number.prototype.toFixed")));
2306 }
2307 double const value_number = value->Number();
2308
2309 // Convert the {fraction_digits} to an integer first.
2310 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
2311 isolate, fraction_digits, Object::ToInteger(isolate, fraction_digits));
2312 double const fraction_digits_number = fraction_digits->Number();
2313
2314 // Check if the {fraction_digits} are in the supported range.
2315 if (fraction_digits_number < 0.0 || fraction_digits_number > 20.0) {
2316 THROW_NEW_ERROR_RETURN_FAILURE(
2317 isolate, NewRangeError(MessageTemplate::kNumberFormatRange,
2318 isolate->factory()->NewStringFromAsciiChecked(
2319 "toFixed() digits")));
2320 }
2321
2322 if (std::isnan(value_number)) return isolate->heap()->nan_string();
2323 if (std::isinf(value_number)) {
2324 return (value_number < 0.0) ? isolate->heap()->minus_infinity_string()
2325 : isolate->heap()->infinity_string();
2326 }
2327 char* const str = DoubleToFixedCString(
2328 value_number, static_cast<int>(fraction_digits_number));
2329 Handle<String> result = isolate->factory()->NewStringFromAsciiChecked(str);
2330 DeleteArray(str);
2331 return *result;
2332 }
2333
2334 // ES6 section 20.1.3.4 Number.prototype.toLocaleString ( [ r1 [ , r2 ] ] )
2335 BUILTIN(NumberPrototypeToLocaleString) {
2336 HandleScope scope(isolate);
2337 Handle<Object> value = args.at<Object>(0);
2338
2339 // Unwrap the receiver {value}.
2340 if (value->IsJSValue()) {
2341 value = handle(Handle<JSValue>::cast(value)->value(), isolate);
2342 }
2343 if (!value->IsNumber()) {
2344 THROW_NEW_ERROR_RETURN_FAILURE(
2345 isolate, NewTypeError(MessageTemplate::kNotGeneric,
2346 isolate->factory()->NewStringFromAsciiChecked(
2347 "Number.prototype.toLocaleString")));
2348 }
2349
2350 // Turn the {value} into a String.
2351 return *isolate->factory()->NumberToString(value);
2352 }
2353
2354 // ES6 section 20.1.3.5 Number.prototype.toPrecision ( precision )
2355 BUILTIN(NumberPrototypeToPrecision) {
2356 HandleScope scope(isolate);
2357 Handle<Object> value = args.at<Object>(0);
2358 Handle<Object> precision = args.atOrUndefined(isolate, 1);
2359
2360 // Unwrap the receiver {value}.
2361 if (value->IsJSValue()) {
2362 value = handle(Handle<JSValue>::cast(value)->value(), isolate);
2363 }
2364 if (!value->IsNumber()) {
2365 THROW_NEW_ERROR_RETURN_FAILURE(
2366 isolate, NewTypeError(MessageTemplate::kNotGeneric,
2367 isolate->factory()->NewStringFromAsciiChecked(
2368 "Number.prototype.toPrecision")));
2369 }
2370 double const value_number = value->Number();
2371
2372 // If no {precision} was specified, just return ToString of {value}.
2373 if (precision->IsUndefined(isolate)) {
2374 return *isolate->factory()->NumberToString(value);
2375 }
2376
2377 // Convert the {precision} to an integer first.
2378 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, precision,
2379 Object::ToInteger(isolate, precision));
2380 double const precision_number = precision->Number();
2381
2382 if (std::isnan(value_number)) return isolate->heap()->nan_string();
2383 if (std::isinf(value_number)) {
2384 return (value_number < 0.0) ? isolate->heap()->minus_infinity_string()
2385 : isolate->heap()->infinity_string();
2386 }
2387 if (precision_number < 1.0 || precision_number > 21.0) {
2388 THROW_NEW_ERROR_RETURN_FAILURE(
2389 isolate, NewRangeError(MessageTemplate::kToPrecisionFormatRange));
2390 }
2391 char* const str = DoubleToPrecisionCString(
2392 value_number, static_cast<int>(precision_number));
2393 Handle<String> result = isolate->factory()->NewStringFromAsciiChecked(str);
2394 DeleteArray(str);
2395 return *result;
2396 }
2397
2398 // ES6 section 20.1.3.6 Number.prototype.toString ( [ radix ] )
2399 BUILTIN(NumberPrototypeToString) {
2400 HandleScope scope(isolate);
2401 Handle<Object> value = args.at<Object>(0);
2402 Handle<Object> radix = args.atOrUndefined(isolate, 1);
2403
2404 // Unwrap the receiver {value}.
2405 if (value->IsJSValue()) {
2406 value = handle(Handle<JSValue>::cast(value)->value(), isolate);
2407 }
2408 if (!value->IsNumber()) {
2409 THROW_NEW_ERROR_RETURN_FAILURE(
2410 isolate, NewTypeError(MessageTemplate::kNotGeneric,
2411 isolate->factory()->NewStringFromAsciiChecked(
2412 "Number.prototype.toString")));
2413 }
2414 double const value_number = value->Number();
2415
2416 // If no {radix} was specified, just return ToString of {value}.
2417 if (radix->IsUndefined(isolate)) {
2418 return *isolate->factory()->NumberToString(value);
2419 }
2420
2421 // Convert the {radix} to an integer first.
2422 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, radix,
2423 Object::ToInteger(isolate, radix));
2424 double const radix_number = radix->Number();
2425
2426 // If {radix} is 10, just return ToString of {value}.
2427 if (radix_number == 10.0) return *isolate->factory()->NumberToString(value);
2428
2429 // Make sure the {radix} is within the valid range.
2430 if (radix_number < 2.0 || radix_number > 36.0) {
2431 THROW_NEW_ERROR_RETURN_FAILURE(
2432 isolate, NewRangeError(MessageTemplate::kToRadixFormatRange));
2433 }
2434
2435 // Fast case where the result is a one character string.
2436 if (IsUint32Double(value_number) && value_number < radix_number) {
2437 // Character array used for conversion.
2438 static const char kCharTable[] = "0123456789abcdefghijklmnopqrstuvwxyz";
2439 return *isolate->factory()->LookupSingleCharacterStringFromCode(
2440 kCharTable[static_cast<uint32_t>(value_number)]);
2441 }
2442
2443 // Slow case.
2444 if (std::isnan(value_number)) return isolate->heap()->nan_string();
2445 if (std::isinf(value_number)) {
2446 return (value_number < 0.0) ? isolate->heap()->minus_infinity_string()
2447 : isolate->heap()->infinity_string();
2448 }
2449 char* const str =
2450 DoubleToRadixCString(value_number, static_cast<int>(radix_number));
2451 Handle<String> result = isolate->factory()->NewStringFromAsciiChecked(str);
2452 DeleteArray(str);
2453 return *result;
2454 }
2455
2456 // ES6 section 20.1.3.7 Number.prototype.valueOf ( )
2457 void Builtins::Generate_NumberPrototypeValueOf(CodeStubAssembler* assembler) {
2458 typedef compiler::Node Node;
2459
2460 Node* receiver = assembler->Parameter(0);
2461 Node* context = assembler->Parameter(3);
2462
2463 Node* result = assembler->ToThisValue(
2464 context, receiver, PrimitiveType::kNumber, "Number.prototype.valueOf");
2465 assembler->Return(result);
2466 }
2467
2468 // -----------------------------------------------------------------------------
2246 // ES6 section 20.2.2 Function Properties of the Math Object 2469 // ES6 section 20.2.2 Function Properties of the Math Object
2247 2470
2248 // ES6 section - 20.2.2.1 Math.abs ( x ) 2471 // ES6 section - 20.2.2.1 Math.abs ( x )
2249 void Builtins::Generate_MathAbs(CodeStubAssembler* assembler) { 2472 void Builtins::Generate_MathAbs(CodeStubAssembler* assembler) {
2250 using compiler::Node; 2473 using compiler::Node;
2251 Node* x = assembler->Parameter(1); 2474 Node* x = assembler->Parameter(1);
2252 Node* context = assembler->Parameter(4); 2475 Node* context = assembler->Parameter(4);
2253 Node* x_value = assembler->TruncateTaggedToFloat64(context, x); 2476 Node* x_value = assembler->TruncateTaggedToFloat64(context, x);
2254 Node* value = assembler->Float64Abs(x_value); 2477 Node* value = assembler->Float64Abs(x_value);
2255 Node* result = assembler->ChangeFloat64ToTagged(value); 2478 Node* result = assembler->ChangeFloat64ToTagged(value);
(...skipping 938 matching lines...) Expand 10 before | Expand all | Expand 10 after
3194 Handle<JSObject> result; 3417 Handle<JSObject> result;
3195 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, 3418 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result,
3196 JSObject::New(target, new_target)); 3419 JSObject::New(target, new_target));
3197 Handle<JSValue>::cast(result)->set_value( 3420 Handle<JSValue>::cast(result)->set_value(
3198 isolate->heap()->ToBoolean(value->BooleanValue())); 3421 isolate->heap()->ToBoolean(value->BooleanValue()));
3199 return *result; 3422 return *result;
3200 } 3423 }
3201 3424
3202 3425
3203 // ES6 section 19.3.3.2 Boolean.prototype.toString ( ) 3426 // ES6 section 19.3.3.2 Boolean.prototype.toString ( )
3204 BUILTIN(BooleanPrototypeToString) { 3427 void Builtins::Generate_BooleanPrototypeToString(CodeStubAssembler* assembler) {
3205 HandleScope scope(isolate); 3428 typedef compiler::Node Node;
3206 Handle<Object> receiver = args.receiver(); 3429
3207 if (receiver->IsJSValue()) { 3430 Node* receiver = assembler->Parameter(0);
3208 receiver = handle(Handle<JSValue>::cast(receiver)->value(), isolate); 3431 Node* context = assembler->Parameter(3);
3209 } 3432
3210 if (!receiver->IsBoolean()) { 3433 Node* value = assembler->ToThisValue(
3211 THROW_NEW_ERROR_RETURN_FAILURE( 3434 context, receiver, PrimitiveType::kBoolean, "Boolean.prototype.toString");
3212 isolate, NewTypeError(MessageTemplate::kNotGeneric, 3435 Node* result = assembler->LoadObjectField(value, Oddball::kToStringOffset);
3213 isolate->factory()->NewStringFromAsciiChecked( 3436 assembler->Return(result);
3214 "Boolean.prototype.toString")));
3215 }
3216 return Handle<Oddball>::cast(receiver)->to_string();
3217 } 3437 }
3218 3438
3439 // ES6 section 19.3.3.3 Boolean.prototype.valueOf ( )
3440 void Builtins::Generate_BooleanPrototypeValueOf(CodeStubAssembler* assembler) {
3441 typedef compiler::Node Node;
3219 3442
3220 // ES6 section 19.3.3.3 Boolean.prototype.valueOf ( ) 3443 Node* receiver = assembler->Parameter(0);
3221 BUILTIN(BooleanPrototypeValueOf) { 3444 Node* context = assembler->Parameter(3);
3222 HandleScope scope(isolate); 3445
3223 Handle<Object> receiver = args.receiver(); 3446 Node* result = assembler->ToThisValue(
3224 if (receiver->IsJSValue()) { 3447 context, receiver, PrimitiveType::kBoolean, "Boolean.prototype.valueOf");
3225 receiver = handle(Handle<JSValue>::cast(receiver)->value(), isolate); 3448 assembler->Return(result);
3226 }
3227 if (!receiver->IsBoolean()) {
3228 THROW_NEW_ERROR_RETURN_FAILURE(
3229 isolate, NewTypeError(MessageTemplate::kNotGeneric,
3230 isolate->factory()->NewStringFromAsciiChecked(
3231 "Boolean.prototype.valueOf")));
3232 }
3233 return *receiver;
3234 } 3449 }
3235 3450
3236
3237 // ----------------------------------------------------------------------------- 3451 // -----------------------------------------------------------------------------
3238 // ES6 section 24.2 DataView Objects 3452 // ES6 section 24.2 DataView Objects
3239 3453
3240 3454
3241 // ES6 section 24.2.2 The DataView Constructor for the [[Call]] case. 3455 // ES6 section 24.2.2 The DataView Constructor for the [[Call]] case.
3242 BUILTIN(DataViewConstructor) { 3456 BUILTIN(DataViewConstructor) {
3243 HandleScope scope(isolate); 3457 HandleScope scope(isolate);
3244 THROW_NEW_ERROR_RETURN_FAILURE( 3458 THROW_NEW_ERROR_RETURN_FAILURE(
3245 isolate, 3459 isolate,
3246 NewTypeError(MessageTemplate::kConstructorNotFunction, 3460 NewTypeError(MessageTemplate::kConstructorNotFunction,
(...skipping 1515 matching lines...) Expand 10 before | Expand all | Expand 10 after
4762 4976
4763 // Do not lazily compute eval position for AsyncFunction, as they may not be 4977 // Do not lazily compute eval position for AsyncFunction, as they may not be
4764 // determined after the function is resumed. 4978 // determined after the function is resumed.
4765 Handle<Script> script = handle(Script::cast(func->shared()->script())); 4979 Handle<Script> script = handle(Script::cast(func->shared()->script()));
4766 int position = script->GetEvalPosition(); 4980 int position = script->GetEvalPosition();
4767 USE(position); 4981 USE(position);
4768 4982
4769 return *func; 4983 return *func;
4770 } 4984 }
4771 4985
4986 // ES6 19.1.3.6 Object.prototype.toString
4987 BUILTIN(ObjectProtoToString) {
4988 HandleScope scope(isolate);
4989 Handle<Object> object = args.at<Object>(0);
4990 RETURN_RESULT_OR_FAILURE(isolate,
4991 Object::ObjectProtoToString(isolate, object));
4992 }
4993
4994 // -----------------------------------------------------------------------------
4995 // ES6 section 19.4 Symbol Objects
4996
4772 // ES6 section 19.4.1.1 Symbol ( [ description ] ) for the [[Call]] case. 4997 // ES6 section 19.4.1.1 Symbol ( [ description ] ) for the [[Call]] case.
4773 BUILTIN(SymbolConstructor) { 4998 BUILTIN(SymbolConstructor) {
4774 HandleScope scope(isolate); 4999 HandleScope scope(isolate);
4775 Handle<Symbol> result = isolate->factory()->NewSymbol(); 5000 Handle<Symbol> result = isolate->factory()->NewSymbol();
4776 Handle<Object> description = args.atOrUndefined(isolate, 1); 5001 Handle<Object> description = args.atOrUndefined(isolate, 1);
4777 if (!description->IsUndefined(isolate)) { 5002 if (!description->IsUndefined(isolate)) {
4778 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, description, 5003 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, description,
4779 Object::ToString(isolate, description)); 5004 Object::ToString(isolate, description));
4780 result->set_name(*description); 5005 result->set_name(*description);
4781 } 5006 }
4782 return *result; 5007 return *result;
4783 } 5008 }
4784 5009
4785 5010
4786 // ES6 section 19.4.1.1 Symbol ( [ description ] ) for the [[Construct]] case. 5011 // ES6 section 19.4.1.1 Symbol ( [ description ] ) for the [[Construct]] case.
4787 BUILTIN(SymbolConstructor_ConstructStub) { 5012 BUILTIN(SymbolConstructor_ConstructStub) {
4788 HandleScope scope(isolate); 5013 HandleScope scope(isolate);
4789 THROW_NEW_ERROR_RETURN_FAILURE( 5014 THROW_NEW_ERROR_RETURN_FAILURE(
4790 isolate, NewTypeError(MessageTemplate::kNotConstructor, 5015 isolate, NewTypeError(MessageTemplate::kNotConstructor,
4791 isolate->factory()->Symbol_string())); 5016 isolate->factory()->Symbol_string()));
4792 } 5017 }
4793 5018
5019 // ES6 section 19.4.3.4 Symbol.prototype [ @@toPrimitive ] ( hint )
5020 void Builtins::Generate_SymbolPrototypeToPrimitive(
5021 CodeStubAssembler* assembler) {
5022 typedef compiler::Node Node;
4794 5023
4795 // ES6 19.1.3.6 Object.prototype.toString 5024 Node* receiver = assembler->Parameter(0);
4796 BUILTIN(ObjectProtoToString) { 5025 Node* context = assembler->Parameter(4);
4797 HandleScope scope(isolate); 5026
4798 Handle<Object> object = args.at<Object>(0); 5027 Node* result =
4799 RETURN_RESULT_OR_FAILURE(isolate, 5028 assembler->ToThisValue(context, receiver, PrimitiveType::kSymbol,
4800 Object::ObjectProtoToString(isolate, object)); 5029 "Symbol.prototype [ @@toPrimitive ]");
5030 assembler->Return(result);
5031 }
5032
5033 // ES6 section 19.4.3.2 Symbol.prototype.toString ( )
5034 void Builtins::Generate_SymbolPrototypeToString(CodeStubAssembler* assembler) {
5035 typedef compiler::Node Node;
5036
5037 Node* receiver = assembler->Parameter(0);
5038 Node* context = assembler->Parameter(3);
5039
5040 Node* value = assembler->ToThisValue(
5041 context, receiver, PrimitiveType::kSymbol, "Symbol.prototype.toString");
5042 Node* result =
5043 assembler->CallRuntime(Runtime::kSymbolDescriptiveString, context, value);
5044 assembler->Return(result);
5045 }
5046
5047 // ES6 section 19.4.3.3 Symbol.prototype.valueOf ( )
5048 void Builtins::Generate_SymbolPrototypeValueOf(CodeStubAssembler* assembler) {
5049 typedef compiler::Node Node;
5050
5051 Node* receiver = assembler->Parameter(0);
5052 Node* context = assembler->Parameter(3);
5053
5054 Node* result = assembler->ToThisValue(
5055 context, receiver, PrimitiveType::kSymbol, "Symbol.prototype.valueOf");
5056 assembler->Return(result);
4801 } 5057 }
4802 5058
4803 // ----------------------------------------------------------------------------- 5059 // -----------------------------------------------------------------------------
4804 // ES6 section 21.1 String Objects 5060 // ES6 section 21.1 String Objects
4805 5061
4806 // ES6 section 21.1.2.1 String.fromCharCode ( ...codeUnits ) 5062 // ES6 section 21.1.2.1 String.fromCharCode ( ...codeUnits )
4807 void Builtins::Generate_StringFromCharCode(CodeStubAssembler* assembler) { 5063 void Builtins::Generate_StringFromCharCode(CodeStubAssembler* assembler) {
4808 typedef CodeStubAssembler::Label Label; 5064 typedef CodeStubAssembler::Label Label;
4809 typedef compiler::Node Node; 5065 typedef compiler::Node Node;
4810 typedef CodeStubAssembler::Variable Variable; 5066 typedef CodeStubAssembler::Variable Variable;
(...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after
5263 assembler->Return(assembler->NaNConstant()); 5519 assembler->Return(assembler->NaNConstant());
5264 assembler->Bind(&if_positioninbounds); 5520 assembler->Bind(&if_positioninbounds);
5265 } 5521 }
5266 5522
5267 // Load the character at the {position} from the {receiver}. 5523 // Load the character at the {position} from the {receiver}.
5268 Node* value = assembler->StringCharCodeAt(receiver, position); 5524 Node* value = assembler->StringCharCodeAt(receiver, position);
5269 Node* result = assembler->SmiFromWord32(value); 5525 Node* result = assembler->SmiFromWord32(value);
5270 assembler->Return(result); 5526 assembler->Return(result);
5271 } 5527 }
5272 5528
5273 // ES6 section 21.1.3.25 String.prototype.trim () 5529 // ES6 section 21.1.3.25 String.prototype.toString ()
5530 void Builtins::Generate_StringPrototypeToString(CodeStubAssembler* assembler) {
5531 typedef compiler::Node Node;
5532
5533 Node* receiver = assembler->Parameter(0);
5534 Node* context = assembler->Parameter(3);
5535
5536 Node* result = assembler->ToThisValue(
5537 context, receiver, PrimitiveType::kString, "String.prototype.toString");
5538 assembler->Return(result);
5539 }
5540
5541 // ES6 section 21.1.3.27 String.prototype.trim ()
5274 BUILTIN(StringPrototypeTrim) { 5542 BUILTIN(StringPrototypeTrim) {
5275 HandleScope scope(isolate); 5543 HandleScope scope(isolate);
5276 TO_THIS_STRING(string, "String.prototype.trim"); 5544 TO_THIS_STRING(string, "String.prototype.trim");
5277 return *String::Trim(string, String::kTrim); 5545 return *String::Trim(string, String::kTrim);
5278 } 5546 }
5279 5547
5280 // Non-standard WebKit extension 5548 // Non-standard WebKit extension
5281 BUILTIN(StringPrototypeTrimLeft) { 5549 BUILTIN(StringPrototypeTrimLeft) {
5282 HandleScope scope(isolate); 5550 HandleScope scope(isolate);
5283 TO_THIS_STRING(string, "String.prototype.trimLeft"); 5551 TO_THIS_STRING(string, "String.prototype.trimLeft");
5284 return *String::Trim(string, String::kTrimLeft); 5552 return *String::Trim(string, String::kTrimLeft);
5285 } 5553 }
5286 5554
5287 // Non-standard WebKit extension 5555 // Non-standard WebKit extension
5288 BUILTIN(StringPrototypeTrimRight) { 5556 BUILTIN(StringPrototypeTrimRight) {
5289 HandleScope scope(isolate); 5557 HandleScope scope(isolate);
5290 TO_THIS_STRING(string, "String.prototype.trimRight"); 5558 TO_THIS_STRING(string, "String.prototype.trimRight");
5291 return *String::Trim(string, String::kTrimRight); 5559 return *String::Trim(string, String::kTrimRight);
5292 } 5560 }
5293 5561
5562 // ES6 section 21.1.3.28 String.prototype.valueOf ( )
5563 void Builtins::Generate_StringPrototypeValueOf(CodeStubAssembler* assembler) {
5564 typedef compiler::Node Node;
5565
5566 Node* receiver = assembler->Parameter(0);
5567 Node* context = assembler->Parameter(3);
5568
5569 Node* result = assembler->ToThisValue(
5570 context, receiver, PrimitiveType::kString, "String.prototype.valueOf");
5571 assembler->Return(result);
5572 }
5573
5294 // ----------------------------------------------------------------------------- 5574 // -----------------------------------------------------------------------------
5295 // ES6 section 21.1 ArrayBuffer Objects 5575 // ES6 section 21.1 ArrayBuffer Objects
5296 5576
5297 // ES6 section 24.1.2.1 ArrayBuffer ( length ) for the [[Call]] case. 5577 // ES6 section 24.1.2.1 ArrayBuffer ( length ) for the [[Call]] case.
5298 BUILTIN(ArrayBufferConstructor) { 5578 BUILTIN(ArrayBufferConstructor) {
5299 HandleScope scope(isolate); 5579 HandleScope scope(isolate);
5300 Handle<JSFunction> target = args.target<JSFunction>(); 5580 Handle<JSFunction> target = args.target<JSFunction>();
5301 DCHECK(*target == target->native_context()->array_buffer_fun() || 5581 DCHECK(*target == target->native_context()->array_buffer_fun() ||
5302 *target == target->native_context()->shared_array_buffer_fun()); 5582 *target == target->native_context()->shared_array_buffer_fun());
5303 THROW_NEW_ERROR_RETURN_FAILURE( 5583 THROW_NEW_ERROR_RETURN_FAILURE(
(...skipping 1122 matching lines...) Expand 10 before | Expand all | Expand 10 after
6426 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H) 6706 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H)
6427 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A) 6707 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A)
6428 #undef DEFINE_BUILTIN_ACCESSOR_C 6708 #undef DEFINE_BUILTIN_ACCESSOR_C
6429 #undef DEFINE_BUILTIN_ACCESSOR_A 6709 #undef DEFINE_BUILTIN_ACCESSOR_A
6430 #undef DEFINE_BUILTIN_ACCESSOR_T 6710 #undef DEFINE_BUILTIN_ACCESSOR_T
6431 #undef DEFINE_BUILTIN_ACCESSOR_S 6711 #undef DEFINE_BUILTIN_ACCESSOR_S
6432 #undef DEFINE_BUILTIN_ACCESSOR_H 6712 #undef DEFINE_BUILTIN_ACCESSOR_H
6433 6713
6434 } // namespace internal 6714 } // namespace internal
6435 } // namespace v8 6715 } // namespace v8
OLDNEW
« no previous file with comments | « src/builtins.h ('k') | src/code-stub-assembler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698