i18nema 0.0.5 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +1 -1
- data/ext/i18nema/i18nema.c +26 -15
- data/lib/i18nema.rb +0 -6
- metadata +2 -2
data/README.md
CHANGED
@@ -27,7 +27,7 @@ an initializer, just do `I18n.backend.init_translations`.
|
|
27
27
|
|
28
28
|
### Faster Startup
|
29
29
|
|
30
|
-
Loading all the translations into memory is
|
30
|
+
Loading all the translations into memory is dramatically faster with
|
31
31
|
I18nema (about 4x). While this is just a one time hit, it's pretty
|
32
32
|
noticeable when you're waiting on it (e.g. console, specs). In
|
33
33
|
[canvas-lms](https://github/com/instructure/canvas-lms), I18nema brings
|
data/ext/i18nema/i18nema.c
CHANGED
@@ -3,6 +3,8 @@
|
|
3
3
|
#include "vendor/syck.h"
|
4
4
|
#include "vendor/uthash.h"
|
5
5
|
|
6
|
+
#define CAN_FREE(item) item != NULL && item->type != i_type_true && item->type != i_type_false && item->type != i_type_null
|
7
|
+
|
6
8
|
VALUE I18nema = Qnil,
|
7
9
|
I18nemaBackend = Qnil,
|
8
10
|
I18nemaBackendLoadError = Qnil;
|
@@ -18,7 +20,7 @@ static void delete_object_r(struct i_object *object);
|
|
18
20
|
static VALUE normalize_key(VALUE self, VALUE key, VALUE separator);
|
19
21
|
|
20
22
|
enum i_object_type {
|
21
|
-
|
23
|
+
i_type_unused,
|
22
24
|
i_type_string,
|
23
25
|
i_type_array,
|
24
26
|
i_type_hash,
|
@@ -32,7 +34,7 @@ enum i_object_type {
|
|
32
34
|
|
33
35
|
union i_object_data {
|
34
36
|
char *string;
|
35
|
-
struct i_object
|
37
|
+
struct i_object *array;
|
36
38
|
struct i_key_value *hash;
|
37
39
|
};
|
38
40
|
|
@@ -92,7 +94,7 @@ array_to_rarray(i_object_t *array)
|
|
92
94
|
{
|
93
95
|
VALUE result = rb_ary_new2(array->size);
|
94
96
|
for (unsigned long i = 0; i < array->size; i++)
|
95
|
-
rb_ary_store(result, i, i_object_to_robject(array->data.array[i]));
|
97
|
+
rb_ary_store(result, i, i_object_to_robject(&array->data.array[i]));
|
96
98
|
return result;
|
97
99
|
}
|
98
100
|
|
@@ -167,13 +169,13 @@ empty_object(i_object_t *object, int recurse)
|
|
167
169
|
case i_type_array:
|
168
170
|
if (recurse)
|
169
171
|
for (unsigned long i = 0; i < object->size; i++)
|
170
|
-
|
172
|
+
empty_object(&object->data.array[i], 1);
|
171
173
|
xfree(object->data.array);
|
172
174
|
break;
|
173
175
|
case i_type_hash:
|
174
176
|
delete_hash(&object->data.hash, recurse);
|
175
177
|
break;
|
176
|
-
case
|
178
|
+
case i_type_unused:
|
177
179
|
break;
|
178
180
|
default:
|
179
181
|
xfree(object->data.string);
|
@@ -185,7 +187,7 @@ static void
|
|
185
187
|
delete_object(i_object_t *object, int recurse)
|
186
188
|
{
|
187
189
|
empty_object(object, recurse);
|
188
|
-
if (object
|
190
|
+
if (CAN_FREE(object))
|
189
191
|
xfree(object);
|
190
192
|
}
|
191
193
|
|
@@ -248,8 +250,9 @@ static int
|
|
248
250
|
delete_syck_st_entry(char *key, char *value, char *arg)
|
249
251
|
{
|
250
252
|
i_object_t *object = (i_object_t *)value;
|
251
|
-
// key object whose string we have yoinked into a kv
|
252
|
-
|
253
|
+
// key object whose string we have yoinked into a kv, or item that
|
254
|
+
// has been copied into an array
|
255
|
+
if (object->type == i_type_unused)
|
253
256
|
delete_object_r(object);
|
254
257
|
return ST_DELETE;
|
255
258
|
}
|
@@ -293,13 +296,19 @@ new_string(char *orig, long len)
|
|
293
296
|
return str;
|
294
297
|
}
|
295
298
|
|
296
|
-
static
|
297
|
-
|
299
|
+
static void
|
300
|
+
set_string_object(i_object_t *object, char *str, long len)
|
298
301
|
{
|
299
|
-
i_object_t *object = ALLOC(i_object_t);
|
300
302
|
object->type = i_type_string;
|
301
303
|
object->size = len;
|
302
304
|
object->data.string = new_string(str, len);
|
305
|
+
}
|
306
|
+
|
307
|
+
static i_object_t*
|
308
|
+
new_string_object(char *str, long len)
|
309
|
+
{
|
310
|
+
i_object_t *object = ALLOC(i_object_t);
|
311
|
+
set_string_object(object, str, len);
|
303
312
|
return object;
|
304
313
|
}
|
305
314
|
|
@@ -309,7 +318,7 @@ new_array_object(long size)
|
|
309
318
|
i_object_t *object = ALLOC(i_object_t);
|
310
319
|
object->type = i_type_array;
|
311
320
|
object->size = size;
|
312
|
-
object->data.array = ALLOC_N(i_object_t
|
321
|
+
object->data.array = ALLOC_N(i_object_t, size);
|
313
322
|
return object;
|
314
323
|
}
|
315
324
|
|
@@ -372,7 +381,9 @@ handle_syck_node(SyckParser *parser, SyckNode *node)
|
|
372
381
|
syck_lookup_sym(parser, oid, (void **)&item);
|
373
382
|
if (item->type == i_type_string)
|
374
383
|
current_translation_count++;
|
375
|
-
result->data.array[i]
|
384
|
+
memcpy(&result->data.array[i], item, sizeof(i_object_t));
|
385
|
+
if (CAN_FREE(item))
|
386
|
+
item->type = i_type_unused;
|
376
387
|
}
|
377
388
|
break;
|
378
389
|
case syck_map_kind:
|
@@ -386,7 +397,7 @@ handle_syck_node(SyckParser *parser, SyckNode *node)
|
|
386
397
|
syck_lookup_sym(parser, oid, (void **)&value);
|
387
398
|
|
388
399
|
i_key_value_t *kv = new_key_value(key->data.string, value);
|
389
|
-
key->type =
|
400
|
+
key->type = i_type_unused; // so we know to free this node in delete_syck_st_entry
|
390
401
|
if (value->type == i_type_string)
|
391
402
|
current_translation_count++;
|
392
403
|
add_key_value(&result->data.hash, kv);
|
@@ -538,7 +549,7 @@ normalize_key(VALUE self, VALUE key, VALUE separator)
|
|
538
549
|
if (RSTRING_LEN(part) == 0)
|
539
550
|
skipped++;
|
540
551
|
else
|
541
|
-
key_frd->data.array[i - skipped]
|
552
|
+
set_string_object(&key_frd->data.array[i - skipped], RSTRING_PTR(part), RSTRING_LEN(part));
|
542
553
|
}
|
543
554
|
key_frd->size -= skipped;
|
544
555
|
|
data/lib/i18nema.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: i18nema
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-06-
|
12
|
+
date: 2013-06-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: i18n
|