unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Calling Lisp in C functions
@ 2021-09-21 19:38 Yuan Fu
  2021-09-22  5:45 ` Eli Zaretskii
  0 siblings, 1 reply; 7+ messages in thread
From: Yuan Fu @ 2021-09-21 19:38 UTC (permalink / raw)
  To: Emacs developers

What’s the best way to evaluate Lisp or call a Lisp function that could signal in a C function and then free allocated memory? I assume that I can’t just call the Lisp function and hope it doesn’t signal.

Yuan


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Calling Lisp in C functions
  2021-09-21 19:38 Calling Lisp in C functions Yuan Fu
@ 2021-09-22  5:45 ` Eli Zaretskii
  2021-09-23  3:59   ` Yuan Fu
  0 siblings, 1 reply; 7+ messages in thread
From: Eli Zaretskii @ 2021-09-22  5:45 UTC (permalink / raw)
  To: Yuan Fu; +Cc: emacs-devel

> From: Yuan Fu <casouri@gmail.com>
> Date: Tue, 21 Sep 2021 12:38:21 -0700
> 
> What’s the best way to evaluate Lisp or call a Lisp function that could signal in a C function and then free allocated memory? I assume that I can’t just call the Lisp function and hope it doesn’t signal.

You want to catch the errors in Lisp that you call from C?  If so, use
the safe_call functions we already have.

If all you want is make sure memory will be allocated, but don't mind
if the signal thrown by Lisp gets back to command loop, use
record_unwind_protect to register a function which will release the
memory.



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Calling Lisp in C functions
  2021-09-22  5:45 ` Eli Zaretskii
@ 2021-09-23  3:59   ` Yuan Fu
  2021-09-23  6:59     ` Eli Zaretskii
  0 siblings, 1 reply; 7+ messages in thread
From: Yuan Fu @ 2021-09-23  3:59 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Emacs developers



> On Sep 21, 2021, at 10:45 PM, Eli Zaretskii <eliz@gnu.org> wrote:
> 
>> From: Yuan Fu <casouri@gmail.com>
>> Date: Tue, 21 Sep 2021 12:38:21 -0700
>> 
>> What’s the best way to evaluate Lisp or call a Lisp function that could signal in a C function and then free allocated memory? I assume that I can’t just call the Lisp function and hope it doesn’t signal.
> 
> You want to catch the errors in Lisp that you call from C?  If so, use
> the safe_call functions we already have.
> 
> If all you want is make sure memory will be allocated, but don't mind
> if the signal thrown by Lisp gets back to command loop, use
> record_unwind_protect to register a function which will release the
> memory.

Thanks, I still don’t know how does stack works so here’s some naive questions:

I tried to write

ptrdiff_t count = SPECPDL_INDEX ();
record_unwind_protect_ptr (ts_delete_cursor, cursor);
...
return unbind_to (count, xxx);

But it give a type error, because ts_delete_cursor doesn’t take a void*. I guess I need to define a wrapper function to avoid that error? Can I use record_unwind_protect_ptr more than once? What does that count mean? What is specpdl?

Yuan


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Calling Lisp in C functions
  2021-09-23  3:59   ` Yuan Fu
@ 2021-09-23  6:59     ` Eli Zaretskii
  2021-09-23  7:47       ` Andreas Schwab
  2021-09-24 17:55       ` Yuan Fu
  0 siblings, 2 replies; 7+ messages in thread
From: Eli Zaretskii @ 2021-09-23  6:59 UTC (permalink / raw)
  To: Yuan Fu; +Cc: emacs-devel

> From: Yuan Fu <casouri@gmail.com>
> Date: Wed, 22 Sep 2021 20:59:00 -0700
> Cc: Emacs developers <emacs-devel@gnu.org>
> 
> I tried to write
> 
> ptrdiff_t count = SPECPDL_INDEX ();
> record_unwind_protect_ptr (ts_delete_cursor, cursor);
> ...
> return unbind_to (count, xxx);
> 
> But it give a type error, because ts_delete_cursor doesn’t take a void*. I guess I need to define a wrapper function to avoid that error?

Yes, see for example directory_files_internal_unwind and its usage in
dired.c.

> Can I use record_unwind_protect_ptr more than once?

Yes.

> What does that count mean?

It tells unbind_to how much of the unwind-protect stack to unwind.
See the definition of unbind_to in eval.c.

> What is specpdl?

It's an array used for manually managed stack for tracking unwinds and
other stuff by the Emacs Lisp machine.  See the comments for 'union
specbinding', starting at line 3135 of lisp.h.



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Calling Lisp in C functions
  2021-09-23  6:59     ` Eli Zaretskii
@ 2021-09-23  7:47       ` Andreas Schwab
  2021-09-24 17:55         ` Yuan Fu
  2021-09-24 17:55       ` Yuan Fu
  1 sibling, 1 reply; 7+ messages in thread
From: Andreas Schwab @ 2021-09-23  7:47 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Yuan Fu, emacs-devel

On Sep 23 2021, Eli Zaretskii wrote:

>> What is specpdl?
>
> It's an array used for manually managed stack for tracking unwinds and
> other stuff by the Emacs Lisp machine.  See the comments for 'union
> specbinding', starting at line 3135 of lisp.h.

pdl = push-down list.

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
"And now for something completely different."



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Calling Lisp in C functions
  2021-09-23  6:59     ` Eli Zaretskii
  2021-09-23  7:47       ` Andreas Schwab
@ 2021-09-24 17:55       ` Yuan Fu
  1 sibling, 0 replies; 7+ messages in thread
From: Yuan Fu @ 2021-09-24 17:55 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel



> On Sep 22, 2021, at 11:59 PM, Eli Zaretskii <eliz@gnu.org> wrote:
> 
>> From: Yuan Fu <casouri@gmail.com>
>> Date: Wed, 22 Sep 2021 20:59:00 -0700
>> Cc: Emacs developers <emacs-devel@gnu.org>
>> 
>> I tried to write
>> 
>> ptrdiff_t count = SPECPDL_INDEX ();
>> record_unwind_protect_ptr (ts_delete_cursor, cursor);
>> ...
>> return unbind_to (count, xxx);
>> 
>> But it give a type error, because ts_delete_cursor doesn’t take a void*. I guess I need to define a wrapper function to avoid that error?
> 
> Yes, see for example directory_files_internal_unwind and its usage in
> dired.c.
> 
>> Can I use record_unwind_protect_ptr more than once?
> 
> Yes.
> 
>> What does that count mean?
> 
> It tells unbind_to how much of the unwind-protect stack to unwind.
> See the definition of unbind_to in eval.c.
> 
>> What is specpdl?
> 
> It's an array used for manually managed stack for tracking unwinds and
> other stuff by the Emacs Lisp machine.  See the comments for 'union
> specbinding', starting at line 3135 of lisp.h.

Thanks, I think I know how it works now.

Yuan




^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Calling Lisp in C functions
  2021-09-23  7:47       ` Andreas Schwab
@ 2021-09-24 17:55         ` Yuan Fu
  0 siblings, 0 replies; 7+ messages in thread
From: Yuan Fu @ 2021-09-24 17:55 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: Eli Zaretskii, emacs-devel



> On Sep 23, 2021, at 12:47 AM, Andreas Schwab <schwab@linux-m68k.org> wrote:
> 
> On Sep 23 2021, Eli Zaretskii wrote:
> 
>>> What is specpdl?
>> 
>> It's an array used for manually managed stack for tracking unwinds and
>> other stuff by the Emacs Lisp machine.  See the comments for 'union
>> specbinding', starting at line 3135 of lisp.h.
> 
> pdl = push-down list.

Thanks!

Yuan



^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2021-09-24 17:55 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-21 19:38 Calling Lisp in C functions Yuan Fu
2021-09-22  5:45 ` Eli Zaretskii
2021-09-23  3:59   ` Yuan Fu
2021-09-23  6:59     ` Eli Zaretskii
2021-09-23  7:47       ` Andreas Schwab
2021-09-24 17:55         ` Yuan Fu
2021-09-24 17:55       ` Yuan Fu

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).