From fe46a5d72f1a24d88f774c1bb1eb6e417d0e44b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?= <grubba@grubba.org> Date: Wed, 26 Feb 2014 23:59:26 +0100 Subject: [PATCH] Runtime: Added support for casting types to program. Casting an object type value to program will now result in the corresponding program. eg: program p = (program)_typeof(o); is approximately the same as program p = object_program(o); --- src/operators.c | 13 +++++++++++++ src/program.c | 17 +++++++++++++++++ src/program.h | 1 + 3 files changed, 31 insertions(+) diff --git a/src/operators.c b/src/operators.c index 4ddb629927..2edf7f9253 100644 --- a/src/operators.c +++ b/src/operators.c @@ -710,6 +710,19 @@ PMOD_EXPORT void o_cast(struct pike_type *type, INT32 run_time_type) } return; + case PIKE_T_TYPE: + { + struct pike_type *t = Pike_sp[-1].u.type; + struct program *p = program_from_type(t); + pop_stack(); + if (p) { + ref_push_program(p); + } else { + push_int(0); + } + return; + } + default: Pike_error("Cannot cast %s to a program.\n", get_name_of_type(TYPEOF(sp[-1]))); diff --git a/src/program.c b/src/program.c index 0f66836685..489d054032 100644 --- a/src/program.c +++ b/src/program.c @@ -11471,6 +11471,19 @@ PMOD_EXPORT struct program *program_from_function(const struct svalue *f) return low_program_from_function(f->u.object, SUBTYPEOF(*f)); } +static const struct pike_type *is_subtyped_object_type(struct pike_type *t) +{ + if ((t->type == T_OBJECT) && t->cdr) return t; + return NULL; +} + +PMOD_EXPORT struct program *program_from_type(const struct pike_type *t) +{ + t = find_type(t, is_subtyped_object_type); + if (!t) return NULL; + return id_to_program((int)(ptrdiff_t)t->cdr); +} + /* NOTE: Does not add references to the return value! */ PMOD_EXPORT struct program *low_program_from_svalue(const struct svalue *s, struct object **parent_obj, @@ -11510,6 +11523,10 @@ PMOD_EXPORT struct program *low_program_from_svalue(const struct svalue *s, case T_PROGRAM: return s->u.program; + + case PIKE_T_TYPE: + return program_from_type(s->u.type); + default: return 0; } diff --git a/src/program.h b/src/program.h index 1a09732b35..f127ac7aa6 100644 --- a/src/program.h +++ b/src/program.h @@ -1042,6 +1042,7 @@ PMOD_EXPORT ptrdiff_t low_get_storage(struct program *o, struct program *p); PMOD_EXPORT char *get_storage(struct object *o, struct program *p); PMOD_EXPORT struct program *low_program_from_function(struct object *o, INT32 i); PMOD_EXPORT struct program *program_from_function(const struct svalue *f); +PMOD_EXPORT struct program *program_from_type(const struct pike_type *t); PMOD_EXPORT struct program *low_program_from_svalue(const struct svalue *s, struct object **parent_obj, int *parent_id); -- GitLab