mirror of https://github.com/svaarala/duktape.git
Sami Vaarala
7 years ago
1 changed files with 57 additions and 0 deletions
@ -0,0 +1,57 @@ |
|||
name: duk_push_literal |
|||
|
|||
proto: | |
|||
const char *duk_push_literal(duk_context *ctx, const char *str); |
|||
|
|||
stack: | |
|||
[ ... ] -> [ ... str! ] |
|||
|
|||
summary: | |
|||
<p>Push a C literal into the stack and return a pointer to the interned |
|||
string data area (which may or may not be the same as the argument literal). |
|||
The argument <code>str</code must be a non-NULL C literal that can be |
|||
operated on using e.g. <code>sizeof(str)</code>. The data contents of the |
|||
literal must be immutable, and the string must not contain NUL characters. |
|||
The <code>str</code> argument may be evaluated multiple times by the API |
|||
macro. Finally, no runtime NULL pointer check is made for the |
|||
<code>str</code> argument so passing in a NULL causes memory unsafe |
|||
behavior.</p> |
|||
|
|||
<p>This call is conceptually equivalent to duk_push_(l)string(), and |
|||
only needs to be used if the minor differences in footprint or speed |
|||
matter. The properties of immutable literals allows minor optimizations |
|||
in Duktape internals:</p> |
|||
<ul> |
|||
<li>The length of the string can be computed at compile time using |
|||
<code>sizeof(str) - 1</code> at the call site.</li> |
|||
<li>Because the string data is assumed to be immutable, the internal |
|||
string representation could just point to the data instead of |
|||
making a copy. (This optimization is not done as of Duktape 2.3.)</li> |
|||
<li>Because the string address is fixed at runtime, it could be used |
|||
for speeding up a string table lookup for the literal. While common, |
|||
there's no assumption that strings are deduplicated, so there may be |
|||
multiple addresses with the same literal. (This optimization is not |
|||
done as of Duktape 2.3.)</li> |
|||
</ul> |
|||
|
|||
<p>If input string might contain internal NUL characters, use |
|||
<code><a href="#duk_push_lstring">duk_push_lstring()</a></code> instead. |
|||
For <code>duk_push_literal()</code> handling of embedded NULs depends |
|||
on config options and calling code should never rely on the behavior.</p> |
|||
|
|||
example: | |
|||
/* Basic case. */ |
|||
duk_push_literal(ctx, "foo"); |
|||
|
|||
/* Argument may involve compile time concatenation and parentheses. */ |
|||
duk_push_literal(ctx, ("foo" "bar")); |
|||
|
|||
/* Argument may also be e.g. DUK_HIDDEN_SYMBOL() which produces a literal. */ |
|||
duk_push_literal(ctx, DUK_HIDDEN_SYMBOL("mySymbol")); |
|||
|
|||
tags: |
|||
- stack |
|||
- string |
|||
- experimental |
|||
|
|||
introduced: 2.3.0 |
Loading…
Reference in new issue