From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTP id A5435248C2 for ; Wed, 10 Jul 2019 07:01:12 -0400 (EDT) Received: from turing.freelists.org ([127.0.0.1]) by localhost (turing.freelists.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id TTjzyYrwbayg for ; Wed, 10 Jul 2019 07:01:12 -0400 (EDT) Received: from smtp60.i.mail.ru (smtp60.i.mail.ru [217.69.128.40]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTPS id E00E52064D for ; Wed, 10 Jul 2019 07:01:11 -0400 (EDT) From: Kirill Shcherbatov Subject: [tarantool-patches] [PATCH v2 11/12] box: use own vtab per each function object Date: Wed, 10 Jul 2019 14:00:59 +0300 Message-Id: In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: tarantool-patches-bounce@freelists.org Errors-to: tarantool-patches-bounce@freelists.org Reply-To: tarantool-patches@freelists.org List-Help: List-Unsubscribe: List-software: Ecartis version 1.0.0 List-Id: tarantool-patches List-Subscribe: List-Owner: List-post: List-Archive: To: tarantool-patches@freelists.org, korablev@tarantool.org Cc: kostja@tarantool.org, Kirill Shcherbatov Tarantool functions used to refer to a static func_vtab object based on it's type. With this patch, each function has own vtab object, so it's virtual method may be overridden. It is required to call builtin functions in func_call directly in further patches. Needed for #4113, #2200, #2233 --- src/box/func.c | 8 +++----- src/box/func.h | 2 +- src/box/lua/call.c | 8 ++------ src/box/sql/func.c | 3 +-- 4 files changed, 7 insertions(+), 14 deletions(-) diff --git a/src/box/func.c b/src/box/func.c index 8d93a83b2..e36649d15 100644 --- a/src/box/func.c +++ b/src/box/func.c @@ -437,7 +437,7 @@ func_c_new(struct func_def *def) diag_set(OutOfMemory, sizeof(*func), "malloc", "func"); return NULL; } - func->base.vtab = &func_c_vtab; + func->base.vtab = func_c_vtab; func->func = NULL; func->module = NULL; return &func->base; @@ -462,7 +462,6 @@ func_c_unload(struct func_c *func) static void func_c_destroy(struct func *base) { - assert(base->vtab == &func_c_vtab); assert(base != NULL && base->def->language == FUNC_LANGUAGE_C); struct func_c *func = (struct func_c *) base; func_c_unload(func); @@ -505,7 +504,6 @@ func_c_load(struct func_c *func) int func_c_call(struct func *base, struct port *args, struct port *ret) { - assert(base->vtab == &func_c_vtab); assert(base != NULL && base->def->language == FUNC_LANGUAGE_C); struct func_c *func = (struct func_c *) base; if (func->func == NULL) { @@ -551,7 +549,7 @@ void func_delete(struct func *func) { struct func_def *def = func->def; - func->vtab->destroy(func); + func->vtab.destroy(func); free(def); } @@ -617,7 +615,7 @@ func_call(struct func *base, struct port *args, struct port *ret) } fiber_set_user(fiber(), &base->owner_credentials); } - int rc = base->vtab->call(base, args, ret); + int rc = base->vtab.call(base, args, ret); /* Restore the original user */ if (orig_credentials) fiber_set_user(fiber(), orig_credentials); diff --git a/src/box/func.h b/src/box/func.h index 2236fd873..7e4dd37a3 100644 --- a/src/box/func.h +++ b/src/box/func.h @@ -72,7 +72,7 @@ struct func_vtab { struct func { struct func_def *def; /** Virtual method table. */ - const struct func_vtab *vtab; + struct func_vtab vtab; /** * Authentication id of the owner of the function, * used for set-user-id functions. diff --git a/src/box/lua/call.c b/src/box/lua/call.c index 4297218cd..752f05745 100644 --- a/src/box/lua/call.c +++ b/src/box/lua/call.c @@ -708,14 +708,14 @@ func_lua_new(struct func_def *def) } if (def->body != NULL) { func->base.def = def; - func->base.vtab = &func_persistent_lua_vtab; + func->base.vtab = func_persistent_lua_vtab; if (func_persistent_lua_load(func) != 0) { free(func); return NULL; } } else { func->lua_ref = LUA_REFNIL; - func->base.vtab = &func_lua_vtab; + func->base.vtab = func_lua_vtab; } return &func->base; } @@ -724,7 +724,6 @@ static void func_lua_destroy(struct func *func) { assert(func != NULL && func->def->language == FUNC_LANGUAGE_LUA); - assert(func->vtab == &func_lua_vtab); free(func); } @@ -732,7 +731,6 @@ static inline int func_lua_call(struct func *func, struct port *args, struct port *ret) { assert(func != NULL && func->def->language == FUNC_LANGUAGE_LUA); - assert(func->vtab == &func_lua_vtab); return box_lua_call(func->def->name, func->def->name_len, args, ret); } @@ -752,7 +750,6 @@ func_persistent_lua_destroy(struct func *base) { assert(base != NULL && base->def->language == FUNC_LANGUAGE_LUA && base->def->body != NULL); - assert(base->vtab == &func_persistent_lua_vtab); struct func_lua *func = (struct func_lua *) base; func_persistent_lua_unload(func); free(func); @@ -763,7 +760,6 @@ func_persistent_lua_call(struct func *base, struct port *args, struct port *ret) { assert(base != NULL && base->def->language == FUNC_LANGUAGE_LUA && base->def->body != NULL); - assert(base->vtab == &func_persistent_lua_vtab); struct func_lua *func = (struct func_lua *)base; struct execute_lua_ctx ctx; ctx.lua_ref = func->lua_ref; diff --git a/src/box/sql/func.c b/src/box/sql/func.c index 18db8530d..f79939cb6 100644 --- a/src/box/sql/func.c +++ b/src/box/sql/func.c @@ -2183,14 +2183,13 @@ func_sql_builtin_new(struct func_def *def) } /** Don't export SQL builtins in Lua for now. */ def->exports.lua = false; - func->base.vtab = &func_sql_builtin_vtab; + func->base.vtab = func_sql_builtin_vtab; return &func->base; } static void func_sql_builtin_destroy(struct func *base) { - assert(base->vtab == &func_sql_builtin_vtab); assert(base != NULL && base->def->language == FUNC_LANGUAGE_SQL_BUILTIN); free(base); } -- 2.21.0