From 16ee006735f78c3e1447a6fd50d32cea8b6d90fc Mon Sep 17 00:00:00 2001 From: "John J. Camilleri" Date: Thu, 7 Oct 2021 15:58:59 +0200 Subject: [PATCH] Add stubs for all un/marshalling functions. Refactoring. --- src/runtime/javascript/ffi.ts | 230 +++++++++++++++++++++++++++++--- src/runtime/javascript/index.ts | 124 +++-------------- 2 files changed, 230 insertions(+), 124 deletions(-) diff --git a/src/runtime/javascript/ffi.ts b/src/runtime/javascript/ffi.ts index 5e9a41953..582cf9928 100644 --- a/src/runtime/javascript/ffi.ts +++ b/src/runtime/javascript/ffi.ts @@ -1,5 +1,17 @@ /* eslint-disable @typescript-eslint/naming-convention */ -import { ExprLit, Literal } from './expr' +import { + Type, + // Hypo, + ExprAbs, + ExprApp, + ExprLit, + ExprMeta, + ExprFun, + ExprVar, + ExprTyped, + ExprImplArg, + Literal +} from './expr' import os from 'os' import ffi from 'ffi-napi' @@ -7,9 +19,48 @@ import ref, { Pointer } from 'ref-napi' import ref_struct from 'ref-struct-di' const Struct = ref_struct(ref) +// ---------------------------------------------------------------------------- +// FFI "Types" + +export const voidPtr = ref.refType(ref.types.void) +const prob_t = ref.types.float +const size_t = ref.types.size_t + +const PgfDB = ref.types.void +const PgfDBPtr = ref.refType(PgfDB) + +const PgfRevision = ref.refType(ref.types.void) +export const PgfRevisionPtr = ref.refType(PgfRevision) + +export const PgfExn = Struct({ + type: ref.types.int, + code: ref.types.int, + msg: ref.types.CString +}) +export const PgfExnPtr = ref.refType(PgfExn) + +const PgfText = Struct({ + size: ref.types.size_t, + text: ref.types.char // char[] +}) +export const PgfTextPtr = ref.refType(PgfText) + +export const PgfItorPtr = ref.refType(ref.types.void) + +const PgfType = ref.types.void // TODO +// const PgfTypePtr = ref.refType(PgfType) + +const PgfTypeHypo = ref.types.void // TODO +const PgfTypeHypoPtr = ref.refType(PgfTypeHypo) + export const PgfExpr = ref.refType(ref.types.Object) export const PgfLiteral = ref.refType(ref.types.Object) +const PgfMetaId = ref.types.int + +const PgfPrintContext = ref.types.void // TODO +const PgfPrintContextPtr = ref.refType(PgfPrintContext) + const PgfUnmarshallerVtbl = Struct({ eabs: ref.refType(ref.types.void), eapp: ref.refType(ref.types.void), @@ -25,9 +76,96 @@ const PgfUnmarshallerVtbl = Struct({ dtyp: ref.refType(ref.types.void), free_ref: ref.refType(ref.types.void) }) -export const PgfUnmarshaller = Struct({ +const PgfUnmarshaller = Struct({ vtbl: ref.refType(PgfUnmarshallerVtbl) }) +const PgfUnmarshallerPtr = ref.refType(PgfUnmarshaller) + +const PgfMarshallerVtbl = Struct({ + match_lit: ref.refType(ref.types.void), + match_expr: ref.refType(ref.types.void), + match_type: ref.refType(ref.types.void) +}) +const PgfMarshaller = Struct({ + vtbl: ref.refType(PgfMarshallerVtbl) +}) +const PgfMarshallerPtr = ref.refType(PgfMarshaller) + +// ---------------------------------------------------------------------------- +// FFI + +export const runtime = ffi.Library('libpgf', { + pgf_read_pgf: [PgfDBPtr, [ref.types.CString, PgfRevisionPtr, PgfExnPtr]], + pgf_boot_ngf: [PgfDBPtr, [ref.types.CString, ref.types.CString, PgfRevisionPtr, PgfExnPtr]], + pgf_read_ngf: [PgfDBPtr, [ref.types.CString, PgfRevisionPtr, PgfExnPtr]], + pgf_new_ngf: [PgfDBPtr, [PgfTextPtr, ref.types.CString, PgfRevisionPtr, PgfExnPtr]], + pgf_write_pgf: [ref.types.void, [ref.types.CString, PgfDBPtr, PgfRevision, PgfExnPtr]], + + pgf_free_revision: [ref.types.void, [PgfDBPtr, PgfRevision]], + + pgf_abstract_name: [PgfTextPtr, [PgfDBPtr, PgfRevision, PgfExnPtr]], + pgf_iter_categories: [ref.types.void, [PgfDBPtr, PgfRevision, PgfItorPtr, PgfExnPtr]], + pgf_start_cat: [PgfType, [PgfDBPtr, PgfRevision, PgfUnmarshallerPtr, PgfExnPtr]], + pgf_category_context: [PgfTypeHypoPtr, [PgfDBPtr, PgfRevision, PgfTextPtr, ref.refType(ref.types.size_t), PgfUnmarshallerPtr, PgfExnPtr]], + pgf_category_prob: [prob_t, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfExnPtr]], + pgf_iter_functions: [ref.types.void, [PgfDBPtr, PgfRevision, PgfItorPtr, PgfExnPtr]], + pgf_iter_functions_by_cat: [ref.types.void, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfItorPtr, PgfExnPtr]], + pgf_function_type: [PgfType, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfUnmarshallerPtr, PgfExnPtr]], + pgf_function_is_constructor: [ref.types.int, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfExnPtr]], + pgf_function_prob: [prob_t, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfExnPtr]], + pgf_print_expr: [PgfTextPtr, [PgfExpr, PgfPrintContextPtr, ref.types.int, PgfMarshallerPtr]], + pgf_read_expr: [PgfExpr, [PgfTextPtr, PgfUnmarshallerPtr]], + pgf_read_expr_ex: [PgfExpr, [PgfTextPtr, ref.refType(ref.types.CString), PgfUnmarshallerPtr]], + pgf_expr_prob: [prob_t, [PgfDBPtr, PgfRevision, PgfExpr, PgfMarshallerPtr, PgfExnPtr]], + pgf_print_type: [PgfTextPtr, [PgfType, PgfPrintContextPtr, ref.types.int, PgfMarshallerPtr]], + pgf_print_context: [PgfTextPtr, [size_t, PgfTypeHypoPtr, PgfPrintContextPtr, ref.types.int, PgfMarshallerPtr]], + pgf_read_type: [PgfType, [PgfTextPtr, PgfUnmarshallerPtr]], + + pgf_clone_revision: [PgfRevision, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfExnPtr]], + pgf_commit_revision: [ref.types.void, [PgfDBPtr, PgfRevision, PgfExnPtr]], + pgf_checkout_revision: [PgfRevision, [PgfDBPtr, PgfTextPtr, PgfExnPtr]], + pgf_create_function: [ref.types.void, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfType, size_t, prob_t, PgfMarshallerPtr, PgfExnPtr]], + pgf_drop_function: [ref.types.void, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfExnPtr]], + pgf_create_category: [ref.types.void, [PgfDBPtr, PgfRevision, PgfTextPtr, size_t, PgfTypeHypoPtr, prob_t, PgfMarshallerPtr, PgfExnPtr]], + pgf_drop_category: [ref.types.void, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfExnPtr]], + + pgf_get_global_flag: [PgfLiteral, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfUnmarshallerPtr, PgfExnPtr]], + pgf_set_global_flag: [ref.types.void, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfLiteral, PgfMarshallerPtr, PgfExnPtr]], + pgf_get_abstract_flag: [PgfLiteral, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfUnmarshallerPtr, PgfExnPtr]], + pgf_set_abstract_flag: [ref.types.void, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfLiteral, PgfMarshallerPtr, PgfExnPtr]] +}) + +// ---------------------------------------------------------------------------- +// Conversion helpers + +export function PgfText_AsString (txtPtr: Pointer): string { + const txtSize = txtPtr.deref().size + const charPtr = ref.reinterpret(txtPtr, txtSize, ref.types.size_t.size) + return charPtr.toString('utf8') +} + +export function PgfText_FromString (str: string): Pointer { + const strbuf = Buffer.from(str, 'utf8') + const size = strbuf.length // size in bytes, not chars + const sizebuf = ref.alloc(ref.types.size_t, size) + const txtbuf = Buffer.alloc(ref.types.size_t.size + size + 1) + sizebuf.copy(txtbuf, 0, 0) + strbuf.copy(txtbuf, ref.types.size_t.size, 0) + return txtbuf as Pointer +} + +// ---------------------------------------------------------------------------- +// Un/marshalling + +const eabs = ffi.Callback(PgfExpr, [PgfUnmarshaller, ref.types.bool, PgfTextPtr, PgfExpr], + function (self, btype: boolean, name: Pointer, body: Pointer): Pointer { + return 0 as any + }) + +const eapp = ffi.Callback(PgfExpr, [PgfUnmarshaller, PgfExpr, PgfExpr], + function (self, fun: Pointer, arg: Pointer): Pointer { + return 0 as any + }) const elit = ffi.Callback(PgfExpr, [PgfUnmarshaller, PgfLiteral], function (self, lit: Pointer): Pointer { @@ -38,6 +176,31 @@ const elit = ffi.Callback(PgfExpr, [PgfUnmarshaller, PgfLiteral], return buf }) +const emeta = ffi.Callback(PgfExpr, [PgfUnmarshaller, PgfMetaId], + function (self, meta: Pointer): Pointer { + return 0 as any + }) + +const efun = ffi.Callback(PgfExpr, [PgfUnmarshaller, PgfTextPtr], + function (self, name: Pointer): Pointer { + return 0 as any + }) + +const evar = ffi.Callback(PgfExpr, [PgfUnmarshaller, ref.types.int], + function (self, index: number): Pointer { + return 0 as any + }) + +const etyped = ffi.Callback(PgfExpr, [PgfUnmarshaller, PgfExpr, PgfType], + function (self, expr: Pointer, type: Pointer): Pointer { + return 0 as any + }) + +const eimplarg = ffi.Callback(PgfExpr, [PgfUnmarshaller, PgfExpr], + function (self, expr: Pointer): Pointer { + return 0 as any + }) + // TODO get from platform/runtime const WORDSIZE_BITS = 64 const WORDSIZE_BYTES = WORDSIZE_BITS / 8 @@ -71,25 +234,62 @@ const lint = ffi.Callback(PgfLiteral, [PgfUnmarshaller, ref.types.size_t, ref.re return buf }) +const lflt = ffi.Callback(PgfLiteral, [PgfUnmarshaller, ref.types.double], + function (self, val: number): Pointer { + return 0 as any + }) + +const lstr = ffi.Callback(PgfLiteral, [PgfUnmarshaller, PgfTextPtr], + function (self, val: Pointer): Pointer { + return 0 as any + }) + +const dtyp = ffi.Callback(PgfType, [PgfUnmarshaller, ref.types.int, PgfTypeHypoPtr, PgfTextPtr, ref.types.int, ref.refType(PgfExpr)], + function (self, n_hypos: number, hypos: Pointer, cat: Pointer, n_exprs: number, exprs: Pointer): Pointer { + return 0 as any + }) + const free_ref = ffi.Callback(ref.types.void, [PgfUnmarshaller, ref.refType(ref.types.void)], function (self, x: any): void { }) -const vtbl = new PgfUnmarshallerVtbl({ - eabs: ref.alloc('void').ref(), - eapp: ref.alloc('void').ref(), +const un_vtbl = new PgfUnmarshallerVtbl({ + eabs: eabs as any, + eapp: eapp as any, elit: elit as any, - emeta: ref.alloc('void').ref(), - efun: ref.alloc('void').ref(), - evar: ref.alloc('void').ref(), - etyped: ref.alloc('void').ref(), - eimplarg: ref.alloc('void').ref(), + emeta: emeta as any, + efun: efun as any, + evar: evar as any, + etyped: etyped as any, + eimplarg: eimplarg as any, lint: lint as any, - lflt: ref.alloc('void').ref(), - lstr: ref.alloc('void').ref(), - dtyp: ref.alloc('void').ref(), + lflt: lflt as any, + lstr: lstr as any, + dtyp: dtyp as any, free_ref: free_ref as any }) -export const unmarshaller = new PgfUnmarshaller({ vtbl: vtbl.ref() }) -export const marshaller = {} +export const unmarshaller = new PgfUnmarshaller({ vtbl: un_vtbl.ref() }) + +const match_lit = ffi.Callback(ref.types.Object, [PgfMarshaller, PgfUnmarshaller, PgfLiteral], + function (self, u: any, lit: any): Pointer { + return 0 as any + }) + +const match_expr = ffi.Callback(ref.types.Object, [PgfMarshaller, PgfUnmarshaller, PgfExpr], + function (self, u: any, expr: any): Pointer { + return 0 as any + }) + +const match_type = ffi.Callback(ref.types.Object, [PgfMarshaller, PgfUnmarshaller, PgfType], + function (self, u: any, type: any): Pointer { + return 0 as any + }) + +const vtbl = new PgfMarshallerVtbl({ + match_lit: match_lit as any, + match_expr: match_expr as any, + match_type: match_type as any +}) + +export const marshaller = new PgfMarshaller({ vtbl: vtbl.ref() }) diff --git a/src/runtime/javascript/index.ts b/src/runtime/javascript/index.ts index 351568a83..d22294563 100644 --- a/src/runtime/javascript/index.ts +++ b/src/runtime/javascript/index.ts @@ -2,58 +2,24 @@ import errno from './errno' import { Expr, ExprLit } from './expr' -import { unmarshaller, PgfUnmarshaller, PgfExpr, PgfLiteral } from './ffi' +import { + voidPtr, + PgfRevisionPtr, + PgfItorPtr, + PgfTextPtr, + PgfExn, + PgfExnPtr, + + PgfText_AsString, + PgfText_FromString, + + runtime, + unmarshaller +} from './ffi' import ffi from 'ffi-napi' import ref, { Pointer } from 'ref-napi' -import ref_struct, { StructObject } from 'ref-struct-di' -const Struct = ref_struct(ref) - -// ---------------------------------------------------------------------------- -// FFI "Types" - -const voidPtr = ref.refType(ref.types.void) -const prob_t = ref.types.float -const size_t = ref.types.size_t - -const PgfDB = ref.types.void -const PgfDBPtr = ref.refType(PgfDB) - -const PgfRevision = ref.refType(ref.types.void) -const PgfRevisionPtr = ref.refType(PgfRevision) - -const PgfExn = Struct({ - type: ref.types.int, - code: ref.types.int, - msg: ref.types.CString -}) -const PgfExnPtr = ref.refType(PgfExn) - -const PgfText = Struct({ - size: ref.types.size_t, - text: ref.types.char // char[] -}) -const PgfTextPtr = ref.refType(PgfText) - -const PgfItorPtr = ref.refType(ref.types.void) - -const PgfType = ref.types.void // TODO -// const PgfTypePtr = ref.refType(PgfType) - -const PgfTypeHypo = ref.types.void // TODO -const PgfTypeHypoPtr = ref.refType(PgfTypeHypo) - -// const PgfExpr = ref.types.void // TODO -// const PgfLiteral = ref.types.void // TODO - -const PgfPrintContext = ref.types.void // TODO -const PgfPrintContextPtr = ref.refType(PgfPrintContext) - -// const PgfUnmarshaller = ref.types.void // TODO -const PgfUnmarshallerPtr = ref.refType(PgfUnmarshaller) - -const PgfMarshaller = ref.types.void // TODO -const PgfMarshallerPtr = ref.refType(PgfMarshaller) +import { StructObject } from 'ref-struct-di' // ---------------------------------------------------------------------------- // TypeScript Types @@ -72,50 +38,6 @@ class PGFError extends Error { } } -// ---------------------------------------------------------------------------- -// FFI - -const runtime = ffi.Library('libpgf', { - pgf_read_pgf: [PgfDBPtr, [ref.types.CString, PgfRevisionPtr, PgfExnPtr]], - pgf_boot_ngf: [PgfDBPtr, [ref.types.CString, ref.types.CString, PgfRevisionPtr, PgfExnPtr]], - pgf_read_ngf: [PgfDBPtr, [ref.types.CString, PgfRevisionPtr, PgfExnPtr]], - pgf_new_ngf: [PgfDBPtr, [PgfTextPtr, ref.types.CString, PgfRevisionPtr, PgfExnPtr]], - pgf_write_pgf: [ref.types.void, [ref.types.CString, PgfDBPtr, PgfRevision, PgfExnPtr]], - - pgf_free_revision: [ref.types.void, [PgfDBPtr, PgfRevision]], - - pgf_abstract_name: [PgfTextPtr, [PgfDBPtr, PgfRevision, PgfExnPtr]], - pgf_iter_categories: [ref.types.void, [PgfDBPtr, PgfRevision, PgfItorPtr, PgfExnPtr]], - pgf_start_cat: [PgfType, [PgfDBPtr, PgfRevision, PgfUnmarshallerPtr, PgfExnPtr]], - pgf_category_context: [PgfTypeHypoPtr, [PgfDBPtr, PgfRevision, PgfTextPtr, ref.refType(ref.types.size_t), PgfUnmarshallerPtr, PgfExnPtr]], - pgf_category_prob: [prob_t, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfExnPtr]], - pgf_iter_functions: [ref.types.void, [PgfDBPtr, PgfRevision, PgfItorPtr, PgfExnPtr]], - pgf_iter_functions_by_cat: [ref.types.void, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfItorPtr, PgfExnPtr]], - pgf_function_type: [PgfType, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfUnmarshallerPtr, PgfExnPtr]], - pgf_function_is_constructor: [ref.types.int, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfExnPtr]], - pgf_function_prob: [prob_t, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfExnPtr]], - pgf_print_expr: [PgfTextPtr, [PgfExpr, PgfPrintContextPtr, ref.types.int, PgfMarshallerPtr]], - pgf_read_expr: [PgfExpr, [PgfTextPtr, PgfUnmarshallerPtr]], - pgf_read_expr_ex: [PgfExpr, [PgfTextPtr, ref.refType(ref.types.CString), PgfUnmarshallerPtr]], - pgf_expr_prob: [prob_t, [PgfDBPtr, PgfRevision, PgfExpr, PgfMarshallerPtr, PgfExnPtr]], - pgf_print_type: [PgfTextPtr, [PgfType, PgfPrintContextPtr, ref.types.int, PgfMarshallerPtr]], - pgf_print_context: [PgfTextPtr, [size_t, PgfTypeHypoPtr, PgfPrintContextPtr, ref.types.int, PgfMarshallerPtr]], - pgf_read_type: [PgfType, [PgfTextPtr, PgfUnmarshallerPtr]], - - pgf_clone_revision: [PgfRevision, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfExnPtr]], - pgf_commit_revision: [ref.types.void, [PgfDBPtr, PgfRevision, PgfExnPtr]], - pgf_checkout_revision: [PgfRevision, [PgfDBPtr, PgfTextPtr, PgfExnPtr]], - pgf_create_function: [ref.types.void, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfType, size_t, prob_t, PgfMarshallerPtr, PgfExnPtr]], - pgf_drop_function: [ref.types.void, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfExnPtr]], - pgf_create_category: [ref.types.void, [PgfDBPtr, PgfRevision, PgfTextPtr, size_t, PgfTypeHypoPtr, prob_t, PgfMarshallerPtr, PgfExnPtr]], - pgf_drop_category: [ref.types.void, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfExnPtr]], - - pgf_get_global_flag: [PgfLiteral, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfUnmarshallerPtr, PgfExnPtr]], - pgf_set_global_flag: [ref.types.void, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfLiteral, PgfMarshallerPtr, PgfExnPtr]], - pgf_get_abstract_flag: [PgfLiteral, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfUnmarshallerPtr, PgfExnPtr]], - pgf_set_abstract_flag: [ref.types.void, [PgfDBPtr, PgfRevision, PgfTextPtr, PgfLiteral, PgfMarshallerPtr, PgfExnPtr]] -}) - // ---------------------------------------------------------------------------- // Helpers @@ -142,22 +64,6 @@ function handleError (err: StructObject): void { } } -function PgfText_AsString (txtPtr: Pointer): string { - const txtSize = txtPtr.deref().size - const charPtr = ref.reinterpret(txtPtr, txtSize, ref.types.size_t.size) - return charPtr.toString('utf8') -} - -function PgfText_FromString (str: string): Pointer { - const strbuf = Buffer.from(str, 'utf8') - const size = strbuf.length // size in bytes, not chars - const sizebuf = ref.alloc(ref.types.size_t, size) - const txtbuf = Buffer.alloc(ref.types.size_t.size + size + 1) - sizebuf.copy(txtbuf, 0, 0) - strbuf.copy(txtbuf, ref.types.size_t.size, 0) - return txtbuf as Pointer -} - // ---------------------------------------------------------------------------- // PGF grammar object