source: trip-planner-front/node_modules/reflect-metadata/docs/index.html@ 6a3a178

Last change on this file since 6a3a178 was 6a3a178, checked in by Ema <ema_spirova@…>, 3 years ago

initial commit

  • Property mode set to 100644
File size: 99.4 KB
RevLine 
[6a3a178]1<!doctype html>
2<head><meta charset="utf-8">
3<title>Metadata Proposal - ECMAScript</title>
4<link rel="stylesheet" href="ecmarkup.css">
5<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.4/styles/github.min.css">
6<script src="ecmarkup.js"></script>
7<script>
8 if (location.hostname === 'rbuckton.github.io' && location.protocol !== 'https:') {
9 location.protocol = 'https:';
10 }
11</script>
12<script type="application/json" id="menu-search-biblio">[{"type":"clause","id":"introduction","aoid":null,"title":"Metadata Proposal - ECMAScript","titleHTML":"Metadata Proposal - ECMAScript","number":"","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Metadata Proposal - ECMAScript"},{"type":"clause","id":"syntax","aoid":null,"title":"Syntax","titleHTML":"Syntax","number":"1","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Syntax"},{"type":"op","aoid":"GetOrCreateMetadataMap","refId":"getorcreatemetadatamap","location":"","referencingIds":[],"key":"GetOrCreateMetadataMap"},{"type":"clause","id":"getorcreatemetadatamap","aoid":"GetOrCreateMetadataMap","title":"GetOrCreateMetadataMap ( O, P, Create )","titleHTML":"GetOrCreateMetadataMap ( O, P, Create )","number":"2.1.1","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":["_ref_8","_ref_17","_ref_22","_ref_42","_ref_52"],"key":"GetOrCreateMetadataMap ( O, P, Create )"},{"type":"clause","id":"operations-on-objects","aoid":null,"title":"Operations on Objects","titleHTML":"Operations on Objects","number":"2.1","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Operations on Objects"},{"type":"clause","id":"abstract-operations","aoid":null,"title":"Abstract Operations","titleHTML":"Abstract Operations","number":"2","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Abstract Operations"},{"type":"op","aoid":"OrdinaryHasMetadata","refId":"ordinaryhasmetadata","location":"","referencingIds":[],"key":"OrdinaryHasMetadata"},{"type":"clause","id":"ordinaryhasmetadata","aoid":"OrdinaryHasMetadata","title":"OrdinaryHasMetadata ( MetadataKey, O, P )","titleHTML":"OrdinaryHasMetadata ( MetadataKey, O, P )","number":"3.1.1.1","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":["_ref_3"],"key":"OrdinaryHasMetadata ( MetadataKey, O, P )"},{"type":"clause","id":"ordinary-object-internal-methods-and-internal-slots-hasmetadata","aoid":null,"title":"[[HasMetadata]] ( MetadataKey, P )","titleHTML":"[[HasMetadata]] ( MetadataKey, P )","number":"3.1.1","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"[[HasMetadata]] ( MetadataKey, P )"},{"type":"op","aoid":"OrdinaryHasOwnMetadata","refId":"ordinaryhasownmetadata","location":"","referencingIds":[],"key":"OrdinaryHasOwnMetadata"},{"type":"clause","id":"ordinaryhasownmetadata","aoid":"OrdinaryHasOwnMetadata","title":"OrdinaryHasOwnMetadata ( MetadataKey, O, P )","titleHTML":"OrdinaryHasOwnMetadata ( MetadataKey, O, P )","number":"3.1.2.1","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":["_ref_5","_ref_6","_ref_13"],"key":"OrdinaryHasOwnMetadata ( MetadataKey, O, P )"},{"type":"clause","id":"ordinary-object-internal-methods-and-internal-slots-hasownmetadata","aoid":null,"title":"[[HasOwnMetadata]] ( MetadataKey, P )","titleHTML":"[[HasOwnMetadata]] ( MetadataKey, P )","number":"3.1.2","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"[[HasOwnMetadata]] ( MetadataKey, P )"},{"type":"op","aoid":"OrdinaryGetMetadata","refId":"ordinarygetmetadata","location":"","referencingIds":[],"key":"OrdinaryGetMetadata"},{"type":"clause","id":"ordinarygetmetadata","aoid":"OrdinaryGetMetadata","title":"OrdinaryGetMetadata ( MetadataKey, O, P )","titleHTML":"OrdinaryGetMetadata ( MetadataKey, O, P )","number":"3.1.3.1","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":["_ref_11"],"key":"OrdinaryGetMetadata ( MetadataKey, O, P )"},{"type":"clause","id":"ordinary-object-internal-methods-and-internal-slots-getmetadata","aoid":null,"title":"[[GetMetadata]] ( MetadataKey, P )","titleHTML":"[[GetMetadata]] ( MetadataKey, P )","number":"3.1.3","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"[[GetMetadata]] ( MetadataKey, P )"},{"type":"op","aoid":"OrdinaryGetOwnMetadata","refId":"ordinarygetownmetadata","location":"","referencingIds":[],"key":"OrdinaryGetOwnMetadata"},{"type":"clause","id":"ordinarygetownmetadata","aoid":"OrdinaryGetOwnMetadata","title":"OrdinaryGetOwnMetadata ( MetadataKey, O, P )","titleHTML":"OrdinaryGetOwnMetadata ( MetadataKey, O, P )","number":"3.1.4.1","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":["_ref_14","_ref_15"],"key":"OrdinaryGetOwnMetadata ( MetadataKey, O, P )"},{"type":"clause","id":"ordinary-object-internal-methods-and-internal-slots-getownmetadata","aoid":null,"title":"[[GetOwnMetadata]] ( MetadataKey, P, ParamIndex )","titleHTML":"[[GetOwnMetadata]] ( MetadataKey, P, ParamIndex )","number":"3.1.4","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"[[GetOwnMetadata]] ( MetadataKey, P, ParamIndex )"},{"type":"op","aoid":"OrdinaryDefineOwnMetadata","refId":"ordinarydefineownmetadata","location":"","referencingIds":[],"key":"OrdinaryDefineOwnMetadata"},{"type":"clause","id":"ordinarydefineownmetadata","aoid":"OrdinaryDefineOwnMetadata","title":"OrdinaryDefineOwnMetadata ( MetadataKey, MetadataValue, O, P )","titleHTML":"OrdinaryDefineOwnMetadata ( MetadataKey, MetadataValue, O, P )","number":"3.1.5.1","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":["_ref_19"],"key":"OrdinaryDefineOwnMetadata ( MetadataKey, MetadataValue, O, P )"},{"type":"clause","id":"ordinary-object-internal-methods-and-internal-slots-defineownmetadata","aoid":null,"title":"[[DefineOwnMetadata]] ( MetadataKey, MetadataValue, P )","titleHTML":"[[DefineOwnMetadata]] ( MetadataKey, MetadataValue, P )","number":"3.1.5","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"[[DefineOwnMetadata]] ( MetadataKey, MetadataValue, P )"},{"type":"op","aoid":"OrdinaryMetadataKeys","refId":"ordinarymetadatakeys","location":"","referencingIds":[],"key":"OrdinaryMetadataKeys"},{"type":"clause","id":"ordinarymetadatakeys","aoid":"OrdinaryMetadataKeys","title":"OrdinaryMetadataKeys ( O, P )","titleHTML":"OrdinaryMetadataKeys ( O, P )","number":"3.1.6.1","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":["_ref_24"],"key":"OrdinaryMetadataKeys ( O, P )"},{"type":"clause","id":"ordinary-object-internal-methods-and-internal-slots-metadatakeys","aoid":null,"title":"[[MetadataKeys]] ( P )","titleHTML":"[[MetadataKeys]] ( P )","number":"3.1.6","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"[[MetadataKeys]] ( P )"},{"type":"op","aoid":"OrdinaryOwnMetadataKeys","refId":"ordinaryownmetadatakeys","location":"","referencingIds":[],"key":"OrdinaryOwnMetadataKeys"},{"type":"clause","id":"ordinaryownmetadatakeys","aoid":"OrdinaryOwnMetadataKeys","title":"OrdinaryOwnMetadataKeys ( O, P )","titleHTML":"OrdinaryOwnMetadataKeys ( O, P )","number":"3.1.7.1","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":["_ref_26","_ref_39"],"key":"OrdinaryOwnMetadataKeys ( O, P )"},{"type":"clause","id":"ordinary-object-internal-methods-and-internal-slots-ownmetadatakeys","aoid":null,"title":"[[OwnMetadataKeys]] ( P )","titleHTML":"[[OwnMetadataKeys]] ( P )","number":"3.1.7","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"[[OwnMetadataKeys]] ( P )"},{"type":"clause","id":"ordinary-object-internal-methods-and-internal-slots-deletemetadata","aoid":null,"title":"[[DeleteMetadata]]( MetadataKey, P )","titleHTML":"[[DeleteMetadata]]( MetadataKey, P )","number":"3.1.8","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"[[DeleteMetadata]]( MetadataKey, P )"},{"type":"clause","id":"ordinary-object-internal-methods-and-internal-slots","aoid":null,"title":"Ordinary Object Internal Methods and Internal Slots","titleHTML":"Ordinary Object Internal Methods and Internal Slots","number":"3.1","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Ordinary Object Internal Methods and Internal Slots"},{"type":"clause","id":"ordinary-and-exotic-objects-behaviors","aoid":null,"title":"Ordinary and Exotic Objects Behaviors","titleHTML":"Ordinary and Exotic Objects Behaviors","number":"3","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Ordinary and Exotic Objects Behaviors"},{"type":"clause","id":"reflect-metadatadecoratorfunctions","aoid":null,"title":"Metadata Decorator Functions","titleHTML":"Metadata Decorator Functions","number":"4.1.1","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Metadata Decorator Functions"},{"type":"clause","id":"reflect.metadata","aoid":null,"title":"Reflect.metadata ( metadataKey, metadataValue )","titleHTML":"Reflect.metadata ( metadataKey, metadataValue )","number":"4.1.2","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Reflect.metadata ( metadataKey, metadataValue )"},{"type":"clause","id":"reflect.definemetadata","aoid":null,"title":"Reflect.defineMetadata ( metadataKey, metadataValue, target [, propertyKey] )","titleHTML":"Reflect.defineMetadata ( metadataKey, metadataValue, target [, propertyKey] )","number":"4.1.3","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Reflect.defineMetadata ( metadataKey, metadataValue, target [, propertyKey] )"},{"type":"clause","id":"reflect.hasmetadata","aoid":null,"title":"Reflect.hasMetadata ( metadataKey, target [, propertyKey] )","titleHTML":"Reflect.hasMetadata ( metadataKey, target [, propertyKey] )","number":"4.1.4","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Reflect.hasMetadata ( metadataKey, target [, propertyKey] )"},{"type":"clause","id":"reflect.hasownmetadata","aoid":null,"title":"Reflect.hasOwnMetadata ( metadataKey, target [, propertyKey] )","titleHTML":"Reflect.hasOwnMetadata ( metadataKey, target [, propertyKey] )","number":"4.1.5","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Reflect.hasOwnMetadata ( metadataKey, target [, propertyKey] )"},{"type":"clause","id":"reflect.getmetadata","aoid":null,"title":"Reflect.getMetadata ( metadataKey, target [, propertyKey] )","titleHTML":"Reflect.getMetadata ( metadataKey, target [, propertyKey] )","number":"4.1.6","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Reflect.getMetadata ( metadataKey, target [, propertyKey] )"},{"type":"clause","id":"reflect.getownmetadata","aoid":null,"title":"Reflect.getOwnMetadata ( metadataKey, target [, propertyKey] )","titleHTML":"Reflect.getOwnMetadata ( metadataKey, target [, propertyKey] )","number":"4.1.7","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Reflect.getOwnMetadata ( metadataKey, target [, propertyKey] )"},{"type":"clause","id":"reflect.getmetadatakeys","aoid":null,"title":"Reflect.getMetadataKeys ( target [, propertyKey] )","titleHTML":"Reflect.getMetadataKeys ( target [, propertyKey] )","number":"4.1.8","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Reflect.getMetadataKeys ( target [, propertyKey] )"},{"type":"clause","id":"reflect.getownmetadatakeys","aoid":null,"title":"Reflect.getOwnMetadataKeys ( target [, propertyKey] )","titleHTML":"Reflect.getOwnMetadataKeys ( target [, propertyKey] )","number":"4.1.9","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Reflect.getOwnMetadataKeys ( target [, propertyKey] )"},{"type":"clause","id":"reflect.deletemetadata","aoid":null,"title":"Reflect.deleteMetadata ( metadataKey, target [, propertyKey] )","titleHTML":"Reflect.deleteMetadata ( metadataKey, target [, propertyKey] )","number":"4.1.10","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Reflect.deleteMetadata ( metadataKey, target [, propertyKey] )"},{"type":"clause","id":"reflect","aoid":null,"title":"The Reflect Object","titleHTML":"The Reflect Object","number":"4.1","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"The Reflect Object"},{"type":"clause","id":"reflection","aoid":null,"title":"Reflection","titleHTML":"Reflection","number":"4","namespace":"https://rbuckton.github.io/reflect-metadata","location":"","referencingIds":[],"key":"Reflection"}]</script><script>"use strict";
13
14function Search(menu) {
15 this.menu = menu;
16 this.$search = document.getElementById('menu-search');
17 this.$searchBox = document.getElementById('menu-search-box');
18 this.$searchResults = document.getElementById('menu-search-results');
19
20 this.loadBiblio();
21
22 document.addEventListener('keydown', this.documentKeydown.bind(this));
23
24 this.$searchBox.addEventListener('keydown', debounce(this.searchBoxKeydown.bind(this), { stopPropagation: true }));
25 this.$searchBox.addEventListener('keyup', debounce(this.searchBoxKeyup.bind(this), { stopPropagation: true }));
26}
27
28Search.prototype.loadBiblio = function () {
29 var $biblio = document.getElementById('menu-search-biblio');
30 if (!$biblio) {
31 this.biblio = [];
32 } else {
33 this.biblio = JSON.parse($biblio.textContent);
34 this.biblio.clauses = this.biblio.filter(function (e) { return e.type === 'clause' });
35 this.biblio.byId = this.biblio.reduce(function (map, entry) {
36 map[entry.id] = entry;
37 return map;
38 }, {});
39 }
40}
41
42Search.prototype.documentKeydown = function (e) {
43 if (e.keyCode === 191) {
44 e.preventDefault();
45 e.stopPropagation();
46 this.triggerSearch();
47 }
48}
49
50Search.prototype.searchBoxKeydown = function (e) {
51 e.stopPropagation();
52 e.preventDefault();
53 if (e.keyCode === 191 && e.target.value.length === 0) {
54 e.preventDefault();
55 } else if (e.keyCode === 13) {
56 e.preventDefault();
57 this.selectResult();
58 }
59}
60
61Search.prototype.searchBoxKeyup = function (e) {
62 if (e.keyCode === 13 || e.keyCode === 9) {
63 return;
64 }
65
66 this.search(e.target.value);
67}
68
69
70Search.prototype.triggerSearch = function (e) {
71 if (this.menu.isVisible()) {
72 this._closeAfterSearch = false;
73 } else {
74 this._closeAfterSearch = true;
75 this.menu.show();
76 }
77
78 this.$searchBox.focus();
79 this.$searchBox.select();
80}
81// bit 12 - Set if the result starts with searchString
82// bits 8-11: 8 - number of chunks multiplied by 2 if cases match, otherwise 1.
83// bits 1-7: 127 - length of the entry
84// General scheme: prefer case sensitive matches with fewer chunks, and otherwise
85// prefer shorter matches.
86function relevance(result, searchString) {
87 var relevance = 0;
88
89 relevance = Math.max(0, 8 - result.match.chunks) << 7;
90
91 if (result.match.caseMatch) {
92 relevance *= 2;
93 }
94
95 if (result.match.prefix) {
96 relevance += 2048
97 }
98
99 relevance += Math.max(0, 255 - result.entry.key.length);
100
101 return relevance;
102}
103
104Search.prototype.search = function (searchString) {
105 var s = Date.now();
106
107 if (searchString === '') {
108 this.displayResults([]);
109 this.hideSearch();
110 return;
111 } else {
112 this.showSearch();
113 }
114
115 if (searchString.length === 1) {
116 this.displayResults([]);
117 return;
118 }
119
120 var results;
121
122 if (/^[\d\.]*$/.test(searchString)) {
123 results = this.biblio.clauses.filter(function (clause) {
124 return clause.number.substring(0, searchString.length) === searchString;
125 }).map(function (clause) {
126 return { entry: clause };
127 });
128 } else {
129 results = [];
130
131 for (var i = 0; i < this.biblio.length; i++) {
132 var entry = this.biblio[i];
133 if (!entry.key) {
134 // biblio entries without a key aren't searchable
135 continue;
136 }
137
138 var match = fuzzysearch(searchString, entry.key);
139 if (match) {
140 results.push({ entry: entry, match: match });
141 }
142 }
143
144 results.forEach(function (result) {
145 result.relevance = relevance(result, searchString);
146 });
147
148 results = results.sort(function (a, b) { return b.relevance - a.relevance });
149
150 }
151
152 if (results.length > 50) {
153 results = results.slice(0, 50);
154 }
155
156 this.displayResults(results);
157}
158Search.prototype.hideSearch = function () {
159 this.$search.classList.remove('active');
160}
161
162Search.prototype.showSearch = function () {
163 this.$search.classList.add('active');
164}
165
166Search.prototype.selectResult = function () {
167 var $first = this.$searchResults.querySelector('li:first-child a');
168
169 if ($first) {
170 document.location = $first.getAttribute('href');
171 }
172
173 this.$searchBox.value = '';
174 this.$searchBox.blur();
175 this.displayResults([]);
176 this.hideSearch();
177
178 if (this._closeAfterSearch) {
179 this.menu.hide();
180 }
181}
182
183Search.prototype.displayResults = function (results) {
184 if (results.length > 0) {
185 this.$searchResults.classList.remove('no-results');
186
187 var html = '<ul>';
188
189 results.forEach(function (result) {
190 var entry = result.entry;
191 var id = entry.id;
192 var cssClass = '';
193 var text = '';
194
195 if (entry.type === 'clause') {
196 var number = entry.number ? entry.number + ' ' : '';
197 text = number + entry.key;
198 cssClass = 'clause';
199 id = entry.id;
200 } else if (entry.type === 'production') {
201 text = entry.key;
202 cssClass = 'prod';
203 id = entry.id;
204 } else if (entry.type === 'op') {
205 text = entry.key;
206 cssClass = 'op';
207 id = entry.id || entry.refId;
208 } else if (entry.type === 'term') {
209 text = entry.key;
210 cssClass = 'term';
211 id = entry.id || entry.refId;
212 }
213
214 if (text) {
215 html += '<li class=menu-search-result-' + cssClass + '><a href="#' + id + '">' + text + '</a></li>'
216 }
217 });
218
219 html += '</ul>'
220
221 this.$searchResults.innerHTML = html;
222 } else {
223 this.$searchResults.innerHTML = '';
224 this.$searchResults.classList.add('no-results');
225 }
226}
227
228
229function Menu() {
230 this.$toggle = document.getElementById('menu-toggle');
231 this.$menu = document.getElementById('menu');
232 this.$toc = document.querySelector('menu-toc > ol');
233 this.$pins = document.querySelector('#menu-pins');
234 this.$pinList = document.getElementById('menu-pins-list');
235 this.$toc = document.querySelector('#menu-toc > ol');
236 this.$specContainer = document.getElementById('spec-container');
237 this.search = new Search(this);
238
239 this._pinnedIds = {};
240 this.loadPinEntries();
241
242 // toggle menu
243 this.$toggle.addEventListener('click', this.toggle.bind(this));
244
245 // keydown events for pinned clauses
246 document.addEventListener('keydown', this.documentKeydown.bind(this));
247
248 // toc expansion
249 var tocItems = this.$menu.querySelectorAll('#menu-toc li');
250 for (var i = 0; i < tocItems.length; i++) {
251 var $item = tocItems[i];
252 $item.addEventListener('click', function($item, event) {
253 $item.classList.toggle('active');
254 event.stopPropagation();
255 }.bind(null, $item));
256 }
257
258 // close toc on toc item selection
259 var tocLinks = this.$menu.querySelectorAll('#menu-toc li > a');
260 for (var i = 0; i < tocLinks.length; i++) {
261 var $link = tocLinks[i];
262 $link.addEventListener('click', function(event) {
263 this.toggle();
264 event.stopPropagation();
265 }.bind(this));
266 }
267
268 // update active clause on scroll
269 window.addEventListener('scroll', debounce(this.updateActiveClause.bind(this)));
270 this.updateActiveClause();
271
272 // prevent menu scrolling from scrolling the body
273 this.$toc.addEventListener('wheel', function (e) {
274 var target = e.currentTarget;
275 var offTop = e.deltaY < 0 && target.scrollTop === 0;
276 if (offTop) {
277 e.preventDefault();
278 }
279 var offBottom = e.deltaY > 0
280 && target.offsetHeight + target.scrollTop >= target.scrollHeight;
281
282 if (offBottom) {
283 e.preventDefault();
284 }
285 })
286}
287
288Menu.prototype.documentKeydown = function (e) {
289 e.stopPropagation();
290 if (e.keyCode === 80) {
291 this.togglePinEntry();
292 } else if (e.keyCode > 48 && e.keyCode < 58) {
293 this.selectPin(e.keyCode - 49);
294 }
295}
296
297Menu.prototype.updateActiveClause = function () {
298 this.setActiveClause(findActiveClause(this.$specContainer))
299}
300
301Menu.prototype.setActiveClause = function (clause) {
302 this.$activeClause = clause;
303 this.revealInToc(this.$activeClause);
304}
305
306Menu.prototype.revealInToc = function (path) {
307 var current = this.$toc.querySelectorAll('li.revealed');
308 for (var i = 0; i < current.length; i++) {
309 current[i].classList.remove('revealed');
310 current[i].classList.remove('revealed-leaf');
311 }
312
313 var current = this.$toc;
314 var index = 0;
315 while (index < path.length) {
316 var children = current.children;
317 for (var i = 0; i < children.length; i++) {
318 if ('#' + path[index].id === children[i].children[1].getAttribute('href') ) {
319 children[i].classList.add('revealed');
320 if (index === path.length - 1) {
321 children[i].classList.add('revealed-leaf');
322 var rect = children[i].getBoundingClientRect();
323 this.$toc.getBoundingClientRect().top
324 var tocRect = this.$toc.getBoundingClientRect();
325 if (rect.top + 10 > tocRect.bottom) {
326 this.$toc.scrollTop = this.$toc.scrollTop + (rect.top - tocRect.bottom) + (rect.bottom - rect.top);
327 } else if (rect.top < tocRect.top) {
328 this.$toc.scrollTop = this.$toc.scrollTop - (tocRect.top - rect.top);
329 }
330 }
331 current = children[i].querySelector('ol');
332 index++;
333 break;
334 }
335 }
336
337 }
338}
339
340function findActiveClause(root, path) {
341 var clauses = new ClauseWalker(root);
342 var $clause;
343 var found = false;
344 var path = path || [];
345
346 while ($clause = clauses.nextNode()) {
347 var rect = $clause.getBoundingClientRect();
348 var $header = $clause.children[0];
349 var marginTop = parseInt(getComputedStyle($header)["margin-top"]);
350
351 if ((rect.top - marginTop) <= 0 && rect.bottom > 0) {
352 found = true;
353 return findActiveClause($clause, path.concat($clause)) || path;
354 }
355 }
356
357 return path;
358}
359
360function ClauseWalker(root) {
361 var previous;
362 var treeWalker = document.createTreeWalker(
363 root,
364 NodeFilter.SHOW_ELEMENT,
365 {
366 acceptNode: function (node) {
367 if (previous === node.parentNode) {
368 return NodeFilter.FILTER_REJECT;
369 } else {
370 previous = node;
371 }
372 if (node.nodeName === 'EMU-CLAUSE' || node.nodeName === 'EMU-INTRO' || node.nodeName === 'EMU-ANNEX') {
373 return NodeFilter.FILTER_ACCEPT;
374 } else {
375 return NodeFilter.FILTER_SKIP;
376 }
377 }
378 },
379 false
380 );
381
382 return treeWalker;
383}
384
385Menu.prototype.toggle = function () {
386 this.$menu.classList.toggle('active');
387}
388
389Menu.prototype.show = function () {
390 this.$menu.classList.add('active');
391}
392
393Menu.prototype.hide = function () {
394 this.$menu.classList.remove('active');
395}
396
397Menu.prototype.isVisible = function() {
398 return this.$menu.classList.contains('active');
399}
400
401Menu.prototype.showPins = function () {
402 this.$pins.classList.add('active');
403}
404
405Menu.prototype.hidePins = function () {
406 this.$pins.classList.remove('active');
407}
408
409Menu.prototype.addPinEntry = function (id) {
410 var entry = this.search.biblio.byId[id];
411 if (!entry) {
412 // id was deleted after pin (or something) so remove it
413 delete this._pinnedIds[id];
414 this.persistPinEntries();
415 return;
416 }
417
418 if (entry.type === 'clause') {
419 var prefix;
420 if (entry.number) {
421 prefix = entry.number + ' ';
422 } else {
423 prefix = '';
424 }
425 this.$pinList.innerHTML += '<li><a href="#' + entry.id + '">' + prefix + entry.titleHTML + '</a></li>';
426 } else {
427 this.$pinList.innerHTML += '<li><a href="#' + entry.id + '">' + entry.key + '</a></li>';
428 }
429
430 if (Object.keys(this._pinnedIds).length === 0) {
431 this.showPins();
432 }
433 this._pinnedIds[id] = true;
434 this.persistPinEntries();
435}
436
437Menu.prototype.removePinEntry = function (id) {
438 var item = this.$pinList.querySelector('a[href="#' + id + '"]').parentNode;
439 this.$pinList.removeChild(item);
440 delete this._pinnedIds[id];
441 if (Object.keys(this._pinnedIds).length === 0) {
442 this.hidePins();
443 }
444
445 this.persistPinEntries();
446}
447
448Menu.prototype.persistPinEntries = function () {
449 try {
450 if (!window.localStorage) return;
451 } catch (e) {
452 return;
453 }
454
455 localStorage.pinEntries = JSON.stringify(Object.keys(this._pinnedIds));
456}
457
458Menu.prototype.loadPinEntries = function () {
459 try {
460 if (!window.localStorage) return;
461 } catch (e) {
462 return;
463 }
464
465 var pinsString = window.localStorage.pinEntries;
466 if (!pinsString) return;
467 var pins = JSON.parse(pinsString);
468 for(var i = 0; i < pins.length; i++) {
469 this.addPinEntry(pins[i]);
470 }
471}
472
473Menu.prototype.togglePinEntry = function (id) {
474 if (!id) {
475 id = this.$activeClause[this.$activeClause.length - 1].id;
476 }
477
478 if (this._pinnedIds[id]) {
479 this.removePinEntry(id);
480 } else {
481 this.addPinEntry(id);
482 }
483}
484
485Menu.prototype.selectPin = function (num) {
486 document.location = this.$pinList.children[num].children[0].href;
487}
488
489var menu;
490function init() {
491 menu = new Menu();
492 var $container = document.getElementById('spec-container');
493 $container.addEventListener('mouseover', debounce(function (e) {
494 Toolbox.activateIfMouseOver(e);
495 }));
496}
497
498document.addEventListener('DOMContentLoaded', init);
499
500function debounce(fn, opts) {
501 opts = opts || {};
502 var timeout;
503 return function(e) {
504 if (opts.stopPropagation) {
505 e.stopPropagation();
506 }
507 var args = arguments;
508 if (timeout) {
509 clearTimeout(timeout);
510 }
511 timeout = setTimeout(function() {
512 timeout = null;
513 fn.apply(this, args);
514 }.bind(this), 150);
515 }
516}
517
518var CLAUSE_NODES = ['EMU-CLAUSE', 'EMU-INTRO', 'EMU-ANNEX'];
519function findLocalReferences ($elem) {
520 var name = $elem.innerHTML;
521 var references = [];
522
523 var parentClause = $elem.parentNode;
524 while (parentClause && CLAUSE_NODES.indexOf(parentClause.nodeName) === -1) {
525 parentClause = parentClause.parentNode;
526 }
527
528 if(!parentClause) return;
529
530 var vars = parentClause.querySelectorAll('var');
531
532 for (var i = 0; i < vars.length; i++) {
533 var $var = vars[i];
534
535 if ($var.innerHTML === name) {
536 references.push($var);
537 }
538 }
539
540 return references;
541}
542
543function toggleFindLocalReferences($elem) {
544 var references = findLocalReferences($elem);
545 if ($elem.classList.contains('referenced')) {
546 references.forEach(function ($reference) {
547 $reference.classList.remove('referenced');
548 });
549 } else {
550 references.forEach(function ($reference) {
551 $reference.classList.add('referenced');
552 });
553 }
554}
555
556function installFindLocalReferences () {
557 document.addEventListener('click', function (e) {
558 if (e.target.nodeName === 'VAR') {
559 toggleFindLocalReferences(e.target);
560 }
561 });
562}
563
564document.addEventListener('DOMContentLoaded', installFindLocalReferences);
565
566
567
568
569// The following license applies to the fuzzysearch function
570// The MIT License (MIT)
571// Copyright © 2015 Nicolas Bevacqua
572// Copyright © 2016 Brian Terlson
573// Permission is hereby granted, free of charge, to any person obtaining a copy of
574// this software and associated documentation files (the "Software"), to deal in
575// the Software without restriction, including without limitation the rights to
576// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
577// the Software, and to permit persons to whom the Software is furnished to do so,
578// subject to the following conditions:
579
580// The above copyright notice and this permission notice shall be included in all
581// copies or substantial portions of the Software.
582
583// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
584// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
585// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
586// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
587// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
588// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
589function fuzzysearch (searchString, haystack, caseInsensitive) {
590 var tlen = haystack.length;
591 var qlen = searchString.length;
592 var chunks = 1;
593 var finding = false;
594 var prefix = true;
595
596 if (qlen > tlen) {
597 return false;
598 }
599
600 if (qlen === tlen) {
601 if (searchString === haystack) {
602 return { caseMatch: true, chunks: 1, prefix: true };
603 } else if (searchString.toLowerCase() === haystack.toLowerCase()) {
604 return { caseMatch: false, chunks: 1, prefix: true };
605 } else {
606 return false;
607 }
608 }
609
610 outer: for (var i = 0, j = 0; i < qlen; i++) {
611 var nch = searchString[i];
612 while (j < tlen) {
613 var targetChar = haystack[j++];
614 if (targetChar === nch) {
615 finding = true;
616 continue outer;
617 }
618 if (finding) {
619 chunks++;
620 finding = false;
621 }
622 }
623
624 if (caseInsensitive) { return false }
625
626 return fuzzysearch(searchString.toLowerCase(), haystack.toLowerCase(), true);
627 }
628
629 return { caseMatch: !caseInsensitive, chunks: chunks, prefix: j <= qlen };
630}
631
632var Toolbox = {
633 init: function () {
634 this.$container = document.createElement('div');
635 this.$container.classList.add('toolbox');
636 this.$permalink = document.createElement('a');
637 this.$permalink.textContent = 'Permalink';
638 this.$pinLink = document.createElement('a');
639 this.$pinLink.textContent = 'Pin';
640 this.$pinLink.setAttribute('href', '#');
641 this.$pinLink.addEventListener('click', function (e) {
642 e.preventDefault();
643 e.stopPropagation();
644 menu.togglePinEntry(this.entry.id);
645 }.bind(this));
646
647 this.$refsLink = document.createElement('a');
648 this.$refsLink.setAttribute('href', '#');
649 this.$refsLink.addEventListener('click', function (e) {
650 e.preventDefault();
651 e.stopPropagation();
652 referencePane.showReferencesFor(this.entry);
653 }.bind(this));
654 this.$container.appendChild(this.$permalink);
655 this.$container.appendChild(this.$pinLink);
656 this.$container.appendChild(this.$refsLink);
657 document.body.appendChild(this.$container);
658 },
659
660 activate: function (el, entry, target) {
661 if (el === this._activeEl) return;
662 this.active = true;
663 this.entry = entry;
664 this.$container.classList.add('active');
665 this.top = el.offsetTop - this.$container.offsetHeight - 10;
666 this.left = el.offsetLeft;
667 this.$container.setAttribute('style', 'left: ' + this.left + 'px; top: ' + this.top + 'px');
668 this.updatePermalink();
669 this.updateReferences();
670 this._activeEl = el;
671 if (this.top < document.body.scrollTop && el === target) {
672 // don't scroll unless it's a small thing (< 200px)
673 this.$container.scrollIntoView();
674 }
675 },
676
677 updatePermalink: function () {
678 this.$permalink.setAttribute('href', '#' + this.entry.id);
679 },
680
681 updateReferences: function () {
682 this.$refsLink.textContent = 'References (' + this.entry.referencingIds.length + ')';
683 },
684
685 activateIfMouseOver: function (e) {
686 var ref = this.findReferenceUnder(e.target);
687 if (ref && (!this.active || e.pageY > this._activeEl.offsetTop)) {
688 var entry = menu.search.biblio.byId[ref.id];
689 this.activate(ref.element, entry, e.target);
690 } else if (this.active && ((e.pageY < this.top) || e.pageY > (this._activeEl.offsetTop + this._activeEl.offsetHeight))) {
691 this.deactivate();
692 }
693 },
694
695 findReferenceUnder: function (el) {
696 while (el) {
697 var parent = el.parentNode;
698 if (el.nodeName === 'H1' && parent.nodeName.match(/EMU-CLAUSE|EMU-ANNEX|EMU-INTRO/) && parent.id) {
699 return { element: el, id: parent.id };
700 } else if (el.nodeName.match(/EMU-(?!CLAUSE|XREF|ANNEX|INTRO)|DFN/) &&
701 el.id && el.id[0] !== '_') {
702 if (el.nodeName === 'EMU-FIGURE' || el.nodeName === 'EMU-TABLE' || el.nodeName === 'EMU-EXAMPLE') {
703 // return the figcaption element
704 return { element: el.children[0].children[0], id: el.id };
705 } else if (el.nodeName === 'EMU-PRODUCTION') {
706 // return the LHS non-terminal element
707 return { element: el.children[0], id: el.id };
708 } else {
709 return { element: el, id: el.id };
710 }
711 }
712 el = parent;
713 }
714 },
715
716 deactivate: function () {
717 this.$container.classList.remove('active');
718 this._activeEl = null;
719 this.activeElBounds = null;
720 this.active = false;
721 }
722}
723
724var referencePane = {
725 init: function() {
726 this.$container = document.createElement('div');
727 this.$container.setAttribute('id', 'references-pane-container');
728
729 var $spacer = document.createElement('div');
730 $spacer.setAttribute('id', 'references-pane-spacer');
731
732 this.$pane = document.createElement('div');
733 this.$pane.setAttribute('id', 'references-pane');
734
735 this.$container.appendChild($spacer);
736 this.$container.appendChild(this.$pane);
737
738 this.$header = document.createElement('div');
739 this.$header.classList.add('menu-pane-header');
740 this.$header.textContent = 'References to ';
741 this.$headerRefId = document.createElement('a');
742 this.$header.appendChild(this.$headerRefId);
743 this.$closeButton = document.createElement('span');
744 this.$closeButton.setAttribute('id', 'references-pane-close');
745 this.$closeButton.addEventListener('click', function (e) {
746 this.deactivate();
747 }.bind(this));
748 this.$header.appendChild(this.$closeButton);
749
750 this.$pane.appendChild(this.$header);
751 var tableContainer = document.createElement('div');
752 tableContainer.setAttribute('id', 'references-pane-table-container');
753
754 this.$table = document.createElement('table');
755 this.$table.setAttribute('id', 'references-pane-table');
756
757 this.$tableBody = this.$table.createTBody();
758
759 tableContainer.appendChild(this.$table);
760 this.$pane.appendChild(tableContainer);
761
762 menu.$specContainer.appendChild(this.$container);
763 },
764
765 activate: function () {
766 this.$container.classList.add('active');
767 },
768
769 deactivate: function () {
770 this.$container.classList.remove('active');
771 },
772
773 showReferencesFor(entry) {
774 this.activate();
775 var newBody = document.createElement('tbody');
776 var previousId;
777 var previousCell;
778 var dupCount = 0;
779 this.$headerRefId.textContent = '#' + entry.id;
780 this.$headerRefId.setAttribute('href', '#' + entry.id);
781 entry.referencingIds.map(function (id) {
782 var target = document.getElementById(id);
783 var cid = findParentClauseId(target);
784 var clause = menu.search.biblio.byId[cid];
785 var dupCount = 0;
786 return { id: id, clause: clause }
787 }).sort(function (a, b) {
788 return sortByClauseNumber(a.clause, b.clause);
789 }).forEach(function (record, i) {
790 if (previousId === record.clause.id) {
791 previousCell.innerHTML += ' (<a href="#' + record.id + '">' + (dupCount + 2) + '</a>)';
792 dupCount++;
793 } else {
794 var row = newBody.insertRow();
795 var cell = row.insertCell();
796 cell.innerHTML = record.clause.number;
797 cell = row.insertCell();
798 cell.innerHTML = '<a href="#' + record.id + '">' + record.clause.titleHTML + '</a>';
799 previousCell = cell;
800 previousId = record.clause.id;
801 dupCount = 0;
802 }
803 }, this);
804 this.$table.removeChild(this.$tableBody);
805 this.$tableBody = newBody;
806 this.$table.appendChild(this.$tableBody);
807 }
808}
809function findParentClauseId(node) {
810 while (node && node.nodeName !== 'EMU-CLAUSE' && node.nodeName !== 'EMU-INTRO' && node.nodeName !== 'EMU-ANNEX') {
811 node = node.parentNode;
812 }
813 if (!node) return null;
814 return node.getAttribute('id');
815}
816
817function sortByClauseNumber(c1, c2) {
818 var c1c = c1.number.split('.');
819 var c2c = c2.number.split('.');
820
821 for (var i = 0; i < c1c.length; i++) {
822 if (i >= c2c.length) {
823 return 1;
824 }
825
826 var c1 = c1c[i];
827 var c2 = c2c[i];
828 var c1cn = Number(c1);
829 var c2cn = Number(c2);
830
831 if (Number.isNaN(c1cn) && Number.isNaN(c2cn)) {
832 if (c1 > c2) {
833 return 1;
834 } else if (c1 < c2) {
835 return -1;
836 }
837 } else if (!Number.isNaN(c1cn) && Number.isNaN(c2cn)) {
838 return -1;
839 } else if (Number.isNaN(c1cn) && !Number.isNaN(c2cn)) {
840 return 1;
841 } else if(c1cn > c2cn) {
842 return 1;
843 } else if (c1cn < c2cn) {
844 return -1;
845 }
846 }
847
848 if (c1c.length === c2c.length) {
849 return 0;
850 }
851 return -1;
852}
853
854document.addEventListener('DOMContentLoaded', function () {
855 Toolbox.init();
856 referencePane.init();
857})
858var CLAUSE_NODES = ['EMU-CLAUSE', 'EMU-INTRO', 'EMU-ANNEX'];
859function findLocalReferences ($elem) {
860 var name = $elem.innerHTML;
861 var references = [];
862
863 var parentClause = $elem.parentNode;
864 while (parentClause && CLAUSE_NODES.indexOf(parentClause.nodeName) === -1) {
865 parentClause = parentClause.parentNode;
866 }
867
868 if(!parentClause) return;
869
870 var vars = parentClause.querySelectorAll('var');
871
872 for (var i = 0; i < vars.length; i++) {
873 var $var = vars[i];
874
875 if ($var.innerHTML === name) {
876 references.push($var);
877 }
878 }
879
880 return references;
881}
882
883function toggleFindLocalReferences($elem) {
884 var references = findLocalReferences($elem);
885 if ($elem.classList.contains('referenced')) {
886 references.forEach(function ($reference) {
887 $reference.classList.remove('referenced');
888 });
889 } else {
890 references.forEach(function ($reference) {
891 $reference.classList.add('referenced');
892 });
893 }
894}
895
896function installFindLocalReferences () {
897 document.addEventListener('click', function (e) {
898 if (e.target.nodeName === 'VAR') {
899 toggleFindLocalReferences(e.target);
900 }
901 });
902}
903
904document.addEventListener('DOMContentLoaded', installFindLocalReferences);
905</script><style>body {
906 display: flex;
907 font-size: 18px;
908 line-height: 1.5;
909 font-family: Cambria, Palatino Linotype, Palatino, Liberation Serif, serif;
910 padding: 0;
911 margin: 0;
912 color: #111;
913}
914
915#spec-container {
916 padding: 0 20px;
917 flex-grow: 1;
918 flex-basis: 66%;
919 box-sizing: border-box;
920 overflow: hidden;
921}
922
923body.oldtoc {
924 margin: 0 auto;
925}
926
927a {
928 text-decoration: none;
929 color: #206ca7;
930}
931
932a:visited {
933 color: #206ca7;
934}
935
936a:hover {
937 text-decoration: underline;
938 color: #239dee;
939}
940
941
942code {
943 font-weight: bold;
944 font-family: Consolas, Monaco, monospace;
945 white-space: pre;
946}
947
948pre code {
949 font-weight: inherit;
950}
951
952pre code.hljs {
953 background-color: #fff;
954 margin: 0;
955 padding: 0;
956}
957
958ol.toc {
959 list-style: none;
960 padding-left: 0;
961}
962
963ol.toc ol.toc {
964 padding-left: 2ex;
965 list-style: none;
966}
967
968var {
969 color: #2aa198;
970 transition: background-color 0.25s ease;
971 cursor: pointer;
972}
973
974var.referenced {
975 background-color: #ffff33;
976}
977
978emu-const {
979 font-family: sans-serif;
980}
981
982emu-val {
983 font-weight: bold;
984}
985emu-alg ol, emu-alg ol ol ol ol {
986 list-style-type: decimal;
987}
988
989emu-alg ol ol, emu-alg ol ol ol ol ol {
990 list-style-type: lower-alpha;
991}
992
993emu-alg ol ol ol, ol ol ol ol ol ol {
994 list-style-type: lower-roman;
995}
996
997emu-eqn {
998 display: block;
999 margin-left: 4em;
1000}
1001
1002emu-eqn.inline {
1003 display: inline;
1004 margin: 0;
1005}
1006
1007emu-eqn div:first-child {
1008 margin-left: -2em;
1009}
1010
1011emu-note {
1012 margin: 1em 0;
1013 color: #666;
1014 border-left: 5px solid #ccc;
1015 display: flex;
1016 flex-direction: row;
1017}
1018
1019emu-note > span.note {
1020 flex-basis: 100px;
1021 min-width: 100px;
1022 flex-grow: 0;
1023 flex-shrink: 1;
1024 text-transform: uppercase;
1025 padding-left: 5px;
1026}
1027
1028emu-note[type=editor] {
1029 border-left-color: #faa;
1030}
1031
1032emu-note > div.note-contents {
1033 flex-grow: 1;
1034 flex-shrink: 1;
1035}
1036
1037emu-note > div.note-contents > p:first-of-type {
1038 margin-top: 0;
1039}
1040
1041emu-note > div.note-contents > p:last-of-type {
1042 margin-bottom: 0;
1043}
1044
1045emu-figure {
1046 display: block;
1047}
1048
1049emu-example {
1050 display: block;
1051 margin: 1em 3em;
1052}
1053
1054emu-example figure figcaption {
1055 margin-top: 0.5em;
1056 text-align: left;
1057}
1058
1059emu-figure figure,
1060emu-example figure,
1061emu-table figure {
1062 display: flex;
1063 flex-direction: column;
1064 align-items: center;
1065}
1066
1067emu-production {
1068 display: block;
1069 margin-top: 1em;
1070 margin-bottom: 1em;
1071 margin-left: 5ex;
1072}
1073
1074emu-grammar.inline, emu-production.inline,
1075emu-grammar.inline emu-production emu-rhs, emu-production.inline emu-rhs,
1076emu-grammar[collapsed] emu-production emu-rhs, emu-production[collapsed] emu-rhs {
1077 display: inline;
1078 padding-left: 1ex;
1079 margin-left: 0;
1080}
1081
1082emu-grammar[collapsed] emu-production, emu-production[collapsed] {
1083 margin: 0;
1084}
1085
1086emu-constraints {
1087 font-size: .75em;
1088 margin-right: 1ex;
1089}
1090
1091emu-gann {
1092 margin-right: 1ex;
1093}
1094
1095emu-gann emu-t:last-child,
1096emu-gann emu-nt:last-child {
1097 margin-right: 0;
1098}
1099
1100emu-geq {
1101 margin-left: 1ex;
1102 font-weight: bold;
1103}
1104
1105emu-oneof {
1106 font-weight: bold;
1107 margin-left: 1ex;
1108}
1109
1110emu-nt {
1111 display: inline-block;
1112 font-style: italic;
1113 white-space: nowrap;
1114 text-indent: 0;
1115}
1116
1117emu-nt a, emu-nt a:visited {
1118 color: #333;
1119}
1120
1121emu-rhs emu-nt {
1122 margin-right: 1ex;
1123}
1124
1125emu-t {
1126 display: inline-block;
1127 font-family: monospace;
1128 font-weight: bold;
1129 white-space: nowrap;
1130 text-indent: 0;
1131}
1132
1133emu-production emu-t {
1134 margin-right: 1ex;
1135}
1136
1137emu-rhs {
1138 display: block;
1139 padding-left: 75px;
1140 text-indent: -25px;
1141}
1142
1143emu-mods {
1144 font-size: .85em;
1145 vertical-align: sub;
1146 font-style: normal;
1147 font-weight: normal;
1148}
1149
1150emu-production[collapsed] emu-mods {
1151 display: none;
1152}
1153
1154emu-params, emu-opt {
1155 margin-right: 1ex;
1156 font-family: monospace;
1157}
1158
1159emu-params, emu-constraints {
1160 color: #2aa198;
1161}
1162
1163emu-opt {
1164 color: #b58900;
1165}
1166
1167emu-gprose {
1168 font-size: 0.9em;
1169 font-family: Helvetica, Arial, sans-serif;
1170}
1171
1172h1.shortname {
1173 color: #f60;
1174 font-size: 1.5em;
1175 margin: 0;
1176}
1177
1178h1.version {
1179 color: #f60;
1180 font-size: 1.5em;
1181 margin: 0;
1182}
1183
1184h1.title {
1185 margin-top: 0;
1186 color: #f60;
1187}
1188
1189h1.first {
1190 margin-top: 0;
1191}
1192
1193h1, h2, h3, h4, h5, h6 {
1194 position: relative;
1195}
1196
1197h1 .secnum {
1198 text-decoration: none;
1199 margin-right: 10px;
1200}
1201
1202h1 span.title {
1203 order: 2;
1204}
1205
1206
1207h1 { font-size: 2.67em; margin-top: 2em; margin-bottom: 0; line-height: 1em;}
1208h2 { font-size: 2em; }
1209h3 { font-size: 1.56em; }
1210h4 { font-size: 1.25em; }
1211h5 { font-size: 1.11em; }
1212h6 { font-size: 1em; }
1213
1214h1:hover span.utils {
1215 display: block;
1216}
1217
1218span.utils {
1219 font-size: 18px;
1220 line-height: 18px;
1221 display: none;
1222 position: absolute;
1223 top: 100%;
1224 left: 0;
1225 right: 0;
1226 font-weight: normal;
1227}
1228
1229span.utils:before {
1230 content: "⤷";
1231 display: inline-block;
1232 padding: 0 5px;
1233}
1234
1235span.utils > * {
1236 display: inline-block;
1237 margin-right: 20px;
1238}
1239
1240h1 span.utils span.anchor a,
1241h2 span.utils span.anchor a,
1242h3 span.utils span.anchor a,
1243h4 span.utils span.anchor a,
1244h5 span.utils span.anchor a,
1245h6 span.utils span.anchor a {
1246 text-decoration: none;
1247 font-variant: small-caps;
1248}
1249
1250h1 span.utils span.anchor a:hover,
1251h2 span.utils span.anchor a:hover,
1252h3 span.utils span.anchor a:hover,
1253h4 span.utils span.anchor a:hover,
1254h5 span.utils span.anchor a:hover,
1255h6 span.utils span.anchor a:hover {
1256 color: #333;
1257}
1258
1259emu-intro h1, emu-clause h1, emu-annex h1 { font-size: 2em; }
1260emu-intro h2, emu-clause h2, emu-annex h2 { font-size: 1.56em; }
1261emu-intro h3, emu-clause h3, emu-annex h3 { font-size: 1.25em; }
1262emu-intro h4, emu-clause h4, emu-annex h4 { font-size: 1.11em; }
1263emu-intro h5, emu-clause h5, emu-annex h5 { font-size: 1em; }
1264emu-intro h6, emu-clause h6, emu-annex h6 { font-size: 0.9em; }
1265emu-intro emu-intro h1, emu-clause emu-clause h1, emu-annex emu-annex h1 { font-size: 1.56em; }
1266emu-intro emu-intro h2, emu-clause emu-clause h2, emu-annex emu-annex h2 { font-size: 1.25em; }
1267emu-intro emu-intro h3, emu-clause emu-clause h3, emu-annex emu-annex h3 { font-size: 1.11em; }
1268emu-intro emu-intro h4, emu-clause emu-clause h4, emu-annex emu-annex h4 { font-size: 1em; }
1269emu-intro emu-intro h5, emu-clause emu-clause h5, emu-annex emu-annex h5 { font-size: 0.9em; }
1270emu-intro emu-intro emu-intro h1, emu-clause emu-clause emu-clause h1, emu-annex emu-annex emu-annex h1 { font-size: 1.25em; }
1271emu-intro emu-intro emu-intro h2, emu-clause emu-clause emu-clause h2, emu-annex emu-annex emu-annex h2 { font-size: 1.11em; }
1272emu-intro emu-intro emu-intro h3, emu-clause emu-clause emu-clause h3, emu-annex emu-annex emu-annex h3 { font-size: 1em; }
1273emu-intro emu-intro emu-intro h4, emu-clause emu-clause emu-clause h4, emu-annex emu-annex emu-annex h4 { font-size: 0.9em; }
1274emu-intro emu-intro emu-intro emu-intro h1, emu-clause emu-clause emu-clause emu-clause h1, emu-annex emu-annex emu-annex emu-annex h1 { font-size: 1.11em; }
1275emu-intro emu-intro emu-intro emu-intro h2, emu-clause emu-clause emu-clause emu-clause h2, emu-annex emu-annex emu-annex emu-annex h2 { font-size: 1em; }
1276emu-intro emu-intro emu-intro emu-intro h3, emu-clause emu-clause emu-clause emu-clause h3, emu-annex emu-annex emu-annex emu-annex h3 { font-size: 0.9em; }
1277emu-intro emu-intro emu-intro emu-intro emu-intro h1, emu-clause emu-clause emu-clause emu-clause emu-clause h1, emu-annex emu-annex emu-annex emu-annex emu-annex h1 { font-size: 1em; }
1278emu-intro emu-intro emu-intro emu-intro emu-intro h2, emu-clause emu-clause emu-clause emu-clause emu-clause h2, emu-annex emu-annex emu-annex emu-annex emu-annex h2 { font-size: 0.9em; }
1279emu-intro emu-intro emu-intro emu-intro emu-intro emu-intro h1, emu-clause emu-clause emu-clause emu-clause emu-clause emu-clause h1, emu-annex emu-annex emu-annex emu-annex emu-annex emu-annex h1 { font-size: 0.9em }
1280
1281emu-clause, emu-intro, emu-annex {
1282 display: block;
1283}
1284
1285/* Figures and tables */
1286figure { display: block; margin: 1em 0 3em 0; }
1287figure object { display: block; margin: 0 auto; }
1288figure table.real-table { margin: 0 auto; }
1289figure figcaption {
1290 display: block;
1291 color: #555555;
1292 font-weight: bold;
1293 text-align: center;
1294}
1295
1296emu-table table {
1297 margin: 0 auto;
1298}
1299
1300emu-table table, table.real-table {
1301 border-collapse: collapse;
1302}
1303
1304emu-table td, emu-table th, table.real-table td, table.real-table th {
1305 border: 1px solid black;
1306 padding: 0.4em;
1307 vertical-align: baseline;
1308}
1309emu-table th, emu-table thead td, table.real-table th {
1310 background-color: #eeeeee;
1311}
1312
1313/* Note: the left content edges of table.lightweight-table >tbody >tr >td
1314 and div.display line up. */
1315table.lightweight-table {
1316 border-collapse: collapse;
1317 margin: 0 0 0 1.5em;
1318}
1319table.lightweight-table td, table.lightweight-table th {
1320 border: none;
1321 padding: 0 0.5em;
1322 vertical-align: baseline;
1323}
1324
1325/* diff styles */
1326ins {
1327 background-color: #e0f8e0;
1328 text-decoration: none;
1329 border-bottom: 1px solid #396;
1330}
1331
1332del {
1333 background-color: #fee;
1334}
1335
1336ins.block, del.block,
1337emu-production > ins, emu-production > del,
1338emu-grammar > ins, emu-grammar > del {
1339 display: block;
1340}
1341emu-rhs > ins, emu-rhs > del {
1342 display: inline;
1343}
1344
1345tr.ins > td > ins {
1346 border-bottom: none;
1347}
1348
1349tr.ins > td {
1350 background-color: #e0f8e0;
1351}
1352
1353tr.del > td {
1354 background-color: #fee;
1355}
1356
1357/* Menu Styles */
1358#menu-toggle {
1359 font-size: 2em;
1360
1361 position: fixed;
1362 top: 0;
1363 left: 0;
1364 width: 1.5em;
1365 height: 1.5em;
1366 z-index: 3;
1367 visibility: hidden;
1368 color: #1567a2;
1369 background-color: #fff;
1370
1371 line-height: 1.5em;
1372 text-align: center;
1373 -webkit-touch-callout: none;
1374 -webkit-user-select: none;
1375 -khtml-user-select: none;
1376 -moz-user-select: none;
1377 -ms-user-select: none;
1378 user-select: none;;
1379
1380 cursor: pointer;
1381}
1382
1383#menu {
1384 display: flex;
1385 flex-direction: column;
1386 width: 33%; height: 100vh;
1387 max-width: 500px;
1388 box-sizing: border-box;
1389 background-color: #ddd;
1390 overflow: hidden;
1391 transition: opacity 0.1s linear;
1392 padding: 0 5px;
1393 position: fixed;
1394 left: 0; top: 0;
1395 border-right: 2px solid #bbb;
1396
1397 z-index: 2;
1398}
1399
1400#menu-spacer {
1401 flex-basis: 33%;
1402 max-width: 500px;
1403 flex-grow: 0;
1404 flex-shrink: 0;
1405}
1406
1407#menu a {
1408 color: #1567a2;
1409}
1410
1411#menu.active {
1412 display: flex;
1413 opacity: 1;
1414 z-index: 2;
1415}
1416
1417#menu-pins {
1418 flex-grow: 1;
1419 display: none;
1420}
1421
1422#menu-pins.active {
1423 display: block;
1424}
1425
1426#menu-pins-list {
1427 margin: 0;
1428 padding: 0;
1429 counter-reset: pins-counter;
1430}
1431
1432#menu-pins-list > li:before {
1433 content: counter(pins-counter);
1434 counter-increment: pins-counter;
1435 display: inline-block;
1436 width: 25px;
1437 text-align: center;
1438 border: 1px solid #bbb;
1439 padding: 2px;
1440 margin: 4px;
1441 box-sizing: border-box;
1442 line-height: 1em;
1443 background-color: #ccc;
1444 border-radius: 4px;
1445}
1446#menu-toc > ol {
1447 padding: 0;
1448 flex-grow: 1;
1449}
1450
1451#menu-toc > ol li {
1452 padding: 0;
1453}
1454
1455#menu-toc > ol , #menu-toc > ol ol {
1456 list-style-type: none;
1457 margin: 0;
1458 padding: 0;
1459}
1460
1461#menu-toc > ol ol {
1462 padding-left: 0.75em;
1463}
1464
1465#menu-toc li {
1466 text-overflow: ellipsis;
1467 overflow: hidden;
1468 white-space: nowrap;
1469}
1470
1471#menu-toc .item-toggle {
1472 display: inline-block;
1473 transform: rotate(-45deg) translate(-5px, -5px);
1474 transition: transform 0.1s ease;
1475 text-align: center;
1476 width: 20px;
1477
1478 color: #aab;
1479
1480 -webkit-touch-callout: none;
1481 -webkit-user-select: none;
1482 -khtml-user-select: none;
1483 -moz-user-select: none;
1484 -ms-user-select: none;
1485 user-select: none;;
1486
1487 cursor: pointer;
1488}
1489
1490#menu-toc .item-toggle-none {
1491 display: inline-block;
1492 width: 20px;
1493}
1494
1495#menu-toc li.active > .item-toggle {
1496 transform: rotate(45deg) translate(-5px, -5px);
1497}
1498
1499#menu-toc li > ol {
1500 display: none;
1501}
1502
1503#menu-toc li.active > ol {
1504 display: block;
1505}
1506
1507#menu-toc li.revealed > a {
1508 background-color: #bbb;
1509 font-weight: bold;
1510 /*
1511 background-color: #222;
1512 color: #c6d8e4;
1513 */
1514}
1515
1516#menu-toc li.revealed-leaf> a {
1517 color: #206ca7;
1518 /*
1519 background-color: #222;
1520 color: #c6d8e4;
1521 */
1522}
1523
1524#menu-toc li.revealed > .item-toggle {
1525 transform: rotate(45deg) translate(-5px, -5px);
1526}
1527
1528#menu-toc li.revealed > ol {
1529 display: block;
1530}
1531
1532#menu-toc li > a {
1533 padding: 2px 5px;
1534}
1535
1536#menu > * {
1537 margin-bottom: 5px;
1538}
1539
1540.menu-pane-header {
1541 padding: 0 5px;
1542 text-transform: uppercase;
1543 background-color: #aaa;
1544 color: #335;
1545 font-weight: bold;
1546 letter-spacing: 2px;
1547 flex-grow: 0;
1548 flex-shrink: 0;
1549 font-size: 0.8em;
1550}
1551
1552#menu-toc {
1553 display: flex;
1554 flex-direction: column;
1555 width: 100%;
1556 overflow: hidden;
1557 flex-grow: 1;
1558}
1559
1560#menu-toc ol.toc {
1561 overflow-x: hidden;
1562 overflow-y: auto;
1563}
1564
1565#menu-search {
1566 position: relative;
1567 flex-grow: 0;
1568 flex-shrink: 0;
1569 width: 100%;
1570
1571 display: flex;
1572 flex-direction: column;
1573
1574 max-height: 300px;
1575}
1576
1577#menu-trace-list {
1578 display: none;
1579}
1580
1581#menu-search-box {
1582 box-sizing: border-box;
1583 display: block;
1584 width: 100%;
1585 margin: 5px 0 0 0;
1586 font-size: 1em;
1587 padding: 2px;
1588 background-color: #bbb;
1589 border: 1px solid #999;
1590}
1591
1592#menu-search-results {
1593 overflow-x: hidden;
1594 overflow-y: auto;
1595}
1596
1597li.menu-search-result-clause:before {
1598 content: 'clause';
1599 width: 40px;
1600 display: inline-block;
1601 text-align: right;
1602 padding-right: 1ex;
1603 color: #666;
1604 font-size: 75%;
1605}
1606li.menu-search-result-op:before {
1607 content: 'op';
1608 width: 40px;
1609 display: inline-block;
1610 text-align: right;
1611 padding-right: 1ex;
1612 color: #666;
1613 font-size: 75%;
1614}
1615
1616li.menu-search-result-prod:before {
1617 content: 'prod';
1618 width: 40px;
1619 display: inline-block;
1620 text-align: right;
1621 padding-right: 1ex;
1622 color: #666;
1623 font-size: 75%
1624}
1625
1626
1627li.menu-search-result-term:before {
1628 content: 'term';
1629 width: 40px;
1630 display: inline-block;
1631 text-align: right;
1632 padding-right: 1ex;
1633 color: #666;
1634 font-size: 75%
1635}
1636
1637#menu-search-results ul {
1638 padding: 0 5px;
1639 margin: 0;
1640}
1641
1642#menu-search-results li {
1643 white-space: nowrap;
1644 text-overflow: ellipsis;
1645}
1646
1647
1648#menu-trace-list {
1649 counter-reset: item;
1650 margin: 0 0 0 20px;
1651 padding: 0;
1652}
1653#menu-trace-list li {
1654 display: block;
1655 white-space: nowrap;
1656}
1657
1658#menu-trace-list li .secnum:after {
1659 content: " ";
1660}
1661#menu-trace-list li:before {
1662 content: counter(item) " ";
1663 background-color: #222;
1664 counter-increment: item;
1665 color: #999;
1666 width: 20px;
1667 height: 20px;
1668 line-height: 20px;
1669 display: inline-block;
1670 text-align: center;
1671 margin: 2px 4px 2px 0;
1672}
1673
1674@media (max-width: 1000px) {
1675 body {
1676 margin: 0;
1677 display: block;
1678 }
1679
1680 #menu {
1681 display: none;
1682 padding-top: 3em;
1683 width: 450px;
1684 }
1685
1686 #menu.active {
1687 position: fixed;
1688 height: 100%;
1689 left: 0;
1690 top: 0;
1691 right: 300px;
1692 }
1693
1694 #menu-toggle {
1695 visibility: visible;
1696 }
1697
1698 #spec-container {
1699 padding: 0 5px;
1700 }
1701
1702 #references-pane-spacer {
1703 display: none;
1704 }
1705}
1706
1707@media only screen and (max-width: 800px) {
1708 #menu {
1709 width: 100%;
1710 }
1711
1712 h1 .secnum:empty {
1713 margin: 0; padding: 0;
1714 }
1715}
1716
1717
1718/* Toolbox */
1719.toolbox {
1720 position: absolute;
1721 background: #ddd;
1722 border: 1px solid #aaa;
1723 display: none;
1724 color: #eee;
1725 padding: 5px;
1726 border-radius: 3px;
1727}
1728
1729.toolbox.active {
1730 display: inline-block;
1731}
1732
1733.toolbox a {
1734 text-decoration: none;
1735 padding: 0 5px;
1736}
1737
1738.toolbox a:hover {
1739 text-decoration: underline;
1740}
1741
1742.toolbox:after, .toolbox:before {
1743 top: 100%;
1744 left: 15px;
1745 border: solid transparent;
1746 content: " ";
1747 height: 0;
1748 width: 0;
1749 position: absolute;
1750 pointer-events: none;
1751}
1752
1753.toolbox:after {
1754 border-color: rgba(0, 0, 0, 0);
1755 border-top-color: #ddd;
1756 border-width: 10px;
1757 margin-left: -10px;
1758}
1759.toolbox:before {
1760 border-color: rgba(204, 204, 204, 0);
1761 border-top-color: #aaa;
1762 border-width: 12px;
1763 margin-left: -12px;
1764}
1765
1766#references-pane-container {
1767 position: fixed;
1768 bottom: 0;
1769 left: 0;
1770 right: 0;
1771 height: 250px;
1772 display: none;
1773 background-color: #ddd;
1774 z-index: 1;
1775}
1776
1777#references-pane-table-container {
1778 overflow-x: hidden;
1779 overflow-y: auto;
1780}
1781
1782#references-pane-spacer {
1783 flex-basis: 33%;
1784 max-width: 500px;
1785}
1786
1787#references-pane {
1788 flex-grow: 1;
1789 overflow: hidden;
1790 display: flex;
1791 flex-direction: column;
1792}
1793
1794#references-pane-container.active {
1795 display: flex;
1796}
1797
1798#references-pane-close:after {
1799 content: '✖';
1800 float: right;
1801 cursor: pointer;
1802}
1803
1804#references-pane table tr td:first-child {
1805 text-align: right;
1806 padding-right: 5px;
1807}
1808
1809@media print {
1810 #menu-toggle {
1811 display: none;
1812 }
1813}
1814</style></head><body><div id="menu-toggle">☰</div><div id="menu-spacer"></div><div id="menu"><div id="menu-search"><input type="text" id="menu-search-box" placeholder="Search..."><div id="menu-search-results" class="inactive"></div></div><div id="menu-pins"><div class="menu-pane-header">Pins</div><ul id="menu-pins-list"></ul></div><div class="menu-pane-header">Table of Contents</div><div id="menu-toc"><ol class="toc"><li><span class="item-toggle-none"></span><a href="#introduction" title="Metadata Proposal - ECMAScript">Metadata Proposal - ECMAScript</a></li><li><span class="item-toggle-none"></span><a href="#syntax" title="Syntax"><span class="secnum">1</span> Syntax</a></li><li><span class="item-toggle">◢</span><a href="#abstract-operations" title="Abstract Operations"><span class="secnum">2</span> Abstract Operations</a><ol class="toc"><li><span class="item-toggle">◢</span><a href="#operations-on-objects" title="Operations on Objects"><span class="secnum">2.1</span> Operations on Objects</a><ol class="toc"><li><span class="item-toggle-none"></span><a href="#getorcreatemetadatamap" title="GetOrCreateMetadataMap ( O, P, Create )"><span class="secnum">2.1.1</span> GetOrCreateMetadataMap ( O, P, Create )</a></li></ol></li></ol></li><li><span class="item-toggle">◢</span><a href="#ordinary-and-exotic-objects-behaviors" title="Ordinary and Exotic Objects Behaviors"><span class="secnum">3</span> Ordinary and Exotic Objects Behaviors</a><ol class="toc"><li><span class="item-toggle">◢</span><a href="#ordinary-object-internal-methods-and-internal-slots" title="Ordinary Object Internal Methods and Internal Slots"><span class="secnum">3.1</span> Ordinary Object Internal Methods and Internal Slots</a><ol class="toc"><li><span class="item-toggle">◢</span><a href="#ordinary-object-internal-methods-and-internal-slots-hasmetadata" title="[[HasMetadata]] ( MetadataKey, P )"><span class="secnum">3.1.1</span> [[HasMetadata]] ( MetadataKey, P )</a><ol class="toc"><li><span class="item-toggle-none"></span><a href="#ordinaryhasmetadata" title="OrdinaryHasMetadata ( MetadataKey, O, P )"><span class="secnum">3.1.1.1</span> OrdinaryHasMetadata ( MetadataKey, O, P )</a></li></ol></li><li><span class="item-toggle">◢</span><a href="#ordinary-object-internal-methods-and-internal-slots-hasownmetadata" title="[[HasOwnMetadata]] ( MetadataKey, P )"><span class="secnum">3.1.2</span> [[HasOwnMetadata]] ( MetadataKey, P )</a><ol class="toc"><li><span class="item-toggle-none"></span><a href="#ordinaryhasownmetadata" title="OrdinaryHasOwnMetadata ( MetadataKey, O, P )"><span class="secnum">3.1.2.1</span> OrdinaryHasOwnMetadata ( MetadataKey, O, P )</a></li></ol></li><li><span class="item-toggle">◢</span><a href="#ordinary-object-internal-methods-and-internal-slots-getmetadata" title="[[GetMetadata]] ( MetadataKey, P )"><span class="secnum">3.1.3</span> [[GetMetadata]] ( MetadataKey, P )</a><ol class="toc"><li><span class="item-toggle-none"></span><a href="#ordinarygetmetadata" title="OrdinaryGetMetadata ( MetadataKey, O, P )"><span class="secnum">3.1.3.1</span> OrdinaryGetMetadata ( MetadataKey, O, P )</a></li></ol></li><li><span class="item-toggle">◢</span><a href="#ordinary-object-internal-methods-and-internal-slots-getownmetadata" title="[[GetOwnMetadata]] ( MetadataKey, P, ParamIndex )"><span class="secnum">3.1.4</span> [[GetOwnMetadata]] ( MetadataKey, P, ParamIndex )</a><ol class="toc"><li><span class="item-toggle-none"></span><a href="#ordinarygetownmetadata" title="OrdinaryGetOwnMetadata ( MetadataKey, O, P )"><span class="secnum">3.1.4.1</span> OrdinaryGetOwnMetadata ( MetadataKey, O, P )</a></li></ol></li><li><span class="item-toggle">◢</span><a href="#ordinary-object-internal-methods-and-internal-slots-defineownmetadata" title="[[DefineOwnMetadata]] ( MetadataKey, MetadataValue, P )"><span class="secnum">3.1.5</span> [[DefineOwnMetadata]] ( MetadataKey, MetadataValue, P )</a><ol class="toc"><li><span class="item-toggle-none"></span><a href="#ordinarydefineownmetadata" title="OrdinaryDefineOwnMetadata ( MetadataKey, MetadataValue, O, P )"><span class="secnum">3.1.5.1</span> OrdinaryDefineOwnMetadata ( MetadataKey, MetadataValue, O, P )</a></li></ol></li><li><span class="item-toggle">◢</span><a href="#ordinary-object-internal-methods-and-internal-slots-metadatakeys" title="[[MetadataKeys]] ( P )"><span class="secnum">3.1.6</span> [[MetadataKeys]] ( P )</a><ol class="toc"><li><span class="item-toggle-none"></span><a href="#ordinarymetadatakeys" title="OrdinaryMetadataKeys ( O, P )"><span class="secnum">3.1.6.1</span> OrdinaryMetadataKeys ( O, P )</a></li></ol></li><li><span class="item-toggle">◢</span><a href="#ordinary-object-internal-methods-and-internal-slots-ownmetadatakeys" title="[[OwnMetadataKeys]] ( P )"><span class="secnum">3.1.7</span> [[OwnMetadataKeys]] ( P )</a><ol class="toc"><li><span class="item-toggle-none"></span><a href="#ordinaryownmetadatakeys" title="OrdinaryOwnMetadataKeys ( O, P )"><span class="secnum">3.1.7.1</span> OrdinaryOwnMetadataKeys ( O, P )</a></li></ol></li><li><span class="item-toggle-none"></span><a href="#ordinary-object-internal-methods-and-internal-slots-deletemetadata" title="[[DeleteMetadata]]( MetadataKey, P )"><span class="secnum">3.1.8</span> [[DeleteMetadata]]( MetadataKey, P )</a></li></ol></li></ol></li><li><span class="item-toggle">◢</span><a href="#reflection" title="Reflection"><span class="secnum">4</span> Reflection</a><ol class="toc"><li><span class="item-toggle">◢</span><a href="#reflect" title="The Reflect Object"><span class="secnum">4.1</span> The Reflect Object</a><ol class="toc"><li><span class="item-toggle-none"></span><a href="#reflect-metadatadecoratorfunctions" title="Metadata Decorator Functions"><span class="secnum">4.1.1</span> Metadata Decorator Functions</a></li><li><span class="item-toggle-none"></span><a href="#reflect.metadata" title="Reflect.metadata ( metadataKey, metadataValue )"><span class="secnum">4.1.2</span> Reflect.metadata ( metadataKey, metadataValue )</a></li><li><span class="item-toggle-none"></span><a href="#reflect.definemetadata" title="Reflect.defineMetadata ( metadataKey, metadataValue, target [, propertyKey] )"><span class="secnum">4.1.3</span> Reflect.defineMetadata ( metadataKey, metadataValue, target [, propertyKey] )</a></li><li><span class="item-toggle-none"></span><a href="#reflect.hasmetadata" title="Reflect.hasMetadata ( metadataKey, target [, propertyKey] )"><span class="secnum">4.1.4</span> Reflect.hasMetadata ( metadataKey, target [, propertyKey] )</a></li><li><span class="item-toggle-none"></span><a href="#reflect.hasownmetadata" title="Reflect.hasOwnMetadata ( metadataKey, target [, propertyKey] )"><span class="secnum">4.1.5</span> Reflect.hasOwnMetadata ( metadataKey, target [, propertyKey] )</a></li><li><span class="item-toggle-none"></span><a href="#reflect.getmetadata" title="Reflect.getMetadata ( metadataKey, target [, propertyKey] )"><span class="secnum">4.1.6</span> Reflect.getMetadata ( metadataKey, target [, propertyKey] )</a></li><li><span class="item-toggle-none"></span><a href="#reflect.getownmetadata" title="Reflect.getOwnMetadata ( metadataKey, target [, propertyKey] )"><span class="secnum">4.1.7</span> Reflect.getOwnMetadata ( metadataKey, target [, propertyKey] )</a></li><li><span class="item-toggle-none"></span><a href="#reflect.getmetadatakeys" title="Reflect.getMetadataKeys ( target [, propertyKey] )"><span class="secnum">4.1.8</span> Reflect.getMetadataKeys ( target [, propertyKey] )</a></li><li><span class="item-toggle-none"></span><a href="#reflect.getownmetadatakeys" title="Reflect.getOwnMetadataKeys ( target [, propertyKey] )"><span class="secnum">4.1.9</span> Reflect.getOwnMetadataKeys ( target [, propertyKey] )</a></li><li><span class="item-toggle-none"></span><a href="#reflect.deletemetadata" title="Reflect.deleteMetadata ( metadataKey, target [, propertyKey] )"><span class="secnum">4.1.10</span> Reflect.deleteMetadata ( metadataKey, target [, propertyKey] )</a></li></ol></li></ol></li></ol></div></div><div id="spec-container">
1815
1816<emu-intro id="introduction">
1817 <h1 class="first">Metadata Proposal - ECMAScript</h1>
1818 <emu-note><span class="note">Note</span><div class="note-contents">A shim for this API can be found here: <a href="https://github.com/rbuckton/ReflectDecorators">https://github.com/rbuckton/ReflectDecorators</a></div></emu-note>
1819 <p>Proposal to add Metadata to ECMAScript.</p>
1820</emu-intro>
1821
1822<emu-clause id="syntax">
1823 <h1><span class="secnum">1</span>Syntax</h1>
1824 <emu-note><span class="note">Note</span><div class="note-contents">This section is non-normative.</div></emu-note>
1825 <pre><code class="javascript hljs"><span class="hljs-comment">// define metadata on an object or property</span>
1826<span class="hljs-built_in">Reflect</span>.defineMetadata(metadataKey, metadataValue, target);
1827<span class="hljs-built_in">Reflect</span>.defineMetadata(metadataKey, metadataValue, target, propertyKey);
1828
1829<span class="hljs-comment">// check for presence of a metadata key on the prototype chain of an object or property</span>
1830<span class="hljs-keyword">let</span> result = <span class="hljs-built_in">Reflect</span>.hasMetadata(metadataKey, target);
1831<span class="hljs-keyword">let</span> result = <span class="hljs-built_in">Reflect</span>.hasMetadata(metadataKey, target, propertyKey);
1832
1833<span class="hljs-comment">// check for presence of an own metadata key of an object or property</span>
1834<span class="hljs-keyword">let</span> result = <span class="hljs-built_in">Reflect</span>.hasOwnMetadata(metadataKey, target);
1835<span class="hljs-keyword">let</span> result = <span class="hljs-built_in">Reflect</span>.hasOwnMetadata(metadataKey, target, propertyKey);
1836
1837<span class="hljs-comment">// get metadata value of a metadata key on the prototype chain of an object or property</span>
1838<span class="hljs-keyword">let</span> result = <span class="hljs-built_in">Reflect</span>.getMetadata(metadataKey, target);
1839<span class="hljs-keyword">let</span> result = <span class="hljs-built_in">Reflect</span>.getMetadata(metadataKey, target, propertyKey);
1840
1841<span class="hljs-comment">// get metadata value of an own metadata key of an object or property</span>
1842<span class="hljs-keyword">let</span> result = <span class="hljs-built_in">Reflect</span>.getOwnMetadata(metadataKey, target);
1843<span class="hljs-keyword">let</span> result = <span class="hljs-built_in">Reflect</span>.getOwnMetadata(metadataKey, target, propertyKey);
1844
1845<span class="hljs-comment">// get all metadata keys on the prototype chain of an object or property</span>
1846<span class="hljs-keyword">let</span> result = <span class="hljs-built_in">Reflect</span>.getMetadataKeys(target);
1847<span class="hljs-keyword">let</span> result = <span class="hljs-built_in">Reflect</span>.getMetadataKeys(target, propertyKey);
1848
1849<span class="hljs-comment">// get all own metadata keys of an object or property</span>
1850<span class="hljs-keyword">let</span> result = <span class="hljs-built_in">Reflect</span>.getOwnMetadataKeys(target);
1851<span class="hljs-keyword">let</span> result = <span class="hljs-built_in">Reflect</span>.getOwnMetadataKeys(target, propertyKey);
1852
1853<span class="hljs-comment">// delete metadata from an object or property</span>
1854<span class="hljs-keyword">let</span> result = <span class="hljs-built_in">Reflect</span>.deleteMetadata(metadataKey, target);
1855<span class="hljs-keyword">let</span> result = <span class="hljs-built_in">Reflect</span>.deleteMetadata(metadataKey, target, propertyKey);
1856
1857<span class="hljs-comment">// apply metadata via a decorator to a constructor</span>
1858@<span class="hljs-built_in">Reflect</span>.metadata(metadataKey, metadataValue)
1859<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">C</span> </span>{
1860 <span class="hljs-comment">// apply metadata via a decorator to a method (property)</span>
1861 @<span class="hljs-built_in">Reflect</span>.metadata(metadataKey, metadataValue)
1862 method() {
1863 }
1864}
1865
1866<span class="hljs-comment">// Design-time type annotations</span>
1867<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">Type</span>(<span class="hljs-params">type</span>) </span>{ <span class="hljs-keyword">return</span> <span class="hljs-built_in">Reflect</span>.metadata(<span class="hljs-string">"design:type"</span>, type); }
1868<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">ParamTypes</span>(<span class="hljs-params">...types</span>) </span>{ <span class="hljs-keyword">return</span> <span class="hljs-built_in">Reflect</span>.metadata(<span class="hljs-string">"design:paramtypes"</span>, types); }
1869<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">ReturnType</span>(<span class="hljs-params">type</span>) </span>{ <span class="hljs-keyword">return</span> <span class="hljs-built_in">Reflect</span>.metadata(<span class="hljs-string">"design:returntype"</span>, type); }
1870
1871<span class="hljs-comment">// Decorator application</span>
1872@ParamTypes(<span class="hljs-built_in">String</span>, <span class="hljs-built_in">Number</span>)
1873<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">C</span> </span>{
1874 <span class="hljs-keyword">constructor</span>(text, i) {
1875 }
1876
1877 @Type(<span class="hljs-built_in">String</span>)
1878 get name() { <span class="hljs-keyword">return</span> <span class="hljs-string">"text"</span>; }
1879
1880 @Type(<span class="hljs-built_in">Function</span>)
1881 @ParamTypes(<span class="hljs-built_in">Number</span>, <span class="hljs-built_in">Number</span>)
1882 @ReturnType(<span class="hljs-built_in">Number</span>)
1883 add(x, y) {
1884 <span class="hljs-keyword">return</span> x + y;
1885 }
1886}
1887
1888<span class="hljs-comment">// Metadata introspection</span>
1889<span class="hljs-keyword">let</span> obj = <span class="hljs-keyword">new</span> C(<span class="hljs-string">"a"</span>, <span class="hljs-number">1</span>);
1890<span class="hljs-keyword">let</span> paramTypes = <span class="hljs-built_in">Reflect</span>.getMetadata(<span class="hljs-string">"design:paramtypes"</span>, inst, <span class="hljs-string">"add"</span>); <span class="hljs-comment">// [Number, Number]</span></code></pre>
1891</emu-clause>
1892
1893<emu-clause id="abstract-operations">
1894 <h1><span class="secnum">2</span>Abstract Operations</h1>
1895 <emu-clause id="operations-on-objects">
1896 <h1><span class="secnum">2.1</span>Operations on Objects</h1>
1897 <emu-clause id="getorcreatemetadatamap" aoid="GetOrCreateMetadataMap">
1898 <h1><span class="secnum">2.1.1</span>GetOrCreateMetadataMap ( O, P, Create )</h1>
1899 <p>When the abstract operation GetOrCreateMetadataMap is called with Object <var>O</var>, property key <var>P</var>, and Boolean <var>Create</var> the following steps are taken:</p>
1900 <emu-alg><ol><li>Assert: <var>P</var> is <emu-val>undefined</emu-val> or <emu-xref aoid="IsPropertyKey" id="_ref_0"><a href="https://tc39.github.io/ecma262/#sec-ispropertykey">IsPropertyKey</a></emu-xref>(<var>P</var>) is <emu-val>true</emu-val>.</li><li>Let <var>targetMetadata</var> be the value of <var>O</var>'s [[Metadata]] internal slot.</li><li>If <var>targetMetadata</var> is <emu-val>undefined</emu-val>, then<ol><li>If <var>Create</var> is <emu-val>false</emu-val>, return <emu-val>undefined</emu-val>.</li><li>Set <var>targetMetadata</var> to be a newly created <emu-val>Map</emu-val> object.</li><li>Set the [[Metadata]] internal slot of <var>O</var> to <var>targetMetadata</var>.</li></ol></li><li>Let <var>metadataMap</var> be ?&nbsp;<emu-xref aoid="Invoke" id="_ref_1"><a href="https://tc39.github.io/ecma262/#sec-invoke">Invoke</a></emu-xref>(<var>targetMetadata</var>, <code>"get"</code>, <var>P</var>).</li><li>If <var>metadataMap</var> is <emu-val>undefined</emu-val>, then<ol><li>If <var>Create</var> is <emu-val>false</emu-val>, return <emu-val>undefined</emu-val>.</li><li>Set <var>metadataMap</var> to be a newly created <emu-val>Map</emu-val> object.</li><li>Perform ?&nbsp;<emu-xref aoid="Invoke" id="_ref_2"><a href="https://tc39.github.io/ecma262/#sec-invoke">Invoke</a></emu-xref>(<var>targetMetadata</var>, <code>"set"</code>, <var>P</var>, <var>metadataMap</var>).</li></ol></li><li>Return <var>metadataMap</var>.
1901 </li></ol></emu-alg>
1902 </emu-clause>
1903 </emu-clause>
1904</emu-clause>
1905
1906<emu-clause id="ordinary-and-exotic-objects-behaviors">
1907 <h1><span class="secnum">3</span>Ordinary and Exotic Objects Behaviors</h1>
1908
1909 <emu-clause id="ordinary-object-internal-methods-and-internal-slots">
1910 <h1><span class="secnum">3.1</span>Ordinary Object Internal Methods and Internal Slots</h1>
1911 <p>All ordinary objects have an internal slot called [[Metadata]]. The value of this internal slot is either <emu-val>null</emu-val> or a <emu-val>Map</emu-val> object and is used for storing metadata for an object.</p>
1912 <emu-clause id="ordinary-object-internal-methods-and-internal-slots-hasmetadata">
1913 <h1><span class="secnum">3.1.1</span>[[HasMetadata]] ( MetadataKey, P )</h1>
1914 <p>When the [[HasMetadata]] internal method of <var>O</var> is called with <emu-xref href="#sec-ecmascript-language-types"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-language-types">ECMAScript language value</a></emu-xref> <var>MetadataKey</var> and property key <var>P</var>, the following steps are taken:</p>
1915 <emu-alg><ol><li>Return ?&nbsp;<emu-xref aoid="OrdinaryHasMetadata" id="_ref_3"><a href="#ordinaryhasmetadata">OrdinaryHasMetadata</a></emu-xref>(<var>MetadataKey</var>, <var>O</var>, <var>P</var>).
1916 </li></ol></emu-alg>
1917 <emu-clause id="ordinaryhasmetadata" aoid="OrdinaryHasMetadata">
1918 <h1><span class="secnum">3.1.1.1</span>OrdinaryHasMetadata ( MetadataKey, O, P )</h1>
1919 <p>When the abstract operation OrdinaryHasMetadata is called with <emu-xref href="#sec-ecmascript-language-types"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-language-types">ECMAScript language value</a></emu-xref> <var>MetadataKey</var>, Object <var>O</var>, and property key <var>P</var>, the following steps are taken:</p>
1920 <emu-alg><ol><li>Assert: <var>P</var> is <emu-val>undefined</emu-val> or <emu-xref aoid="IsPropertyKey" id="_ref_4"><a href="https://tc39.github.io/ecma262/#sec-ispropertykey">IsPropertyKey</a></emu-xref>(<var>P</var>) is <emu-val>true</emu-val>.</li><li>Let <var>hasOwn</var> be ?&nbsp;<emu-xref aoid="OrdinaryHasOwnMetadata" id="_ref_5"><a href="#ordinaryhasownmetadata">OrdinaryHasOwnMetadata</a></emu-xref>(<var>MetadataKey</var>, <var>O</var>, <var>P</var>).</li><li>If <var>hasOwn</var> is <emu-val>true</emu-val>, return <emu-val>true</emu-val>.</li><li>Let <var>parent</var> be ? <var>O</var>.[[GetPrototypeOf]]().</li><li>If <var>parent</var> is not <emu-val>null</emu-val>, Return ? <var>parent</var>.[[HasMetadata]](<var>MetadataKey</var>, <var>P</var>).</li><li>Return <emu-val>false</emu-val>.
1921 </li></ol></emu-alg>
1922 </emu-clause>
1923 </emu-clause>
1924
1925 <emu-clause id="ordinary-object-internal-methods-and-internal-slots-hasownmetadata">
1926 <h1><span class="secnum">3.1.2</span>[[HasOwnMetadata]] ( MetadataKey, P )</h1>
1927 <p>When the [[HasOwnMetadata]] internal method of <var>O</var> is called with <emu-xref href="#sec-ecmascript-language-types"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-language-types">ECMAScript language value</a></emu-xref> <var>MetadataKey</var> and property key <var>P</var>, the following steps are taken:</p>
1928 <emu-alg><ol><li>Return ?&nbsp;<emu-xref aoid="OrdinaryHasOwnMetadata" id="_ref_6"><a href="#ordinaryhasownmetadata">OrdinaryHasOwnMetadata</a></emu-xref>(<var>MetadataKey</var>, <var>O</var>, <var>P</var>).
1929 </li></ol></emu-alg>
1930 <emu-clause id="ordinaryhasownmetadata" aoid="OrdinaryHasOwnMetadata">
1931 <h1><span class="secnum">3.1.2.1</span>OrdinaryHasOwnMetadata ( MetadataKey, O, P )</h1>
1932 <p>When the abstract operation OrdinaryHasOwnMetadata is called with <emu-xref href="#sec-ecmascript-language-types"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-language-types">ECMAScript language value</a></emu-xref> <var>MetadataKey</var>, Object <var>O</var>, and property key <var>P</var>, the following steps are taken:</p>
1933 <emu-alg><ol><li>Assert: <var>P</var> is <emu-val>undefined</emu-val> or <emu-xref aoid="IsPropertyKey" id="_ref_7"><a href="https://tc39.github.io/ecma262/#sec-ispropertykey">IsPropertyKey</a></emu-xref>(<var>P</var>) is <emu-val>true</emu-val>.</li><li>Let <var>metadataMap</var> be ?&nbsp;<emu-xref aoid="GetOrCreateMetadataMap" id="_ref_8"><a href="#getorcreatemetadatamap">GetOrCreateMetadataMap</a></emu-xref>(<var>O</var>, <var>P</var>, <emu-val>false</emu-val>).</li><li>If <var>metadataMap</var> is <emu-val>undefined</emu-val>, return <emu-val>false</emu-val>.</li><li>Return ?&nbsp;<emu-xref aoid="ToBoolean" id="_ref_9"><a href="https://tc39.github.io/ecma262/#sec-toboolean">ToBoolean</a></emu-xref>(? <emu-xref aoid="Invoke" id="_ref_10"><a href="https://tc39.github.io/ecma262/#sec-invoke">Invoke</a></emu-xref>(<var>metadataMap</var>, <code>"has"</code>, <var>MetadataKey</var>)).
1934 </li></ol></emu-alg>
1935 </emu-clause>
1936 </emu-clause>
1937
1938 <emu-clause id="ordinary-object-internal-methods-and-internal-slots-getmetadata">
1939 <h1><span class="secnum">3.1.3</span>[[GetMetadata]] ( MetadataKey, P )</h1>
1940 <p>When the [[GetMatadata]] internal method of <var>O</var> is called with <emu-xref href="#sec-ecmascript-language-types"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-language-types">ECMAScript language value</a></emu-xref> <var>MetadataKey</var> and property key <var>P</var>, the following steps are taken:</p>
1941 <emu-alg><ol><li>Return ?&nbsp;<emu-xref aoid="OrdinaryGetMetadata" id="_ref_11"><a href="#ordinarygetmetadata">OrdinaryGetMetadata</a></emu-xref>(<var>MetadataKey</var>, <var>O</var>, <var>P</var>).
1942 </li></ol></emu-alg>
1943 <emu-clause id="ordinarygetmetadata" aoid="OrdinaryGetMetadata">
1944 <h1><span class="secnum">3.1.3.1</span>OrdinaryGetMetadata ( MetadataKey, O, P )</h1>
1945 <p>When the abstract operation OrdinaryGetMetadata is called with <emu-xref href="#sec-ecmascript-language-types"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-language-types">ECMAScript language value</a></emu-xref> <var>MetadataKey</var>, Object <var>O</var>, and property key <var>P</var>, the following steps are taken:</p>
1946 <emu-alg><ol><li>Assert: <var>P</var> is <emu-val>undefined</emu-val> or <emu-xref aoid="IsPropertyKey" id="_ref_12"><a href="https://tc39.github.io/ecma262/#sec-ispropertykey">IsPropertyKey</a></emu-xref>(<var>P</var>) is <emu-val>true</emu-val>.</li><li>Let <var>hasOwn</var> be ?&nbsp;<emu-xref aoid="OrdinaryHasOwnMetadata" id="_ref_13"><a href="#ordinaryhasownmetadata">OrdinaryHasOwnMetadata</a></emu-xref>(<var>MetadataKey</var>, <var>O</var>, <var>P</var>).</li><li>If <var>hasOwn</var> is <emu-val>true</emu-val>, return ?&nbsp;<emu-xref aoid="OrdinaryGetOwnMetadata" id="_ref_14"><a href="#ordinarygetownmetadata">OrdinaryGetOwnMetadata</a></emu-xref>(<var>MetadataKey</var>, <var>O</var>, <var>P</var>).</li><li>Let <var>parent</var> be ? <var>O</var>.[[GetPrototypeOf]]().</li><li>If <var>parent</var> is not <emu-val>null</emu-val>, return ? <var>parent</var>.[[GetMetadata]](<var>MetadataKey</var>, <var>P</var>).</li><li>Return <emu-val>undefined</emu-val>.
1947 </li></ol></emu-alg>
1948 </emu-clause>
1949 </emu-clause>
1950
1951 <emu-clause id="ordinary-object-internal-methods-and-internal-slots-getownmetadata">
1952 <h1><span class="secnum">3.1.4</span>[[GetOwnMetadata]] ( MetadataKey, P, ParamIndex )</h1>
1953 <p>When the [[GetOwnMetadata]] internal method of <var>O</var> is called with <emu-xref href="#sec-ecmascript-language-types"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-language-types">ECMAScript language value</a></emu-xref> <var>MetadataKey</var> and property key <var>P</var>, the following steps are taken:</p>
1954 <emu-alg><ol><li>Return ?&nbsp;<emu-xref aoid="OrdinaryGetOwnMetadata" id="_ref_15"><a href="#ordinarygetownmetadata">OrdinaryGetOwnMetadata</a></emu-xref>(<var>MetadataKey</var>, <var>O</var>, <var>P</var>).
1955 </li></ol></emu-alg>
1956 <emu-clause id="ordinarygetownmetadata" aoid="OrdinaryGetOwnMetadata">
1957 <h1><span class="secnum">3.1.4.1</span>OrdinaryGetOwnMetadata ( MetadataKey, O, P )</h1>
1958 <p>When the abstract operation OrdinaryGetOwnMetadata is called with <emu-xref href="#sec-ecmascript-language-types"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-language-types">ECMAScript language value</a></emu-xref> <var>MetadataKey</var>, Object <var>O</var>, and property key <var>P</var>, the following steps are taken:</p>
1959 <emu-alg><ol><li>Assert: <var>P</var> is <emu-val>undefined</emu-val> or <emu-xref aoid="IsPropertyKey" id="_ref_16"><a href="https://tc39.github.io/ecma262/#sec-ispropertykey">IsPropertyKey</a></emu-xref>(<var>P</var>) is <emu-val>true</emu-val>.</li><li>Let <var>metadataMap</var> be ?&nbsp;<emu-xref aoid="GetOrCreateMetadataMap" id="_ref_17"><a href="#getorcreatemetadatamap">GetOrCreateMetadataMap</a></emu-xref>(<var>O</var>, <var>P</var>, <emu-val>false</emu-val>).</li><li>If <var>metadataMap</var> is <emu-val>undefined</emu-val>, return <emu-val>undefined</emu-val>.</li><li>Return ?&nbsp;<emu-xref aoid="Invoke" id="_ref_18"><a href="https://tc39.github.io/ecma262/#sec-invoke">Invoke</a></emu-xref>(<var>metadataMap</var>, <code>"get"</code>, <var>MetadataKey</var>).
1960 </li></ol></emu-alg>
1961 </emu-clause>
1962 </emu-clause>
1963
1964 <emu-clause id="ordinary-object-internal-methods-and-internal-slots-defineownmetadata">
1965 <h1><span class="secnum">3.1.5</span>[[DefineOwnMetadata]] ( MetadataKey, MetadataValue, P )</h1>
1966 <p>When the [[DefineOwnMetadata]] internal method of <var>O</var> is called with <emu-xref href="#sec-ecmascript-language-types"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-language-types">ECMAScript language value</a></emu-xref> <var>MetadataKey</var>, <emu-xref href="#sec-ecmascript-language-types"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-language-types">ECMAScript language value</a></emu-xref> <var>MetadataValue</var>, and property key <var>P</var>, the following steps are taken:</p>
1967 <emu-alg><ol><li>Return ?&nbsp;<emu-xref aoid="OrdinaryDefineOwnMetadata" id="_ref_19"><a href="#ordinarydefineownmetadata">OrdinaryDefineOwnMetadata</a></emu-xref>(<var>MetadataKey</var>, <var>MetadataValue</var>, <var>O</var>, <var>P</var>)
1968 </li></ol></emu-alg>
1969 <emu-clause id="ordinarydefineownmetadata" aoid="OrdinaryDefineOwnMetadata">
1970 <h1><span class="secnum">3.1.5.1</span>OrdinaryDefineOwnMetadata ( MetadataKey, MetadataValue, O, P )</h1>
1971 <p>When the abstract operation <emu-xref aoid="OrdinaryDefineOwnProperty" id="_ref_20"><a href="https://tc39.github.io/ecma262/#sec-ordinarydefineownproperty">OrdinaryDefineOwnProperty</a></emu-xref> is called with <emu-xref href="#sec-ecmascript-language-types"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-language-types">ECMAScript language value</a></emu-xref> <var>MetadataKey</var>, <emu-xref href="#sec-ecmascript-language-types"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-language-types">ECMAScript language value</a></emu-xref> <var>MetadataValue</var>, Object <var>O</var>, and property key <var>P</var>, the following steps are taken:</p>
1972 <emu-alg><ol><li>Assert: <var>P</var> is <emu-val>undefined</emu-val> or <emu-xref aoid="IsPropertyKey" id="_ref_21"><a href="https://tc39.github.io/ecma262/#sec-ispropertykey">IsPropertyKey</a></emu-xref>(<var>P</var>) is <emu-val>true</emu-val>.</li><li>Let <var>metadataMap</var> be ?&nbsp;<emu-xref aoid="GetOrCreateMetadataMap" id="_ref_22"><a href="#getorcreatemetadatamap">GetOrCreateMetadataMap</a></emu-xref>(<var>O</var>, <var>P</var>, <emu-val>true</emu-val>).</li><li>Return ?&nbsp;<emu-xref aoid="Invoke" id="_ref_23"><a href="https://tc39.github.io/ecma262/#sec-invoke">Invoke</a></emu-xref>(<var>metadataMap</var>, <code>"set"</code>, <var>MetadataKey</var>, <var>MetadataValue</var>).
1973 </li></ol></emu-alg>
1974 </emu-clause>
1975 </emu-clause>
1976
1977 <emu-clause id="ordinary-object-internal-methods-and-internal-slots-metadatakeys">
1978 <h1><span class="secnum">3.1.6</span>[[MetadataKeys]] ( P )</h1>
1979 <p>When the [[MetadataKeys]] internal method of <var>O</var> is called with property key <var>P</var> the following steps are taken:</p>
1980 <emu-alg><ol><li>Return ?&nbsp;<emu-xref aoid="OrdinaryMetadataKeys" id="_ref_24"><a href="#ordinarymetadatakeys">OrdinaryMetadataKeys</a></emu-xref>(<var>O</var>, <var>P</var>).
1981 </li></ol></emu-alg>
1982 <emu-clause id="ordinarymetadatakeys" aoid="OrdinaryMetadataKeys">
1983 <h1><span class="secnum">3.1.6.1</span>OrdinaryMetadataKeys ( O, P )</h1>
1984 <p>When the abstract operation OrdinaryMetadataKeys is called with Object <var>O</var> and property key <var>P</var> the following steps are taken:</p>
1985 <emu-alg><ol><li>Assert: <var>P</var> is <emu-val>undefined</emu-val> or <emu-xref aoid="IsPropertyKey" id="_ref_25"><a href="https://tc39.github.io/ecma262/#sec-ispropertykey">IsPropertyKey</a></emu-xref>(<var>P</var>) is <emu-val>true</emu-val>.</li><li>Let <var>ownKeys</var> be ?&nbsp;<emu-xref aoid="OrdinaryOwnMetadataKeys" id="_ref_26"><a href="#ordinaryownmetadatakeys">OrdinaryOwnMetadataKeys</a></emu-xref>(<var>O</var>, <var>P</var>).</li><li>Let <var>parent</var> be ? <var>O</var>.[[GetPrototypeOf]]().</li><li>If <var>parent</var> is <emu-val>null</emu-val>, then return <var>ownKeys</var>.</li><li>Let <var>parentKeys</var> be ? <var>O</var>.[[OrdinaryMetadataKeys]](<var>P</var>).</li><li>Let <var>ownKeysLen</var> = ?&nbsp;<emu-xref aoid="Get" id="_ref_27"><a href="https://tc39.github.io/ecma262/#sec-get-o-p">Get</a></emu-xref>(<var>ownKeys</var>, "length").</li><li>If <var>ownKeysLen</var> is <emu-val>0</emu-val>, return <var>parentKeys</var>.</li><li>Let <var>parentKeysLen</var> = ?&nbsp;<emu-xref aoid="Get" id="_ref_28"><a href="https://tc39.github.io/ecma262/#sec-get-o-p">Get</a></emu-xref>(<var>parentKeys</var>, "length").</li><li>If <var>parentKeysLen</var> is <emu-val>0</emu-val>, return <var>ownKeys</var>.</li><li>Let <var>set</var> be a newly created <emu-val>Set</emu-val> object.</li><li>Let <var>keys</var> be ?&nbsp;<emu-xref aoid="ArrayCreate" id="_ref_29"><a href="https://tc39.github.io/ecma262/#sec-arraycreate">ArrayCreate</a></emu-xref>(0).</li><li>Let <var>k</var> be <emu-val>0</emu-val>.</li><li>For each element <var>key</var> of <var>ownKeys</var><ol><li>Let <var>hasKey</var> be ?&nbsp;<emu-xref aoid="Invoke" id="_ref_30"><a href="https://tc39.github.io/ecma262/#sec-invoke">Invoke</a></emu-xref>(<var>set</var>, <code>"has"</code>, <var>key</var>).</li><li>If <var>hasKey</var> is <emu-val>false</emu-val>, then<ol><li>Let <var>Pk</var> be !&nbsp;<emu-xref aoid="ToString" id="_ref_31"><a href="https://tc39.github.io/ecma262/#sec-tostring">ToString</a></emu-xref>(<var>k</var>).</li><li>Perform ?&nbsp;<emu-xref aoid="Invoke" id="_ref_32"><a href="https://tc39.github.io/ecma262/#sec-invoke">Invoke</a></emu-xref>(<var>set</var>, "add", <var>key</var>).</li><li>Let <var>defineStatus</var> be <emu-xref aoid="CreateDataProperty" id="_ref_33"><a href="https://tc39.github.io/ecma262/#sec-createdataproperty">CreateDataProperty</a></emu-xref>(<var>keys</var>, <var>Pk</var>, <var>key</var>).</li><li>Assert: <var>defineStatus</var> is <emu-val>true</emu-val>.</li><li>Increase <var>k</var> by <emu-val>1</emu-val>.</li></ol></li></ol></li><li>For each element <var>key</var> of <var>parentKeys</var><ol><li>Let <var>hasKey</var> be ?&nbsp;<emu-xref aoid="Invoke" id="_ref_34"><a href="https://tc39.github.io/ecma262/#sec-invoke">Invoke</a></emu-xref>(<var>set</var>, <code>"has"</code>, <var>key</var>).</li><li>If <var>hasKey</var> is <emu-val>false</emu-val>, then<ol><li>Let <var>Pk</var> be !&nbsp;<emu-xref aoid="ToString" id="_ref_35"><a href="https://tc39.github.io/ecma262/#sec-tostring">ToString</a></emu-xref>(<var>k</var>).</li><li>Perform ?&nbsp;<emu-xref aoid="Invoke" id="_ref_36"><a href="https://tc39.github.io/ecma262/#sec-invoke">Invoke</a></emu-xref>(<var>set</var>, <code>"add"</code>, <var>key</var>).</li><li>Let <var>defineStatus</var> be <emu-xref aoid="CreateDataProperty" id="_ref_37"><a href="https://tc39.github.io/ecma262/#sec-createdataproperty">CreateDataProperty</a></emu-xref>(<var>keys</var>, <var>Pk</var>, <var>key</var>).</li><li>Assert: <var>defineStatus</var> is <emu-val>true</emu-val>.</li><li>Increase <var>k</var> by <emu-val>1</emu-val>.</li></ol></li></ol></li><li>Perform ?&nbsp;<emu-xref aoid="Set" id="_ref_38"><a href="https://tc39.github.io/ecma262/#sec-set-o-p-v-throw">Set</a></emu-xref>(<var>keys</var>, <code>"length"</code>, <var>k</var>).</li><li>return <var>keys</var>.
1986 </li></ol></emu-alg>
1987 </emu-clause>
1988 </emu-clause>
1989
1990 <emu-clause id="ordinary-object-internal-methods-and-internal-slots-ownmetadatakeys">
1991 <h1><span class="secnum">3.1.7</span>[[OwnMetadataKeys]] ( P )</h1>
1992 <p>When the [[OwnMetadataKeys]] internal method of <var>O</var> is called with property key <var>P</var> the following steps are taken:</p>
1993 <emu-alg><ol><li>Return <emu-xref aoid="OrdinaryOwnMetadataKeys" id="_ref_39"><a href="#ordinaryownmetadatakeys">OrdinaryOwnMetadataKeys</a></emu-xref>(<var>O</var>, <var>P</var>).
1994 </li></ol></emu-alg>
1995 <emu-clause id="ordinaryownmetadatakeys" aoid="OrdinaryOwnMetadataKeys">
1996 <h1><span class="secnum">3.1.7.1</span>OrdinaryOwnMetadataKeys ( O, P )</h1>
1997 <p>When the abstract operation OrdinaryOwnMetadataKeys is called with Object <var>O</var> and property key <var>P</var> the following steps are taken:</p>
1998 <emu-alg><ol><li>Assert: <var>P</var> is <emu-val>undefined</emu-val> or <emu-xref aoid="IsPropertyKey" id="_ref_40"><a href="https://tc39.github.io/ecma262/#sec-ispropertykey">IsPropertyKey</a></emu-xref>(<var>P</var>) is <emu-val>true</emu-val>.</li><li>Let <var>keys</var> be ?&nbsp;<emu-xref aoid="ArrayCreate" id="_ref_41"><a href="https://tc39.github.io/ecma262/#sec-arraycreate">ArrayCreate</a></emu-xref>(0).</li><li>Let <var>metadataMap</var> be ?&nbsp;<emu-xref aoid="GetOrCreateMetadataMap" id="_ref_42"><a href="#getorcreatemetadatamap">GetOrCreateMetadataMap</a></emu-xref>(<var>O</var>, <var>P</var>, <emu-val>false</emu-val>).</li><li>If <var>metadataMap</var> is <emu-val>undefined</emu-val>, return <var>keys</var>.</li><li>Let <var>keysObj</var> be ?&nbsp;<emu-xref aoid="Invoke" id="_ref_43"><a href="https://tc39.github.io/ecma262/#sec-invoke">Invoke</a></emu-xref>(<var>metadataMap</var>, <code>"keys"</code>).</li><li>Let <var>iterator</var> be ?&nbsp;<emu-xref aoid="GetIterator" id="_ref_44"><a href="https://tc39.github.io/ecma262/#sec-getiterator">GetIterator</a></emu-xref>(<var>keysObj</var>).</li><li>Let <var>k</var> be <emu-val>0</emu-val>.</li><li>Repeat<ol><li>Let <var>Pk</var> be !&nbsp;<emu-xref aoid="ToString" id="_ref_45"><a href="https://tc39.github.io/ecma262/#sec-tostring">ToString</a></emu-xref>(<var>k</var>).</li><li>Let <var>next</var> be ?&nbsp;<emu-xref aoid="IteratorStep" id="_ref_46"><a href="https://tc39.github.io/ecma262/#sec-iteratorstep">IteratorStep</a></emu-xref>(<var>iterator</var>).</li><li>If <var>next</var> is <emu-val>false</emu-val>, then<ol><li>Let <var>setStatus</var> be ?&nbsp;<emu-xref aoid="Set" id="_ref_47"><a href="https://tc39.github.io/ecma262/#sec-set-o-p-v-throw">Set</a></emu-xref>(<var>keys</var>, <code>"length"</code>, <var>k</var>, <var>true</var>).</li><li>Assert: <var>setStatus</var> is <emu-val>true</emu-val>.</li><li>Return <var>keys</var>.</li></ol></li><li>Let <var>nextValue</var> be ?&nbsp;<emu-xref aoid="IteratorValue" id="_ref_48"><a href="https://tc39.github.io/ecma262/#sec-iteratorvalue">IteratorValue</a></emu-xref>(<var>next</var>).</li><li>Let <var>defineStatus</var> be <emu-xref aoid="CreateDataPropertyOrThrow" id="_ref_49"><a href="https://tc39.github.io/ecma262/#sec-createdatapropertyorthrow">CreateDataPropertyOrThrow</a></emu-xref>(<var>keys</var>, <var>Pk</var>, <var>nextValue</var>).</li><li>If <var>defineStatus</var> is an <emu-xref href="#sec-completion-record-specification-type"><a href="https://tc39.github.io/ecma262/#sec-completion-record-specification-type">abrupt completion</a></emu-xref>, return ?&nbsp;<emu-xref aoid="IteratorClose" id="_ref_50"><a href="https://tc39.github.io/ecma262/#sec-iteratorclose">IteratorClose</a></emu-xref>(<var>iterator</var>, <var>defineStatus</var>).</li><li>Increase <var>k</var> by <emu-val>1</emu-val>.
1999 </li></ol></li></ol></emu-alg>
2000 </emu-clause>
2001 </emu-clause>
2002
2003 <emu-clause id="ordinary-object-internal-methods-and-internal-slots-deletemetadata">
2004 <h1><span class="secnum">3.1.8</span>[[DeleteMetadata]]( MetadataKey, P )</h1>
2005 <p>When the [[DeleteMetadata]] internal method of <var>O</var> is called with <emu-xref href="#sec-ecmascript-language-types"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-language-types">ECMAScript language value</a></emu-xref> <var>MetadataKey</var> and property key <var>P</var> the following steps are taken:</p>
2006 <emu-alg><ol><li>Assert: <var>P</var> is <emu-val>undefined</emu-val> or <emu-xref aoid="IsPropertyKey" id="_ref_51"><a href="https://tc39.github.io/ecma262/#sec-ispropertykey">IsPropertyKey</a></emu-xref>(<var>P</var>) is <emu-val>true</emu-val>.</li><li>Let <var>metadataMap</var> be ?&nbsp;<emu-xref aoid="GetOrCreateMetadataMap" id="_ref_52"><a href="#getorcreatemetadatamap">GetOrCreateMetadataMap</a></emu-xref>(<var>O</var>, <var>P</var>, <emu-val>false</emu-val>).</li><li>If <var>metadataMap</var> is <emu-val>undefined</emu-val>, return <emu-val>false</emu-val>.</li><li>Return ?&nbsp;<emu-xref aoid="Invoke" id="_ref_53"><a href="https://tc39.github.io/ecma262/#sec-invoke">Invoke</a></emu-xref>(<var>metadataMap</var>, <code>"delete"</code>, <var>MetadataKey</var>).
2007 </li></ol></emu-alg>
2008 </emu-clause>
2009 </emu-clause>
2010</emu-clause>
2011
2012<emu-clause id="reflection">
2013 <h1><span class="secnum">4</span>Reflection</h1>
2014 <emu-clause id="reflect">
2015 <h1><span class="secnum">4.1</span>The Reflect Object</h1>
2016 <p>This section contains amendments to the Reflect object.</p>
2017 <emu-clause id="reflect-metadatadecoratorfunctions">
2018 <h1><span class="secnum">4.1.1</span>Metadata Decorator Functions</h1>
2019 <p>A metadata decorator function is an anonymous built-in function that has [[MetadataKey]] and [[MetadataValue]] internal slots.</p>
2020 <p>When a metadata decorator function <var>F</var> is called with arguments <var>target</var> and <var>key</var>, the following steps are taken:</p>
2021 <emu-alg><ol><li>Assert: <var>F</var> has a [[MetadataKey]] internal slot whose value is an <emu-xref href="#sec-ecmascript-language-types"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-language-types">ECMAScript language value</a></emu-xref>, or <emu-val>undefined</emu-val>.</li><li>Assert: <var>F</var> has a [[MetadataValue]] internal slot whose value is an <emu-xref href="#sec-ecmascript-language-types"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-language-types">ECMAScript language value</a></emu-xref>, or <emu-val>undefined</emu-val>.</li><li>If <emu-xref aoid="Type" id="_ref_54"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-data-types-and-values">Type</a></emu-xref>(<var>target</var>) is not Object, throw a <emu-val>TypeError</emu-val> exception.</li><li>If <var>key</var> is not <emu-val>undefined</emu-val> and <emu-xref aoid="IsPropertyKey" id="_ref_55"><a href="https://tc39.github.io/ecma262/#sec-ispropertykey">IsPropertyKey</a></emu-xref>(<var>key</var>) is <emu-val>false</emu-val>, throw a <emu-val>TypeError</emu-val> exception.</li><li>Let <var>metadataKey</var> be the value of <var>F</var>'s [[MetadataKey]] internal slot.</li><li>Let <var>metadataValue</var> be the value of <var>F</var>'s [[MetadataValue]] internal slot.</li><li>Perform ? <var>target</var>.[[DefineMetadata]](<var>metadataKey</var>, <var>metadataValue</var>, <var>target</var>, <var>key</var>).</li><li>Return <emu-val>undefined</emu-val>.
2022 </li></ol></emu-alg>
2023 </emu-clause>
2024
2025 <emu-clause id="reflect.metadata">
2026 <h1><span class="secnum">4.1.2</span>Reflect.metadata ( metadataKey, metadataValue )</h1>
2027 <p>When the <code>metadata</code> function is called with arguments <var>metadataKey</var> and <var>metadataValue</var>, the following steps are taken:</p>
2028 <emu-alg><ol><li>Let <var>decorator</var> be a new built-in function object as defined in Metadata Decorator Functions.</li><li>Set the [[MetadataKey]] internal slot of <var>decorator</var> to <var>metadataKey</var>.</li><li>Set the [[MetadataValue]] internal slot of <var>decorator</var> to <var>metadataValue</var>.</li><li>Return <var>decorator</var>.
2029 </li></ol></emu-alg>
2030 </emu-clause>
2031
2032 <emu-clause id="reflect.definemetadata">
2033 <h1><span class="secnum">4.1.3</span>Reflect.defineMetadata ( metadataKey, metadataValue, target [, propertyKey] )</h1>
2034 <p>When the <code>defineMetadata</code> function is called with arguments <var>metadataKey</var>, <var>metadataValue</var>, <var>target</var>, and <var>propertyKey</var>, the following steps are taken:</p>
2035 <emu-alg><ol><li>If <emu-xref aoid="Type" id="_ref_56"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-data-types-and-values">Type</a></emu-xref>(<var>target</var>) is not Object, throw a <emu-val>TypeError</emu-val> exception.</li><li>Return ? <var>target</var>.[[DefineMetadata]](<var>metadataKey</var>, <var>metadataValue</var>, <var>propertyKey</var>).
2036 </li></ol></emu-alg>
2037 </emu-clause>
2038
2039 <emu-clause id="reflect.hasmetadata">
2040 <h1><span class="secnum">4.1.4</span>Reflect.hasMetadata ( metadataKey, target [, propertyKey] )</h1>
2041 <p>When the <code>hasMetadata</code> function is called with arguments <var>metadataKey</var>, <var>target</var>, and <var>propertyKey</var>, the following steps are taken:</p>
2042 <emu-alg><ol><li>If <emu-xref aoid="Type" id="_ref_57"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-data-types-and-values">Type</a></emu-xref>(<var>target</var>) is not Object, throw a <emu-val>TypeError</emu-val> exception.</li><li>Return ? <var>target</var>.[[HasMetadata]](<var>metadataKey</var>, <var>propertyKey</var>).
2043 </li></ol></emu-alg>
2044 </emu-clause>
2045
2046 <emu-clause id="reflect.hasownmetadata">
2047 <h1><span class="secnum">4.1.5</span>Reflect.hasOwnMetadata ( metadataKey, target [, propertyKey] )</h1>
2048 <p>When the <code>hasOwnMetadata</code> function is called with arguments <var>metadataKey</var>, <var>target</var>, and <var>propertyKey</var>, the following steps are taken:</p>
2049 <emu-alg><ol><li>If <emu-xref aoid="Type" id="_ref_58"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-data-types-and-values">Type</a></emu-xref>(<var>target</var>) is not Object, throw a <emu-val>TypeError</emu-val> exception.</li><li>Return ? <var>target</var>.[[HasOwn]](<var>metadataKey</var>, <var>propertyKey</var>).
2050 </li></ol></emu-alg>
2051 </emu-clause>
2052
2053 <emu-clause id="reflect.getmetadata">
2054 <h1><span class="secnum">4.1.6</span>Reflect.getMetadata ( metadataKey, target [, propertyKey] )</h1>
2055 <p>When the <code>getMetadata</code> function is called with arguments <var>metadataKey</var>, <var>target</var>, and <var>propertyKey</var>, the following steps are taken:</p>
2056 <emu-alg><ol><li>If <emu-xref aoid="Type" id="_ref_59"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-data-types-and-values">Type</a></emu-xref>(<var>target</var>) is not Object, throw a <emu-val>TypeError</emu-val> exception.</li><li>Return ? <var>target</var>.[[GetMetadata]](<var>metadataKey</var>, <var>propertyKey</var>).
2057 </li></ol></emu-alg>
2058 </emu-clause>
2059
2060 <emu-clause id="reflect.getownmetadata">
2061 <h1><span class="secnum">4.1.7</span>Reflect.getOwnMetadata ( metadataKey, target [, propertyKey] )</h1>
2062 <p>When the <code>getOwnMetadata</code> function is called with arguments <var>metadataKey</var>, <var>target</var>, and <var>propertyKey</var>, the following steps are taken:</p>
2063 <emu-alg><ol><li>If <emu-xref aoid="Type" id="_ref_60"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-data-types-and-values">Type</a></emu-xref>(<var>target</var>) is not Object, throw a <emu-val>TypeError</emu-val> exception.</li><li>Return ? <var>target</var>.[[GetOwnMetadata]](<var>metadataKey</var>, <var>propertyKey</var>).
2064 </li></ol></emu-alg>
2065 </emu-clause>
2066
2067 <emu-clause id="reflect.getmetadatakeys">
2068 <h1><span class="secnum">4.1.8</span>Reflect.getMetadataKeys ( target [, propertyKey] )</h1>
2069 <p>When the <code>getMetadataKeys</code> function is called with arguments <var>target</var> and <var>propertyKey</var>, the following steps are taken:</p>
2070 <emu-alg><ol><li>If <emu-xref aoid="Type" id="_ref_61"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-data-types-and-values">Type</a></emu-xref>(<var>target</var>) is not Object, throw a <emu-val>TypeError</emu-val> exception.</li><li>Return ? <var>target</var>.[[GetMetadataKeys]](<var>propertyKey</var>).
2071 </li></ol></emu-alg>
2072 </emu-clause>
2073
2074 <emu-clause id="reflect.getownmetadatakeys">
2075 <h1><span class="secnum">4.1.9</span>Reflect.getOwnMetadataKeys ( target [, propertyKey] )</h1>
2076 <p>When the <code>getOwnMetadataKeys</code> function is called with arguments <var>target</var> and <var>propertyKey</var>, the following steps are taken:</p>
2077 <emu-alg><ol><li>If <emu-xref aoid="Type" id="_ref_62"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-data-types-and-values">Type</a></emu-xref>(<var>target</var>) is not Object, throw a <emu-val>TypeError</emu-val> exception.</li><li>Return ? <var>target</var>.[[GetOwnMetadataKeys]](<var>propertyKey</var>).
2078 </li></ol></emu-alg>
2079 </emu-clause>
2080
2081 <emu-clause id="reflect.deletemetadata">
2082 <h1><span class="secnum">4.1.10</span>Reflect.deleteMetadata ( metadataKey, target [, propertyKey] )</h1>
2083 <p>When the <code>deleteMetadata</code> function is called with arguments <var>metadataKey</var>, <var>target</var>, and <var>propertyKey</var>, the following steps are taken:</p>
2084 <emu-alg><ol><li>If <emu-xref aoid="Type" id="_ref_63"><a href="https://tc39.github.io/ecma262/#sec-ecmascript-data-types-and-values">Type</a></emu-xref>(<var>target</var>) is not Object, throw a <emu-val>TypeError</emu-val> exception.</li><li>Return ? <var>target</var>.[[DeleteMetadata]](<var>metadataKey</var>, <var>propertyKey</var>).
2085 </li></ol></emu-alg>
2086 </emu-clause>
2087 </emu-clause>
2088</emu-clause></div></body>
Note: See TracBrowser for help on using the repository browser.