util/memory.h had landed as the very first #include in ~30 files from the mechanical memcpy/memcmp conversion, ahead of each file's own umbrella type header - moves it back after, matching the rest of the codebase's ordering. Also updates a scriptplatform.h comment left over from the int/fixed/bignum split, and drops an unused util/string.h include in scriptcompile.c. Co-Authored-By: Claude Sonnet 5 <[email protected]>
74 lines
2.2 KiB
C
74 lines
2.2 KiB
C
/**
|
|
* 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 <string.h>
|
|
|
|
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;
|
|
}
|
|
}
|