To: vim_dev@googlegroups.com
Subject: Patch 8.1.0177
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
------------

Patch 8.1.0177
Problem:    Defining function in sandbox is inconsistent, cannot use :function
            but can define a lambda.
Solution:   Allow defining a function in the sandbox, but also use the sandbox
            when executing it. (closes #3182)
Files:	    src/userfunc.c, src/ex_cmds.h


*** ../vim-8.1.0176/src/userfunc.c	Sun Jul  8 17:18:58 2018
--- src/userfunc.c	Tue Jul 10 19:30:35 2018
***************
*** 14,26 ****
  #include "vim.h"
  
  #if defined(FEAT_EVAL) || defined(PROTO)
! /* function flags */
! #define FC_ABORT    0x01	/* abort function on error */
! #define FC_RANGE    0x02	/* function accepts range */
! #define FC_DICT	    0x04	/* Dict function, uses "self" */
! #define FC_CLOSURE  0x08	/* closure, uses outer scope variables */
! #define FC_DELETED  0x10	/* :delfunction used while uf_refcount > 0 */
! #define FC_REMOVED  0x20	/* function redefined while uf_refcount > 0 */
  
  /* From user function to hashitem and back. */
  #define UF2HIKEY(fp) ((fp)->uf_name)
--- 14,27 ----
  #include "vim.h"
  
  #if defined(FEAT_EVAL) || defined(PROTO)
! // flags used in uf_flags
! #define FC_ABORT    0x01	// abort function on error
! #define FC_RANGE    0x02	// function accepts range
! #define FC_DICT	    0x04	// Dict function, uses "self"
! #define FC_CLOSURE  0x08	// closure, uses outer scope variables
! #define FC_DELETED  0x10	// :delfunction used while uf_refcount > 0
! #define FC_REMOVED  0x20	// function redefined while uf_refcount > 0
! #define FC_SANDBOX  0x40	// function defined in the sandbox
  
  /* From user function to hashitem and back. */
  #define UF2HIKEY(fp) ((fp)->uf_name)
***************
*** 296,301 ****
--- 297,304 ----
  	if (prof_def_func())
  	    func_do_profile(fp);
  #endif
+ 	if (sandbox)
+ 	    flags |= FC_SANDBOX;
  	fp->uf_varargs = TRUE;
  	fp->uf_flags = flags;
  	fp->uf_calls = 0;
***************
*** 688,693 ****
--- 691,697 ----
      char_u	*save_sourcing_name;
      linenr_T	save_sourcing_lnum;
      scid_T	save_current_SID;
+     int		using_sandbox = FALSE;
      funccall_T	*fc;
      int		save_did_emsg;
      static int	depth = 0;
***************
*** 854,859 ****
--- 858,870 ----
      save_sourcing_name = sourcing_name;
      save_sourcing_lnum = sourcing_lnum;
      sourcing_lnum = 1;
+ 
+     if (fp->uf_flags & FC_SANDBOX)
+     {
+ 	using_sandbox = TRUE;
+ 	++sandbox;
+     }
+ 
      /* need space for function name + ("function " + 3) or "[number]" */
      len = (save_sourcing_name == NULL ? 0 : STRLEN(save_sourcing_name))
  						   + STRLEN(fp->uf_name) + 20;
***************
*** 1020,1025 ****
--- 1031,1038 ----
      if (do_profiling == PROF_YES)
  	script_prof_restore(&wait_start);
  #endif
+     if (using_sandbox)
+ 	--sandbox;
  
      if (p_verbose >= 12 && sourcing_name != NULL)
      {
***************
*** 2429,2434 ****
--- 2442,2449 ----
  	func_do_profile(fp);
  #endif
      fp->uf_varargs = varargs;
+     if (sandbox)
+ 	flags |= FC_SANDBOX;
      fp->uf_flags = flags;
      fp->uf_calls = 0;
      fp->uf_script_ID = current_SID;
*** ../vim-8.1.0176/src/ex_cmds.h	Tue Apr  3 22:07:59 2018
--- src/ex_cmds.h	Tue Jul 10 19:17:05 2018
***************
*** 584,590 ****
  			EXTRA|NOTRLCOM|SBOXOK|CMDWIN,
  			ADDR_LINES),
  EX(CMD_function,	"function",	ex_function,
! 			EXTRA|BANG|CMDWIN,
  			ADDR_LINES),
  EX(CMD_global,		"global",	ex_global,
  			RANGE|WHOLEFOLD|BANG|EXTRA|DFLALL|SBOXOK|CMDWIN,
--- 584,590 ----
  			EXTRA|NOTRLCOM|SBOXOK|CMDWIN,
  			ADDR_LINES),
  EX(CMD_function,	"function",	ex_function,
! 			EXTRA|BANG|SBOXOK|CMDWIN,
  			ADDR_LINES),
  EX(CMD_global,		"global",	ex_global,
  			RANGE|WHOLEFOLD|BANG|EXTRA|DFLALL|SBOXOK|CMDWIN,
*** ../vim-8.1.0176/src/version.c	Tue Jul 10 17:33:41 2018
--- src/version.c	Tue Jul 10 19:38:37 2018
***************
*** 791,792 ****
--- 791,794 ----
  {   /* Add new patch number below this line */
+ /**/
+     177,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
224. You set up your own Web page. You set up a Web page for each
     of your kids... and your pets.

 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///