11/*
2- * Copyright (c) 2018, 2019 , Oracle and/or its affiliates. All rights reserved.
2+ * Copyright (c) 2018, 2020 , Oracle and/or its affiliates. All rights reserved.
33 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44 *
55 * The Universal Permissive License (UPL), Version 1.0
4848import com .oracle .truffle .api .nodes .UnexpectedResultException ;
4949import com .oracle .truffle .api .object .DynamicObject ;
5050import com .oracle .truffle .api .object .HiddenKey ;
51+ import com .oracle .truffle .api .profiles .ConditionProfile ;
5152import com .oracle .truffle .js .builtins .AsyncFromSyncIteratorPrototypeBuiltinsFactory .AsyncFromSyncNextNodeGen ;
5253import com .oracle .truffle .js .builtins .AsyncFromSyncIteratorPrototypeBuiltinsFactory .AsyncFromSyncReturnNodeGen ;
5354import com .oracle .truffle .js .builtins .AsyncFromSyncIteratorPrototypeBuiltinsFactory .AsyncFromSyncThrowNodeGen ;
@@ -132,7 +133,6 @@ private abstract static class AsyncFromSyncBaseNode extends JSBuiltinNode {
132133 static final HiddenKey DONE = new HiddenKey ("Done" );
133134
134135 @ Child private PropertyGetNode getPromiseNode ;
135- @ Child private PropertyGetNode getPromiseResolveNode ;
136136
137137 @ Child private JSFunctionCallNode executePromiseMethodNode ;
138138 @ Child private NewPromiseCapabilityNode newPromiseCapabilityNode ;
@@ -146,6 +146,8 @@ private abstract static class AsyncFromSyncBaseNode extends JSBuiltinNode {
146146 @ Child protected PropertyGetNode getSyncIteratorRecordNode ;
147147 @ Child private PropertySetNode setDoneNode ;
148148
149+ protected ConditionProfile valuePresenceProfile = ConditionProfile .createBinaryProfile ();
150+
149151 AsyncFromSyncBaseNode (JSContext context , JSBuiltin builtin ) {
150152 super (context , builtin );
151153 this .newPromiseCapabilityNode = NewPromiseCapabilityNode .create (context );
@@ -255,7 +257,7 @@ public AsyncFromSyncNext(JSContext context, JSBuiltin builtin) {
255257 }
256258
257259 @ Specialization (guards = "isObject(thisObj)" )
258- protected Object next (DynamicObject thisObj , Object value ) {
260+ protected Object next (VirtualFrame frame , DynamicObject thisObj , Object value ) {
259261 PromiseCapabilityRecord promiseCapability = createPromiseCapability ();
260262 if (!isAsyncFromSyncIterator (thisObj )) {
261263 JSException typeError = Errors .createTypeErrorIncompatibleReceiver (thisObj );
@@ -265,7 +267,11 @@ protected Object next(DynamicObject thisObj, Object value) {
265267 DynamicObject nextResult ;
266268 IteratorRecord syncIteratorRecord = (IteratorRecord ) getSyncIteratorRecordNode .getValue (thisObj );
267269 try {
268- nextResult = iteratorNextNode .execute (syncIteratorRecord , value );
270+ if (valuePresenceProfile .profile (JSArguments .getUserArgumentCount (frame .getArguments ()) == 0 )) {
271+ nextResult = iteratorNextNode .execute (syncIteratorRecord );
272+ } else {
273+ nextResult = iteratorNextNode .execute (syncIteratorRecord , value );
274+ }
269275 } catch (GraalJSException e ) {
270276 promiseCapabilityReject (promiseCapability , e );
271277 return promiseCapability .getPromise ();
@@ -303,7 +309,11 @@ protected Object doMethod(VirtualFrame frame, DynamicObject thisObj, Object valu
303309 }
304310 Object returnResult ;
305311 try {
306- returnResult = executeReturnMethod .executeCall (JSArguments .create (syncIterator , method , value ));
312+ if (valuePresenceProfile .profile (JSArguments .getUserArgumentCount (frame .getArguments ()) == 0 )) {
313+ returnResult = executeReturnMethod .executeCall (JSArguments .create (syncIterator , method ));
314+ } else {
315+ returnResult = executeReturnMethod .executeCall (JSArguments .create (syncIterator , method , value ));
316+ }
307317 } catch (GraalJSException e ) {
308318 promiseCapabilityReject (promiseCapability , e );
309319 return promiseCapability .getPromise ();
0 commit comments