* stack size info
@ 2007-03-20 13:22 A Soare
2007-03-20 16:14 ` ttn
0 siblings, 1 reply; 9+ messages in thread
From: A Soare @ 2007-03-20 13:22 UTC (permalink / raw)
To: Emacs Dev [emacs-devel]
16.7 Byte-Code Function Objects
===============================
STACKSIZE
The maximum stack size this function needs.
------------------------------
(defun p (n)
"sum"
(if (> n 1) (+ n (p (1- n)))
n))
(byte-compile 'p)
(symbol-function 'p)
#[(n)
"..."
[n 1 p]
3 <=<= here is the stack size.
"sum"]
But I believe that a recursive function has the stack greater, 3*n, not 3. For every recursion I believe that the stack size get greater with 3, so the stack is dependent of n. Is it true?
Is this a little error of explanation in INFO file?
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: stack size info
2007-03-20 13:22 stack size info A Soare
@ 2007-03-20 16:14 ` ttn
0 siblings, 0 replies; 9+ messages in thread
From: ttn @ 2007-03-20 16:14 UTC (permalink / raw)
To: alinsoar; +Cc: emacs-devel
From: A Soare <alinsoar@voila.fr>
Date: Tue, 20 Mar 2007 14:22:14 +0100 (CET)
#[(n)
"..."
[n 1 p]
3 <=<= here is the stack size.
"sum"]
But I believe that a recursive function has the stack greater, 3*n,
not 3. For every recursion I believe that the stack size get greater
with 3, so the stack is dependent of n. Is it true?
Is this a little error of explanation in INFO file?
i think the intention of the documentation is that "this function" means
this "this function call". to me it seems pretty clear, but that may be
due to recent coffee intake... could you suggest a change to make the
explanation clearer for you?
thi
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: stack size info
@ 2007-03-22 15:19 A Soare
2007-03-22 18:24 ` David Kastrup
0 siblings, 1 reply; 9+ messages in thread
From: A Soare @ 2007-03-22 15:19 UTC (permalink / raw)
To: ttn; +Cc: Emacs Dev [emacs-devel]
STACKSIZE
The maximum stack size this function needs. In case of recursion,
every recursive call grows function's stack size with this constant.
########
This is a litte better?
It is mecessary to use "maximum". It is not an exact quantity?
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: stack size info
2007-03-22 15:19 A Soare
@ 2007-03-22 18:24 ` David Kastrup
2007-03-23 15:01 ` Thien-Thi Nguyen
0 siblings, 1 reply; 9+ messages in thread
From: David Kastrup @ 2007-03-22 18:24 UTC (permalink / raw)
To: alinsoar; +Cc: ttn, Emacs Dev [emacs-devel]
A Soare <alinsoar@voila.fr> writes:
> STACKSIZE
> The maximum stack size this function needs. In case of recursion,
> every recursive call grows function's stack size with this constant.
>
> ########
>
> This is a litte better?
I don't think so. My guess is "The maximum stack size this function
needs for execution, disregarding further (including recursive)
function calls as those extend the stack on their own."
--
David Kastrup, Kriemhildstr. 15, 44793 Bochum
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: stack size info
2007-03-22 18:24 ` David Kastrup
@ 2007-03-23 15:01 ` Thien-Thi Nguyen
2007-03-23 16:00 ` Stefan Monnier
0 siblings, 1 reply; 9+ messages in thread
From: Thien-Thi Nguyen @ 2007-03-23 15:01 UTC (permalink / raw)
To: alinsoar, emacs-devel
From: David Kastrup <dak@gnu.org>
Date: Thu, 22 Mar 2007 19:24:10 +0100
A Soare <alinsoar@voila.fr> writes:
> STACKSIZE
> The maximum stack size this function needs. In case of recursion,
> every recursive call grows function's stack size with this constant.
>
> ########
>
> This is a litte better?
I don't think so. My guess is "The maximum stack size this function
needs for execution, disregarding further (including recursive)
function calls as those extend the stack on their own."
i'm inclined to leave the docs alone. the node's entire context is a
single function and thus the STACKSIZE element of the byte-code function
object pertains to a single function call.
however, if pressed, i will suggest:
The maximum stack size this function might need when called.
"might" because it is possible that any particular call uses less than
that amount. "when called" addresses recursion.
is that wording ok?
thi
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: stack size info
@ 2007-03-23 15:08 A Soare
2007-03-24 13:38 ` Thien-Thi Nguyen
0 siblings, 1 reply; 9+ messages in thread
From: A Soare @ 2007-03-23 15:08 UTC (permalink / raw)
To: ttn; +Cc: Emacs Dev [emacs-devel]
> From: David Kastrup <dak@gnu.org>
> Date: Thu, 22 Mar 2007 19:24:10 +0100
>
> A Soare <alinsoar@voila.fr> writes:
>
> > STACKSIZE
> > The maximum stack size this function needs. In case of recursion,
> > every recursive call grows function's stack size with this constant.
> >
> > ########
> >
> > This is a litte better?
>
> I don't think so. My guess is "The maximum stack size this function
> needs for execution, disregarding further (including recursive)
> function calls as those extend the stack on their own."
>
> i'm inclined to leave the docs alone. the node's entire context is a
> single function and thus the STACKSIZE element of the byte-code function
> object pertains to a single function call.
I think this problem is not at all important, but at a first glance one can imagine something wrong.
>
> however, if pressed, i will suggest:
> The maximum stack size this function might need when called.
>
> "might" because it is possible that any particular call uses less than
> that amount. "when called" addresses recursion.
>
As you wish.
One more important question is "The maximum stack size" or just simply "the stack size". I can not imagine an example in which this STACKSIZE is greater than the actual real size. Can somebody help me with an example, please?
Thanks.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: stack size info
2007-03-23 15:01 ` Thien-Thi Nguyen
@ 2007-03-23 16:00 ` Stefan Monnier
0 siblings, 0 replies; 9+ messages in thread
From: Stefan Monnier @ 2007-03-23 16:00 UTC (permalink / raw)
To: ttn; +Cc: alinsoar, emacs-devel
> I don't think so. My guess is "The maximum stack size this function
> needs for execution, disregarding further (including recursive)
> function calls as those extend the stack on their own."
> i'm inclined to leave the docs alone. the node's entire context is a
> single function and thus the STACKSIZE element of the byte-code function
> object pertains to a single function call.
> however, if pressed, i will suggest:
> The maximum stack size this function might need when called.
> "might" because it is possible that any particular call uses less than
> that amount. "when called" addresses recursion.
Maybe it could be called a "stack frame".
And I'd use the word "upper bound" rather than maximum.
Also I'd use the word "use" rather than "need".
Stefan
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: stack size info
2007-03-23 15:08 A Soare
@ 2007-03-24 13:38 ` Thien-Thi Nguyen
0 siblings, 0 replies; 9+ messages in thread
From: Thien-Thi Nguyen @ 2007-03-24 13:38 UTC (permalink / raw)
To: alinsoar; +Cc: emacs-devel
From: A Soare <alinsoar@voila.fr>
Date: Fri, 23 Mar 2007 16:08:46 +0100 (CET)
I can not imagine an example in which this STACKSIZE is greater than
the actual real size. Can somebody help me with an example, please?
following is an example (created in the *scratch* buffer, btw, so
you can try to recreate it for yourself, as well). the annotations
(comments) on the right were added by hand.
there are two functions and three function calls. the second and
third calls illustrate how one function might use a different amount
of stack depending on its operating environment (in this case, the
value of its arg OBJECT). that amount is at most 4, which coincides
(purposefully) with the STACKSIZE element in the byte-code function
object for `maybe'.
to understand in more detail, you will need to understand how each
operation interacts with the stack (if at all). for more info,
place the cursor after the following form and type `C-x C-e':
(info "(elisp)Disassembly")
btw, the construct `(or (byte-compile FOO) (symbol-function FOO))'
is because `byte-compile' returns nil if FOO is already compiled.
thi
___________________________________________________
(defun no-op () t)
no-op
(disassemble (or (byte-compile 'no-op)
(symbol-function 'no-op))
(current-buffer))
byte code:
args: nil ; stack usage
0 constant t ; 1
1 return ; 0
(defun maybe (object)
(when object
(let* ((a 42)
(b 6))
(when (= a (+ b (* b b)))
object))))
maybe
(disassemble (or (byte-compile 'maybe)
(symbol-function 'maybe))
(current-buffer))
byte code: ; OBJECT: nil
args: (object) ; stack usage
0 varref object ; 1
1 goto-if-nil-else-pop 2 ; (branch taken)
4 constant 42
5 varbind a
6 constant 6
7 varbind b
8 varref a
9 varref b
10 dup
11 dup
12 mult
13 plus
14 eqlsign
15 goto-if-nil-else-pop 1
18 varref object
19:1 unbind 2
20:2 return ; 0
(disassemble (or (byte-compile 'maybe)
(symbol-function 'maybe))
(current-buffer))
byte code: ; OBJECT: 42
args: (object) ; stack usage
0 varref object ; 1
1 goto-if-nil-else-pop 2 ; 0 (branch not taken)
4 constant 42 ; 1
5 varbind a ; 0
6 constant 6 ; 1
7 varbind b ; 0
8 varref a ; 1
9 varref b ; 2
10 dup ; 3
11 dup ; 4
12 mult ; 3
13 plus ; 2
14 eqlsign ; 1
15 goto-if-nil-else-pop 1 ; 0 (branch not taken)
18 varref object ; 1
19:1 unbind 2
20:2 return ; 0
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: stack size info
@ 2007-03-26 10:42 A Soare
0 siblings, 0 replies; 9+ messages in thread
From: A Soare @ 2007-03-26 10:42 UTC (permalink / raw)
To: ttn; +Cc: Emacs Dev [emacs-devel]
> I can not imagine an example in which this STACKSIZE is greater than
> the actual real size. Can somebody help me with an example, please?
>
> following is an example (created in the *scratch* buffer, btw, so
> you can try to recreate it for yourself, as well). the annotations
> (comments) on the right were added by hand.
>
> there are two functions and three function calls. the second and
> third calls illustrate how one function might use a different amount
> of stack depending on its operating environment (in this case, the
> value of its arg OBJECT). that amount is at most 4, which coincides
> (purposefully) with the STACKSIZE element in the byte-code function
> object for `maybe'.
>
> to understand in more detail, you will need to understand how each
> operation interacts with the stack (if at all). for more info,
> place the cursor after the following form and type `C-x C-e':
>
> (info "(elisp)Disassembly")
>
> btw, the construct `(or (byte-compile FOO) (symbol-function FOO))'
> is because `byte-compile' returns nil if FOO is already compiled.
>
> thi
>
> ___________________________________________________
>
> (defun no-op () t)
> no-op
>
> (disassemble (or (byte-compile 'no-op)
> (symbol-function 'no-op))
> (current-buffer))
> byte code:
> args: nil ; stack usage
> 0 constant t ; 1
> 1 return ; 0
>
> (defun maybe (object)
> (when object
> (let* ((a 42)
> (b 6))
> (when (= a (+ b (* b b)))
> object))))
> maybe
>
> (disassemble (or (byte-compile 'maybe)
> (symbol-function 'maybe))
> (current-buffer))
> byte code: ; OBJECT: nil
> args: (object) ; stack usage
> 0 varref object ; 1
> 1 goto-if-nil-else-pop 2 ; (branch taken)
> 4 constant 42
> 5 varbind a
> 6 constant 6
> 7 varbind b
> 8 varref a
> 9 varref b
> 10 dup
> 11 dup
> 12 mult
> 13 plus
> 14 eqlsign
> 15 goto-if-nil-else-pop 1
> 18 varref object
> 19:1 unbind 2
> 20:2 return ; 0
>
> (disassemble (or (byte-compile 'maybe)
> (symbol-function 'maybe))
> (current-buffer))
> byte code: ; OBJECT: 42
> args: (object) ; stack usage
> 0 varref object ; 1
> 1 goto-if-nil-else-pop 2 ; 0 (branch not taken)
> 4 constant 42 ; 1
> 5 varbind a ; 0
> 6 constant 6 ; 1
> 7 varbind b ; 0
> 8 varref a ; 1
> 9 varref b ; 2
> 10 dup ; 3
> 11 dup ; 4
> 12 mult ; 3
> 13 plus ; 2
> 14 eqlsign ; 1
> 15 goto-if-nil-else-pop 1 ; 0 (branch not taken)
> 18 varref object ; 1
> 19:1 unbind 2
> 20:2 return ; 0
>
>
>
Thank you very much.
Alin Soare.
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2007-03-26 10:42 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-03-20 13:22 stack size info A Soare
2007-03-20 16:14 ` ttn
-- strict thread matches above, loose matches on Subject: below --
2007-03-22 15:19 A Soare
2007-03-22 18:24 ` David Kastrup
2007-03-23 15:01 ` Thien-Thi Nguyen
2007-03-23 16:00 ` Stefan Monnier
2007-03-23 15:08 A Soare
2007-03-24 13:38 ` Thien-Thi Nguyen
2007-03-26 10:42 A Soare
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).