feat: implement new system for context tracking

This commit is contained in:
2023-09-09 17:32:46 +03:00
parent 78b192babe
commit 0e04459fe7
48 changed files with 435 additions and 692 deletions

View File

@@ -29,9 +29,14 @@ interface Internals {
extensible(obj: object): boolean;
sort(arr: any[], comaprator: (a: any, b: any) => number): void;
constructor: {
log(...args: any[]): void;
}
}
var env: Environment = arguments[0], internals: Internals = arguments[1];
// @ts-ignore
var env: Environment = arguments[0], internals: Internals = arguments[1], log = internals.constructor.log;
try {
run('values/object');
@@ -47,7 +52,9 @@ try {
run('set');
run('regex');
run('timeout');
env.global.log = log;
log('Loaded polyfills!');
}
catch (e: any) {

View File

@@ -1,10 +1,11 @@
define("map", () => {
const syms = { values: internals.symbol('Map.values') } as { readonly values: unique symbol };
const Object = env.global.Object;
class Map<KeyT, ValueT> {
[syms.values]: any = {};
public [Symbol.iterator](): IterableIterator<[KeyT, ValueT]> {
public [env.global.Symbol.iterator](): IterableIterator<[KeyT, ValueT]> {
return this.entries();
}
@@ -28,7 +29,7 @@ define("map", () => {
if (i >= keys.length) return { done: true };
else return { done: false, value: [ keys[i], this[syms.values][keys[i++]] ] }
},
[Symbol.iterator]() { return this; }
[env.global.Symbol.iterator]() { return this; }
}
}
public keys(): IterableIterator<KeyT> {
@@ -40,7 +41,7 @@ define("map", () => {
if (i >= keys.length) return { done: true };
else return { done: false, value: keys[i] }
},
[Symbol.iterator]() { return this; }
[env.global.Symbol.iterator]() { return this; }
}
}
public values(): IterableIterator<ValueT> {
@@ -52,7 +53,7 @@ define("map", () => {
if (i >= keys.length) return { done: true };
else return { done: false, value: this[syms.values][keys[i++]] }
},
[Symbol.iterator]() { return this; }
[env.global.Symbol.iterator]() { return this; }
}
}
@@ -80,7 +81,7 @@ define("map", () => {
}
public constructor(iterable: Iterable<[KeyT, ValueT]>) {
const it = iterable[Symbol.iterator]();
const it = iterable[env.global.Symbol.iterator]();
for (let el = it.next(); !el.done; el = it.next()) {
this[syms.values][el.value[0]] = el.value[1];

View File

@@ -1,10 +1,11 @@
define("set", () => {
const syms = { values: internals.symbol('Map.values') } as { readonly values: unique symbol };
const Object = env.global.Object;
class Set<T> {
[syms.values]: any = {};
public [Symbol.iterator](): IterableIterator<[T, T]> {
public [env.global.Symbol.iterator](): IterableIterator<[T, T]> {
return this.entries();
}
@@ -28,7 +29,7 @@ define("set", () => {
if (i >= keys.length) return { done: true };
else return { done: false, value: [ keys[i], keys[i] ] }
},
[Symbol.iterator]() { return this; }
[env.global.Symbol.iterator]() { return this; }
}
}
public keys(): IterableIterator<T> {
@@ -40,7 +41,7 @@ define("set", () => {
if (i >= keys.length) return { done: true };
else return { done: false, value: keys[i] }
},
[Symbol.iterator]() { return this; }
[env.global.Symbol.iterator]() { return this; }
}
}
public values(): IterableIterator<T> {
@@ -68,7 +69,7 @@ define("set", () => {
}
public constructor(iterable: Iterable<T>) {
const it = iterable[Symbol.iterator]();
const it = iterable[env.global.Symbol.iterator]();
for (let el = it.next(); !el.done; el = it.next()) {
this[syms.values][el.value] = undefined;

View File

@@ -16,14 +16,14 @@ define("values/array", () => {
} as ArrayConstructor;
env.setProto('array', Array.prototype);
(Array.prototype as any)[Symbol.typeName] = "Array";
(Array.prototype as any)[env.global.Symbol.typeName] = "Array";
setConstr(Array.prototype, Array);
setProps(Array.prototype, {
[Symbol.iterator]: function() {
[env.global.Symbol.iterator]: function() {
return this.values();
},
[Symbol.typeName]: "Array",
[env.global.Symbol.typeName]: "Array",
values() {
var i = 0;
@@ -35,7 +35,7 @@ define("values/array", () => {
}
return { done: true, value: undefined };
},
[Symbol.iterator]() { return this; }
[env.global.Symbol.iterator]() { return this; }
};
},
keys() {
@@ -48,7 +48,7 @@ define("values/array", () => {
}
return { done: true, value: undefined };
},
[Symbol.iterator]() { return this; }
[env.global.Symbol.iterator]() { return this; }
};
},
entries() {
@@ -61,7 +61,7 @@ define("values/array", () => {
}
return { done: true, value: undefined };
},
[Symbol.iterator]() { return this; }
[env.global.Symbol.iterator]() { return this; }
};
},
concat() {

View File

@@ -117,7 +117,7 @@ define("values/function", () => {
},
return: (value) => new Promise((res, rej) => next(res, rej, 'ret', value)),
throw: (value) => new Promise((res, rej) => next(res, rej, 'err', value)),
[Symbol.asyncIterator]() { return this; }
[env.global.Symbol.asyncIterator]() { return this; }
}
}
},
@@ -131,7 +131,7 @@ define("values/function", () => {
next: (...args) => internals.apply(it.next, it, args),
return: (val) => internals.apply(it.next, it, [val]),
throw: (val) => internals.apply(it.next, it, [val]),
[Symbol.iterator]() { return this; }
[env.global.Symbol.iterator]() { return this; }
}
}
}

View File

@@ -216,7 +216,7 @@ define("values/object", () => {
return this;
},
toString() {
return '[object ' + (this[Symbol.typeName] ?? 'Unknown') + ']';
return '[object ' + (this[env.global.Symbol.typeName] ?? 'Unknown') + ']';
},
hasOwnProperty(key) {
return Object.hasOwn(this, key);

View File

@@ -142,9 +142,9 @@ define("values/string", () => {
else throw new Error('This function may be used only with primitive or object strings.');
}
if (typeof term[Symbol.search] !== 'function') term = RegExp.escape(term);
if (typeof term[env.global.Symbol.search] !== 'function') term = RegExp.escape(term);
return term[Symbol.search](this, false, start);
return term[env.global.Symbol.search](this, false, start);
},
lastIndexOf(term: any, start) {
if (typeof this !== 'string') {
@@ -152,9 +152,9 @@ define("values/string", () => {
else throw new Error('This function may be used only with primitive or object strings.');
}
if (typeof term[Symbol.search] !== 'function') term = RegExp.escape(term);
if (typeof term[env.global.Symbol.search] !== 'function') term = RegExp.escape(term);
return term[Symbol.search](this, true, start);
return term[env.global.Symbol.search](this, true, start);
},
includes(term, start) {
return this.indexOf(term, start) >= 0;
@@ -166,9 +166,9 @@ define("values/string", () => {
else throw new Error('This function may be used only with primitive or object strings.');
}
if (typeof pattern[Symbol.replace] !== 'function') pattern = RegExp.escape(pattern);
if (typeof pattern[env.global.Symbol.replace] !== 'function') pattern = RegExp.escape(pattern);
return pattern[Symbol.replace](this, val);
return pattern[env.global.Symbol.replace](this, val);
},
replaceAll(pattern: any, val) {
if (typeof this !== 'string') {
@@ -176,10 +176,10 @@ define("values/string", () => {
else throw new Error('This function may be used only with primitive or object strings.');
}
if (typeof pattern[Symbol.replace] !== 'function') pattern = RegExp.escape(pattern, "g");
if (typeof pattern[env.global.Symbol.replace] !== 'function') pattern = RegExp.escape(pattern, "g");
if (pattern instanceof RegExp && !pattern.global) pattern = new pattern.constructor(pattern.source, pattern.flags + "g");
return pattern[Symbol.replace](this, val);
return pattern[env.global.Symbol.replace](this, val);
},
match(pattern: any) {
@@ -188,9 +188,9 @@ define("values/string", () => {
else throw new Error('This function may be used only with primitive or object strings.');
}
if (typeof pattern[Symbol.match] !== 'function') pattern = RegExp.escape(pattern);
if (typeof pattern[env.global.Symbol.match] !== 'function') pattern = RegExp.escape(pattern);
return pattern[Symbol.match](this);
return pattern[env.global.Symbol.match](this);
},
matchAll(pattern: any) {
if (typeof this !== 'string') {
@@ -198,10 +198,10 @@ define("values/string", () => {
else throw new Error('This function may be used only with primitive or object strings.');
}
if (typeof pattern[Symbol.match] !== 'function') pattern = RegExp.escape(pattern, "g");
if (typeof pattern[env.global.Symbol.match] !== 'function') pattern = RegExp.escape(pattern, "g");
if (pattern instanceof RegExp && !pattern.global) pattern = new pattern.constructor(pattern.source, pattern.flags + "g");
return pattern[Symbol.match](this);
return pattern[env.global.Symbol.match](this);
},
split(pattern: any, lim, sensible) {
@@ -210,9 +210,9 @@ define("values/string", () => {
else throw new Error('This function may be used only with primitive or object strings.');
}
if (typeof pattern[Symbol.split] !== 'function') pattern = RegExp.escape(pattern, "g");
if (typeof pattern[env.global.Symbol.split] !== 'function') pattern = RegExp.escape(pattern, "g");
return pattern[Symbol.split](this, lim, sensible);
return pattern[env.global.Symbol.split](this, lim, sensible);
},
slice(start, end) {
if (typeof this !== 'string') {

View File

@@ -31,6 +31,6 @@ define("values/symbol", () => {
asyncIterator: Symbol('Symbol.asyncIterator') as any,
});
env.global.Object.defineProperty(Object.prototype, Symbol.typeName, { value: 'Object' });
env.global.Object.defineProperty(env.global, Symbol.typeName, { value: 'Window' });
internals.defineField(env.global.Object.prototype, Symbol.typeName, 'Object', false, false, false);
internals.defineField(env.global, Symbol.typeName, 'Window', false, false, false);
});