mirror of
https://github.com/DarkPlacesEngine/gmqcc.git
synced 2025-02-02 04:31:53 +00:00
Merge branch 'master' into ftepp
This commit is contained in:
commit
f0d56d07fe
1 changed files with 24 additions and 30 deletions
54
parser.c
54
parser.c
|
@ -20,6 +20,9 @@ typedef struct {
|
||||||
ast_value **imm_string;
|
ast_value **imm_string;
|
||||||
ast_value **imm_vector;
|
ast_value **imm_vector;
|
||||||
|
|
||||||
|
/* must be deleted first, they reference immediates and values */
|
||||||
|
ast_value **accessors;
|
||||||
|
|
||||||
ast_value *imm_float_zero;
|
ast_value *imm_float_zero;
|
||||||
ast_value *imm_vector_zero;
|
ast_value *imm_vector_zero;
|
||||||
|
|
||||||
|
@ -2396,6 +2399,7 @@ static bool parser_create_array_accessor(parser_t *parser, ast_value *array, con
|
||||||
{
|
{
|
||||||
ast_function *func = NULL;
|
ast_function *func = NULL;
|
||||||
ast_value *fval = NULL;
|
ast_value *fval = NULL;
|
||||||
|
ast_block *body = NULL;
|
||||||
|
|
||||||
fval = ast_value_new(ast_ctx(array), funcname, TYPE_FUNCTION);
|
fval = ast_value_new(ast_ctx(array), funcname, TYPE_FUNCTION);
|
||||||
if (!fval) {
|
if (!fval) {
|
||||||
|
@ -2410,15 +2414,25 @@ static bool parser_create_array_accessor(parser_t *parser, ast_value *array, con
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body = ast_block_new(ast_ctx(array));
|
||||||
|
if (!body) {
|
||||||
|
parseerror(parser, "failed to create block for array accessor");
|
||||||
|
ast_delete(fval);
|
||||||
|
ast_delete(func);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec_push(func->blocks, body);
|
||||||
*out = fval;
|
*out = fval;
|
||||||
|
|
||||||
|
vec_push(parser->accessors, fval);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool parser_create_array_setter(parser_t *parser, ast_value *array, const char *funcname)
|
static bool parser_create_array_setter(parser_t *parser, ast_value *array, const char *funcname)
|
||||||
{
|
{
|
||||||
ast_expression *root = NULL;
|
ast_expression *root = NULL;
|
||||||
ast_block *body = NULL;
|
|
||||||
ast_value *index = NULL;
|
ast_value *index = NULL;
|
||||||
ast_value *value = NULL;
|
ast_value *value = NULL;
|
||||||
ast_function *func;
|
ast_function *func;
|
||||||
|
@ -2434,12 +2448,6 @@ static bool parser_create_array_setter(parser_t *parser, ast_value *array, const
|
||||||
func = fval->constval.vfunc;
|
func = fval->constval.vfunc;
|
||||||
fval->expression.next = (ast_expression*)ast_value_new(ast_ctx(array), "<void>", TYPE_VOID);
|
fval->expression.next = (ast_expression*)ast_value_new(ast_ctx(array), "<void>", TYPE_VOID);
|
||||||
|
|
||||||
body = ast_block_new(ast_ctx(array));
|
|
||||||
if (!body) {
|
|
||||||
parseerror(parser, "failed to create block for array accessor");
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
index = ast_value_new(ast_ctx(array), "index", TYPE_FLOAT);
|
index = ast_value_new(ast_ctx(array), "index", TYPE_FLOAT);
|
||||||
value = ast_value_copy((ast_value*)array->expression.next);
|
value = ast_value_copy((ast_value*)array->expression.next);
|
||||||
|
|
||||||
|
@ -2457,12 +2465,10 @@ static bool parser_create_array_setter(parser_t *parser, ast_value *array, const
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
vec_push(body->exprs, root);
|
vec_push(func->blocks[0]->exprs, root);
|
||||||
vec_push(func->blocks, body);
|
|
||||||
array->setter = fval;
|
array->setter = fval;
|
||||||
return true;
|
return true;
|
||||||
cleanup:
|
cleanup:
|
||||||
if (body) ast_delete(body);
|
|
||||||
if (index) ast_delete(index);
|
if (index) ast_delete(index);
|
||||||
if (value) ast_delete(value);
|
if (value) ast_delete(value);
|
||||||
if (root) ast_delete(root);
|
if (root) ast_delete(root);
|
||||||
|
@ -2474,7 +2480,6 @@ cleanup:
|
||||||
static bool parser_create_array_field_setter(parser_t *parser, ast_value *array, const char *funcname)
|
static bool parser_create_array_field_setter(parser_t *parser, ast_value *array, const char *funcname)
|
||||||
{
|
{
|
||||||
ast_expression *root = NULL;
|
ast_expression *root = NULL;
|
||||||
ast_block *body = NULL;
|
|
||||||
ast_value *entity = NULL;
|
ast_value *entity = NULL;
|
||||||
ast_value *index = NULL;
|
ast_value *index = NULL;
|
||||||
ast_value *value = NULL;
|
ast_value *value = NULL;
|
||||||
|
@ -2491,12 +2496,6 @@ static bool parser_create_array_field_setter(parser_t *parser, ast_value *array,
|
||||||
func = fval->constval.vfunc;
|
func = fval->constval.vfunc;
|
||||||
fval->expression.next = (ast_expression*)ast_value_new(ast_ctx(array), "<void>", TYPE_VOID);
|
fval->expression.next = (ast_expression*)ast_value_new(ast_ctx(array), "<void>", TYPE_VOID);
|
||||||
|
|
||||||
body = ast_block_new(ast_ctx(array));
|
|
||||||
if (!body) {
|
|
||||||
parseerror(parser, "failed to create block for array accessor");
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
entity = ast_value_new(ast_ctx(array), "entity", TYPE_ENTITY);
|
entity = ast_value_new(ast_ctx(array), "entity", TYPE_ENTITY);
|
||||||
index = ast_value_new(ast_ctx(array), "index", TYPE_FLOAT);
|
index = ast_value_new(ast_ctx(array), "index", TYPE_FLOAT);
|
||||||
value = ast_value_copy((ast_value*)array->expression.next);
|
value = ast_value_copy((ast_value*)array->expression.next);
|
||||||
|
@ -2515,12 +2514,10 @@ static bool parser_create_array_field_setter(parser_t *parser, ast_value *array,
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
vec_push(body->exprs, root);
|
vec_push(func->blocks[0]->exprs, root);
|
||||||
vec_push(func->blocks, body);
|
|
||||||
array->setter = fval;
|
array->setter = fval;
|
||||||
return true;
|
return true;
|
||||||
cleanup:
|
cleanup:
|
||||||
if (body) ast_delete(body);
|
|
||||||
if (entity) ast_delete(entity);
|
if (entity) ast_delete(entity);
|
||||||
if (index) ast_delete(index);
|
if (index) ast_delete(index);
|
||||||
if (value) ast_delete(value);
|
if (value) ast_delete(value);
|
||||||
|
@ -2533,7 +2530,6 @@ cleanup:
|
||||||
static bool parser_create_array_getter(parser_t *parser, ast_value *array, const ast_expression *elemtype, const char *funcname)
|
static bool parser_create_array_getter(parser_t *parser, ast_value *array, const ast_expression *elemtype, const char *funcname)
|
||||||
{
|
{
|
||||||
ast_expression *root = NULL;
|
ast_expression *root = NULL;
|
||||||
ast_block *body = NULL;
|
|
||||||
ast_value *index = NULL;
|
ast_value *index = NULL;
|
||||||
ast_value *fval;
|
ast_value *fval;
|
||||||
ast_function *func;
|
ast_function *func;
|
||||||
|
@ -2551,12 +2547,6 @@ static bool parser_create_array_getter(parser_t *parser, ast_value *array, const
|
||||||
func = fval->constval.vfunc;
|
func = fval->constval.vfunc;
|
||||||
fval->expression.next = ast_type_copy(ast_ctx(array), elemtype);
|
fval->expression.next = ast_type_copy(ast_ctx(array), elemtype);
|
||||||
|
|
||||||
body = ast_block_new(ast_ctx(array));
|
|
||||||
if (!body) {
|
|
||||||
parseerror(parser, "failed to create block for array accessor");
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
index = ast_value_new(ast_ctx(array), "index", TYPE_FLOAT);
|
index = ast_value_new(ast_ctx(array), "index", TYPE_FLOAT);
|
||||||
|
|
||||||
if (!index) {
|
if (!index) {
|
||||||
|
@ -2571,12 +2561,10 @@ static bool parser_create_array_getter(parser_t *parser, ast_value *array, const
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
vec_push(body->exprs, root);
|
vec_push(func->blocks[0]->exprs, root);
|
||||||
vec_push(func->blocks, body);
|
|
||||||
array->getter = fval;
|
array->getter = fval;
|
||||||
return true;
|
return true;
|
||||||
cleanup:
|
cleanup:
|
||||||
if (body) ast_delete(body);
|
|
||||||
if (index) ast_delete(index);
|
if (index) ast_delete(index);
|
||||||
if (root) ast_delete(root);
|
if (root) ast_delete(root);
|
||||||
ast_delete(func);
|
ast_delete(func);
|
||||||
|
@ -3450,6 +3438,11 @@ bool parser_compile_string(const char *name, const char *str)
|
||||||
void parser_cleanup()
|
void parser_cleanup()
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
|
for (i = 0; i < vec_size(parser->accessors); ++i) {
|
||||||
|
ast_delete(parser->accessors[i]->constval.vfunc);
|
||||||
|
parser->accessors[i]->constval.vfunc = NULL;
|
||||||
|
ast_delete(parser->accessors[i]);
|
||||||
|
}
|
||||||
for (i = 0; i < vec_size(parser->functions); ++i) {
|
for (i = 0; i < vec_size(parser->functions); ++i) {
|
||||||
ast_delete(parser->functions[i]);
|
ast_delete(parser->functions[i]);
|
||||||
}
|
}
|
||||||
|
@ -3470,6 +3463,7 @@ void parser_cleanup()
|
||||||
ast_delete(parser->globals[i].var);
|
ast_delete(parser->globals[i].var);
|
||||||
mem_d(parser->globals[i].name);
|
mem_d(parser->globals[i].name);
|
||||||
}
|
}
|
||||||
|
vec_free(parser->accessors);
|
||||||
vec_free(parser->functions);
|
vec_free(parser->functions);
|
||||||
vec_free(parser->imm_vector);
|
vec_free(parser->imm_vector);
|
||||||
vec_free(parser->imm_string);
|
vec_free(parser->imm_string);
|
||||||
|
|
Loading…
Reference in a new issue