diff --git a/src/operators.c b/src/operators.c index 4ddb6299274ee1649d70573b55e475fa6a4f95df..2edf7f925308f354b5ea77cbc00b341feb0e9a0c 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 0f66836685694a9fd16a2ff5b3cb9c89017658b3..489d0540321f7f38c4816f30f8f03ea420932fa1 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 1a09732b359531098414368673d75c988f152164..f127ac7aa670e1f658f4a2f3ed54a437a91dd150 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);