瀏覽代碼

Better documentation for the GC of strings in the C API

Plus some other small changes.
Roberto Ierusalimschy 4 年之前
父節點
當前提交
613513d09f
共有 1 個文件被更改,包括 58 次插入20 次删除
  1. 58 20
      manual/manual.of

+ 58 - 20
manual/manual.of

@@ -2450,7 +2450,7 @@ When you call a Lua function
 without a fixed number of results @seeF{lua_call},
 without a fixed number of results @seeF{lua_call},
 Lua ensures that the stack has enough space for all results,
 Lua ensures that the stack has enough space for all results,
 but it does not ensure any extra space.
 but it does not ensure any extra space.
-So, before pushing anything in the stack after such a call
+So, before pushing anything on the stack after such a call
 you should use @Lid{lua_checkstack}.
 you should use @Lid{lua_checkstack}.
 
 
 }
 }
@@ -2497,6 +2497,39 @@ which behaves like a nil value.
 
 
 }
 }
 
 
+@sect3{constchar|@title{Pointers to strings}
+
+Several functions in the API return pointers (@T{const char*})
+to Lua strings in the stack.
+(See @Lid{lua_pushfstring}, @Lid{lua_pushlstring},
+@Lid{lua_pushstring}, and @Lid{lua_tolstring}.
+See also @Lid{luaL_checklstring}, @Lid{luaL_checkstring},
+and @Lid{luaL_tolstring} in the auxiliary library.)
+
+In general,
+Lua's garbage collection can free or move internal memory
+and then invalidate pointers to internal strings.
+To allow a safe use of these pointers,
+The API guarantees that any pointer to a string in a stack index
+is valid while the value at that index is neither modified nor popped.
+When the index is a pseudo-index (referring to an upvalue),
+the pointer is valid while the corresponding call is active and
+the corresponding upvalue is not modified.
+
+Some functions in the debug interface
+also return pointers to strings,
+namely @Lid{lua_getlocal}, @Lid{lua_getupvalue},
+@Lid{lua_setlocal}, and @Lid{lua_setupvalue}.
+For these functions, the pointer is guaranteed to
+be valid while the caller function is active and
+the given closure (if one was given) is in the stack.
+
+Except for these guarantees,
+the garbage collector is free to invalidate
+any pointer to internal strings.
+
+}
+
 }
 }
 
 
 @sect2{c-closure| @title{C Closures}
 @sect2{c-closure| @title{C Closures}
@@ -2791,7 +2824,7 @@ depending on the situation;
 an interrogation mark @Char{?} means that
 an interrogation mark @Char{?} means that
 we cannot know how many elements the function pops/pushes
 we cannot know how many elements the function pops/pushes
 by looking only at its arguments.
 by looking only at its arguments.
-(For instance, they may depend on what is on the stack.)
+(For instance, they may depend on what is in the stack.)
 The third field, @T{x},
 The third field, @T{x},
 tells whether the function may raise errors:
 tells whether the function may raise errors:
 @Char{-} means the function never raises any error;
 @Char{-} means the function never raises any error;
@@ -3584,6 +3617,10 @@ plus an associated block of raw memory with @id{size} bytes.
 @Lid{lua_setiuservalue} and @Lid{lua_getiuservalue}.)
 @Lid{lua_setiuservalue} and @Lid{lua_getiuservalue}.)
 
 
 The function returns the address of the block of memory.
 The function returns the address of the block of memory.
+Lua ensures that this address is valid as long as
+the corresponding userdata is alive @see{GC}.
+Moreover, if the userdata is marked for finalization @see{finalizers},
+its address is valid at least until the call to its finalizer.
 
 
 }
 }
 
 
@@ -3764,7 +3801,7 @@ This function is equivalent to @Lid{lua_pushcclosure} with no upvalues.
 @apii{0,1,v}
 @apii{0,1,v}
 
 
 Pushes onto the stack a formatted string
 Pushes onto the stack a formatted string
-and returns a pointer to this string.
+and returns a pointer to this string @see{constchar}.
 It is similar to the @ANSI{sprintf},
 It is similar to the @ANSI{sprintf},
 but has two important differences.
 but has two important differences.
 First,
 First,
@@ -3838,7 +3875,7 @@ the function returns.
 The string can contain any binary data,
 The string can contain any binary data,
 including @x{embedded zeros}.
 including @x{embedded zeros}.
 
 
-Returns a pointer to the internal copy of the string.
+Returns a pointer to the internal copy of the string @see{constchar}.
 
 
 }
 }
 
 
@@ -3865,7 +3902,7 @@ Lua will make or reuse an internal copy of the given string,
 so the memory at @id{s} can be freed or reused immediately after
 so the memory at @id{s} can be freed or reused immediately after
 the function returns.
 the function returns.
 
 
-Returns a pointer to the internal copy of the string.
+Returns a pointer to the internal copy of the string @see{constchar}.
 
 
 If @id{s} is @id{NULL}, pushes @nil and returns @id{NULL}.
 If @id{s} is @id{NULL}, pushes @nil and returns @id{NULL}.
 
 
@@ -4277,7 +4314,7 @@ otherwise, returns @id{NULL}.
 }
 }
 
 
 @APIEntry{void lua_toclose (lua_State *L, int index);|
 @APIEntry{void lua_toclose (lua_State *L, int index);|
-@apii{0,0,v}
+@apii{0,0,m}
 
 
 Marks the given index in the stack as a
 Marks the given index in the stack as a
 to-be-closed @Q{variable} @see{to-be-closed}.
 to-be-closed @Q{variable} @see{to-be-closed}.
@@ -4295,10 +4332,16 @@ by any other function in the API except @Lid{lua_settop} or @Lid{lua_pop}.
 This function should not be called for an index
 This function should not be called for an index
 that is equal to or below an active to-be-closed index.
 that is equal to or below an active to-be-closed index.
 
 
-This function can raise an out-of-memory error.
-In that case, the value in the given index is immediately closed,
+In the case of an out-of-memory error,
+the value in the given index is immediately closed,
 as if it was already marked.
 as if it was already marked.
 
 
+Note that, both in case of errors and of a regular return,
+by the time the @idx{__close} metamethod runs,
+the @N{C stack} was already unwound,
+so that any automatic C variable declared in the calling function
+will be out of scope.
+
 }
 }
 
 
 @APIEntry{lua_Integer lua_tointeger (lua_State *L, int index);|
 @APIEntry{lua_Integer lua_tointeger (lua_State *L, int index);|
@@ -4338,15 +4381,11 @@ then @id{lua_tolstring} also
 when @id{lua_tolstring} is applied to keys during a table traversal.)
 when @id{lua_tolstring} is applied to keys during a table traversal.)
 
 
 @id{lua_tolstring} returns a pointer
 @id{lua_tolstring} returns a pointer
-to a string inside the Lua state.
+to a string inside the Lua state @see{constchar}.
 This string always has a zero (@Char{\0})
 This string always has a zero (@Char{\0})
 after its last character (as @N{in C}),
 after its last character (as @N{in C}),
 but can contain other zeros in its body.
 but can contain other zeros in its body.
 
 
-Because Lua has garbage collection,
-there is no guarantee that the pointer returned by @id{lua_tolstring}
-will be valid after the corresponding Lua value is removed from the stack.
-
 }
 }
 
 
 @APIEntry{lua_Number lua_tonumber (lua_State *L, int index);|
 @APIEntry{lua_Number lua_tonumber (lua_State *L, int index);|
@@ -4708,7 +4747,7 @@ true if the function is a vararg function
 }
 }
 
 
 @item{@id{ftransfer}|
 @item{@id{ftransfer}|
-the index on the stack of the first value being @Q{transferred},
+the index in the stack of the first value being @Q{transferred},
 that is, parameters in a call or return values in a return.
 that is, parameters in a call or return values in a return.
 (The other values are in consecutive indices.)
 (The other values are in consecutive indices.)
 Using this index, you can access and modify these values
 Using this index, you can access and modify these values
@@ -4860,7 +4899,7 @@ an identification of the @emph{activation record}
 of the function executing at a given level.
 of the function executing at a given level.
 @N{Level 0} is the current running function,
 @N{Level 0} is the current running function,
 whereas level @M{n+1} is the function that has called level @M{n}
 whereas level @M{n+1} is the function that has called level @M{n}
-(except for tail calls, which do not count on the stack).
+(except for tail calls, which do not count in the stack).
 When called with a level greater than the stack depth,
 When called with a level greater than the stack depth,
 @Lid{lua_getstack} returns 0;
 @Lid{lua_getstack} returns 0;
 otherwise it returns 1.
 otherwise it returns 1.
@@ -4947,8 +4986,7 @@ For each event, the hook is called as explained below:
 @description{
 @description{
 
 
 @item{The call hook| is called when the interpreter calls a function.
 @item{The call hook| is called when the interpreter calls a function.
-The hook is called just after Lua enters the new function,
-before the function gets its arguments.
+The hook is called just after Lua enters the new function.
 }
 }
 
 
 @item{The return hook| is called when the interpreter returns from a function.
 @item{The return hook| is called when the interpreter returns from a function.
@@ -5038,7 +5076,7 @@ refer to the @id{n2}-th upvalue of the Lua closure at index @id{funcindex2}.
 
 
 
 
 @C{-------------------------------------------------------------------------}
 @C{-------------------------------------------------------------------------}
-@sect1{@title{The Auxiliary Library}
+@sect1{auxlib|@title{The Auxiliary Library}
 
 
 @simplesect{
 @simplesect{
 
 
@@ -5925,7 +5963,7 @@ it returns @id{NULL} instead of raising an error.
 Converts any Lua value at the given index to a @N{C string}
 Converts any Lua value at the given index to a @N{C string}
 in a reasonable format.
 in a reasonable format.
 The resulting string is pushed onto the stack and also
 The resulting string is pushed onto the stack and also
-returned by the function.
+returned by the function @see{constchar}.
 If @id{len} is not @id{NULL},
 If @id{len} is not @id{NULL},
 the function also sets @T{*len} with the string length.
 the function also sets @T{*len} with the string length.
 
 
@@ -8608,7 +8646,7 @@ which means the function running at level @id{f} of the call stack
 of the given thread:
 of the given thread:
 @N{level 0} is the current function (@id{getinfo} itself);
 @N{level 0} is the current function (@id{getinfo} itself);
 @N{level 1} is the function that called @id{getinfo}
 @N{level 1} is the function that called @id{getinfo}
-(except for tail calls, which do not count on the stack);
+(except for tail calls, which do not count in the stack);
 and so on.
 and so on.
 If @id{f} is a number greater than the number of active functions,
 If @id{f} is a number greater than the number of active functions,
 then @id{getinfo} returns @fail.
 then @id{getinfo} returns @fail.