diff --git a/package-lock.json b/package-lock.json index 517555d3..965b728d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -216,9 +216,9 @@ "dev": true }, "binaryen": { - "version": "39.0.0-nightly.20171116", - "resolved": "https://registry.npmjs.org/binaryen/-/binaryen-39.0.0-nightly.20171116.tgz", - "integrity": "sha512-ljl/qPne0+8hYtNWITRSAtxNM1EG5NnvTg+HRmSUdNAK2j9wcyAAg5uVj+TgipEqY82kmHt5C9+TSQNEwaxgrw==" + "version": "39.0.0-nightly.20171205", + "resolved": "https://registry.npmjs.org/binaryen/-/binaryen-39.0.0-nightly.20171205.tgz", + "integrity": "sha512-OYyWKbtGCSjfX1mTmwMfTANC+trKmEIOOfAMbqjJzU+qmEFCt942kIn+6+3sNeuehLLuPeXrEOq1JxKnKVdizg==" }, "bn.js": { "version": "4.11.8", diff --git a/package.json b/package.json index da972c6e..cae59267 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@types/node": "^8.0.54", - "binaryen": "39.0.0-nightly.20171116", + "binaryen": "39.0.0-nightly.20171205", "minimist": "^1.2.0", "source-map-support": "^0.5.0" }, diff --git a/src/compiler.ts b/src/compiler.ts index c2953382..d63a964d 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -352,7 +352,7 @@ export class Compiler extends DiagnosticEmitter { } else { this.module.addGlobal(internalName, nativeType, element.isMutable, initializer); if (!element.isMutable) { - // TODO: check export, requires updated binaryen.js with Module#addGlobalExport + // TODO: check export } } return element.isCompiled = true; @@ -416,7 +416,7 @@ export class Compiler extends DiagnosticEmitter { if (!instance) return; if (declaration.range.source.isEntry && declaration.parent == declaration.range.source && hasModifier(ModifierKind.EXPORT, declaration.modifiers)) - this.module.addExport(instance.internalName, declaration.identifier.name); + this.module.addFunctionExport(instance.internalName, declaration.identifier.name); } compileFunctionUsingTypeArguments(prototype: FunctionPrototype, typeArguments: TypeNode[], contextualTypeArguments: Map | null = null, alternativeReportNode: Node | null = null): Function | null { @@ -473,7 +473,7 @@ export class Compiler extends DiagnosticEmitter { // create the function const internalName: string = instance.internalName; if (instance.isDeclare) { - this.module.addImport(internalName, "env", declaration.identifier.name, typeRef); + this.module.addFunctionImport(internalName, "env", declaration.identifier.name, typeRef); } else { this.module.addFunction(internalName, typeRef, typesToNativeTypes(instance.additionalLocals), this.module.createBlock(null, stmts, NativeType.None)); } @@ -577,7 +577,7 @@ export class Compiler extends DiagnosticEmitter { if (!(element).isGeneric) { const functionInstance: Function | null = this.compileFunctionUsingTypeArguments(element, []); if (functionInstance && statement.range.source.isEntry) - this.module.addExport(functionInstance.internalName, member.externalIdentifier.name); + this.module.addFunctionExport(functionInstance.internalName, member.externalIdentifier.name); } break; diff --git a/src/glue/binaryen.d.ts b/src/glue/binaryen.d.ts index 12555199..b592629b 100644 --- a/src/glue/binaryen.d.ts +++ b/src/glue/binaryen.d.ts @@ -274,12 +274,18 @@ declare function _BinaryenFunctionRunPasses(func: BinaryenFunctionRef, module: B declare type BinaryenImportRef = usize; -declare function _BinaryenAddImport(module: BinaryenModuleRef, internalName: CString, externalModuleName: CString, externalBaseName: CString, type: BinaryenFunctionTypeRef): BinaryenImportRef; +declare function _BinaryenAddFunctionImport(module: BinaryenModuleRef, internalName: CString, externalModuleName: CString, externalBaseName: CString, functionType: BinaryenFunctionTypeRef): BinaryenImportRef; +declare function _BinaryenAddTableImport(module: BinaryenModuleRef, internalName: CString, externalModuleName: CString, externalBaseName: CString): BinaryenImportRef; +declare function _BinaryenAddMemoryImport(module: BinaryenModuleRef, internalName: CString, externalModuleName: CString, externalBaseName: CString): BinaryenImportRef; +declare function _BinaryenAddGlobalImport(module: BinaryenModuleRef, internalName: CString, externalModuleName: CString, externalBaseName: CString, globalType: BinaryenType): BinaryenImportRef; declare function _BinaryenRemoveImport(module: BinaryenModuleRef, internalName: CString): void; declare type BinaryenExportRef = usize; -declare function _BinaryenAddExport(module: BinaryenModuleRef, internalName: CString, externalName: CString): BinaryenExportRef; +declare function _BinaryenAddFunctionExport(module: BinaryenModuleRef, internalName: CString, externalName: CString): BinaryenExportRef; +declare function _BinaryenAddTableExport(module: BinaryenModuleRef, internalName: CString, externalName: CString): BinaryenExportRef; +declare function _BinaryenAddMemoryExport(module: BinaryenModuleRef, internalName: CString, externalName: CString): BinaryenExportRef; +declare function _BinaryenAddGlobalExport(module: BinaryenModuleRef, internalName: CString, externalName: CString): BinaryenExportRef; declare function _BinaryenRemoveExport(module: BinaryenModuleRef, externalName: CString): void; declare type BinaryenGlobalRef = usize; diff --git a/src/module.ts b/src/module.ts index 89036161..5560bc8f 100644 --- a/src/module.ts +++ b/src/module.ts @@ -522,12 +522,48 @@ export class Module { } } - addExport(internalName: string, externalName: string): ExportRef { + addFunctionExport(internalName: string, externalName: string): ExportRef { if (this.noEmit) return 0; const cStr1: CString = allocString(internalName); const cStr2: CString = allocString(externalName); try { - return _BinaryenAddExport(this.ref, cStr1, cStr2); + return _BinaryenAddFunctionExport(this.ref, cStr1, cStr2); + } finally { + _free(cStr2); + _free(cStr1); + } + } + + addTableExport(internalName: string, externalName: string): ExportRef { + if (this.noEmit) return 0; + const cStr1: CString = allocString(internalName); + const cStr2: CString = allocString(externalName); + try { + return _BinaryenAddTableExport(this.ref, cStr1, cStr2); + } finally { + _free(cStr2); + _free(cStr1); + } + } + + addMemoryExport(internalName: string, externalName: string): ExportRef { + if (this.noEmit) return 0; + const cStr1: CString = allocString(internalName); + const cStr2: CString = allocString(externalName); + try { + return _BinaryenAddMemoryExport(this.ref, cStr1, cStr2); + } finally { + _free(cStr2); + _free(cStr1); + } + } + + addGlobalExport(internalName: string, externalName: string): ExportRef { + if (this.noEmit) return 0; + const cStr1: CString = allocString(internalName); + const cStr2: CString = allocString(externalName); + try { + return _BinaryenAddGlobalExport(this.ref, cStr1, cStr2); } finally { _free(cStr2); _free(cStr1); @@ -544,13 +580,55 @@ export class Module { } } - addImport(internalName: string, externalModuleName: string, externalBaseName: string, type: FunctionTypeRef): ImportRef { + addFunctionImport(internalName: string, externalModuleName: string, externalBaseName: string, functionType: FunctionTypeRef): ImportRef { if (this.noEmit) return 0; const cStr1: CString = allocString(internalName); const cStr2: CString = allocString(externalModuleName); const cStr3: CString = allocString(externalBaseName); try { - return _BinaryenAddImport(this.ref, cStr1, cStr2, cStr3, type); + return _BinaryenAddFunctionImport(this.ref, cStr1, cStr2, cStr3, functionType); + } finally { + _free(cStr3); + _free(cStr2); + _free(cStr1); + } + } + + addTableImport(internalName: string, externalModuleName: string, externalBaseName: string): ImportRef { + if (this.noEmit) return 0; + const cStr1: CString = allocString(internalName); + const cStr2: CString = allocString(externalModuleName); + const cStr3: CString = allocString(externalBaseName); + try { + return _BinaryenAddTableImport(this.ref, cStr1, cStr2, cStr3); + } finally { + _free(cStr3); + _free(cStr2); + _free(cStr1); + } + } + + addMemoryImport(internalName: string, externalModuleName: string, externalBaseName: string): ImportRef { + if (this.noEmit) return 0; + const cStr1: CString = allocString(internalName); + const cStr2: CString = allocString(externalModuleName); + const cStr3: CString = allocString(externalBaseName); + try { + return _BinaryenAddMemoryImport(this.ref, cStr1, cStr2, cStr3); + } finally { + _free(cStr3); + _free(cStr2); + _free(cStr1); + } + } + + addGlobalImport(internalName: string, externalModuleName: string, externalBaseName: string, globalType: NativeType): ImportRef { + if (this.noEmit) return 0; + const cStr1: CString = allocString(internalName); + const cStr2: CString = allocString(externalModuleName); + const cStr3: CString = allocString(externalBaseName); + try { + return _BinaryenAddGlobalImport(this.ref, cStr1, cStr2, cStr3, globalType); } finally { _free(cStr3); _free(cStr2); @@ -598,6 +676,16 @@ export class Module { } } + setFunctionTable(funcs: BinaryenFunctionRef[]): void { + if (this.noEmit) return; + const cArr: CArray = allocI32Array(funcs); + try { + _BinaryenSetFunctionTable(this.ref, cArr, funcs.length); + } finally { + _free(cArr); + } + } + setStart(func: FunctionRef): void { if (this.noEmit) return; _BinaryenSetStart(this.ref, func);