int slang_variable_copy(slang_variable * x, const slang_variable * y) { slang_variable z; if (!slang_variable_construct(&z)) return 0; if (!slang_fully_specified_type_copy(&z.type, &y->type)) { slang_variable_destruct(&z); return 0; } z.a_name = y->a_name; z.array_len = y->array_len; if (y->initializer != NULL) { z.initializer = (slang_operation *) _slang_alloc(sizeof(slang_operation)); if (z.initializer == NULL) { slang_variable_destruct(&z); return 0; } if (!slang_operation_construct(z.initializer)) { _slang_free(z.initializer); slang_variable_destruct(&z); return 0; } if (!slang_operation_copy(z.initializer, y->initializer)) { slang_variable_destruct(&z); return 0; } } z.size = y->size; slang_variable_destruct(x); *x = z; return 1; }
int slang_variable_scope_copy (slang_variable_scope *x, const slang_variable_scope *y) { slang_variable_scope z; unsigned int i; if (!slang_variable_scope_construct (&z)) return 0; z.variables = (slang_variable *) slang_alloc_malloc (y->num_variables * sizeof (slang_variable)); if (z.variables == NULL) { slang_variable_scope_destruct (&z); return 0; } for (z.num_variables = 0; z.num_variables < y->num_variables; z.num_variables++) if (!slang_variable_construct (&z.variables[z.num_variables])) { slang_variable_scope_destruct (&z); return 0; } for (i = 0; i < z.num_variables; i++) if (!slang_variable_copy (&z.variables[i], &y->variables[i])) { slang_variable_scope_destruct (&z); return 0; } z.outer_scope = y->outer_scope; slang_variable_scope_destruct (x); *x = z; return 1; }
static slang_variable * slang_variable_new(void) { slang_variable *v = (slang_variable *) _slang_alloc(sizeof(slang_variable)); if (v) { if (!slang_variable_construct(v)) { _slang_free(v); v = NULL; } } return v; }
int slang_function_construct (slang_function *func) { func->kind = slang_func_ordinary; if (!slang_variable_construct (&func->header)) return 0; func->parameters = (slang_variable_scope *) slang_alloc_malloc (sizeof (slang_variable_scope)); if (func->parameters == NULL) { slang_variable_destruct (&func->header); return 0; } if (!slang_variable_scope_construct (func->parameters)) { slang_alloc_free (func->parameters); slang_variable_destruct (&func->header); return 0; } func->param_count = 0; func->body = NULL; func->address = ~0; slang_fixup_table_init (&func->fixups); return 1; }