X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Ftypes%2Flet_val.h;h=c3b5f386528324dd87f6baa0d7e4f3d88fa2fee9;hp=e2827e21ad51e628a69dfb141de23bff474e4652;hb=2f5af21b263403997e154658635d6b6e6eaab453;hpb=898c6dac30d12d7fe56662d66a8e73c340926d64 diff --git a/src/types/let_val.h b/src/types/let_val.h index e2827e2..c3b5f38 100644 --- a/src/types/let_val.h +++ b/src/types/let_val.h @@ -1,6 +1,36 @@ -#ifndef _PSI_TYPES_LET_VAL_H -#define _PSI_TYPES_LET_VAL_H +/******************************************************************************* + Copyright (c) 2016, Michael Wallner . + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*******************************************************************************/ + +#ifndef PSI_TYPES_LET_VAL_H +#define PSI_TYPES_LET_VAL_H + +#include "decl_var.h" +#include "num_exp.h" +#include "let_calloc.h" +#include "let_callback.h" +#include "let_func.h" enum let_val_kind { PSI_LET_NULL, @@ -10,7 +40,9 @@ enum let_val_kind { PSI_LET_FUNC, PSI_LET_TMP, }; + #define PSI_LET_REFERENCE 0x1; + typedef struct let_val { enum let_val_kind kind; decl_var *var; @@ -29,53 +61,51 @@ typedef struct let_val { } flags; } let_val; -static inline let_val *init_let_val(enum let_val_kind kind, void *data) { - let_val *let = calloc(1, sizeof(*let)); - switch (let->kind = kind) { - case PSI_LET_NULL: - break; - case PSI_LET_NUMEXP: - let->data.num = data; - break; - case PSI_LET_CALLOC: - let->data.alloc = data; - break; +let_val* init_let_val(enum let_val_kind kind, void* data); +void free_let_val(let_val* let); +void dump_let_val(int fd, let_val *val, unsigned level, int last); + +struct psi_data; +struct impl; + +int validate_let_val(struct psi_data *data, let_val *val, decl_var *let_var, struct impl *impl); + +static inline decl_arg *locate_let_val_inner_ref(let_val *val) { + decl_arg *ref = NULL; + + switch (val->kind) { case PSI_LET_CALLBACK: - let->data.callback = data; + ref = val->data.callback->func->ref; break; case PSI_LET_FUNC: - let->data.func = data; + ref = val->data.func->ref; break; - case PSI_LET_TMP: - let->data.var = data; + default: break; - EMPTY_SWITCH_DEFAULT_CASE(); } - return let; + return ref; +} +static inline impl_var *locate_let_val_impl_var(let_val *val) { + if (val) { + switch (val->kind) { + case PSI_LET_CALLBACK: + return val->data.callback->func->var; + case PSI_LET_FUNC: + return val->data.func->var; + default: + break; + } + } + return NULL; } -static inline void free_let_val(let_val *let) { - switch (let->kind) { - case PSI_LET_NULL: - break; - case PSI_LET_NUMEXP: - free_num_exp(let->data.num); - break; - case PSI_LET_CALLOC: - free_let_calloc(let->data.alloc); - break; - case PSI_LET_CALLBACK: - free_let_callback(let->data.callback); - break; - case PSI_LET_FUNC: - free_let_func(let->data.func); - break; - case PSI_LET_TMP: - free_decl_var(let->data.var); - break; - EMPTY_SWITCH_DEFAULT_CASE(); +static inline const char *locate_let_val_varname(let_val *val) { + impl_var *var = locate_let_val_impl_var(val); + + if (var) { + return &var->name[1]; } - free(let); + return NULL; } #endif