From 932809e6cfa9665931d2502c120cfc47fadb835b Mon Sep 17 00:00:00 2001 From: Alexander Ivanov Date: Wed, 17 Jun 2020 14:05:08 +0800 Subject: [PATCH] fix(interpreter.js): Continuing expirement with DATATYPE_NOCOPY --- src/interpreter.js | 48 ++++++++++++++++++++++++---------------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/src/interpreter.js b/src/interpreter.js index 29e7f9f..57ad004 100644 --- a/src/interpreter.js +++ b/src/interpreter.js @@ -130,37 +130,39 @@ function findArgs (acc, v, k) { return acc } -function extendType (functions, defaultTypeArgs) { - const argPos = reduce(defaultTypeArgs, findArgs, []) - const produceArgs = typeof defaultTypeArgs === 'object' - ? function produceArgsObject (typeArgs) { - if (typeArgs === undefined) return defaultTypeArgs - const args = JSON.parse(JSON.stringify(defaultTypeArgs)) - for (const { path, val } of argPos) { - // Set field - const c = path.split('.').reverse() - let into = args - while (c.length > 1) { - into = into[c.pop()] - } - into[c.pop()] = typeArgs[val] +function constructProduceArgs (defaultTypeArgs) { + const json = JSON.stringify(defaultTypeArgs) + if (defaultTypeArgs !== 'object') return () => defaultTypeArgs + return function produceArgsObject (typeArgs) { + if (typeArgs === undefined) return defaultTypeArgs + const args = DATATYPE_NOCOPY ? defaultTypeArgs : JSON.parse(json) + for (const { path, val } of argPos) { + // Set field + const c = path.split('.').reverse() + let into = args + while (c.length > 1) { + into = into[c.pop()] } - return args + into[c.pop()] = typeArgs[val] } - : function produceArgsPrimitive () { return defaultTypeArgs } + return args + } +} + +function extendType ([ _read, _write, _sizeOf ], defaultTypeArgs) { + const argPos = reduce(defaultTypeArgs, findArgs, []) + const produceArgs = constructProduceArgs(defaultTypeArgs) function read (buffer, offset, typeArgs, context) { - return functions[0].call(this, buffer, offset, produceArgs(typeArgs), context) + return _read.call(this, buffer, offset, produceArgs(typeArgs), context) } function write (value, buffer, offset, typeArgs, context) { - return functions[1].call(this, value, buffer, offset, produceArgs(typeArgs), context) + return _write.call(this, value, buffer, offset, produceArgs(typeArgs), context) } function sizeOf (value, typeArgs, context) { - if (typeof functions[2] === 'function') { - return functions[2].call(this, value, produceArgs(typeArgs), context) - } - return functions[2] + return _sizeOf.call(this, value, produceArgs(typeArgs), context) } - return [read, write, sizeOf] + function sizeOfStatic () { return _sizeOf } + return [read, write, typeof _sizeOf === 'function' ? sizeOf : sizeOfStatic] } module.exports = ProtoDef