move more instructions as intrinsics

This commit is contained in:
2025-01-22 03:57:32 +02:00
parent 582753440b
commit 343684f9ce
9 changed files with 59 additions and 97 deletions

View File

@@ -88,4 +88,19 @@ setGlobalPrototypes({
uint8: Uint8Array.prototype,
int32: Int32Array.prototype,
});
setIntrinsic("regex", RegExp);
setIntrinsic("regex", RegExp);
setIntrinsic("keys", (obj: object, own: boolean, onlyEnumerable: boolean) => {
const members = object.getMembers(obj, own, onlyEnumerable);
let i = 0;
return () => {
if (i >= members.length) return { done: true };
else return { value: members[i++] };
};
});
setIntrinsic("defGetter", (obj: object, key: any, func: Function) => {
object.defineProperty(obj, key, { g: func, e: true, c: true });
});
setIntrinsic("defSetter", (obj: object, key: any, func: Function) => {
object.defineProperty(obj, key, { s: func, e: true, c: true });
});

View File

@@ -39,8 +39,8 @@ export interface ObjectPrimordials {
defineProperty(obj: object, key: string | number | symbol, conf: { g?: Function, s?: Function, e?: boolean, c?: boolean }): boolean;
defineField(obj: object, key: string | number | symbol, conf: { v?: any, e?: boolean, c?: boolean, w?: boolean }): boolean;
getOwnMember(obj: object, key: any): PropertyDescriptor | undefined;
getOwnMembers(obj: object, onlyEnumerable: boolean): string[];
getOwnSymbolMembers(obj: object, onlyEnumerable: boolean): symbol[];
getMembers(obj: object, own: boolean, onlyEnumerable: boolean): string[];
getSymbolMembers(obj: object, own: boolean, onlyEnumerable: boolean): symbol[];
getPrototype(obj: object): object | undefined;
setPrototype(obj: object, proto?: object): object;
preventExt(obj: object): void;

View File

@@ -55,10 +55,10 @@ export const Object = (() => {
return object.getOwnMember(obj, key);
}
public static getOwnPropertyNames(obj: object): string[] {
return object.getOwnMembers(obj, false);
return object.getMembers(obj, true, false);
}
public static getOwnPropertySymbols(obj: object): symbol[] {
return object.getOwnSymbolMembers(obj, false);
return object.getSymbolMembers(obj, true, false);
}
public static defineProperty(obj: object, key: string | symbol, desc: PropertyDescriptor) {
@@ -98,8 +98,8 @@ export const Object = (() => {
return obj;
}
public static defineProperties(obj: object, desc: PropertyDescriptorMap) {
const keys = object.getOwnMembers(desc, true) as ((keyof typeof obj) & string)[];
const symbols = object.getOwnSymbolMembers(desc, true) as ((keyof typeof obj) & symbol)[];
const keys = object.getMembers(desc, true, true) as ((keyof typeof obj) & string)[];
const symbols = object.getSymbolMembers(desc, true, true) as ((keyof typeof obj) & symbol)[];
for (let i = 0; i < keys.length; i++) {
Object.defineProperty(obj, keys[i], desc[keys[i]]);
@@ -119,8 +119,8 @@ export const Object = (() => {
public static assign(target: any) {
for (let i = 1; i < arguments.length; i++) {
const obj = arguments[i];
const keys = object.getOwnMembers(obj, false);
const symbols = object.getOwnSymbolMembers(obj, false);
const keys = object.getMembers(obj, true, false);
const symbols = object.getSymbolMembers(obj, true, false);
for (let j = 0; j < keys.length; j++) {
target[keys[j]] = obj[keys[j]];
@@ -142,8 +142,8 @@ export const Object = (() => {
public static keys(obj: any) {
const res: any[] = [];
const keys = object.getOwnMembers(obj, true);
const symbols = object.getOwnSymbolMembers(obj, true);
const keys = object.getMembers(obj, true, true);
const symbols = object.getSymbolMembers(obj, true, true);
for (let i = 0; i < keys.length; i++) {
res[res.length] = keys[i];
@@ -156,8 +156,8 @@ export const Object = (() => {
}
public static values(obj: any) {
const res: any[] = [];
const keys = object.getOwnMembers(obj, true);
const symbols = object.getOwnSymbolMembers(obj, true);
const keys = object.getMembers(obj, true, true);
const symbols = object.getSymbolMembers(obj, true, true);
for (let i = 0; i < keys.length; i++) {
res[res.length] = obj[keys[i]];
@@ -170,8 +170,8 @@ export const Object = (() => {
}
public static entries(obj: any) {
const res: [any, any][] = [];
const keys = object.getOwnMembers(obj, true);
const symbols = object.getOwnSymbolMembers(obj, true);
const keys = object.getMembers(obj, true, true);
const symbols = object.getSymbolMembers(obj, true, true);
for (let i = 0; i < keys.length; i++) {
res[res.length] = [keys[i], obj[keys[i]]];