Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion posix.mak
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ EXTRA_MODULES_INTERNAL := $(addprefix \
std/internal/digest/, sha_SSSE3 ) $(addprefix \
std/internal/math/, biguintcore biguintnoasm biguintx86 \
gammafunction errorfunction) $(addprefix std/internal/, \
cstring phobosinit unicode_tables scopebuffer\
cstring encodinginit processinit unicode_tables scopebuffer\
unicode_comp unicode_decomp unicode_grapheme unicode_norm) \
$(addprefix std/internal/test/, dummyrange) \
$(addprefix std/experimental/ndslice/, internal) \
Expand Down
42 changes: 38 additions & 4 deletions std/encoding.d
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ module std.encoding;
import std.traits;
import std.typecons;
import std.range.primitives;
import std.internal.encodinginit;

@system unittest
{
Expand Down Expand Up @@ -2360,25 +2361,38 @@ abstract class EncodingScheme
* This function allows user-defined subclasses of EncodingScheme to
* be declared in other modules.
*
* Params:
* Klass = The subclass of EncodingScheme to register.
*
* Example:
* ----------------------------------------------
* class Amiga1251 : EncodingScheme
* {
* shared static this()
* {
* EncodingScheme.register("path.to.Amiga1251");
* EncodingScheme.register!Amiga1251;
* }
* }
* ----------------------------------------------
*/
static void register(Klass:EncodingScheme)()
{
scope scheme = new Klass();
foreach (encodingName;scheme.names())
{
supported[toLower(encodingName)] = () => new Klass();
}
}

deprecated("Please pass the EncodingScheme subclass as template argument instead.")
static void register(string className)
{
auto scheme = cast(EncodingScheme)ClassInfo.find(className).create();
if (scheme is null)
throw new EncodingException("Unable to create class "~className);
foreach (encodingName;scheme.names())
{
supported[toLower(encodingName)] = className;
supportedFactories[toLower(encodingName)] = className;
}
}

Expand All @@ -2396,7 +2410,12 @@ abstract class EncodingScheme
*/
static EncodingScheme create(string encodingName)
{
auto p = toLower(encodingName) in supported;
encodingName = toLower(encodingName);

if (auto p = encodingName in supported)
return (*p)();

auto p = encodingName in supportedFactories;
if (p is null)
throw new EncodingException("Unrecognized Encoding: "~encodingName);
string className = *p;
Expand Down Expand Up @@ -2650,7 +2669,8 @@ abstract class EncodingScheme
return t.length - s.length;
}

__gshared string[string] supported;
__gshared EncodingScheme function()[string] supported;
__gshared string[string] supportedFactories;
}

/**
Expand Down Expand Up @@ -3297,6 +3317,20 @@ class EncodingSchemeUtf32Native : EncodingScheme
assert(ub.length == 8);
}


// shared static this() called from encodinginit to break ctor cycle
extern(C) void std_encoding_shared_static_this()
{
EncodingScheme.register!EncodingSchemeASCII;
EncodingScheme.register!EncodingSchemeLatin1;
EncodingScheme.register!EncodingSchemeLatin2;
EncodingScheme.register!EncodingSchemeWindows1250;
EncodingScheme.register!EncodingSchemeWindows1252;
EncodingScheme.register!EncodingSchemeUtf8;
EncodingScheme.register!EncodingSchemeUtf16Native;
EncodingScheme.register!EncodingSchemeUtf32Native;
}

//=============================================================================


Expand Down
19 changes: 19 additions & 0 deletions std/internal/encodinginit.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// Written in the D programming language.

/++
The purpose of this module is to perform static construction away from the
normal modules to eliminate cyclic construction errors.

Copyright: Copyright 2011 - 2016
License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
Authors: Martin Nowak, Steven Schveighoffer
Source: $(PHOBOSSRC std/internal/_encodinginit.d)
+/
module std.internal.encodinginit;

extern(C) void std_encoding_shared_static_this();

shared static this()
{
std_encoding_shared_static_this();
}
35 changes: 0 additions & 35 deletions std/internal/phobosinit.d

This file was deleted.

22 changes: 22 additions & 0 deletions std/internal/processinit.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// Written in the D programming language.

/++
The only purpose of this module is to do the static construction for
std.process in order to eliminate cyclic construction errors.

Copyright: Copyright 2011 -
License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
Authors: Jonathan M Davis and Kato Shoichi
Source: $(PHOBOSSRC std/internal/_processinit.d)
+/
module std.internal.processinit;

version(OSX)
{
extern(C) void std_process_shared_static_this();

shared static this()
{
std_process_shared_static_this();
}
}
1 change: 1 addition & 0 deletions std/process.d
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ version (Windows)

import std.range.primitives;
import std.stdio;
import std.internal.processinit;
import std.internal.cstring;


Expand Down
3 changes: 2 additions & 1 deletion win32.mak
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,8 @@ SRC_STD_C_FREEBSD= \

SRC_STD_INTERNAL= \
std\internal\cstring.d \
std\internal\phobosinit.d \
std\internal\encodinginit.d \
std\internal\processinit.d \
std\internal\unicode_tables.d \
std\internal\unicode_comp.d \
std\internal\unicode_decomp.d \
Expand Down
3 changes: 2 additions & 1 deletion win64.mak
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,8 @@ SRC_STD_C_FREEBSD= \

SRC_STD_INTERNAL= \
std\internal\cstring.d \
std\internal\phobosinit.d \
std\internal\encodinginit.d \
std\internal\processinit.d \
std\internal\unicode_tables.d \
std\internal\unicode_comp.d \
std\internal\unicode_decomp.d \
Expand Down