Ensure static private method init run before static property (#12918)

This commit is contained in:
Huáng Jùnliàng 2021-03-03 18:02:23 -05:00 committed by GitHub
parent bdb207cb75
commit ac758f7d70
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
21 changed files with 163 additions and 143 deletions

View File

@ -806,7 +806,7 @@ export function buildFieldsInitNodes(
break; break;
case isStatic && isPrivate && isMethod && !privateFieldsAsProperties: case isStatic && isPrivate && isMethod && !privateFieldsAsProperties:
needsClassRef = true; needsClassRef = true;
staticNodes.push( staticNodes.unshift(
buildPrivateStaticFieldInitSpec(prop, privateNamesMap), buildPrivateStaticFieldInitSpec(prop, privateNamesMap),
); );
staticNodes.unshift( staticNodes.unshift(
@ -819,7 +819,7 @@ export function buildFieldsInitNodes(
break; break;
case isStatic && isPrivate && isMethod && privateFieldsAsProperties: case isStatic && isPrivate && isMethod && privateFieldsAsProperties:
needsClassRef = true; needsClassRef = true;
staticNodes.push( staticNodes.unshift(
buildPrivateStaticMethodInitLoose( buildPrivateStaticMethodInitLoose(
t.cloneNode(ref), t.cloneNode(ref),
prop, prop,

View File

@ -24,6 +24,10 @@ var _getB2 = function _getB2() {
return this.b; return this.b;
}; };
Object.defineProperty(B, _getB, {
value: _getB2
});
var _getA2 = function _getA2() { var _getA2 = function _getA2() {
return A.a; return A.a;
}; };
@ -31,7 +35,4 @@ var _getA2 = function _getA2() {
Object.defineProperty(B, _getA, { Object.defineProperty(B, _getA, {
value: _getA2 value: _getA2
}); });
Object.defineProperty(B, _getB, {
value: _getB2
});
var [getA, getB] = B.extract(); var [getA, getB] = B.extract();

View File

@ -24,6 +24,10 @@ var _getB2 = function _getB2() {
return this.b; return this.b;
}; };
Object.defineProperty(B, _getB, {
value: _getB2
});
var _getA2 = function _getA2() { var _getA2 = function _getA2() {
return babelHelpers.get(babelHelpers.getPrototypeOf(B), "a", this); return babelHelpers.get(babelHelpers.getPrototypeOf(B), "a", this);
}; };
@ -31,7 +35,4 @@ var _getA2 = function _getA2() {
Object.defineProperty(B, _getA, { Object.defineProperty(B, _getA, {
value: _getA2 value: _getA2
}); });
Object.defineProperty(B, _getB, {
value: _getB2
});
const [getA, getB] = B.extract(); const [getA, getB] = B.extract();

View File

@ -1,29 +0,0 @@
expect(() => {
class C {
static #_ = new C;
static get #p() { return C };
constructor() {
C.#p;
}
}
}).toThrow(/attempted to use private field on non-instance/);
expect(() => {
class C {
static #_ = new C;
static set #p(v) {};
constructor() {
C.#p = 0;
}
}
}).toThrow(/attempted to use private field on non-instance/);
expect(() => {
class C {
static #_ = new C;
static set #p(v) {};
constructor() {
for (C.#p of [0]);
}
}
}).toThrow(/attempted to use private field on non-instance/);

View File

@ -0,0 +1,35 @@
expect((() => {
let r;
class C {
static #_ = new C;
static get #p() { return 0 };
constructor() {
r = C.#p;
}
}
return r;
})()).toBe(0);
expect((() => {
let r;
class C {
static #_ = new C;
static set #p(v) { r = v; };
constructor() {
C.#p = 0;
}
}
return r;
})()).toBe(0);
expect((() => {
let r;
class C {
static #_ = new C;
static set #p(v) { r = v; };
constructor() {
for (C.#p of [0]);
}
}
return r;
})()).toBe(0);

View File

@ -21,11 +21,11 @@ var _get_privateStaticFieldValue = function () {
return babelHelpers.classPrivateFieldLooseBase(Cl, _PRIVATE_STATIC_FIELD)[_PRIVATE_STATIC_FIELD]; return babelHelpers.classPrivateFieldLooseBase(Cl, _PRIVATE_STATIC_FIELD)[_PRIVATE_STATIC_FIELD];
}; };
Object.defineProperty(Cl, _PRIVATE_STATIC_FIELD, {
writable: true,
value: "top secret string"
});
Object.defineProperty(Cl, _privateStaticFieldValue, { Object.defineProperty(Cl, _privateStaticFieldValue, {
get: _get_privateStaticFieldValue, get: _get_privateStaticFieldValue,
set: _set_privateStaticFieldValue set: _set_privateStaticFieldValue
}); });
Object.defineProperty(Cl, _PRIVATE_STATIC_FIELD, {
writable: true,
value: "top secret string"
});

View File

@ -13,11 +13,11 @@ var _set_privateStaticFieldValue = function (newValue) {
babelHelpers.classPrivateFieldLooseBase(Cl, _PRIVATE_STATIC_FIELD)[_PRIVATE_STATIC_FIELD] = newValue; babelHelpers.classPrivateFieldLooseBase(Cl, _PRIVATE_STATIC_FIELD)[_PRIVATE_STATIC_FIELD] = newValue;
}; };
Object.defineProperty(Cl, _PRIVATE_STATIC_FIELD, {
writable: true,
value: 0
});
Object.defineProperty(Cl, _privateStaticFieldValue, { Object.defineProperty(Cl, _privateStaticFieldValue, {
get: void 0, get: void 0,
set: _set_privateStaticFieldValue set: _set_privateStaticFieldValue
}); });
Object.defineProperty(Cl, _PRIVATE_STATIC_FIELD, {
writable: true,
value: 0
});

View File

@ -14,12 +14,12 @@ var _get_privateFieldValue = function () {
return babelHelpers.classPrivateFieldLooseBase(this, _privateField)[_privateField]; return babelHelpers.classPrivateFieldLooseBase(this, _privateField)[_privateField];
}; };
Object.defineProperty(Cl, _privateField, {
writable: true,
value: 0
});
Object.defineProperty(Cl, _privateFieldValue, { Object.defineProperty(Cl, _privateFieldValue, {
get: _get_privateFieldValue, get: _get_privateFieldValue,
set: void 0 set: void 0
}); });
Object.defineProperty(Cl, _privateField, {
writable: true,
value: 0
});
var cl = new Cl(); var cl = new Cl();

View File

@ -42,12 +42,12 @@ var _get_privateFieldValue = function () {
return babelHelpers.classPrivateFieldLooseBase(Cl, _privateField)[_privateField]; return babelHelpers.classPrivateFieldLooseBase(Cl, _privateField)[_privateField];
}; };
Object.defineProperty(Cl, _privateFieldValue, {
get: _get_privateFieldValue,
set: _set_privateFieldValue
});
Object.defineProperty(Cl, _privateField, { Object.defineProperty(Cl, _privateField, {
writable: true, writable: true,
value: "top secret string" value: "top secret string"
}); });
Cl.publicField = "not secret string"; Cl.publicField = "not secret string";
Object.defineProperty(Cl, _privateFieldValue, {
get: _get_privateFieldValue,
set: _set_privateFieldValue
});

View File

@ -1,29 +0,0 @@
expect(() => {
class C {
static #_ = new C;
static get #p() { return C };
constructor() {
C.#p;
}
}
}).toThrow(/attempted to use private field on non-instance/);
expect(() => {
class C {
static #_ = new C;
static set #p(v) {};
constructor() {
C.#p = 0;
}
}
}).toThrow(/attempted to use private field on non-instance/);
expect(() => {
class C {
static #_ = new C;
static set #p(v) {};
constructor() {
for (C.#p of [0]);
}
}
}).toThrow(/attempted to use private field on non-instance/);

View File

@ -0,0 +1,35 @@
expect((() => {
let r;
class C {
static #_ = new C;
static get #p() { return 0 };
constructor() {
r = C.#p;
}
}
return r;
})()).toBe(0);
expect((() => {
let r;
class C {
static #_ = new C;
static set #p(v) { r = v; };
constructor() {
C.#p = 0;
}
}
return r;
})()).toBe(0);
expect((() => {
let r;
class C {
static #_ = new C;
static set #p(v) { r = v; };
constructor() {
for (C.#p of [0]);
}
}
return r;
})()).toBe(0);

View File

@ -21,11 +21,11 @@ var _get_privateStaticFieldValue = function () {
return babelHelpers.classPrivateFieldLooseBase(Cl, _PRIVATE_STATIC_FIELD)[_PRIVATE_STATIC_FIELD]; return babelHelpers.classPrivateFieldLooseBase(Cl, _PRIVATE_STATIC_FIELD)[_PRIVATE_STATIC_FIELD];
}; };
Object.defineProperty(Cl, _PRIVATE_STATIC_FIELD, {
writable: true,
value: "top secret string"
});
Object.defineProperty(Cl, _privateStaticFieldValue, { Object.defineProperty(Cl, _privateStaticFieldValue, {
get: _get_privateStaticFieldValue, get: _get_privateStaticFieldValue,
set: _set_privateStaticFieldValue set: _set_privateStaticFieldValue
}); });
Object.defineProperty(Cl, _PRIVATE_STATIC_FIELD, {
writable: true,
value: "top secret string"
});

View File

@ -13,11 +13,11 @@ var _set_privateStaticFieldValue = function (newValue) {
babelHelpers.classPrivateFieldLooseBase(Cl, _PRIVATE_STATIC_FIELD)[_PRIVATE_STATIC_FIELD] = newValue; babelHelpers.classPrivateFieldLooseBase(Cl, _PRIVATE_STATIC_FIELD)[_PRIVATE_STATIC_FIELD] = newValue;
}; };
Object.defineProperty(Cl, _PRIVATE_STATIC_FIELD, {
writable: true,
value: 0
});
Object.defineProperty(Cl, _privateStaticFieldValue, { Object.defineProperty(Cl, _privateStaticFieldValue, {
get: void 0, get: void 0,
set: _set_privateStaticFieldValue set: _set_privateStaticFieldValue
}); });
Object.defineProperty(Cl, _PRIVATE_STATIC_FIELD, {
writable: true,
value: 0
});

View File

@ -14,12 +14,12 @@ var _get_privateFieldValue = function () {
return babelHelpers.classPrivateFieldLooseBase(this, _privateField)[_privateField]; return babelHelpers.classPrivateFieldLooseBase(this, _privateField)[_privateField];
}; };
Object.defineProperty(Cl, _privateField, {
writable: true,
value: 0
});
Object.defineProperty(Cl, _privateFieldValue, { Object.defineProperty(Cl, _privateFieldValue, {
get: _get_privateFieldValue, get: _get_privateFieldValue,
set: void 0 set: void 0
}); });
Object.defineProperty(Cl, _privateField, {
writable: true,
value: 0
});
const cl = new Cl(); const cl = new Cl();

View File

@ -42,12 +42,12 @@ var _get_privateFieldValue = function () {
return babelHelpers.classPrivateFieldLooseBase(Cl, _privateField)[_privateField]; return babelHelpers.classPrivateFieldLooseBase(Cl, _privateField)[_privateField];
}; };
Object.defineProperty(Cl, _privateFieldValue, {
get: _get_privateFieldValue,
set: _set_privateFieldValue
});
Object.defineProperty(Cl, _privateField, { Object.defineProperty(Cl, _privateField, {
writable: true, writable: true,
value: "top secret string" value: "top secret string"
}); });
babelHelpers.defineProperty(Cl, "publicField", "not secret string"); babelHelpers.defineProperty(Cl, "publicField", "not secret string");
Object.defineProperty(Cl, _privateFieldValue, {
get: _get_privateFieldValue,
set: _set_privateFieldValue
});

View File

@ -1,29 +0,0 @@
expect(() => {
class C {
static #_ = new C;
static get #p() { return C };
constructor() {
C.#p;
}
}
}).toThrow(/attempted to get private static field before its declaration/);
expect(() => {
class C {
static #_ = new C;
static set #p(v) {};
constructor() {
C.#p = 0;
}
}
}).toThrow(/attempted to set private static field before its declaration/);
expect(() => {
class C {
static #_ = new C;
static set #p(v) {};
constructor() {
for (C.#p of [0]);
}
}
}).toThrow(/attempted to set private static field before its declaration/);

View File

@ -0,0 +1,35 @@
expect((() => {
let r;
class C {
static #_ = new C;
static get #p() { return 0 };
constructor() {
r = C.#p;
}
}
return r;
})()).toBe(0);
expect((() => {
let r;
class C {
static #_ = new C;
static set #p(v) { r = v; };
constructor() {
C.#p = 0;
}
}
return r;
})()).toBe(0);
expect((() => {
let r;
class C {
static #_ = new C;
static set #p(v) { r = v; };
constructor() {
for (C.#p of [0]);
}
}
return r;
})()).toBe(0);

View File

@ -17,11 +17,11 @@ var _get_privateStaticFieldValue = function () {
return babelHelpers.classStaticPrivateFieldSpecGet(Cl, Cl, _PRIVATE_STATIC_FIELD); return babelHelpers.classStaticPrivateFieldSpecGet(Cl, Cl, _PRIVATE_STATIC_FIELD);
}; };
var _PRIVATE_STATIC_FIELD = {
writable: true,
value: "top secret string"
};
var _privateStaticFieldValue = { var _privateStaticFieldValue = {
get: _get_privateStaticFieldValue, get: _get_privateStaticFieldValue,
set: _set_privateStaticFieldValue set: _set_privateStaticFieldValue
}; };
var _PRIVATE_STATIC_FIELD = {
writable: true,
value: "top secret string"
};

View File

@ -9,11 +9,11 @@ var _set_privateStaticFieldValue = function (newValue) {
babelHelpers.classStaticPrivateFieldSpecSet(Cl, Cl, _PRIVATE_STATIC_FIELD, newValue); babelHelpers.classStaticPrivateFieldSpecSet(Cl, Cl, _PRIVATE_STATIC_FIELD, newValue);
}; };
var _PRIVATE_STATIC_FIELD = {
writable: true,
value: 0
};
var _privateStaticFieldValue = { var _privateStaticFieldValue = {
get: void 0, get: void 0,
set: _set_privateStaticFieldValue set: _set_privateStaticFieldValue
}; };
var _PRIVATE_STATIC_FIELD = {
writable: true,
value: 0
};

View File

@ -10,12 +10,12 @@ var _get_privateFieldValue = function () {
return babelHelpers.classStaticPrivateFieldSpecGet(this, Cl, _privateField); return babelHelpers.classStaticPrivateFieldSpecGet(this, Cl, _privateField);
}; };
var _privateField = {
writable: true,
value: 0
};
var _privateFieldValue = { var _privateFieldValue = {
get: _get_privateFieldValue, get: _get_privateFieldValue,
set: void 0 set: void 0
}; };
var _privateField = {
writable: true,
value: 0
};
var cl = new Cl(); var cl = new Cl();

View File

@ -40,12 +40,12 @@ var _get_privateFieldValue = function () {
return babelHelpers.classStaticPrivateFieldSpecGet(Cl, Cl, _privateField); return babelHelpers.classStaticPrivateFieldSpecGet(Cl, Cl, _privateField);
}; };
var _privateFieldValue = {
get: _get_privateFieldValue,
set: _set_privateFieldValue
};
var _privateField = { var _privateField = {
writable: true, writable: true,
value: "top secret string" value: "top secret string"
}; };
babelHelpers.defineProperty(Cl, "publicField", "not secret string"); babelHelpers.defineProperty(Cl, "publicField", "not secret string");
var _privateFieldValue = {
get: _get_privateFieldValue,
set: _set_privateFieldValue
};