From 37d5e35437df393cd23e90f72579dea8d91fdea0 Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Thu, 4 Mar 2021 15:52:53 +0100 Subject: object: introduce uc_protoref_new() The new uc_protoref_new() function allows creating array or object values with prototype references. Signed-off-by: Jo-Philipp Wich --- object.c | 23 +++++++++++++++++++++++ object.h | 1 + 2 files changed, 24 insertions(+) diff --git a/object.c b/object.c index 5841f76..4e49ac4 100644 --- a/object.c +++ b/object.c @@ -316,6 +316,29 @@ uc_prototype_new(uc_prototype *parent) return proto; } +uc_prototype * +uc_protoref_new(json_object *value, uc_prototype *proto) +{ + uc_prototype *ref; + + if (!json_object_is_type(value, json_type_object) && + !json_object_is_type(value, json_type_array)) + return NULL; + + ref = xalloc(sizeof(*ref)); + ref->header.type = UC_OBJ_PROTOTYPE; + ref->header.jso = value; + + if (proto) { + ref->parent = proto; + uc_value_get(proto->header.jso); + } + + json_object_set_serializer(ref->header.jso, NULL, ref, uc_prototype_gc); + + return ref; +} + static uc_ressource_types res_types; diff --git a/object.h b/object.h index ba08651..069f9ed 100644 --- a/object.h +++ b/object.h @@ -118,6 +118,7 @@ uc_closure *uc_closure_new(uc_function *function, bool arrow_fn); uc_cfunction *uc_cfunction_new(const char *name, uc_cfn_ptr cfn); uc_regexp *uc_regexp_new(const char *pattern, bool icase, bool newline, bool global, char **err); uc_prototype *uc_prototype_new(uc_prototype *parent); +uc_prototype *uc_protoref_new(json_object *value, uc_prototype *proto); uc_ressource_type *uc_ressource_type_add(const char *name, uc_prototype *proto, void (*freefn)(void *)); uc_ressource_type *uc_ressource_type_lookup(const char *name); -- cgit v1.2.3