Skip to content
This repository was archived by the owner on Oct 15, 2020. It is now read-only.

Commit 785b5f6

Browse files
committed
deps: Updated chakracore to 1.1.0.4
Includes following bug fix in chakracore that was observed in 4e46931 changes to `node.js`. * Fix to enable `{get}` as valid object literal. See chakra-core/ChakraCore#320
1 parent 193c581 commit 785b5f6

File tree

7 files changed

+106
-57
lines changed

7 files changed

+106
-57
lines changed

deps/chakrashim/core/lib/Parser/parse.cpp

Lines changed: 24 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -3473,53 +3473,36 @@ ParseNodePtr Parser::ParseMemberList(LPCOLESTR pNameHint, ulong* pNameHintLength
34733473
else if (nullptr != pidHint) //Its either tkID/tkStrCon/tkFloatCon/tkIntCon
34743474
{
34753475
Assert(pidHint->Psz() != nullptr);
3476-
if (pidHint == wellKnownPropertyPids.getter && tkHint.tk == tkID)
3477-
{
3478-
if (isObjectPattern)
3479-
{
3480-
Error(ERRInvalidAssignmentTarget);
3481-
}
34823476

3483-
LPCOLESTR pNameGet = nullptr;
3484-
pnodeArg = ParseMemberGetSet<buildAST>(knopGetMember, &pNameGet);
3485-
if (CONFIG_FLAG(UseFullName) && buildAST && pnodeArg->sxBin.pnode2->nop == knopFncDecl)
3486-
{
3487-
if (m_scriptContext->GetConfig()->IsES6FunctionNameEnabled())
3488-
{
3489-
// displays as get object.funcname
3490-
ulong getOffset = 0;
3491-
pFullNameHint = AppendNameHints(wellKnownPropertyPids.getter, AppendNameHints(pNameHint, pNameGet, &fullNameHintLength, &shortNameOffset), &fullNameHintLength, &getOffset, true);
3492-
shortNameOffset += getOffset;
3493-
}
3494-
else
3495-
{
3496-
// displays as object.funcname.get
3497-
pFullNameHint = AppendNameHints(pNameHint, AppendNameHints(pNameGet, wellKnownPropertyPids.getter, &fullNameHintLength, &shortNameOffset), &fullNameHintLength, &shortNameOffset);
3498-
}
3499-
}
3500-
}
3501-
else if (pidHint == wellKnownPropertyPids.setter && tkHint.tk == tkID)
3477+
if ((pidHint == wellKnownPropertyPids.get || pidHint == wellKnownPropertyPids.set) &&
3478+
// get/set are only pseudo keywords when they are identifiers (i.e. not strings)
3479+
tkHint.tk == tkID && NextTokenIsPropertyNameStart())
35023480
{
35033481
if (isObjectPattern)
35043482
{
35053483
Error(ERRInvalidAssignmentTarget);
35063484
}
35073485

3508-
LPCOLESTR pNameSet = nullptr;
3509-
pnodeArg = ParseMemberGetSet<buildAST>(knopSetMember, &pNameSet);
3486+
LPCOLESTR pNameGetOrSet = nullptr;
3487+
OpCode op = pidHint == wellKnownPropertyPids.get ? knopGetMember : knopSetMember;
3488+
3489+
pnodeArg = ParseMemberGetSet<buildAST>(op, &pNameGetOrSet);
3490+
35103491
if (CONFIG_FLAG(UseFullName) && buildAST && pnodeArg->sxBin.pnode2->nop == knopFncDecl)
35113492
{
35123493
if (m_scriptContext->GetConfig()->IsES6FunctionNameEnabled())
35133494
{
3514-
// displays as set object.funcname
3515-
ulong setOffset = 0;
3516-
pFullNameHint = AppendNameHints(wellKnownPropertyPids.setter, AppendNameHints(pNameHint, pNameSet, &fullNameHintLength, &shortNameOffset), &fullNameHintLength, &setOffset, true);
3517-
shortNameOffset += setOffset;
3495+
// displays as "get object.funcname" or "set object.funcname"
3496+
ulong getOrSetOffset = 0;
3497+
LPCOLESTR intermediateHint = AppendNameHints(pNameHint, pNameGetOrSet, &fullNameHintLength, &shortNameOffset);
3498+
pFullNameHint = AppendNameHints(pidHint, intermediateHint, &fullNameHintLength, &getOrSetOffset, true);
3499+
shortNameOffset += getOrSetOffset;
35183500
}
35193501
else
35203502
{
3521-
// displays as object.funcname.set
3522-
pFullNameHint = AppendNameHints(pNameHint, AppendNameHints(pNameSet, wellKnownPropertyPids.setter, &fullNameHintLength, &shortNameOffset), &fullNameHintLength, &shortNameOffset);
3503+
// displays as "object.funcname.get" or "object.funcname.set"
3504+
LPCOLESTR intermediateHint = AppendNameHints(pNameGetOrSet, pidHint, &fullNameHintLength, &shortNameOffset);
3505+
pFullNameHint = AppendNameHints(pNameHint, intermediateHint, &fullNameHintLength, &shortNameOffset);
35233506
}
35243507
}
35253508
}
@@ -6290,7 +6273,7 @@ ParseNodePtr Parser::ParseClassDecl(BOOL isDeclaration, LPCOLESTR pNameHint, ulo
62906273
bool isMemberNamedGetOrSet = false;
62916274
RestorePoint beginMethodName;
62926275
m_pscan->Capture(&beginMethodName);
6293-
if (memberPid == wellKnownPropertyPids.getter || memberPid == wellKnownPropertyPids.setter)
6276+
if (memberPid == wellKnownPropertyPids.get || memberPid == wellKnownPropertyPids.set)
62946277
{
62956278
m_pscan->ScanForcingPid();
62966279
}
@@ -6300,9 +6283,9 @@ ParseNodePtr Parser::ParseClassDecl(BOOL isDeclaration, LPCOLESTR pNameHint, ulo
63006283
isMemberNamedGetOrSet = true;
63016284
}
63026285

6303-
if ((memberPid == wellKnownPropertyPids.getter || memberPid == wellKnownPropertyPids.setter) && !isMemberNamedGetOrSet)
6286+
if ((memberPid == wellKnownPropertyPids.get || memberPid == wellKnownPropertyPids.set) && !isMemberNamedGetOrSet)
63046287
{
6305-
bool isGetter = (memberPid == wellKnownPropertyPids.getter);
6288+
bool isGetter = (memberPid == wellKnownPropertyPids.get);
63066289

63076290
if (m_token.tk == tkLBrack && m_scriptContext->GetConfig()->IsES6ObjectLiteralsEnabled())
63086291
{
@@ -6338,7 +6321,9 @@ ParseNodePtr Parser::ParseClassDecl(BOOL isDeclaration, LPCOLESTR pNameHint, ulo
63386321
{
63396322
pnodeFnc->sxFnc.SetIsAccessor();
63406323
pnodeMember = CreateBinNode(isGetter ? knopGetMember : knopSetMember, pnodeMemberName, pnodeFnc);
6341-
pMemberNameHint = ConstructFinalHintNode(pClassNamePid, pidHint, isGetter ? wellKnownPropertyPids.getter : wellKnownPropertyPids.setter, isStatic, &memberNameHintLength, &memberNameOffset, isComputedName, pMemberNameHint);
6324+
pMemberNameHint = ConstructFinalHintNode(pClassNamePid, pidHint,
6325+
isGetter ? wellKnownPropertyPids.get : wellKnownPropertyPids.set, isStatic,
6326+
&memberNameHintLength, &memberNameOffset, isComputedName, pMemberNameHint);
63426327
}
63436328
}
63446329
else
@@ -9734,8 +9719,8 @@ void Parser::InitPids()
97349719
wellKnownPropertyPids.arguments = m_phtbl->PidHashNameLen(g_ssym_arguments.sz, g_ssym_arguments.cch);
97359720
wellKnownPropertyPids.async = m_phtbl->PidHashNameLen(g_ssym_async.sz, g_ssym_async.cch);
97369721
wellKnownPropertyPids.eval = m_phtbl->PidHashNameLen(g_ssym_eval.sz, g_ssym_eval.cch);
9737-
wellKnownPropertyPids.getter = m_phtbl->PidHashNameLen(g_ssym_get.sz, g_ssym_get.cch);
9738-
wellKnownPropertyPids.setter = m_phtbl->PidHashNameLen(g_ssym_set.sz, g_ssym_set.cch);
9722+
wellKnownPropertyPids.get = m_phtbl->PidHashNameLen(g_ssym_get.sz, g_ssym_get.cch);
9723+
wellKnownPropertyPids.set = m_phtbl->PidHashNameLen(g_ssym_set.sz, g_ssym_set.cch);
97399724
wellKnownPropertyPids.let = m_phtbl->PidHashNameLen(g_ssym_let.sz, g_ssym_let.cch);
97409725
wellKnownPropertyPids.constructor = m_phtbl->PidHashNameLen(g_ssym_constructor.sz, g_ssym_constructor.cch);
97419726
wellKnownPropertyPids.prototype = m_phtbl->PidHashNameLen(g_ssym_prototype.sz, g_ssym_prototype.cch);

deps/chakrashim/core/lib/Parser/parse.h

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -385,17 +385,17 @@ class Parser
385385

386386
struct WellKnownPropertyPids
387387
{
388-
IdentPtr arguments; // m_pidArguments; // 'arguments' identifier
389-
IdentPtr async; // m_pidAsync;
390-
IdentPtr eval; // m_pidEval;
391-
IdentPtr setter; // m_pidSetter;
392-
IdentPtr getter; // m_pidGetter;
393-
IdentPtr let; //m_pidLet;
394-
IdentPtr constructor; //m_pidConstructor;
395-
IdentPtr prototype; //m_pidPrototype;
396-
IdentPtr __proto__; // m_pid__proto__;
397-
IdentPtr of; //m_pidOf;
398-
IdentPtr target; // m_pidTarget;
388+
IdentPtr arguments;
389+
IdentPtr async;
390+
IdentPtr eval;
391+
IdentPtr set;
392+
IdentPtr get;
393+
IdentPtr let;
394+
IdentPtr constructor;
395+
IdentPtr prototype;
396+
IdentPtr __proto__;
397+
IdentPtr of;
398+
IdentPtr target;
399399
};
400400

401401
WellKnownPropertyPids wellKnownPropertyPids;
@@ -453,6 +453,7 @@ class Parser
453453
bool IsNodeAllowedForDeferParse(OpCode op) {return !this->m_deferringAST ||
454454
(op == knopBlock || op == knopVarDecl || op == knopConstDecl || op == knopLetDecl || op == knopFncDecl); }
455455
bool NextTokenConfirmsLetDecl() const { return m_token.tk == tkID || m_token.tk == tkLBrack || m_token.tk == tkLCurly || m_token.IsReservedWord(); }
456+
bool NextTokenIsPropertyNameStart() const { return m_token.tk == tkID || m_token.tk == tkStrCon || m_token.tk == tkIntCon || m_token.tk == tkFltCon || m_token.tk == tkLBrack || m_token.IsReservedWord(); }
456457

457458
template<bool buildAST>
458459
void PushStmt(StmtNest *pStmt, ParseNodePtr pnode, OpCode op, ParseNodePtr pnodeLab, LabelId* pLabelIdList)

deps/chakrashim/core/lib/common/CommonDefines.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
#define CHAKRA_CORE_MINOR_VERSION 1
1515
#define CHAKRA_CORE_VERSION_RELEASE 1
1616
#define CHAKRA_CORE_VERSION_PRERELEASE 0
17-
#define CHAKRA_CORE_VERSION_RELEASE_QFE 3
17+
#define CHAKRA_CORE_VERSION_RELEASE_QFE 4
1818

1919
#define CHAKRA_VERSION_RELEASE 0
2020
#define CHAKRA_VERSION_PRERELEASE 1

deps/chakrashim/core/test/es5/ObjLitGetSet.baseline

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,4 @@ PASS
2323
(test 5): Object literal get set function toString
2424
function foo() { return _foo; }
2525
function foo(value) { _foo = value; }
26+
PASS

deps/chakrashim/core/test/es5/ObjLitGetSet.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,8 @@ function Test5()
173173

174174
WScript.Echo("" + fooDescriptor.get);
175175
WScript.Echo("" + fooDescriptor.set);
176+
177+
return true;
176178
}
177179

178180
// Note: test for Object literal duplicate set\get property is in the file ObjLitGetSetDuplicate.js.

deps/chakrashim/core/test/es6/destructuring_obj.js

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,9 +165,26 @@ var tests = [
165165
assert.throws(function () { eval("for(var [z] = function ([a]) { } in []) {}"); }, SyntaxError, "Initializer as function expression is not valid syntax", "for-in loop head declarations cannot have an initializer");
166166
}
167167
},
168+
{
169+
name: "Object destructuring with `get` and `set` identifiers",
170+
body: function () {
171+
var { get } = { get: 1 };
172+
let { set } = { set: 2 };
173+
assert.areEqual(1, get, "`get` is a valid object destructuring name");
174+
assert.areEqual(2, set, "`set` is a valid object destructuring name");
175+
176+
assert.throws(function () { eval("var { get foo() { } } = { get: 1 };"); }, SyntaxError, "getter accessor is not a valid object destructuring name", "Invalid destructuring assignment target");
177+
assert.throws(function () { eval("var { set bar(x) { } } = { set: 2 };"); }, SyntaxError, "setter accessor is not a valid object destructuring name", "Invalid destructuring assignment target");
178+
179+
const { get: x } = { get: 3 };
180+
var { set: y } = { set: 4 };
181+
assert.areEqual(3, x, "`get` is a valid object destructuring name mapping");
182+
assert.areEqual(4, y, "`set` is a valid object destructuring name mapping");
183+
}
184+
},
168185
{
169186
name: "Object destructuring basic functionality",
170-
body : function () {
187+
body: function () {
171188
{
172189
var x3, x4;
173190
let {x:x1} = {x:20};

deps/chakrashim/core/test/es6/objlit.js

Lines changed: 48 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,58 @@ var tests = [
1515
}
1616
},
1717
{
18-
name: "Method shorthand",
18+
name: "Shorthand names `get` and `set` parse without error (they are not keywords in these cases)",
19+
body: function () {
20+
var a = 0;
21+
var get = 1;
22+
var set = 2;
23+
var z = 3;
24+
25+
var o = { get };
26+
var p = { set };
27+
var q = { get, set };
28+
var r = { set, get };
29+
var s = { get, z };
30+
var t = { a, set };
31+
var u = { a, get, z };
32+
33+
assert.areEqual(1, o.get, "o.get = 1");
34+
assert.areEqual(2, p.set, "p.set = 2");
35+
assert.areEqual(1, q.get, "q.get = 1");
36+
assert.areEqual(2, q.set, "q.set = 2");
37+
assert.areEqual(2, r.set, "r.set = 2");
38+
assert.areEqual(1, r.get, "r.get = 1");
39+
assert.areEqual(1, s.get, "s.get = 1");
40+
assert.areEqual(3, s.z, "s.z = 3");
41+
assert.areEqual(0, t.a, "t.a = 0");
42+
assert.areEqual(2, t.set, "t.set = 2");
43+
assert.areEqual(0, u.a, "u.a = 0");
44+
assert.areEqual(1, u.get, "u.get = 1");
45+
assert.areEqual(3, u.z, "u.z = 3");
46+
}
47+
},
48+
{
49+
name: "Concise method shorthand",
1950
body: function() {
2051
var obj = {
21-
foo() { return "foo"; }
52+
foo() { return "foo"; }
53+
};
54+
55+
assert.areEqual("foo", obj.foo());
56+
assert.areEqual("foo", ({ foo: function() { }, foo() { return "foo"; } }).foo());
57+
assert.areEqual("foo", ({ foo(x) { }, foo() { return "foo"; } }).foo());
58+
}
59+
},
60+
{
61+
name: "Concise method shorthand with `get` and `set` names",
62+
body: function () {
63+
var o = {
64+
get() { return "g"; },
65+
set() { return "s"; }
2266
};
2367

24-
assert.areEqual(obj.foo(), "foo");
25-
assert.areEqual(({ foo: function() { }, foo() { return "foo"; } }).foo(), "foo");
26-
assert.areEqual(({ foo(x) { }, foo() { return "foo"; } }).foo(), "foo");
68+
assert.areEqual('g', o.get(), "o.get returns 'g'");
69+
assert.areEqual('s', o.set(), "o.set returns 's'");
2770
}
2871
},
2972
{

0 commit comments

Comments
 (0)