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

Commit

Permalink
deps: Updated chakracore to 1.1.0.4
Browse files Browse the repository at this point in the history
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

See Microsoft/Chakracore [release/1.1](https://github.com/Microsoft/ChakraCore/commits/release/1.1)
for more details.

PR-URL: #30
Reviewed-By: Sandeep Agarwal <[email protected]>
Reviewed-By: Jianchun Xu <[email protected]>
  • Loading branch information
kunalspathak committed Feb 29, 2016
1 parent e2fc338 commit fc3cf3e
Show file tree
Hide file tree
Showing 7 changed files with 106 additions and 57 deletions.
63 changes: 24 additions & 39 deletions deps/chakrashim/core/lib/Parser/parse.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3473,53 +3473,36 @@ ParseNodePtr Parser::ParseMemberList(LPCOLESTR pNameHint, ulong* pNameHintLength
else if (nullptr != pidHint) //Its either tkID/tkStrCon/tkFloatCon/tkIntCon
{
Assert(pidHint->Psz() != nullptr);
if (pidHint == wellKnownPropertyPids.getter && tkHint.tk == tkID)
{
if (isObjectPattern)
{
Error(ERRInvalidAssignmentTarget);
}

LPCOLESTR pNameGet = nullptr;
pnodeArg = ParseMemberGetSet<buildAST>(knopGetMember, &pNameGet);
if (CONFIG_FLAG(UseFullName) && buildAST && pnodeArg->sxBin.pnode2->nop == knopFncDecl)
{
if (m_scriptContext->GetConfig()->IsES6FunctionNameEnabled())
{
// displays as get object.funcname
ulong getOffset = 0;
pFullNameHint = AppendNameHints(wellKnownPropertyPids.getter, AppendNameHints(pNameHint, pNameGet, &fullNameHintLength, &shortNameOffset), &fullNameHintLength, &getOffset, true);
shortNameOffset += getOffset;
}
else
{
// displays as object.funcname.get
pFullNameHint = AppendNameHints(pNameHint, AppendNameHints(pNameGet, wellKnownPropertyPids.getter, &fullNameHintLength, &shortNameOffset), &fullNameHintLength, &shortNameOffset);
}
}
}
else if (pidHint == wellKnownPropertyPids.setter && tkHint.tk == tkID)
if ((pidHint == wellKnownPropertyPids.get || pidHint == wellKnownPropertyPids.set) &&
// get/set are only pseudo keywords when they are identifiers (i.e. not strings)
tkHint.tk == tkID && NextTokenIsPropertyNameStart())
{
if (isObjectPattern)
{
Error(ERRInvalidAssignmentTarget);
}

LPCOLESTR pNameSet = nullptr;
pnodeArg = ParseMemberGetSet<buildAST>(knopSetMember, &pNameSet);
LPCOLESTR pNameGetOrSet = nullptr;
OpCode op = pidHint == wellKnownPropertyPids.get ? knopGetMember : knopSetMember;

pnodeArg = ParseMemberGetSet<buildAST>(op, &pNameGetOrSet);

if (CONFIG_FLAG(UseFullName) && buildAST && pnodeArg->sxBin.pnode2->nop == knopFncDecl)
{
if (m_scriptContext->GetConfig()->IsES6FunctionNameEnabled())
{
// displays as set object.funcname
ulong setOffset = 0;
pFullNameHint = AppendNameHints(wellKnownPropertyPids.setter, AppendNameHints(pNameHint, pNameSet, &fullNameHintLength, &shortNameOffset), &fullNameHintLength, &setOffset, true);
shortNameOffset += setOffset;
// displays as "get object.funcname" or "set object.funcname"
ulong getOrSetOffset = 0;
LPCOLESTR intermediateHint = AppendNameHints(pNameHint, pNameGetOrSet, &fullNameHintLength, &shortNameOffset);
pFullNameHint = AppendNameHints(pidHint, intermediateHint, &fullNameHintLength, &getOrSetOffset, true);
shortNameOffset += getOrSetOffset;
}
else
{
// displays as object.funcname.set
pFullNameHint = AppendNameHints(pNameHint, AppendNameHints(pNameSet, wellKnownPropertyPids.setter, &fullNameHintLength, &shortNameOffset), &fullNameHintLength, &shortNameOffset);
// displays as "object.funcname.get" or "object.funcname.set"
LPCOLESTR intermediateHint = AppendNameHints(pNameGetOrSet, pidHint, &fullNameHintLength, &shortNameOffset);
pFullNameHint = AppendNameHints(pNameHint, intermediateHint, &fullNameHintLength, &shortNameOffset);
}
}
}
Expand Down Expand Up @@ -6290,7 +6273,7 @@ ParseNodePtr Parser::ParseClassDecl(BOOL isDeclaration, LPCOLESTR pNameHint, ulo
bool isMemberNamedGetOrSet = false;
RestorePoint beginMethodName;
m_pscan->Capture(&beginMethodName);
if (memberPid == wellKnownPropertyPids.getter || memberPid == wellKnownPropertyPids.setter)
if (memberPid == wellKnownPropertyPids.get || memberPid == wellKnownPropertyPids.set)
{
m_pscan->ScanForcingPid();
}
Expand All @@ -6300,9 +6283,9 @@ ParseNodePtr Parser::ParseClassDecl(BOOL isDeclaration, LPCOLESTR pNameHint, ulo
isMemberNamedGetOrSet = true;
}

if ((memberPid == wellKnownPropertyPids.getter || memberPid == wellKnownPropertyPids.setter) && !isMemberNamedGetOrSet)
if ((memberPid == wellKnownPropertyPids.get || memberPid == wellKnownPropertyPids.set) && !isMemberNamedGetOrSet)
{
bool isGetter = (memberPid == wellKnownPropertyPids.getter);
bool isGetter = (memberPid == wellKnownPropertyPids.get);

if (m_token.tk == tkLBrack && m_scriptContext->GetConfig()->IsES6ObjectLiteralsEnabled())
{
Expand Down Expand Up @@ -6338,7 +6321,9 @@ ParseNodePtr Parser::ParseClassDecl(BOOL isDeclaration, LPCOLESTR pNameHint, ulo
{
pnodeFnc->sxFnc.SetIsAccessor();
pnodeMember = CreateBinNode(isGetter ? knopGetMember : knopSetMember, pnodeMemberName, pnodeFnc);
pMemberNameHint = ConstructFinalHintNode(pClassNamePid, pidHint, isGetter ? wellKnownPropertyPids.getter : wellKnownPropertyPids.setter, isStatic, &memberNameHintLength, &memberNameOffset, isComputedName, pMemberNameHint);
pMemberNameHint = ConstructFinalHintNode(pClassNamePid, pidHint,
isGetter ? wellKnownPropertyPids.get : wellKnownPropertyPids.set, isStatic,
&memberNameHintLength, &memberNameOffset, isComputedName, pMemberNameHint);
}
}
else
Expand Down Expand Up @@ -9734,8 +9719,8 @@ void Parser::InitPids()
wellKnownPropertyPids.arguments = m_phtbl->PidHashNameLen(g_ssym_arguments.sz, g_ssym_arguments.cch);
wellKnownPropertyPids.async = m_phtbl->PidHashNameLen(g_ssym_async.sz, g_ssym_async.cch);
wellKnownPropertyPids.eval = m_phtbl->PidHashNameLen(g_ssym_eval.sz, g_ssym_eval.cch);
wellKnownPropertyPids.getter = m_phtbl->PidHashNameLen(g_ssym_get.sz, g_ssym_get.cch);
wellKnownPropertyPids.setter = m_phtbl->PidHashNameLen(g_ssym_set.sz, g_ssym_set.cch);
wellKnownPropertyPids.get = m_phtbl->PidHashNameLen(g_ssym_get.sz, g_ssym_get.cch);
wellKnownPropertyPids.set = m_phtbl->PidHashNameLen(g_ssym_set.sz, g_ssym_set.cch);
wellKnownPropertyPids.let = m_phtbl->PidHashNameLen(g_ssym_let.sz, g_ssym_let.cch);
wellKnownPropertyPids.constructor = m_phtbl->PidHashNameLen(g_ssym_constructor.sz, g_ssym_constructor.cch);
wellKnownPropertyPids.prototype = m_phtbl->PidHashNameLen(g_ssym_prototype.sz, g_ssym_prototype.cch);
Expand Down
23 changes: 12 additions & 11 deletions deps/chakrashim/core/lib/Parser/parse.h
Original file line number Diff line number Diff line change
Expand Up @@ -385,17 +385,17 @@ class Parser

struct WellKnownPropertyPids
{
IdentPtr arguments; // m_pidArguments; // 'arguments' identifier
IdentPtr async; // m_pidAsync;
IdentPtr eval; // m_pidEval;
IdentPtr setter; // m_pidSetter;
IdentPtr getter; // m_pidGetter;
IdentPtr let; //m_pidLet;
IdentPtr constructor; //m_pidConstructor;
IdentPtr prototype; //m_pidPrototype;
IdentPtr __proto__; // m_pid__proto__;
IdentPtr of; //m_pidOf;
IdentPtr target; // m_pidTarget;
IdentPtr arguments;
IdentPtr async;
IdentPtr eval;
IdentPtr set;
IdentPtr get;
IdentPtr let;
IdentPtr constructor;
IdentPtr prototype;
IdentPtr __proto__;
IdentPtr of;
IdentPtr target;
};

WellKnownPropertyPids wellKnownPropertyPids;
Expand Down Expand Up @@ -453,6 +453,7 @@ class Parser
bool IsNodeAllowedForDeferParse(OpCode op) {return !this->m_deferringAST ||
(op == knopBlock || op == knopVarDecl || op == knopConstDecl || op == knopLetDecl || op == knopFncDecl); }
bool NextTokenConfirmsLetDecl() const { return m_token.tk == tkID || m_token.tk == tkLBrack || m_token.tk == tkLCurly || m_token.IsReservedWord(); }
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(); }

template<bool buildAST>
void PushStmt(StmtNest *pStmt, ParseNodePtr pnode, OpCode op, ParseNodePtr pnodeLab, LabelId* pLabelIdList)
Expand Down
2 changes: 1 addition & 1 deletion deps/chakrashim/core/lib/common/CommonDefines.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
#define CHAKRA_CORE_MINOR_VERSION 1
#define CHAKRA_CORE_VERSION_RELEASE 1
#define CHAKRA_CORE_VERSION_PRERELEASE 0
#define CHAKRA_CORE_VERSION_RELEASE_QFE 3
#define CHAKRA_CORE_VERSION_RELEASE_QFE 4

#define CHAKRA_VERSION_RELEASE 0
#define CHAKRA_VERSION_PRERELEASE 1
Expand Down
1 change: 1 addition & 0 deletions deps/chakrashim/core/test/es5/ObjLitGetSet.baseline
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,4 @@ PASS
(test 5): Object literal get set function toString
function foo() { return _foo; }
function foo(value) { _foo = value; }
PASS
2 changes: 2 additions & 0 deletions deps/chakrashim/core/test/es5/ObjLitGetSet.js
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,8 @@ function Test5()

WScript.Echo("" + fooDescriptor.get);
WScript.Echo("" + fooDescriptor.set);

return true;
}

// Note: test for Object literal duplicate set\get property is in the file ObjLitGetSetDuplicate.js.
Expand Down
19 changes: 18 additions & 1 deletion deps/chakrashim/core/test/es6/destructuring_obj.js
Original file line number Diff line number Diff line change
Expand Up @@ -165,9 +165,26 @@ var tests = [
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");
}
},
{
name: "Object destructuring with `get` and `set` identifiers",
body: function () {
var { get } = { get: 1 };
let { set } = { set: 2 };
assert.areEqual(1, get, "`get` is a valid object destructuring name");
assert.areEqual(2, set, "`set` is a valid object destructuring name");

assert.throws(function () { eval("var { get foo() { } } = { get: 1 };"); }, SyntaxError, "getter accessor is not a valid object destructuring name", "Invalid destructuring assignment target");
assert.throws(function () { eval("var { set bar(x) { } } = { set: 2 };"); }, SyntaxError, "setter accessor is not a valid object destructuring name", "Invalid destructuring assignment target");

const { get: x } = { get: 3 };
var { set: y } = { set: 4 };
assert.areEqual(3, x, "`get` is a valid object destructuring name mapping");
assert.areEqual(4, y, "`set` is a valid object destructuring name mapping");
}
},
{
name: "Object destructuring basic functionality",
body : function () {
body: function () {
{
var x3, x4;
let {x:x1} = {x:20};
Expand Down
53 changes: 48 additions & 5 deletions deps/chakrashim/core/test/es6/objlit.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,58 @@ var tests = [
}
},
{
name: "Method shorthand",
name: "Shorthand names `get` and `set` parse without error (they are not keywords in these cases)",
body: function () {
var a = 0;
var get = 1;
var set = 2;
var z = 3;

var o = { get };
var p = { set };
var q = { get, set };
var r = { set, get };
var s = { get, z };
var t = { a, set };
var u = { a, get, z };

assert.areEqual(1, o.get, "o.get = 1");
assert.areEqual(2, p.set, "p.set = 2");
assert.areEqual(1, q.get, "q.get = 1");
assert.areEqual(2, q.set, "q.set = 2");
assert.areEqual(2, r.set, "r.set = 2");
assert.areEqual(1, r.get, "r.get = 1");
assert.areEqual(1, s.get, "s.get = 1");
assert.areEqual(3, s.z, "s.z = 3");
assert.areEqual(0, t.a, "t.a = 0");
assert.areEqual(2, t.set, "t.set = 2");
assert.areEqual(0, u.a, "u.a = 0");
assert.areEqual(1, u.get, "u.get = 1");
assert.areEqual(3, u.z, "u.z = 3");
}
},
{
name: "Concise method shorthand",
body: function() {
var obj = {
foo() { return "foo"; }
foo() { return "foo"; }
};

assert.areEqual("foo", obj.foo());
assert.areEqual("foo", ({ foo: function() { }, foo() { return "foo"; } }).foo());
assert.areEqual("foo", ({ foo(x) { }, foo() { return "foo"; } }).foo());
}
},
{
name: "Concise method shorthand with `get` and `set` names",
body: function () {
var o = {
get() { return "g"; },
set() { return "s"; }
};

assert.areEqual(obj.foo(), "foo");
assert.areEqual(({ foo: function() { }, foo() { return "foo"; } }).foo(), "foo");
assert.areEqual(({ foo(x) { }, foo() { return "foo"; } }).foo(), "foo");
assert.areEqual('g', o.get(), "o.get returns 'g'");
assert.areEqual('s', o.set(), "o.set returns 's'");
}
},
{
Expand Down

0 comments on commit fc3cf3e

Please sign in to comment.