From f641d58ece369150aa2ee73a0055c6514d8b1390 Mon Sep 17 00:00:00 2001 From: Rosco Kalis Date: 2023年11月22日 11:38:12 +0100 Subject: [PATCH] Move compiled bytecode mapping for global functions to the symbol table definition --- packages/cashc/src/ast/Globals.ts | 24 ++++++++++++------- packages/cashc/src/ast/SymbolTable.ts | 7 +++--- .../src/generation/GenerateTargetTraversal.ts | 7 ++++-- packages/cashc/src/generation/utils.ts | 21 +--------------- 4 files changed, 25 insertions(+), 34 deletions(-) diff --git a/packages/cashc/src/ast/Globals.ts b/packages/cashc/src/ast/Globals.ts index 4a09951a..2d5d3355 100644 --- a/packages/cashc/src/ast/Globals.ts +++ b/packages/cashc/src/ast/Globals.ts @@ -1,4 +1,6 @@ -import { PrimitiveType, ArrayType, BytesType } from '@cashscript/utils'; +import { + PrimitiveType, ArrayType, BytesType, Op, +} from '@cashscript/utils'; import { SymbolTable, Symbol } from './SymbolTable.js'; export const NumberUnit: { [index:string] : number } = { @@ -63,42 +65,46 @@ GLOBAL_SYMBOL_TABLE.set( // Global functions GLOBAL_SYMBOL_TABLE.set( - Symbol.function(GlobalFunction.ABS, PrimitiveType.INT, [PrimitiveType.INT]), + Symbol.function(GlobalFunction.ABS, PrimitiveType.INT, [PrimitiveType.INT], [Op.OP_ABS]), ); GLOBAL_SYMBOL_TABLE.set( - Symbol.function(GlobalFunction.MIN, PrimitiveType.INT, [PrimitiveType.INT, PrimitiveType.INT]), + Symbol.function(GlobalFunction.MIN, PrimitiveType.INT, [PrimitiveType.INT, PrimitiveType.INT], [Op.OP_MIN]), ); GLOBAL_SYMBOL_TABLE.set( - Symbol.function(GlobalFunction.MAX, PrimitiveType.INT, [PrimitiveType.INT, PrimitiveType.INT]), + Symbol.function(GlobalFunction.MAX, PrimitiveType.INT, [PrimitiveType.INT, PrimitiveType.INT], [Op.OP_MAX]), ); GLOBAL_SYMBOL_TABLE.set(Symbol.function( GlobalFunction.WITHIN, PrimitiveType.BOOL, [PrimitiveType.INT, PrimitiveType.INT, PrimitiveType.INT], + [Op.OP_WITHIN], )); GLOBAL_SYMBOL_TABLE.set( - Symbol.function(GlobalFunction.RIPEMD160, new BytesType(20), [PrimitiveType.ANY]), + Symbol.function(GlobalFunction.RIPEMD160, new BytesType(20), [PrimitiveType.ANY], [Op.OP_RIPEMD160]), ); GLOBAL_SYMBOL_TABLE.set( - Symbol.function(GlobalFunction.SHA1, new BytesType(20), [PrimitiveType.ANY]), + Symbol.function(GlobalFunction.SHA1, new BytesType(20), [PrimitiveType.ANY], [Op.OP_SHA1]), ); GLOBAL_SYMBOL_TABLE.set( - Symbol.function(GlobalFunction.SHA256, new BytesType(32), [PrimitiveType.ANY]), + Symbol.function(GlobalFunction.SHA256, new BytesType(32), [PrimitiveType.ANY], [Op.OP_SHA256]), ); GLOBAL_SYMBOL_TABLE.set( - Symbol.function(GlobalFunction.HASH160, new BytesType(20), [PrimitiveType.ANY]), + Symbol.function(GlobalFunction.HASH160, new BytesType(20), [PrimitiveType.ANY], [Op.OP_HASH160]), ); GLOBAL_SYMBOL_TABLE.set( - Symbol.function(GlobalFunction.HASH256, new BytesType(32), [PrimitiveType.ANY]), + Symbol.function(GlobalFunction.HASH256, new BytesType(32), [PrimitiveType.ANY], [Op.OP_HASH256]), ); GLOBAL_SYMBOL_TABLE.set(Symbol.function( GlobalFunction.CHECKSIG, PrimitiveType.BOOL, [PrimitiveType.SIG, PrimitiveType.PUBKEY], + [Op.OP_CHECKSIG], )); GLOBAL_SYMBOL_TABLE.set(Symbol.function( GlobalFunction.CHECKMULTISIG, PrimitiveType.BOOL, [new ArrayType(PrimitiveType.SIG), new ArrayType(PrimitiveType.PUBKEY)], + [Op.OP_CHECKMULTISIG], )); GLOBAL_SYMBOL_TABLE.set(Symbol.function( GlobalFunction.CHECKDATASIG, PrimitiveType.BOOL, [PrimitiveType.DATASIG, new BytesType(), PrimitiveType.PUBKEY], + [Op.OP_CHECKDATASIG], )); diff --git a/packages/cashc/src/ast/SymbolTable.ts b/packages/cashc/src/ast/SymbolTable.ts index fcfada94..7298565b 100644 --- a/packages/cashc/src/ast/SymbolTable.ts +++ b/packages/cashc/src/ast/SymbolTable.ts @@ -1,4 +1,4 @@ -import { Type } from '@cashscript/utils'; +import { Script, Type } from '@cashscript/utils'; import { VariableDefinitionNode, ParameterNode, @@ -14,6 +14,7 @@ export class Symbol { public symbolType: SymbolType, public definition?: Node, public parameters?: Type[], + public bytecode?: Script, ) {} static variable(node: VariableDefinitionNode | ParameterNode): Symbol { @@ -24,8 +25,8 @@ export class Symbol { return new Symbol(name, type, SymbolType.VARIABLE); } - static function(name: string, type: Type, parameters: Type[]): Symbol { - return new Symbol(name, type, SymbolType.FUNCTION, undefined, parameters); + static function(name: string, type: Type, parameters: Type[], bytecode: Script): Symbol { + return new Symbol(name, type, SymbolType.FUNCTION, undefined, parameters, bytecode); } static class(name: string, type: Type, parameters: Type[]): Symbol { diff --git a/packages/cashc/src/generation/GenerateTargetTraversal.ts b/packages/cashc/src/generation/GenerateTargetTraversal.ts index 337510e0..72c5de3d 100644 --- a/packages/cashc/src/generation/GenerateTargetTraversal.ts +++ b/packages/cashc/src/generation/GenerateTargetTraversal.ts @@ -44,7 +44,6 @@ import { BinaryOperator } from '../ast/Operator.js'; import { compileBinaryOp, compileCast, - compileGlobalFunction, compileNullaryOp, compileTimeOp, compileUnaryOp, @@ -311,7 +310,11 @@ export default class GenerateTargetTraversal extends AstTraversal { node.parameters = this.visitList(node.parameters); - this.emit(compileGlobalFunction(node.identifier.name as GlobalFunction)); + if (!node.identifier.definition?.bytecode) { + throw new Error('Somehow function symbol definition does not exist or does not specify bytecode'); // Should not happen + } + + this.emit(node.identifier.definition.bytecode); this.popFromStack(node.parameters.length); this.pushToStack('(value)'); diff --git a/packages/cashc/src/generation/utils.ts b/packages/cashc/src/generation/utils.ts index f4aab3cb..db923bb5 100644 --- a/packages/cashc/src/generation/utils.ts +++ b/packages/cashc/src/generation/utils.ts @@ -7,7 +7,7 @@ import { Type, } from '@cashscript/utils'; import { UnaryOperator, BinaryOperator, NullaryOperator } from '../ast/Operator.js'; -import { GlobalFunction, TimeOp } from '../ast/Globals.js'; +import { TimeOp } from '../ast/Globals.js'; export function compileTimeOp(op: TimeOp): Script { const mapping = { @@ -30,25 +30,6 @@ export function compileCast(from: Type, to: Type): Script { return []; } -export function compileGlobalFunction(fn: GlobalFunction): Script { - const mapping = { - [GlobalFunction.ABS]: [Op.OP_ABS], - [GlobalFunction.CHECKDATASIG]: [Op.OP_CHECKDATASIG], - [GlobalFunction.CHECKMULTISIG]: [Op.OP_CHECKMULTISIG], - [GlobalFunction.CHECKSIG]: [Op.OP_CHECKSIG], - [GlobalFunction.MAX]: [Op.OP_MAX], - [GlobalFunction.MIN]: [Op.OP_MIN], - [GlobalFunction.RIPEMD160]: [Op.OP_RIPEMD160], - [GlobalFunction.SHA1]: [Op.OP_SHA1], - [GlobalFunction.SHA256]: [Op.OP_SHA256], - [GlobalFunction.HASH160]: [Op.OP_HASH160], - [GlobalFunction.HASH256]: [Op.OP_HASH256], - [GlobalFunction.WITHIN]: [Op.OP_WITHIN], - }; - - return mapping[fn]; -} - export function compileBinaryOp(op: BinaryOperator, numeric: boolean = false): Script { const mapping: { [key in BinaryOperator]: Script } = { [BinaryOperator.MUL]: [Op.OP_MUL],

AltStyle によって変換されたページ (->オリジナル) /