Implement parsing await. (#3738)
Several bugs fixed for parsing yield as well. JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
This commit is contained in:
@@ -0,0 +1,138 @@
|
||||
// Copyright JS Foundation and other contributors, http://js.foundation
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
/* This test checks await expressions (nothing else). */
|
||||
|
||||
function check_syntax_error (code)
|
||||
{
|
||||
try {
|
||||
eval (code)
|
||||
assert (false)
|
||||
} catch (e) {
|
||||
assert (e instanceof SyntaxError)
|
||||
}
|
||||
}
|
||||
|
||||
check_syntax_error("(async function await() {})")
|
||||
check_syntax_error("(async function *await() {})")
|
||||
check_syntax_error("async function f(await) {}")
|
||||
check_syntax_error("(async function f(await) {})")
|
||||
check_syntax_error("async function f(a = await new Promise) {}")
|
||||
check_syntax_error("async function f() { function await() {} }")
|
||||
check_syntax_error("async await => 0");
|
||||
check_syntax_error("async (await) => 0");
|
||||
check_syntax_error("async function f() { await () => 0 }");
|
||||
check_syntax_error("async (a) => a\\u0077ait a");
|
||||
check_syntax_error("async (a) => { () => 0\na\\u0077ait a }");
|
||||
|
||||
// Valid uses of await
|
||||
|
||||
async a => await a
|
||||
async a => { await a }
|
||||
async (a) => await a
|
||||
async(a) => { await a }
|
||||
|
||||
// Nested async and non-async functions
|
||||
|
||||
async (a) => {
|
||||
() => await
|
||||
await a
|
||||
}
|
||||
|
||||
(a) => {
|
||||
await
|
||||
async (a) => await a
|
||||
await
|
||||
async (a) => await a
|
||||
a\u0077ait
|
||||
}
|
||||
|
||||
async function f1(a) {
|
||||
await a
|
||||
(function () { await ? async function(a) { await a } : await })
|
||||
await a
|
||||
}
|
||||
|
||||
async (a) => {
|
||||
await a;
|
||||
() => await ? async (a) => await a : await
|
||||
await a
|
||||
}
|
||||
|
||||
async (a) => {
|
||||
(a = () => await, [b] = (c))
|
||||
await a
|
||||
(a, b = () => await)
|
||||
await a
|
||||
}
|
||||
|
||||
// Object initializers
|
||||
|
||||
var o = {
|
||||
async await(a) {
|
||||
await a;
|
||||
() => await
|
||||
await a
|
||||
},
|
||||
|
||||
f(a) {
|
||||
await
|
||||
async (a) => await a
|
||||
await
|
||||
async (a) => await a
|
||||
a\u0077ait
|
||||
},
|
||||
|
||||
async ["g"] () {
|
||||
await a;
|
||||
() => await
|
||||
await a
|
||||
}
|
||||
}
|
||||
|
||||
async function f2(a) {
|
||||
var o = {
|
||||
[await a]() { await % await }
|
||||
}
|
||||
await a;
|
||||
}
|
||||
|
||||
class C {
|
||||
async await(a) {
|
||||
await a;
|
||||
() => await
|
||||
await a
|
||||
}
|
||||
|
||||
f(a) {
|
||||
await
|
||||
async (a) => await a
|
||||
await
|
||||
async (a) => await a
|
||||
a\u0077ait
|
||||
}
|
||||
|
||||
async ["g"] () {
|
||||
await a;
|
||||
() => await
|
||||
await a
|
||||
}
|
||||
}
|
||||
|
||||
async function f3(a) {
|
||||
class C {
|
||||
[await a]() { await % await }
|
||||
}
|
||||
await a;
|
||||
}
|
||||
@@ -43,7 +43,7 @@
|
||||
// Test %GeneratorPrototype% prototype chain
|
||||
(function () {
|
||||
function* g(){}
|
||||
var iterator = new g.constructor("a","b","c","yield a; yield b; yield c;")(1,2,3);
|
||||
var iterator = new g.constructor("a","b","c","() => yield\n yield a; yield b; yield c;")(1,2,3);
|
||||
|
||||
var item = iterator.next();
|
||||
assert(item.value === 1);
|
||||
|
||||
@@ -58,6 +58,7 @@ check_syntax_error("function *gen(){ (yield\n1) }");
|
||||
check_syntax_error("function *gen(){ function yield() {} }");
|
||||
check_syntax_error("function *gen(){ (yield)=>1 }");
|
||||
check_syntax_error("function *gen(){ yield => 1 }");
|
||||
check_syntax_error("function *gen(){ yi\\u0065ld 1 }");
|
||||
|
||||
function *gen4() {
|
||||
var f = function yield(i) {
|
||||
@@ -71,3 +72,15 @@ function *gen4() {
|
||||
}
|
||||
|
||||
assert(gen4().next().value === 39);
|
||||
|
||||
(function *() {
|
||||
() => yield
|
||||
yield 1;
|
||||
})
|
||||
|
||||
function *gen5() {
|
||||
var o = {
|
||||
["f"]() { yield % yield }
|
||||
}
|
||||
yield 1;
|
||||
}
|
||||
|
||||
@@ -223,7 +223,7 @@ main (void)
|
||||
/* Check the snapshot data. Unused bytes should be filled with zeroes */
|
||||
const uint8_t expected_data[] =
|
||||
{
|
||||
0x4A, 0x52, 0x52, 0x59, 0x2B, 0x00, 0x00, 0x00,
|
||||
0x4A, 0x52, 0x52, 0x59, 0x2C, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00,
|
||||
0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
|
||||
0x03, 0x00, 0x01, 0x00, 0x41, 0x00, 0x01, 0x00,
|
||||
|
||||
Reference in New Issue
Block a user