summaryrefslogtreecommitdiff
path: root/runtime/js
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/js')
-rw-r--r--runtime/js/10_dispatch_buffer.js150
-rw-r--r--runtime/js/11_timers.js3
-rw-r--r--runtime/js/12_io.js10
3 files changed, 6 insertions, 157 deletions
diff --git a/runtime/js/10_dispatch_buffer.js b/runtime/js/10_dispatch_buffer.js
deleted file mode 100644
index 091fce504..000000000
--- a/runtime/js/10_dispatch_buffer.js
+++ /dev/null
@@ -1,150 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-"use strict";
-
-((window) => {
- const core = window.Deno.core;
-
- function assert(cond) {
- if (!cond) {
- throw Error("assert");
- }
- }
-
- ////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////// General async handling //////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////
-
- // General Async response handling
- let nextRequestId = 1;
- const promiseTable = {};
-
- function opAsync(opName, opRequestBuilder, opResultParser) {
- // Make sure requests of this type are handled by the asyncHandler
- // The asyncHandler's role is to call the "promiseTable[requestId]" function
- core.setAsyncHandlerByName(opName, (bufUi8, _) => {
- const [requestId, result, error] = opResultParser(bufUi8, true);
- if (error !== null) {
- promiseTable[requestId][1](error);
- } else {
- promiseTable[requestId][0](result);
- }
- delete promiseTable[requestId];
- });
-
- const requestId = nextRequestId++;
-
- // Create and store promise
- const promise = new Promise((resolve, reject) => {
- promiseTable[requestId] = [resolve, reject];
- });
-
- // Synchronously dispatch async request
- core.dispatchByName(opName, ...opRequestBuilder(requestId));
-
- // Wait for async response
- return promise;
- }
-
- function opSync(opName, opRequestBuilder, opResultParser) {
- const rawResult = core.dispatchByName(opName, ...opRequestBuilder());
-
- const [_, result, error] = opResultParser(rawResult, false);
- if (error !== null) throw error;
- return result;
- }
-
- ////////////////////////////////////////////////////////////////////////////////////////////
- /////////////////////////////////// Error handling /////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////
-
- function handleError(className, message) {
- const [ErrorClass, args] = core.getErrorClassAndArgs(className);
- if (!ErrorClass) {
- return new Error(
- `Unregistered error class: "${className}"\n` +
- ` ${message}\n` +
- ` Classes of errors returned from ops should be registered via Deno.core.registerErrorClass().`,
- );
- }
- return new ErrorClass(message, ...args);
- }
-
- ////////////////////////////////////////////////////////////////////////////////////////////
- ///////////////////////////////// Buffer ops handling //////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////
-
- const scratchBytes = new ArrayBuffer(3 * 4);
- const scratchView = new DataView(
- scratchBytes,
- scratchBytes.byteOffset,
- scratchBytes.byteLength,
- );
-
- function bufferOpBuildRequest(requestId, argument, zeroCopy) {
- scratchView.setBigUint64(0, BigInt(requestId), true);
- scratchView.setUint32(8, argument, true);
- return [scratchView, ...zeroCopy];
- }
-
- function bufferOpParseResult(bufUi8, isCopyNeeded) {
- // Decode header value from ui8 buffer
- const headerByteLength = 4 * 4;
- assert(bufUi8.byteLength >= headerByteLength);
- assert(bufUi8.byteLength % 4 == 0);
- const view = new DataView(
- bufUi8.buffer,
- bufUi8.byteOffset + bufUi8.byteLength - headerByteLength,
- headerByteLength,
- );
-
- const requestId = Number(view.getBigUint64(0, true));
- const status = view.getUint32(8, true);
- const result = view.getUint32(12, true);
-
- // Error handling
- if (status !== 0) {
- const className = core.decode(bufUi8.subarray(0, result));
- const message = core.decode(bufUi8.subarray(result, -headerByteLength))
- .trim();
-
- return [requestId, null, handleError(className, message)];
- }
-
- if (bufUi8.byteLength === headerByteLength) {
- return [requestId, result, null];
- }
-
- // Rest of response buffer is passed as reference or as a copy
- let respBuffer = null;
- if (isCopyNeeded) {
- // Copy part of the response array (if sent through shared array buf)
- respBuffer = bufUi8.slice(0, result);
- } else {
- // Create view on existing array (if sent through overflow)
- respBuffer = bufUi8.subarray(0, result);
- }
-
- return [requestId, respBuffer, null];
- }
-
- function bufferOpAsync(opName, argument = 0, ...zeroCopy) {
- return opAsync(
- opName,
- (requestId) => bufferOpBuildRequest(requestId, argument, zeroCopy),
- bufferOpParseResult,
- );
- }
-
- function bufferOpSync(opName, argument = 0, ...zeroCopy) {
- return opSync(
- opName,
- () => bufferOpBuildRequest(0, argument, zeroCopy),
- bufferOpParseResult,
- );
- }
-
- window.__bootstrap.dispatchBuffer = {
- bufferOpSync,
- bufferOpAsync,
- };
-})(this);
diff --git a/runtime/js/11_timers.js b/runtime/js/11_timers.js
index f07622388..7a0307c06 100644
--- a/runtime/js/11_timers.js
+++ b/runtime/js/11_timers.js
@@ -4,7 +4,6 @@
((window) => {
const assert = window.__bootstrap.util.assert;
const core = window.Deno.core;
- const { bufferOpSync } = window.__bootstrap.dispatchBuffer;
function opStopGlobalTimer() {
core.jsonOpSync("op_global_timer_stop");
@@ -20,7 +19,7 @@
const nowBytes = new Uint8Array(8);
function opNow() {
- bufferOpSync("op_now", 0, nowBytes);
+ core.binOpSync("op_now", 0, nowBytes);
return new DataView(nowBytes.buffer).getFloat64();
}
diff --git a/runtime/js/12_io.js b/runtime/js/12_io.js
index 09e87f990..fe815c7ed 100644
--- a/runtime/js/12_io.js
+++ b/runtime/js/12_io.js
@@ -6,8 +6,8 @@
"use strict";
((window) => {
+ const core = window.Deno.core;
const DEFAULT_BUFFER_SIZE = 32 * 1024;
- const { bufferOpSync, bufferOpAsync } = window.__bootstrap.dispatchBuffer;
// Seek whence values.
// https://golang.org/pkg/io/#pkg-constants
const SeekMode = {
@@ -81,7 +81,7 @@
return 0;
}
- const nread = bufferOpSync("op_read_sync", rid, buffer);
+ const nread = core.binOpSync("op_read_sync", rid, buffer);
if (nread < 0) {
throw new Error("read error");
}
@@ -97,7 +97,7 @@
return 0;
}
- const nread = await bufferOpAsync("op_read_async", rid, buffer);
+ const nread = await core.binOpAsync("op_read_async", rid, buffer);
if (nread < 0) {
throw new Error("read error");
}
@@ -106,7 +106,7 @@
}
function writeSync(rid, data) {
- const result = bufferOpSync("op_write_sync", rid, data);
+ const result = core.binOpSync("op_write_sync", rid, data);
if (result < 0) {
throw new Error("write error");
}
@@ -115,7 +115,7 @@
}
async function write(rid, data) {
- const result = await bufferOpAsync("op_write_async", rid, data);
+ const result = await core.binOpAsync("op_write_async", rid, data);
if (result < 0) {
throw new Error("write error");
}