X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fcontext.h;h=73d13cdf167806de3a2ae02ad3309c456096619f;hp=386304b718647c8611a72ec7369e861168cca208;hb=c9384515a81cb64d345b299908b2852f51bb8e6e;hpb=b4a3c33fc143fd57288fcfe0878e7a22eeaf61bf diff --git a/src/context.h b/src/context.h index 386304b..73d13cd 100644 --- a/src/context.h +++ b/src/context.h @@ -1,39 +1,82 @@ -#ifndef _PSI_CONTEXT_H -#define _PSI_CONTEXT_H +/******************************************************************************* + Copyright (c) 2016, Michael Wallner . + All rights reserved. -#include "parser.h" + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: -#define PSI_ERROR 16 -#define PSI_WARNING 32 -typedef void (*PSI_ContextErrorFunc)(PSI_Token *token, int type, const char *msg, ...); + * 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. -typedef struct PSI_Context PSI_Context; -typedef struct PSI_ContextOps PSI_ContextOps; + 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. +*******************************************************************************/ -struct PSI_ContextOps { - void (*init)(PSI_Context *C); - void (*dtor)(PSI_Context *C); - zend_function_entry *(*compile)(PSI_Context *C); - void (*call)(PSI_Context *C, decl_callinfo *decl_call, impl_vararg *va); +#ifndef PSI_CONTEXT_H +#define PSI_CONTEXT_H + +/* zend_function_entry */ +#include "Zend/zend_API.h" + +struct psi_context; +struct psi_token; +struct psi_parser; +struct psi_call_frame; +struct impl_vararg; +struct psi_decl; +struct psi_impl; + +enum psi_context_query { + PSI_CONTEXT_QUERY_SELF, /* ffi/jit */ + PSI_CONTEXT_QUERY_TYPE, /* impl type token_t to native ffi_type/jit_type */ +}; + +struct psi_context_ops { + ZEND_RESULT_CODE (*load)(void); + void (*free)(void); + void (*init)(struct psi_context *C); + void (*dtor)(struct psi_context *C); + zend_function_entry *(*compile)(struct psi_context *C); + void (*call)(struct psi_call_frame *frame); + void *(*query)(struct psi_context *C, enum psi_context_query q, void *arg); }; -struct PSI_Context { +#include "data.h" + +struct psi_context { PSI_DATA_MEMBERS; void *context; - struct PSI_ContextOps *ops; + struct psi_context_ops *ops; zend_function_entry *closures; - PSI_Data *data; + struct psi_data *data; size_t count; }; -PSI_Context *PSI_ContextInit(PSI_Context *C, PSI_ContextOps *ops, PSI_ContextErrorFunc error); -void PSI_ContextBuild(PSI_Context *C, const char *path); -int PSI_ContextValidate(PSI_Context *C, PSI_Parser *P); -void PSI_ContextValidatePredef(PSI_Context *C, PSI_Data *D); -zend_function_entry *PSI_ContextCompile(PSI_Context *C); -void PSI_ContextCall(PSI_Context *C, decl_callinfo *decl_call, impl_vararg *va); -void PSI_ContextDump(PSI_Context *C, int fd); -void PSI_ContextDtor(PSI_Context *C); -void PSI_ContextFree(PSI_Context **C); +struct psi_context_call_data { + struct psi_context *context; + union { + struct psi_impl *fn; + struct psi_let_callback *cb; + } impl; +}; + +struct psi_context *psi_context_init(struct psi_context *C, struct psi_context_ops *ops, psi_error_cb error, unsigned flags); +void psi_context_build(struct psi_context *C, const char *path); +zend_function_entry *psi_context_compile(struct psi_context *C); +ZEND_RESULT_CODE psi_context_call(struct psi_context *C, zend_execute_data *execute_data, zval *return_value, struct psi_impl *impl); +void psi_context_dump(struct psi_context *C, int fd); +void psi_context_dtor(struct psi_context *C); +void psi_context_free(struct psi_context **C); #endif