| OLD | NEW | 
|---|
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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 | 
| OLD | NEW | 
|---|