#include "php.h"
#include "php_scandir.h"
#include "php_psi.h"
-#include "context.h"
-#include "parser.h"
#include "libjit.h"
#include "libffi.h"
return rv;
}
+int psi_printf(const char *fmt, ...) {
+ int rs;
+ char *a1;
+ va_list ap1, ap2;
+
+ va_start(ap1, fmt);
+ va_copy(ap2, ap1);
+ a1 = va_arg(ap2, char *);
+ rs = vprintf(fmt, ap1);
+ va_end(ap1);
+ va_end(ap2);
+ return rs;
+}
+
static struct psi_func_redir {
const char *name;
void (*func)(void);
} psi_func_redirs[] = {
{"glob", (void (*)(void)) psi_glob},
+ {"printf", (void (*)(void)) psi_printf},
PSI_REDIRS
{0}
};
static inline int validate_decl_arg(PSI_Data *data, decl_arg *arg) {
if (!validate_decl_type(data, arg->type)) {
- data->error(PSI_WARNING, "Cannot use '%s'(%d) as type for '%s'",
- arg->type->name, arg->type->type, arg->var->name);
+ data->error(PSI_WARNING, "Cannot use '%s'(%d) as type for decl var '%s'"
+ " in %s on line %zu at col %zu",
+ arg->type->name, arg->type->type, arg->var->name,
+ arg->type->token->file, arg->type->token->line, arg->type->token->col);
return 0;
}
return 1;
/* e.g. let foo = *bar; */
let->var->pointer_level = let->val->data.var->pointer_level;
let->var->arg = init_decl_arg(
- init_decl_type(real_decl_type(let->val->data.var->arg->type)->type,
+ init_decl_type(
+ real_decl_type(let->val->data.var->arg->type)->type,
real_decl_type(let->val->data.var->arg->type)->name),
- init_decl_var(let->var->name, let->var->pointer_level, let->var->array_size));
+ init_decl_var(
+ let->var->name,
+ let->var->pointer_level,
+ let->var->array_size));
break;
case PSI_LET_NUMEXP:
if (!validate_num_exp(data, impl->decl->args, impl->decl->func, let->val->data.num)) {
}
-void PSI_ContextCall(PSI_Context *C, impl_val *ret_val, decl *decl)
+void PSI_ContextCall(PSI_Context *C, decl_callinfo *decl_call, impl_vararg *va)
{
- C->ops->call(C, ret_val, decl);
+ C->ops->call(C, decl_call, va);
}
static inline void dump_decl_type(int fd, decl_type *t) {
dprintf(fd, "%s ", decl->abi->convention);
dump_decl_arg(fd, decl->func);
dprintf(fd, "(");
- if (decl->args) for (j = 0; j < decl->args->count; ++j) {
- if (j) {
- dprintf(fd, ", ");
+ if (decl->args) {
+ for (j = 0; j < decl->args->count; ++j) {
+ if (j) {
+ dprintf(fd, ", ");
+ }
+ dump_decl_arg(fd, decl->args->args[j]);
+ }
+ if (decl->args->varargs) {
+ dprintf(fd, ", ...");
}
- dump_decl_arg(fd, decl->args->args[j]);
}
dprintf(fd, ");\n");
}
impl *impl = C->impls->list[i];
dprintf(fd, "function %s(", impl->func->name);
- if (impl->func->args) for (j = 0; j < impl->func->args->count; ++j) {
- impl_arg *iarg = impl->func->args->args[j];
-
- dprintf(fd, "%s%s %s$%s",
- j ? ", " : "",
- iarg->type->name,
- iarg->var->reference ? "&" : "",
- iarg->var->name);
- if (iarg->def) {
- dprintf(fd, " = %s", iarg->def->text);
+ if (impl->func->args) {
+ for (j = 0; j < impl->func->args->count; ++j) {
+ impl_arg *iarg = impl->func->args->args[j];
+
+ dprintf(fd, "%s%s %s$%s",
+ j ? ", " : "",
+ iarg->type->name,
+ iarg->var->reference ? "&" : "",
+ iarg->var->name);
+ if (iarg->def) {
+ dprintf(fd, " = %s", iarg->def->text);
+ }
+ }
+ if (impl->func->args->vararg.name) {
+ impl_arg *vararg = impl->func->args->vararg.name;
+
+ dprintf(fd, ", %s %s...$%s",
+ vararg->type->name,
+ vararg->var->reference ? "&" : "",
+ vararg->var->name);
}
}
dprintf(fd, ") : %s%s {\n",