mirror of https://github.com/svaarala/duktape.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
207 lines
3.6 KiB
207 lines
3.6 KiB
|
|
/*===
|
|
bar
|
|
bar
|
|
bar
|
|
SyntaxError
|
|
===*/
|
|
|
|
print({foo:'bar'}.foo); // key without quotes
|
|
print({"foo":'bar'}.foo); // key with quotes
|
|
print({foo:'bar',}.foo); // one trailing comma
|
|
|
|
try {
|
|
// two trailing commas is a SyntaxError
|
|
eval("print({foo:'bar',,}.foo)");
|
|
} catch (e) {
|
|
print(e.name);
|
|
}
|
|
|
|
/*===
|
|
1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6
|
|
7
|
|
===*/
|
|
|
|
/* Property name can be an identifier, a string, or a number.
|
|
* The identifier can also be a reserved word.
|
|
*/
|
|
|
|
print({foo:1}.foo);
|
|
print({if:2}.if);
|
|
print({1:3}['1']);
|
|
print({1.23:4}['1.23']); // coerced with ToString(1.23) -> '1.23'
|
|
print({1.00:5}['1']); // coerced with ToString(1.00) -> '1'
|
|
print({Infinity:6}['Infinity']);
|
|
print({"foo":7}.foo);
|
|
|
|
/*===
|
|
1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6
|
|
7
|
|
===*/
|
|
|
|
/* Getter/setter name can be an identifier, a string, or a number.
|
|
* The identifier can also be a reserved word.
|
|
*/
|
|
|
|
try {
|
|
eval("print({get foo() { return 1 }}.foo);");
|
|
} catch (e) {
|
|
print(e.name);
|
|
}
|
|
|
|
try {
|
|
eval("print({get if() { return 2 }}.if);");
|
|
} catch (e) {
|
|
print(e.name);
|
|
}
|
|
|
|
try {
|
|
eval("print({get 1() { return 3 }}['1']);");
|
|
} catch (e) {
|
|
print(e.name);
|
|
}
|
|
|
|
try {
|
|
eval("print({get 1.23() { return 4 }}['1.23']);"); // coerced with ToString
|
|
} catch (e) {
|
|
print(e.name);
|
|
}
|
|
|
|
try {
|
|
eval("print({get 1.00() { return 5 }}['1']);"); // coerced with ToString
|
|
} catch (e) {
|
|
print(e.name);
|
|
}
|
|
|
|
try {
|
|
eval("print({get Infinity() { return 6 }}['Infinity']);"); // coerced with ToString
|
|
} catch (e) {
|
|
print(e.name);
|
|
}
|
|
|
|
try {
|
|
eval('print({get "foo"() { return 7 }}.foo);');
|
|
} catch (e) {
|
|
print(e.name);
|
|
}
|
|
|
|
/*===
|
|
1
|
|
2
|
|
3
|
|
===*/
|
|
|
|
/* Some corner cases. */
|
|
|
|
try {
|
|
eval("print({get: 1}.get);"); // 'get' as a property name
|
|
} catch (e) {
|
|
print(e.name);
|
|
}
|
|
|
|
try {
|
|
eval("print({get foo() { return 2 }}.foo);"); // 'foo' as a getter
|
|
} catch (e) {
|
|
print(e.name);
|
|
}
|
|
|
|
try {
|
|
eval("print({get get() { return 3 }}.get);"); // 'get' as a getter name (pretty rare)
|
|
} catch (e) {
|
|
print(e.name);
|
|
}
|
|
|
|
/*===
|
|
2
|
|
SyntaxError
|
|
===*/
|
|
|
|
/* Duplicate keys */
|
|
|
|
try {
|
|
/* in non-strict mode, latter key should be effective */
|
|
print(eval("function func1() { return ({foo:1,foo:2}).foo; }; func1();"));
|
|
} catch (e) {
|
|
print(e.name);
|
|
}
|
|
|
|
try {
|
|
/* in strict mode, it is a syntax error to have duplicate keys (among other things) */
|
|
print(eval("function func2() { 'use strict'; return ({foo:1,foo:2}).foo; }; func2();"));
|
|
} catch (e) {
|
|
print(e.name);
|
|
}
|
|
|
|
/*===
|
|
2
|
|
SyntaxError
|
|
SyntaxError
|
|
SyntaxError
|
|
SyntaxError
|
|
SyntaxError
|
|
SyntaxError
|
|
===*/
|
|
|
|
/* Duplicate keys and mixed set/get/plain key handling */
|
|
|
|
try {
|
|
/* duplicate plain keys are allowed in non-strict mode, and last
|
|
* occurrence matters.
|
|
*/
|
|
print(eval("({foo:1,foo:2}).foo"));
|
|
} catch (e) {
|
|
print(e.name);
|
|
}
|
|
|
|
try {
|
|
/* duplicate plain key in strict mode is a SyntaxError */
|
|
print(eval("'use strict'; ({foo:1,foo:2}).foo"));
|
|
} catch (e) {
|
|
print(e.name);
|
|
}
|
|
|
|
try {
|
|
/* getter after plain not allowed */
|
|
print(eval("({foo:1, get foo() { return 'getter'}}).foo"));
|
|
} catch (e) {
|
|
print(e.name);
|
|
}
|
|
|
|
try {
|
|
/* setter after plain not allowed */
|
|
print(eval("({foo:1, set foo(v) {}}).foo"));
|
|
} catch (e) {
|
|
print(e.name);
|
|
}
|
|
|
|
try {
|
|
/* plain after getter not allowed */
|
|
print(eval("({get foo() { return 'getter' }, foo:1}).foo"));
|
|
} catch (e) {
|
|
print(e.name);
|
|
}
|
|
|
|
try {
|
|
/* plain after setter not allowed */
|
|
print(eval("({set foo(v) {}, foo:1}).foo"));
|
|
} catch (e) {
|
|
print(e.name);
|
|
}
|
|
|
|
try {
|
|
/* plain after getter and setter not allowed */
|
|
print(eval("({get foo() { return 'getter' }, set foo(v) {}, foo:1}).foo"));
|
|
} catch (e) {
|
|
print(e.name);
|
|
}
|
|
|
|
|