From 2e501c68a8641a2b3c430b55f13491a9c1c5d0f5 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 11 May 2010 12:20:11 +0200 Subject: Add support for custom allocators New example: examples/cxx/hybrid/allocator. --- xsde/cxx/parser/cli.hxx | 2 ++ xsde/cxx/parser/elements.cxx | 1 + xsde/cxx/parser/generator.cxx | 25 +++++++++++++++++++++++++ xsde/cxx/parser/name-processor.cxx | 1 + xsde/cxx/parser/parser-header.cxx | 21 +++++++++++++++++++-- xsde/cxx/parser/print-impl-common.hxx | 35 +++++++++++++++++++++++++++-------- 6 files changed, 75 insertions(+), 10 deletions(-) (limited to 'xsde/cxx/parser') diff --git a/xsde/cxx/parser/cli.hxx b/xsde/cxx/parser/cli.hxx index a50c3ff..d4d42c7 100644 --- a/xsde/cxx/parser/cli.hxx +++ b/xsde/cxx/parser/cli.hxx @@ -36,6 +36,7 @@ namespace CXX extern Key generate_polymorphic; extern Key runtime_polymorphic; extern Key suppress_reset; + extern Key custom_allocator; extern Key generate_noop_impl; extern Key generate_print_impl; extern Key generate_test_driver; @@ -99,6 +100,7 @@ namespace CXX generate_polymorphic, Boolean, runtime_polymorphic, Boolean, suppress_reset, Boolean, + custom_allocator, Boolean, generate_noop_impl, Boolean, generate_print_impl, Boolean, generate_test_driver, Boolean, diff --git a/xsde/cxx/parser/elements.cxx b/xsde/cxx/parser/elements.cxx index 0b98370..7cf1fec 100644 --- a/xsde/cxx/parser/elements.cxx +++ b/xsde/cxx/parser/elements.cxx @@ -32,6 +32,7 @@ namespace CXX ops.value (), ops.value (), ops.value (), + ops.value (), ops.value ()), options (ops), xml_parser (xml_parser_), diff --git a/xsde/cxx/parser/generator.cxx b/xsde/cxx/parser/generator.cxx index c8a9f68..74ba2ea 100644 --- a/xsde/cxx/parser/generator.cxx +++ b/xsde/cxx/parser/generator.cxx @@ -125,6 +125,7 @@ namespace CXX extern Key generate_polymorphic = "generate-polymorphic"; extern Key runtime_polymorphic = "runtime-polymorphic"; extern Key suppress_reset = "suppress-reset"; + extern Key custom_allocator = "custom-allocator"; extern Key generate_noop_impl = "generate-noop-impl"; extern Key generate_print_impl = "generate-print-impl"; extern Key generate_test_driver = "generate-test-driver"; @@ -246,6 +247,11 @@ namespace CXX << " Suppress the generation of parser reset code." << endl; + e << "--custom-allocator" << endl + << " Generate code that uses custom allocator functions\n" + << " instead of operator new/delete." + << endl; + e << "--generate-noop-impl" << endl << " Generate a sample parser implementation that\n" << " does nothing (no operation)." @@ -1396,6 +1402,25 @@ namespace CXX << endl; } + if (ops.value ()) + { + hxx << "#ifndef XSDE_CUSTOM_ALLOCATOR" << endl + << "#error the generated code uses custom allocator while " << + "the XSD/e runtime does not (reconfigure the runtime or " << + "remove --custom-allocator)" << endl + << "#endif" << endl + << endl; + } + else + { + hxx << "#ifdef XSDE_CUSTOM_ALLOCATOR" << endl + << "#error the XSD/e runtime uses custom allocator while " << + "the generated code does not (reconfigure the runtime or " << + "add --custom-allocator)" << endl + << "#endif" << endl + << endl; + } + // // diff --git a/xsde/cxx/parser/name-processor.cxx b/xsde/cxx/parser/name-processor.cxx index 2cd1020..42b2863 100644 --- a/xsde/cxx/parser/name-processor.cxx +++ b/xsde/cxx/parser/name-processor.cxx @@ -45,6 +45,7 @@ namespace CXX ops.value (), ops.value (), ops.value (), + ops.value (), ops.value ()), skel_suffix_ (ops.value ()), impl_suffix_ (ops.value ()), diff --git a/xsde/cxx/parser/parser-header.cxx b/xsde/cxx/parser/parser-header.cxx index 5062337..e3b4aeb 100644 --- a/xsde/cxx/parser/parser-header.cxx +++ b/xsde/cxx/parser/parser-header.cxx @@ -1589,6 +1589,21 @@ namespace CXX String const c (char_type); + // Custom allocator. + // + if (custom_alloc) + { + os << "// Custom allocator." << endl + << "//" << endl + << "using ::xsde::cxx::alloc;" + << "using ::xsde::cxx::free;"; + + if (exceptions) + os << "using ::xsde::cxx::alloc_guard;"; + + os << endl; + } + os << "// Built-in XML Schema types mapping." << endl << "//" << endl << "using ::xsde::cxx::string_sequence;" @@ -1739,8 +1754,10 @@ namespace CXX } else { - ctx.os << "#include " << endl - << "#include " << endl; + if (ctx.custom_alloc) + ctx.os << "#include " << endl; + + ctx.os << "#include " << endl; if (ctx.char_encoding == L"iso8859-1") ctx.os << "#include " << endl; diff --git a/xsde/cxx/parser/print-impl-common.hxx b/xsde/cxx/parser/print-impl-common.hxx index b997f74..13325bd 100644 --- a/xsde/cxx/parser/print-impl-common.hxx +++ b/xsde/cxx/parser/print-impl-common.hxx @@ -998,8 +998,13 @@ namespace CXX if (options.value () && default_type (t, xs_ns_name () + L"::qname*")) { - os << endl - << "delete " << arg_ << ";"; + os << endl; + + if (!custom_alloc) + os << "delete " << arg_ << ";"; + else + os << arg_ << "->~qname ();" + << xs_ns_name () << "::free (" << arg_ << ");"; } } @@ -1029,8 +1034,12 @@ namespace CXX { if (options.value () && default_type (t, "char*")) { - os << endl - << "delete[] " << arg_ << ";"; + os << endl; + + if (!custom_alloc) + os << "delete[] " << arg_ << ";"; + else + os << xs_ns_name () << "::free (" << arg_ << ");"; } } @@ -1039,8 +1048,13 @@ namespace CXX { if (default_type (t, xs_ns_name () + L"::string_sequence*")) { - os << endl - << "delete " << arg_ << ";"; + os << endl; + + if (!custom_alloc) + os << "delete " << arg_ << ";"; + else + os << arg_ << "->~string_sequence ();" + << xs_ns_name () << "::free (" << arg_ << ");"; } } @@ -1049,8 +1063,13 @@ namespace CXX { if (default_type (t, xs_ns_name () + L"::buffer*")) { - os << endl - << "delete " << arg_ << ";"; + os << endl; + + if (!custom_alloc) + os << "delete " << arg_ << ";"; + else + os << arg_ << "->~buffer ();" + << xs_ns_name () << "::free (" << arg_ << ");"; } } -- cgit v1.1