ast_value **imm_string;
ast_value **imm_vector;
+ /* must be deleted first, they reference immediates and values */
+ ast_value **accessors;
+
ast_value *imm_float_zero;
ast_value *imm_vector_zero;
vec_push(func->blocks, body);
*out = fval;
+ vec_push(parser->accessors, fval);
+
return true;
}
}
/* sanity check */
- if (vec_size(params) > 8)
- parseerror(parser, "more than 8 parameters are currently not supported");
+ if (vec_size(params) > 8 && opts_standard == COMPILER_QCC)
+ (void)!parsewarning(parser, WARN_EXTENSIONS, "more than 8 parameters are not supported by this standard");
/* parse-out */
if (!parser_next(parser)) {
{
parser->lex = lex_open(filename);
if (!parser->lex) {
- con_out("failed to open file \"%s\"\n", filename);
+ con_err("failed to open file \"%s\"\n", filename);
+ return false;
+ }
+ return parser_compile();
+}
+
+bool parser_compile_string_len(const char *name, const char *str, size_t len)
+{
+ parser->lex = lex_open_string(str, len, name);
+ if (!parser->lex) {
+ con_err("failed to create lexer for string \"%s\"\n", name);
return false;
}
return parser_compile();
{
parser->lex = lex_open_string(str, strlen(str), name);
if (!parser->lex) {
- con_out("failed to create lexer for string \"%s\"\n", name);
+ con_err("failed to create lexer for string \"%s\"\n", name);
return false;
}
return parser_compile();
void parser_cleanup()
{
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) {
ast_delete(parser->functions[i]);
}
ast_delete(parser->globals[i].var);
mem_d(parser->globals[i].name);
}
+ vec_free(parser->accessors);
vec_free(parser->functions);
vec_free(parser->imm_vector);
vec_free(parser->imm_string);