Skip to content

Commit

Permalink
Move around some things
Browse files Browse the repository at this point in the history
Jarred-Sumner committed Aug 18, 2022
1 parent bc412e1 commit c720bdc
Showing 9 changed files with 242 additions and 182 deletions.
7 changes: 6 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1412,13 +1412,18 @@ bun-relink-fast: bun-relink-copy bun-link-lld-release-no-lto
wasm-return1:
zig build-lib -OReleaseSmall test/bun.js/wasm-return-1-test.zig -femit-bin=test/bun.js/wasm-return-1-test.wasm -target wasm32-freestanding

generate-classes:
bun src/bun.js/scripts/generate-classes.ts

generate-sink:
bun src/bun.js/generate-jssink.js
bun src/bun.js/scripts/generate-jssink.js
$(WEBKIT_DIR)/Source/JavaScriptCore/create_hash_table src/bun.js/bindings/JSSink.cpp > src/bun.js/bindings/JSSinkLookupTable.h
$(SED) -i -e 's/#include "Lookup.h"//' src/bun.js/bindings/JSSinkLookupTable.h
$(SED) -i -e 's/namespace JSC {//' src/bun.js/bindings/JSSinkLookupTable.h
$(SED) -i -e 's/} \/\/ namespace JSC//' src/bun.js/bindings/JSSinkLookupTable.h

codegen: generate-sink generate-classes

EMIT_LLVM_FOR_RELEASE=-emit-llvm -flto="full"
EMIT_LLVM_FOR_DEBUG=
EMIT_LLVM=$(EMIT_LLVM_FOR_RELEASE)
2 changes: 1 addition & 1 deletion src/bun.js/WebKit
2 changes: 1 addition & 1 deletion src/bun.js/bindings/JSSink.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@

// AUTO-GENERATED FILE. DO NOT EDIT.
// Generated by 'make generate-sink' at 2022-08-17T12:00:00.774Z
// Generated by 'make generate-sink' at 2022-08-18T01:38:52.471Z
//
#pragma once

2 changes: 1 addition & 1 deletion src/bun.js/bindings/JSSinkLookupTable.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Automatically generated from src/bun.js/bindings/JSSink.cpp using /build/bun-webkit//Source/JavaScriptCore/create_hash_table. DO NOT EDIT!
// Automatically generated from src/bun.js/bindings/JSSink.cpp using /Users/jarred/Code/bun/src/bun.js/WebKit/Source/JavaScriptCore/create_hash_table. DO NOT EDIT!



36 changes: 36 additions & 0 deletions src/bun.js/scripts/class-definitions.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
export type Field =
| { getter: string; cache?: true }
| { setter: string }
| { accessor: { getter: string; setter: string }; cache?: true }
| {
fn: string;
length?: number;
DOMJIT?: {
return: string;
args?: [string, string] | [string, string, string] | [string];
symbol: string;
};
};

export interface ClassDefinition {
name: string;
construct?: boolean;
finalize?: boolean;
klass: Record<string, Field>;
proto: Record<string, Field>;
JSType?: string;
}

export function define(
{ klass = {}, proto = {}, ...rest } = {} as ClassDefinition
): ClassDefinition {
return {
...rest,
klass: Object.fromEntries(
Object.entries(klass).sort(([a], [b]) => a.localeCompare(b))
),
proto: Object.fromEntries(
Object.entries(proto).sort(([a], [b]) => a.localeCompare(b))
),
};
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
import { readdirSync } from "fs";
import { resolve } from "path";
import type { Field, ClassDefinition } from "./class-definitions";

function symbolName(typeName, name) {
return `${typeName}__${name}`;
}
@@ -50,7 +54,13 @@ function appendSymbols(to, symbolName, prop) {
to.push([fn, symbolName(fn)]);
}
}
function propRow(symbolName, typeName, name, prop, isWrapped = true) {
function propRow(
symbolName: (a: string, b: string) => string,
typeName: string,
name: string,
prop: Field,
isWrapped = true
) {
var {
defaultValue,
getter,
@@ -114,7 +124,7 @@ function propRow(symbolName, typeName, name, prop, isWrapped = true) {
throw "Unsupported property";
}

function generateHashTable(
export function generateHashTable(
nameToUse,
symbolName,
typeName,
@@ -510,8 +520,13 @@ function renderStaticDecls(symbolName, typeName, fields) {
return rows.join("\n");
}

function renderFieldsImpl(symbolName, typeName, obj, proto) {
const rows = [];
function renderFieldsImpl(
symbolName: (typeName: string, name: string) => string,
typeName: string,
obj: ClassDefinition,
proto: ClassDefinition["proto"]
) {
const rows: string[] = [];

if (obj.construct) {
rows.push(`
@@ -870,9 +885,9 @@ function generateImpl(typeName, obj) {

function generateZig(
typeName,
{ klass = {}, proto = {}, construct, finalize }
{ klass = {}, proto = {}, construct, finalize } = {} as ClassDefinition
) {
const exports = [];
const exports: [string, string][] = [];

if (construct) {
exports.push([`constructor`, classSymbolName(typeName, "construct")]);
@@ -1083,138 +1098,6 @@ function generateLazyClassStructureImpl(typeName, { klass = {}, proto = {} }) {
`.trim();
}

function define({ klass = {}, proto = {}, ...rest } = {}) {
return {
...rest,
klass: Object.fromEntries(
Object.entries(klass).sort(([a], [b]) => a.localeCompare(b))
),
proto: Object.fromEntries(
Object.entries(proto).sort(([a], [b]) => a.localeCompare(b))
),
};
}

const classes = [
define({
name: "Request",
construct: true,
finalize: true,
klass: {},
JSType: "0b11101110",
proto: {
url: {
getter: "getURL",
cache: true,
},

// body: {
// getter: "getBody",
// },

text: { fn: "getText" },
json: { fn: "getJSON" },
arrayBuffer: { fn: "getArrayBuffer" },
blob: { fn: "getBlob" },
clone: { fn: "doClone", length: 1 },
cache: {
getter: "getCache",
},
credentials: {
getter: "getCredentials",
},
destination: {
getter: "getDestination",
},
headers: {
getter: "getHeaders",
cache: true,
},
integrity: {
getter: "getIntegrity",
},
method: {
getter: "getMethod",
},
mode: {
getter: "getMode",
},
redirect: {
getter: "getRedirect",
},
referrer: {
getter: "getReferrer",
},
referrerPolicy: {
getter: "getReferrerPolicy",
},
url: {
getter: "getUrl",
cache: true,
},
bodyUsed: {
getter: "getBodyUsed",
},
},
}),

define({
name: "Response",
construct: true,
finalize: true,
JSType: "0b11101110",
klass: {
json: {
fn: "constructJSON",
},
redirect: {
fn: "constructRedirect",
},
error: {
fn: "constructError",
},
},
proto: {
url: {
getter: "getURL",
cache: true,
},

// body: {
// getter: "getBody",
// },

text: { fn: "getText" },
json: { fn: "getJSON" },
arrayBuffer: { fn: "getArrayBuffer" },
blob: { fn: "getBlob" },
clone: { fn: "doClone", length: 1 },

type: {
getter: "getResponseType",
},
headers: {
getter: "getHeaders",
cache: true,
},

statusText: {
getter: "getStatusText",
cache: true,
},
status: {
getter: "getStatus",
},
ok: {
getter: "getOK",
},
bodyUsed: {
getter: "getBodyUsed",
},
},
}),
];

const GENERATED_CLASSES_HEADER = `
// GENERATED CODE - DO NOT MODIFY BY HAND
// Generated by src/bun.js/generate-classes.js
@@ -1309,27 +1192,53 @@ const StaticCallbackType = fn(*JSC.JSGlobalObject, *JSC.CallFrame) callconv(.C)
`;
await Bun.write(`${import.meta.dir}/bindings/generated_classes.zig`, [

const directoriesToSearch = [
resolve(`${import.meta.dir}/../api`),
resolve(`${import.meta.dir}/../webcore`),
];

function findClasses() {
var classes = [];
for (let directory of directoriesToSearch) {
readdirSync(directory).forEach((file) => {
if (file.endsWith(".classes.ts")) {
const result = require(`${directory}/${file}`);
console.log("Generated", result.default.length, "classes from", file);
for (let { name } of result.default) {
console.log(` - ${name}`);
}

classes.push(...result.default);
}
});
}
return classes;
}

const classes = findClasses();

await Bun.write(`${import.meta.dir}/../bindings/generated_classes.zig`, [
ZIG_GENERATED_CLASSES_HEADER,
...classes.map((a) => generateZig(a.name, a).trim()).join("\n"),
]);
await Bun.write(`${import.meta.dir}/bindings/ZigGeneratedClasses.h`, [
await Bun.write(`${import.meta.dir}/../bindings/ZigGeneratedClasses.h`, [
GENERATED_CLASSES_HEADER,
...classes.map((a) => generateHeader(a.name, a)),
GENERATED_CLASSES_FOOTER,
]);
await Bun.write(`${import.meta.dir}/bindings/ZigGeneratedClasses.cpp`, [
await Bun.write(`${import.meta.dir}/../bindings/ZigGeneratedClasses.cpp`, [
GENERATED_CLASSES_IMPL_HEADER,
...classes.map((a) => generateImpl(a.name, a)),
GENERATED_CLASSES_IMPL_FOOTER,
]);
await Bun.write(
`${import.meta.dir}/bindings/ZigGeneratedClasses+lazyStructureHeader.h`,
`${import.meta.dir}/../bindings/ZigGeneratedClasses+lazyStructureHeader.h`,
classes.map((a) => generateLazyClassStructureHeader(a.name, a)).join("\n")
);

await Bun.write(
`${import.meta.dir}/bindings/ZigGeneratedClasses+DOMClientIsoSubspaces.h`,
`${import.meta.dir}/../bindings/ZigGeneratedClasses+DOMClientIsoSubspaces.h`,
classes.map((a) =>
[
`std::unique_ptr<GCClient::IsoSubspace> ${clientSubspaceFor(a.name)};`,
@@ -1341,7 +1250,7 @@ await Bun.write(
);

await Bun.write(
`${import.meta.dir}/bindings/ZigGeneratedClasses+DOMIsoSubspaces.h`,
`${import.meta.dir}/../bindings/ZigGeneratedClasses+DOMIsoSubspaces.h`,
classes.map((a) =>
[
`std::unique_ptr<IsoSubspace> ${subspaceFor(a.name)};`,
@@ -1351,10 +1260,12 @@ await Bun.write(
);

await Bun.write(
`${import.meta.dir}/bindings/ZigGeneratedClasses+lazyStructureImpl.h`,
`${import.meta.dir}/../bindings/ZigGeneratedClasses+lazyStructureImpl.h`,
initLazyClasses(
classes.map((a) => generateLazyClassStructureImpl(a.name, a))
) +
"\n" +
visitLazyClasses(classes)
);

export {};
Loading
Oops, something went wrong.

0 comments on commit c720bdc

Please sign in to comment.