mirror of
				https://github.com/tc39/test262.git
				synced 2025-11-04 05:33:50 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			64 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved.
 | 
						|
// This code is governed by the BSD license found in the LICENSE file.
 | 
						|
 | 
						|
/*---
 | 
						|
description: Every new evaluation of a class creates a different Private Name (private static field)
 | 
						|
esid: sec-runtime-semantics-evaluate-name
 | 
						|
info: |
 | 
						|
  ClassElementName : PrivateIdentifier
 | 
						|
    1. Let privateIdentifier be StringValue of PrivateIdentifier.
 | 
						|
    2. Let privateName be NewPrivateName(privateIdentifier).
 | 
						|
    3. Let scope be the running execution context's PrivateEnvironment.
 | 
						|
    4. Let scopeEnvRec be scope's EnvironmentRecord.
 | 
						|
    5. Perform ! scopeEnvRec.InitializeBinding(privateIdentifier, privateName).
 | 
						|
    6. Return privateName.
 | 
						|
 | 
						|
  ClassTail : ClassHeritage { ClassBody }
 | 
						|
    ...
 | 
						|
    27. Let staticFields be a new empty List.
 | 
						|
    28. For each ClassElement e in order from elements,
 | 
						|
      a. If IsStatic of e is false, then
 | 
						|
        ...
 | 
						|
      b. Else,
 | 
						|
        i. Let field be the result of performing PropertyDefinitionEvaluation for m ClassElementEvaluation for e with arguments F and false.
 | 
						|
      c. If field is an abrupt completion, then
 | 
						|
        ...
 | 
						|
      d. If field is not empty,
 | 
						|
        i. If IsStatic of e is false, append field to instanceFields.
 | 
						|
        ii. Otherwise, append field to staticFields.
 | 
						|
    ...
 | 
						|
    34. For each item fieldRecord in order from staticFields,
 | 
						|
      a. Perform ? DefineField(F, field).
 | 
						|
    ...
 | 
						|
 | 
						|
  DefineField(receiver, fieldRecord)
 | 
						|
    ...
 | 
						|
    8. If fieldName is a Private Name,
 | 
						|
      a. Perform ? PrivateFieldAdd(fieldName, receiver, initValue).
 | 
						|
features: [class, class-static-fields-private]
 | 
						|
---*/
 | 
						|
 | 
						|
let createClass = function () {
 | 
						|
  return class {
 | 
						|
    static #m = 'test262';
 | 
						|
 | 
						|
    static access() {
 | 
						|
      return this.#m;
 | 
						|
    }
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
let C1 = createClass();
 | 
						|
let C2 = createClass();
 | 
						|
 | 
						|
assert.sameValue(C1.access(), 'test262');
 | 
						|
assert.sameValue(C2.access(), 'test262');
 | 
						|
 | 
						|
assert.throws(TypeError, function() {
 | 
						|
  C1.access.call(C2);
 | 
						|
}, 'invalid access of c1 private static field');
 | 
						|
 | 
						|
assert.throws(TypeError, function() {
 | 
						|
  C2.access.call(C1);
 | 
						|
}, 'invalid access of c2 private static field');
 |