diff options
author | David Robillard <d@drobilla.net> | 2022-04-10 18:38:56 -0400 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2023-12-02 18:49:08 -0500 |
commit | b839af39ad87fbf0fe30fd500b596a5593c13a69 (patch) | |
tree | 2cc2bd60bd1e28cd966f694a3329cdbd8c80b023 | |
parent | c8594c69b612005c7507ad00f7274ca7791197d7 (diff) | |
download | serd-b839af39ad87fbf0fe30fd500b596a5593c13a69.tar.gz serd-b839af39ad87fbf0fe30fd500b596a5593c13a69.tar.bz2 serd-b839af39ad87fbf0fe30fd500b596a5593c13a69.zip |
Reuse the same rdf:type node for all "a" abbreviations
This reduces the stack space requirements for every type statement, at the cost
of adding a bit of constant bloat for the node in documents that do not contain
it.
-rw-r--r-- | src/read_turtle.c | 5 | ||||
-rw-r--r-- | src/reader.c | 2 | ||||
-rw-r--r-- | src/reader.h | 1 | ||||
-rw-r--r-- | test/test_overflow.c | 2 |
4 files changed, 6 insertions, 4 deletions
diff --git a/src/read_turtle.c b/src/read_turtle.c index d8a5de3e..03d1950f 100644 --- a/src/read_turtle.c +++ b/src/read_turtle.c @@ -581,9 +581,8 @@ read_verb(SerdReader* reader, SerdNode** const dest) if (node->length == 1 && serd_node_string(node)[0] == 'a' && next != ':' && !is_PN_CHARS_BASE(next)) { serd_stack_pop_to(&reader->stack, orig_stack_size); - return ((*dest = push_node(reader, SERD_URI, NS_RDF "type", 47)) - ? SERD_SUCCESS - : SERD_BAD_STACK); + *dest = reader->rdf_type; + return SERD_SUCCESS; } if ((st = read_PrefixedName( diff --git a/src/reader.c b/src/reader.c index 73509c6f..b7a64ce4 100644 --- a/src/reader.c +++ b/src/reader.c @@ -271,11 +271,13 @@ serd_reader_new(SerdWorld* const world, me->rdf_first = push_node(me, SERD_URI, NS_RDF "first", 48); me->rdf_rest = push_node(me, SERD_URI, NS_RDF "rest", 47); me->rdf_nil = push_node(me, SERD_URI, NS_RDF "nil", 46); + me->rdf_type = push_node(me, SERD_URI, NS_RDF "type", 47); // The initial stack size check should cover this assert(me->rdf_first); assert(me->rdf_rest); assert(me->rdf_nil); + assert(me->rdf_type); if (!(flags & SERD_READ_GLOBAL)) { me->bprefix[0] = 'f'; diff --git a/src/reader.h b/src/reader.h index 0bb3454b..9ec2e4ac 100644 --- a/src/reader.h +++ b/src/reader.h @@ -40,6 +40,7 @@ struct SerdReaderImpl { SerdNode* rdf_first; SerdNode* rdf_rest; SerdNode* rdf_nil; + SerdNode* rdf_type; SerdByteSource* source; SerdEnv* env; SerdStack stack; diff --git a/test/test_overflow.c b/test/test_overflow.c index 62a77022..edabd4eb 100644 --- a/test/test_overflow.c +++ b/test/test_overflow.c @@ -8,7 +8,7 @@ #include <assert.h> #include <stdio.h> -static const size_t min_stack_size = 4U * sizeof(size_t) + 238U; +static const size_t min_stack_size = 4U * sizeof(size_t) + 320U; static const size_t max_stack_size = 2048U; static SerdStatus |