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

Side by Side Diff: src/builtins.cc

Issue 1865833002: [generators] Decouple generator resume from fullcodegen. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 8 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
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.h" 7 #include "src/api.h"
8 #include "src/api-arguments.h" 8 #include "src/api-arguments.h"
9 #include "src/api-natives.h" 9 #include "src/api-natives.h"
10 #include "src/base/once.h" 10 #include "src/base/once.h"
(...skipping 2295 matching lines...) Expand 10 before | Expand all | Expand 10 after
2306 assembler->Return(result); 2306 assembler->Return(result);
2307 } 2307 }
2308 2308
2309 // ES6 section 20.2.2.35 Math.trunc ( x ) 2309 // ES6 section 20.2.2.35 Math.trunc ( x )
2310 void Builtins::Generate_MathTrunc(compiler::CodeStubAssembler* assembler) { 2310 void Builtins::Generate_MathTrunc(compiler::CodeStubAssembler* assembler) {
2311 Generate_MathRoundingOperation(assembler, 2311 Generate_MathRoundingOperation(assembler,
2312 &compiler::CodeStubAssembler::Float64Trunc); 2312 &compiler::CodeStubAssembler::Float64Trunc);
2313 } 2313 }
2314 2314
2315 // ----------------------------------------------------------------------------- 2315 // -----------------------------------------------------------------------------
2316 // ES6 section 25.3 Generator Objects
2317
2318 namespace {
2319
2320 void Generate_GeneratorPrototypeResume(
2321 compiler::CodeStubAssembler* assembler,
2322 JSGeneratorObject::ResumeMode resume_mode, char const* const method_name) {
2323 typedef compiler::CodeStubAssembler::Label Label;
2324 typedef compiler::Node Node;
2325
2326 Node* receiver = assembler->Parameter(0);
2327 Node* value = assembler->Parameter(1);
2328 Node* context = assembler->Parameter(4);
2329 Node* zero = assembler->SmiConstant(Smi::FromInt(0));
2330
2331 // Check if the {receiver} is actually a JSGeneratorObject.
2332 Label if_receiverisincompatible(assembler, Label::kDeferred);
2333 assembler->GotoIf(assembler->WordIsSmi(receiver), &if_receiverisincompatible);
2334 Node* receiver_instance_type = assembler->LoadInstanceType(receiver);
2335 assembler->GotoUnless(assembler->Word32Equal(
2336 receiver_instance_type,
2337 assembler->Int32Constant(JS_GENERATOR_OBJECT_TYPE)),
2338 &if_receiverisincompatible);
2339
2340 // Check if the {receiver} is running or already closed.
2341 Node* receiver_continuation = assembler->LoadObjectField(
2342 receiver, JSGeneratorObject::kContinuationOffset);
2343 Label if_receiverisclosed(assembler, Label::kDeferred),
2344 if_receiverisrunning(assembler, Label::kDeferred);
2345 assembler->GotoIf(assembler->SmiEqual(receiver_continuation, zero),
2346 &if_receiverisclosed);
2347 assembler->GotoIf(assembler->SmiLessThan(receiver_continuation, zero),
2348 &if_receiverisrunning);
2349
2350 // Resume the {receiver} using our trampoline.
2351 Node* result = assembler->CallStub(
2352 CodeFactory::ResumeGenerator(assembler->isolate()), context, value,
2353 receiver, assembler->SmiConstant(Smi::FromInt(resume_mode)));
2354 assembler->Return(result);
2355
2356 assembler->Bind(&if_receiverisincompatible);
2357 {
2358 // The {receiver} is not a valid JSGeneratorObject.
2359 Node* result = assembler->CallRuntime(
2360 Runtime::kThrowIncompatibleMethodReceiver, context,
2361 assembler->HeapConstant(assembler->factory()->NewStringFromAsciiChecked(
2362 method_name, TENURED)),
2363 receiver);
2364 assembler->Return(result); // Never reached.
2365 }
2366
2367 assembler->Bind(&if_receiverisclosed);
2368 {
2369 // The {receiver} is closed already.
2370 Node* result = nullptr;
2371 switch (resume_mode) {
2372 case JSGeneratorObject::kNext:
2373 result = assembler->CallRuntime(Runtime::kCreateIterResultObject,
2374 context, assembler->UndefinedConstant(),
2375 assembler->BooleanConstant(true));
2376 break;
2377 case JSGeneratorObject::kReturn:
2378 result =
2379 assembler->CallRuntime(Runtime::kCreateIterResultObject, context,
2380 value, assembler->BooleanConstant(true));
2381 break;
2382 case JSGeneratorObject::kThrow:
2383 result = assembler->CallRuntime(Runtime::kThrow, context, value);
2384 break;
2385 }
2386 assembler->Return(result);
2387 }
2388
2389 assembler->Bind(&if_receiverisrunning);
2390 {
2391 Node* result =
2392 assembler->CallRuntime(Runtime::kThrowGeneratorRunning, context);
2393 assembler->Return(result); // Never reached.
2394 }
2395 }
2396
2397 } // namespace
2398
2399 // ES6 section 25.3.1.2 Generator.prototype.next ( value )
2400 void Builtins::Generate_GeneratorPrototypeNext(
2401 compiler::CodeStubAssembler* assembler) {
2402 Generate_GeneratorPrototypeResume(assembler, JSGeneratorObject::kNext,
2403 "[Generator].prototype.next");
2404 }
2405
2406 // ES6 section 25.3.1.3 Generator.prototype.return ( value )
2407 void Builtins::Generate_GeneratorPrototypeReturn(
2408 compiler::CodeStubAssembler* assembler) {
2409 Generate_GeneratorPrototypeResume(assembler, JSGeneratorObject::kReturn,
2410 "[Generator].prototype.return");
2411 }
2412
2413 // ES6 section 25.3.1.4 Generator.prototype.throw ( exception )
2414 void Builtins::Generate_GeneratorPrototypeThrow(
2415 compiler::CodeStubAssembler* assembler) {
2416 Generate_GeneratorPrototypeResume(assembler, JSGeneratorObject::kThrow,
2417 "[Generator].prototype.throw");
2418 }
2419
2420 // -----------------------------------------------------------------------------
2316 // ES6 section 26.1 The Reflect Object 2421 // ES6 section 26.1 The Reflect Object
2317 2422
2318
2319 // ES6 section 26.1.3 Reflect.defineProperty 2423 // ES6 section 26.1.3 Reflect.defineProperty
2320 BUILTIN(ReflectDefineProperty) { 2424 BUILTIN(ReflectDefineProperty) {
2321 HandleScope scope(isolate); 2425 HandleScope scope(isolate);
2322 DCHECK_EQ(4, args.length()); 2426 DCHECK_EQ(4, args.length());
2323 Handle<Object> target = args.at<Object>(1); 2427 Handle<Object> target = args.at<Object>(1);
2324 Handle<Object> key = args.at<Object>(2); 2428 Handle<Object> key = args.at<Object>(2);
2325 Handle<Object> attributes = args.at<Object>(3); 2429 Handle<Object> attributes = args.at<Object>(3);
2326 2430
2327 if (!target->IsJSReceiver()) { 2431 if (!target->IsJSReceiver()) {
2328 THROW_NEW_ERROR_RETURN_FAILURE( 2432 THROW_NEW_ERROR_RETURN_FAILURE(
(...skipping 2516 matching lines...) Expand 10 before | Expand all | Expand 10 after
4845 BUILTIN_LIST_T(DEFINE_BUILTIN_ACCESSOR_T) 4949 BUILTIN_LIST_T(DEFINE_BUILTIN_ACCESSOR_T)
4846 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H) 4950 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H)
4847 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A) 4951 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A)
4848 #undef DEFINE_BUILTIN_ACCESSOR_C 4952 #undef DEFINE_BUILTIN_ACCESSOR_C
4849 #undef DEFINE_BUILTIN_ACCESSOR_A 4953 #undef DEFINE_BUILTIN_ACCESSOR_A
4850 #undef DEFINE_BUILTIN_ACCESSOR_T 4954 #undef DEFINE_BUILTIN_ACCESSOR_T
4851 #undef DEFINE_BUILTIN_ACCESSOR_H 4955 #undef DEFINE_BUILTIN_ACCESSOR_H
4852 4956
4853 } // namespace internal 4957 } // namespace internal
4854 } // namespace v8 4958 } // namespace v8
OLDNEW
« no previous file with comments | « src/builtins.h ('k') | src/code-factory.h » ('j') | src/deoptimizer.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698