/** * Copyright (c) 2026 Dominic Masters * * This software is released under the MIT License. * https://opensource.org/licenses/MIT */ #include "scriptcompiletypes.h" #include "util/memory.h" #include "expression/scriptcompileliteral.h" #include "builder/scriptbuilderemit.h" #include "builder/scriptbuilderstring.h" #include "builder/scriptbuilderlocal.h" #include "builder/scriptbuildernative.h" #include void scriptCompileLiteral(scriptbuilder_t *builder, const scriptnode_t *node) { uint16_t name; uint8_t slot; const scriptnativeconstant_t *constant; int32_t bits; switch(node->kind) { case SCRIPT_NODE_NUMBER: if(node->numberValue == (float)(int16_t)node->numberValue) { scriptBuilderOp(builder, SCRIPT_BC_PUSH_INT, 1); scriptBuilderU16(builder, (uint16_t)(int16_t)node->numberValue); } else { memoryCopy(&bits, &node->numberValue, sizeof(bits)); scriptBuilderOp(builder, SCRIPT_BC_PUSH_NUMBER, 1); scriptBuilderI32(builder, bits); } break; case SCRIPT_NODE_BOOL: scriptBuilderOp(builder, node->number != 0 ? SCRIPT_BC_PUSH_TRUE : SCRIPT_BC_PUSH_FALSE, 1); break; case SCRIPT_NODE_NULL: scriptBuilderOp(builder, SCRIPT_BC_PUSH_NULL, 1); break; case SCRIPT_NODE_UNDEFINED: scriptBuilderOp(builder, SCRIPT_BC_PUSH_UNDEFINED, 1); break; case SCRIPT_NODE_STRING: scriptBuilderOpFailing(builder, SCRIPT_BC_PUSH_STRING, 1); scriptBuilderU16(builder, scriptBuilderString(builder, node->text, node->length)); break; case SCRIPT_NODE_IDENT: constant = scriptBuilderConstantFind(builder, node); if(constant) { scriptBuilderOp(builder, SCRIPT_BC_PUSH_INT, 1); scriptBuilderU16(builder, (uint16_t)constant->value); break; } name = scriptBuilderName(builder, node->text); slot = scriptBuilderResolve(builder, name); if(slot == SCRIPT_COMPILE_BY_NAME) { scriptBuilderOp(builder, SCRIPT_BC_LOAD_VAR, 1); scriptBuilderU16(builder, name); } else { scriptBuilderOp(builder, SCRIPT_BC_LOAD_LOCAL, 1); scriptBuilderByte(builder, slot); } break; default: break; } }