diff --git a/CMakeLists.txt b/CMakeLists.txt index ee25577d..5e8c8900 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -267,4 +267,6 @@ if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") install(DIRECTORY bash_completion.d DESTINATION ${CONF_INST_DIR}) endif(${CMAKE_SYSTEM_NAME} MATCHES "Linux") -add_subdirectory(runtime) +if(D_VERSION EQUAL 2) + add_subdirectory(runtime) +endif() diff --git a/runtime/CMakeLists.txt b/runtime/CMakeLists.txt index 98e44507..db76285f 100644 --- a/runtime/CMakeLists.txt +++ b/runtime/CMakeLists.txt @@ -6,6 +6,10 @@ cmake_minimum_required(VERSION 2.6) # Main configuration. # +if(D_VERSION EQUAL 1) + message(FATAL_ERROR "Please use bob to build Tango for D1.") +endif() + include(CheckTypeSize) check_type_size(void* ptr_size) @@ -29,146 +33,97 @@ else(BUILD_SHARED_LIBS) set(CXX_COMPILE_FLAGS " ") endif(BUILD_SHARED_LIBS) -# build tango for D1, druntime for D2 -if(D_VERSION EQUAL 1) - set(RUNTIME tango) -elseif(D_VERSION EQUAL 2) - set(RUNTIME druntime) -else(D_VERSION EQUAL 1) - message(FATAL_ERROR "The runtime must be built as part of the main CMake project.") -endif(D_VERSION EQUAL 1) get_directory_property(PROJECT_PARENT_DIR DIRECTORY ${PROJECT_SOURCE_DIR} PARENT_DIRECTORY) -set(RUNTIME_DIR ${PROJECT_PARENT_DIR}/${RUNTIME} CACHE PATH "runtime source dir") +set(RUNTIME_DIR ${PROJECT_PARENT_DIR}/druntime CACHE PATH "runtime source dir") # # Gather source files. # -if(D_VERSION EQUAL 1) - # copy imports to runtime dir - set(LDC_IMPORTS) - macro(imports_file SRCARG) - get_filename_component(DEST ${SRCARG} NAME) - set(SRC ${PROJECT_PARENT_DIR}/${SRCARG}) - set(DEST ${RUNTIME_DIR}/ldc/${DEST}) +set(PHOBOS2_DIR ${PROJECT_PARENT_DIR}/phobos CACHE PATH "phobos2 source dir") +set(RUNTIME_CC druntime-core) +set(RUNTIME_GC druntime-gc-basic) +set(RUNTIME_DC druntime-rt-ldc) +set(RUNTIME_AIO ldruntime) +set(RUNTIME_DC_DIR ${RUNTIME_DIR}/src/rt) +set(RUNTIME_GC_DIR ${RUNTIME_DIR}/src/gc) +set(RUNTIME_INCLUDE ${RUNTIME_DIR}/src) +file(GLOB CORE_D ${RUNTIME_DIR}/src/core/*.d ) +file(GLOB CORE_D_SYNC ${RUNTIME_DIR}/src/core/sync/*.d ) +file(GLOB CORE_D_STDC ${RUNTIME_DIR}/src/core/stdc/*.d ) +file(GLOB_RECURSE GC_D ${RUNTIME_GC_DIR}/*.d) +file(GLOB_RECURSE DCRT_D ${RUNTIME_DC_DIR}/*.d) +file(GLOB_RECURSE LDC_D ${RUNTIME_DIR}/src/ldc/*.d) +list(REMOVE_ITEM DCRT_D + ${RUNTIME_DC_DIR}/alloca.d + ${RUNTIME_DC_DIR}/arraybyte.d + ${RUNTIME_DC_DIR}/arraycast.d + ${RUNTIME_DC_DIR}/arraycat.d + ${RUNTIME_DC_DIR}/arraydouble.d + ${RUNTIME_DC_DIR}/arrayfloat.d + ${RUNTIME_DC_DIR}/arrayreal.d + ${RUNTIME_DC_DIR}/arrayshort.d + ${RUNTIME_DC_DIR}/critical_.d + ${RUNTIME_DC_DIR}/deh.d + ${RUNTIME_DC_DIR}/deh2.d + ${RUNTIME_DC_DIR}/llmath.d + ${RUNTIME_DC_DIR}/qsort2.d + ${RUNTIME_DC_DIR}/trace.d +) +file(GLOB DCRT_C ${RUNTIME_DC_DIR}/*.c) +list(REMOVE_ITEM DCRT_C ${RUNTIME_DC_DIR}/deh.c ${RUNTIME_DC_DIR}/memory_osx.c ${RUNTIME_DC_DIR}/dylib_fixes.c) +if(UNIX) + file(GLOB_RECURSE CORE_D_SYS ${RUNTIME_DIR}/src/core/sys/posix/*.d) +elseif(WIN32) + file(GLOB_RECURSE CORE_D_SYS ${RUNTIME_DIR}/src/core/sys/windows/*.d) +elseif(APPLE) + file(GLOB_RECURSE CORE_D_SYS ${RUNTIME_DIR}/src/core/sys/osx/*.d) +endif(UNIX) +list(APPEND CORE_D ${CORE_D_SYNC} ${CORE_D_SYS} ${CORE_D_STDC} ) +list(APPEND GENERATE_DI ${CORE_D}) +list(APPEND CORE_D ${LDC_D} ${RUNTIME_DIR}/src/object_.d) +file(GLOB CORE_C ${RUNTIME_DIR}/src/core/stdc/*.c) - list(APPEND LDC_IMPORTS ${DEST}) - add_custom_command( - OUTPUT ${DEST} - DEPENDS ${SRC} - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${SRC} ${DEST} - ) - endmacro(imports_file) - imports_file(import/ldc/cstdarg.di) - imports_file(import/ldc/intrinsics.di) - imports_file(import/ldc/llvmasm.di) - imports_file(internal/ldc/bitmanip.d) - imports_file(internal/ldc/vararg.d) - # library names - set(RUNTIME_CC tango-cc-tango) - set(RUNTIME_GC tango-gc-basic) - set(RUNTIME_DC ldc-runtime) - set(RUNTIME_AIO tango) - # set paths to source files, or fill lists directly - set(RUNTIME_DC_DIR ${RUNTIME_DIR}/internal) - set(RUNTIME_GC_DIR ${RUNTIME_DIR}/lib/gc/basic) - set(RUNTIME_INCLUDE ${RUNTIME_DC_DIR}) - file(GLOB CORE_D ${RUNTIME_DIR}/lib/common/tango/core/*.d) - file(GLOB CORE_C ${RUNTIME_DIR}/lib/common/tango/stdc/*.c) - file(GLOB_RECURSE GC_D ${RUNTIME_GC_DIR}/*.d) - file(GLOB_RECURSE DCRT_D ${RUNTIME_DC_DIR}/*.d) - file(GLOB DCRT_C ${RUNTIME_DC_DIR}/*.c) - set(CONFIG_NAME ${LDC_EXE}) -elseif(D_VERSION EQUAL 2) - set(PHOBOS2_DIR ${PROJECT_PARENT_DIR}/phobos CACHE PATH "phobos2 source dir") - set(RUNTIME_CC druntime-core) - set(RUNTIME_GC druntime-gc-basic) - set(RUNTIME_DC druntime-rt-ldc) - set(RUNTIME_AIO ldruntime) - set(RUNTIME_DC_DIR ${RUNTIME_DIR}/src/rt) - set(RUNTIME_GC_DIR ${RUNTIME_DIR}/src/gc) - set(RUNTIME_INCLUDE ${RUNTIME_DIR}/src) - file(GLOB CORE_D ${RUNTIME_DIR}/src/core/*.d ) - file(GLOB CORE_D_SYNC ${RUNTIME_DIR}/src/core/sync/*.d ) - file(GLOB CORE_D_STDC ${RUNTIME_DIR}/src/core/stdc/*.d ) - file(GLOB_RECURSE GC_D ${RUNTIME_GC_DIR}/*.d) - file(GLOB_RECURSE DCRT_D ${RUNTIME_DC_DIR}/*.d) - file(GLOB_RECURSE LDC_D ${RUNTIME_DIR}/src/ldc/*.d) - list(REMOVE_ITEM DCRT_D - ${RUNTIME_DC_DIR}/alloca.d - ${RUNTIME_DC_DIR}/arraybyte.d - ${RUNTIME_DC_DIR}/arraycast.d - ${RUNTIME_DC_DIR}/arraycat.d - ${RUNTIME_DC_DIR}/arraydouble.d - ${RUNTIME_DC_DIR}/arrayfloat.d - ${RUNTIME_DC_DIR}/arrayreal.d - ${RUNTIME_DC_DIR}/arrayshort.d - ${RUNTIME_DC_DIR}/critical_.d - ${RUNTIME_DC_DIR}/deh.d - ${RUNTIME_DC_DIR}/deh2.d - ${RUNTIME_DC_DIR}/llmath.d - ${RUNTIME_DC_DIR}/qsort2.d - ${RUNTIME_DC_DIR}/trace.d - ) - file(GLOB DCRT_C ${RUNTIME_DC_DIR}/*.c) - list(REMOVE_ITEM DCRT_C ${RUNTIME_DC_DIR}/deh.c ${RUNTIME_DC_DIR}/memory_osx.c ${RUNTIME_DC_DIR}/dylib_fixes.c) +if(PHOBOS2_DIR) + file(GLOB PHOBOS2_D ${PHOBOS2_DIR}/std/*.d) + file(GLOB_RECURSE PHOBOS2_D_INTERNAL ${PHOBOS2_DIR}/std/internal/*.d) + file(GLOB PHOBOS2_D_C ${PHOBOS2_DIR}/std/c/*.d) if(UNIX) - file(GLOB_RECURSE CORE_D_SYS ${RUNTIME_DIR}/src/core/sys/posix/*.d) + file(GLOB PHOBOS2_D_C_SYS ${PHOBOS2_DIR}/std/c/linux/*.d) elseif(WIN32) - file(GLOB_RECURSE CORE_D_SYS ${RUNTIME_DIR}/src/core/sys/windows/*.d) + file(GLOB PHOBOS2_D_C_SYS ${PHOBOS2_DIR}/std/c/windows/*.d) elseif(APPLE) - file(GLOB_RECURSE CORE_D_SYS ${RUNTIME_DIR}/src/core/sys/osx/*.d) + file(GLOB PHOBOS2_D_C_SYS ${PHOBOS2_DIR}/std/c/osx/*.d) endif(UNIX) - list(APPEND CORE_D ${CORE_D_SYNC} ${CORE_D_SYS} ${CORE_D_STDC} ) - list(APPEND GENERATE_DI ${CORE_D}) - list(APPEND CORE_D ${LDC_D} ${RUNTIME_DIR}/src/object_.d) - file(GLOB CORE_C ${RUNTIME_DIR}/src/core/stdc/*.c) - - if(PHOBOS2_DIR) - file(GLOB PHOBOS2_D ${PHOBOS2_DIR}/std/*.d) - file(GLOB_RECURSE PHOBOS2_D_INTERNAL ${PHOBOS2_DIR}/std/internal/*.d) - file(GLOB PHOBOS2_D_C ${PHOBOS2_DIR}/std/c/*.d) - if(UNIX) - file(GLOB PHOBOS2_D_C_SYS ${PHOBOS2_DIR}/std/c/linux/*.d) - elseif(WIN32) - file(GLOB PHOBOS2_D_C_SYS ${PHOBOS2_DIR}/std/c/windows/*.d) - elseif(APPLE) - file(GLOB PHOBOS2_D_C_SYS ${PHOBOS2_DIR}/std/c/osx/*.d) - endif(UNIX) - file(GLOB ZLIB_C ${PHOBOS2_DIR}/etc/c/zlib/*.c) - list(REMOVE_ITEM ZLIB_C - ${PHOBOS2_DIR}/etc/c/zlib/minigzip.c - ${PHOBOS2_DIR}/etc/c/zlib/example.c - ${PHOBOS2_DIR}/etc/c/zlib/gzio.c - ) - if(WIN32) - file(GLOB PHOBOS2_D_WIN ${PHOBOS2_DIR}/std/windows/*.d) - endif(WIN32) - list(APPEND PHOBOS2_D - ${PHOBOS2_D_INTERNAL} - ${PHOBOS2_D_WIN} - ${PHOBOS2_D_C} - ${PHOBOS2_D_C_SYS} - ${PHOBOS2_DIR}/etc/c/zlib.d - ${PHOBOS2_DIR}/crc32.d - ) - list(REMOVE_ITEM PHOBOS2_D - ${PHOBOS2_DIR}/std/intrinsic.d - ) - set(CONFIG_NAME ${LDC_EXE}_phobos) - else(PHOBOS2_DIR) - set(CONFIG_NAME ${LDC_EXE}) - endif(PHOBOS2_DIR) -endif(D_VERSION EQUAL 1) + file(GLOB ZLIB_C ${PHOBOS2_DIR}/etc/c/zlib/*.c) + list(REMOVE_ITEM ZLIB_C + ${PHOBOS2_DIR}/etc/c/zlib/minigzip.c + ${PHOBOS2_DIR}/etc/c/zlib/example.c + ${PHOBOS2_DIR}/etc/c/zlib/gzio.c + ) + if(WIN32) + file(GLOB PHOBOS2_D_WIN ${PHOBOS2_DIR}/std/windows/*.d) + endif(WIN32) + list(APPEND PHOBOS2_D + ${PHOBOS2_D_INTERNAL} + ${PHOBOS2_D_WIN} + ${PHOBOS2_D_C} + ${PHOBOS2_D_C_SYS} + ${PHOBOS2_DIR}/etc/c/zlib.d + ${PHOBOS2_DIR}/crc32.d + ) + list(REMOVE_ITEM PHOBOS2_D + ${PHOBOS2_DIR}/std/intrinsic.d + ) + set(CONFIG_NAME ${LDC_EXE}_phobos) +else(PHOBOS2_DIR) + set(CONFIG_NAME ${LDC_EXE}) +endif(PHOBOS2_DIR) # should only be necessary if run independently from ldc cmake project if(NOT LDC_LOC) if(NOT LDC_EXE) - if(D_VERSION EQUAL 1) - set(LDC_EXE ldc) - elseif(D_VERSION EQUAL 2) - set(LDC_EXE ldc2) - endif(D_VERSION EQUAL 1) + set(LDC_EXE ldc2) endif(NOT LDC_EXE) find_program(LDC_LOC ${LDC_EXE} ${PROJECT_BINARY_DIR}/../bin DOC "path to ldc binary") @@ -264,14 +219,10 @@ macro(build_runtime d_flags c_flags ld_flags lib_suffix path_suffix) set(DCRT_O "") set(DCRT_BC "") foreach(f ${DCRT_D}) - if(D_VERSION EQUAL 1) - dc(${f} DCRT_O DCRT_BC "${d_flags}" ${RUNTIME_DC_DIR} "${target_suffix}") - else(D_VERSION EQUAL 1) - dc(${f} DCRT_O DCRT_BC "${d_flags}" "" "${target_suffix}") - endif(D_VERSION EQUAL 1) + dc(${f} DCRT_O DCRT_BC "${d_flags}" "" "${target_suffix}") endforeach(f) - if(EXISTS ${PROJECT_PARENT_DIR}/${RUNTIME}) + if(EXISTS ${RUNTIME_DIR}) if(BUILD_SINGLE_LIB) add_library(${RUNTIME_AIO}${target_suffix} ${D_LIBRARY_TYPE} @@ -296,7 +247,7 @@ macro(build_runtime d_flags c_flags ld_flags lib_suffix path_suffix) ${RUNTIME_DC}${lib_suffix} ) endif(BUILD_SINGLE_LIB) - endif(EXISTS ${PROJECT_PARENT_DIR}/${RUNTIME}) + endif() if(BUILD_BC_LIBS) find_program(LLVM_AR_EXE llvm-ar ${LLVM_INSTDIR}/bin DOC "path to llvm-ar tool") @@ -389,17 +340,12 @@ endif(MULTILIB) # Install target. # -if(D_VERSION EQUAL 2) - install(DIRECTORY ${CMAKE_BINARY_DIR}/import/core DESTINATION ${INCLUDE_INSTALL_DIR} FILES_MATCHING PATTERN "*.di") - if(PHOBOS2_DIR) - install(DIRECTORY ${PHOBOS2_DIR}/std DESTINATION ${INCLUDE_INSTALL_DIR} FILES_MATCHING PATTERN "*.d") - install(DIRECTORY ${PHOBOS2_DIR}/etc DESTINATION ${INCLUDE_INSTALL_DIR} FILES_MATCHING PATTERN "*.d") - install(FILES ${PHOBOS2_DIR}/crc32.d DESTINATION ${INCLUDE_INSTALL_DIR}) - endif(PHOBOS2_DIR) - install(FILES ${RUNTIME_DIR}/import/object.di DESTINATION ${INCLUDE_INSTALL_DIR}/ldc) - install(FILES ${RUNTIME_DIR}/src/ldc/bitop.d DESTINATION ${INCLUDE_INSTALL_DIR}/core) - install(DIRECTORY ${RUNTIME_DIR}/import/ldc DESTINATION ${INCLUDE_INSTALL_DIR} FILES_MATCHING PATTERN "*.di") -else(D_VERSION EQUAL 2) - install(DIRECTORY ${PROJECT_SOURCE_DIR}/${RUNTIME}/internal/ldc/ DESTINATION ${INCLUDE_INSTALL_DIR}/ldc) - install(DIRECTORY ${PROJECT_SOURCE_DIR}/runtime/import/ldc DESTINATION ${INCLUDE_INSTALL_DIR}) -endif(D_VERSION EQUAL 2) +install(DIRECTORY ${CMAKE_BINARY_DIR}/import/core DESTINATION ${INCLUDE_INSTALL_DIR} FILES_MATCHING PATTERN "*.di") +if(PHOBOS2_DIR) + install(DIRECTORY ${PHOBOS2_DIR}/std DESTINATION ${INCLUDE_INSTALL_DIR} FILES_MATCHING PATTERN "*.d") + install(DIRECTORY ${PHOBOS2_DIR}/etc DESTINATION ${INCLUDE_INSTALL_DIR} FILES_MATCHING PATTERN "*.d") + install(FILES ${PHOBOS2_DIR}/crc32.d DESTINATION ${INCLUDE_INSTALL_DIR}) +endif(PHOBOS2_DIR) +install(FILES ${RUNTIME_DIR}/import/object.di DESTINATION ${INCLUDE_INSTALL_DIR}/ldc) +install(FILES ${RUNTIME_DIR}/src/ldc/bitop.d DESTINATION ${INCLUDE_INSTALL_DIR}/core) +install(DIRECTORY ${RUNTIME_DIR}/import/ldc DESTINATION ${INCLUDE_INSTALL_DIR} FILES_MATCHING PATTERN "*.di") diff --git a/runtime/README b/runtime/README index 7e59610c..0d22b97c 100644 --- a/runtime/README +++ b/runtime/README @@ -1,30 +1,24 @@ -This should help get the runtime built. -FOR D1: -======= -1) Do a checkout of tango trunk into the ldc root dir (along dmd, gen, runtime etc). +Building druntime/Phobos for D2 +--- - * $ ls - * dmd dmd2 gen ir ... - * $ svn co http://svn.dsource.org/projects/tango/trunk tango +LDC currently needs custom forks of druntime and Phobos. They are integrated +with the main repository using Git submodules. To build them, make sure you +have up-to-date copies of the submodules in your local repository: -2) Compile the runtime +$ git submodule update -i - * sh build.sh +The libraries should then be built and installed automatically along with the +compiler itself. If, for some reason, you want to build them separately, the +targets are: -FOR D2: -======= -1) Check http://bitbucket.org/prokhin_alexy/ldc2/wiki/Home for up to date instructions +$ make runtime +$ make phobos2 -2) At the time of writing, this works: - * $ git clone https://github.com/AlexeyProkhin/druntime - * $ git clone https://github.com/AlexeyProkhin/phobos +Building Tango for D1 +--- -3) Using cmake, set the D version to 2, then set the correct paths for druntime and phobos - -4) Compile ldc2, druntime, and phobos - - * $ make phobos2 - -======= -Enjoy! +This directory used to contain scripts for building Tango for LDC/D1, which +became obsolete after LDC support was added to its build system, and were +consequently removed. Please use the official Tango build system (bob) from +now on. diff --git a/runtime/build-sharedlibs.sh b/runtime/build-sharedlibs.sh deleted file mode 100755 index 298b5b64..00000000 --- a/runtime/build-sharedlibs.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -# I'm no good bash scripter ... - -# copy imports -mkdir -p ../tango/ldc -cp internal/ldc/bitmanip.d ../tango/ldc/bitmanip.di -cp internal/ldc/vararg.d ../tango/ldc/vararg.di -cp import/ldc/* ../tango/ldc - -# make the runtime -cp -R lib ../tango -cd ../tango/lib -make -f ldc-posix.mak clean -make -f ldc-posix.mak sharedlib -cd ../.. - -# install the runtime -rm -f lib/libldc-runtime-shared.so -cp runtime/internal/libldc-runtime-shared.so lib -rm -f lib/libtango-gc-basic-shared.so -cp tango/lib/gc/basic/libtango-gc-basic-shared.so lib -rm -f lib/libtango-cc-tango-shared.so -cp tango/lib/common/tango/libtango-cc-tango-shared.so lib diff --git a/runtime/build.sh b/runtime/build.sh deleted file mode 100755 index 88505bd0..00000000 --- a/runtime/build.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -# I'm no good bash scripter ... - -# copy imports -mkdir -p ../tango/ldc -cp internal/ldc/bitmanip.d ../tango/ldc/bitmanip.di -cp internal/ldc/vararg.d ../tango/ldc/vararg.di -cp import/ldc/* ../tango/ldc - -# make the runtime -cp -R lib ../tango -cd ../tango/lib -make -f ldc-posix.mak clean -make -f ldc-posix.mak lib -cd ../.. - -# install the runtime -rm -f lib/libldc-runtime*.a -cp runtime/internal/libldc-runtime*.a lib -rm -f lib/libtango-gc-basic*.a -cp tango/lib/gc/basic/libtango-gc-basic*.a lib -rm -f lib/libtango-cc-tango*.a -cp tango/lib/common/tango/libtango-cc-tango*.a lib diff --git a/runtime/import/ldc/cstdarg.di b/runtime/import/ldc/cstdarg.di deleted file mode 100644 index 4c980416..00000000 --- a/runtime/import/ldc/cstdarg.di +++ /dev/null @@ -1,29 +0,0 @@ -/* - * vararg support for extern(C) functions - */ - -module ldc.cstdarg; - -// Check for the right compiler -version(LDC) -{ - // OK -} -else -{ - static assert(false, "This module is only valid for LDC"); -} - -alias void* va_list; - -pragma(va_start) - void va_start(T)(va_list ap, ref T); - -pragma(va_arg) - T va_arg(T)(va_list ap); - -pragma(va_end) - void va_end(va_list args); - -pragma(va_copy) - void va_copy(va_list dst, va_list src); diff --git a/runtime/import/ldc/intrinsics.di b/runtime/import/ldc/intrinsics.di deleted file mode 100644 index 5a27a40a..00000000 --- a/runtime/import/ldc/intrinsics.di +++ /dev/null @@ -1,413 +0,0 @@ -/* - * This module holds declarations to LLVM intrinsics. - * - * See the LLVM language reference for more information: - * - * - http://llvm.org/docs/LangRef.html#intrinsics - * - */ - -module ldc.intrinsics; - -// Check for the right compiler -version(LDC) -{ - // OK -} -else -{ - static assert(false, "This module is only valid for LDC"); -} - -// -// CODE GENERATOR INTRINSICS -// - - -// The 'llvm.returnaddress' intrinsic attempts to compute a target-specific -// value indicating the return address of the current function or one of its -// callers. - -pragma(intrinsic, "llvm.returnaddress") - void* llvm_returnaddress(uint level); - - -// The 'llvm.frameaddress' intrinsic attempts to return the target-specific -// frame pointer value for the specified stack frame. - -pragma(intrinsic, "llvm.frameaddress") - void* llvm_frameaddress(uint level); - - -// The 'llvm.stacksave' intrinsic is used to remember the current state of the -// function stack, for use with llvm.stackrestore. This is useful for -// implementing language features like scoped automatic variable sized arrays -// in C99. - -pragma(intrinsic, "llvm.stacksave") - void* llvm_stacksave(); - - -// The 'llvm.stackrestore' intrinsic is used to restore the state of the -// function stack to the state it was in when the corresponding llvm.stacksave -// intrinsic executed. This is useful for implementing language features like -// scoped automatic variable sized arrays in C99. - -pragma(intrinsic, "llvm.stackrestore") - void llvm_stackrestore(void* ptr); - - -// The 'llvm.prefetch' intrinsic is a hint to the code generator to insert a -// prefetch instruction if supported; otherwise, it is a noop. Prefetches have -// no effect on the behavior of the program but can change its performance -// characteristics. - -pragma(intrinsic, "llvm.prefetch") - void llvm_prefetch(void* ptr, uint rw, uint locality); - - -// The 'llvm.pcmarker' intrinsic is a method to export a Program Counter (PC) -// in a region of code to simulators and other tools. The method is target -// specific, but it is expected that the marker will use exported symbols to -// transmit the PC of the marker. The marker makes no guarantees that it will -// remain with any specific instruction after optimizations. It is possible -// that the presence of a marker will inhibit optimizations. The intended use -// is to be inserted after optimizations to allow correlations of simulation -// runs. - -pragma(intrinsic, "llvm.pcmarker") - void llvm_pcmarker(uint id); - - -// The 'llvm.readcyclecounter' intrinsic provides access to the cycle counter -// register (or similar low latency, high accuracy clocks) on those targets that -// support it. On X86, it should map to RDTSC. On Alpha, it should map to RPCC. -// As the backing counters overflow quickly (on the order of 9 seconds on -// alpha), this should only be used for small timings. - -pragma(intrinsic, "llvm.readcyclecounter") - ulong readcyclecounter(); - - - - -// -// STANDARD C LIBRARY INTRINSICS -// - - -// The 'llvm.memcpy.*' intrinsics copy a block of memory from the source -// location to the destination location. -// Note that, unlike the standard libc function, the llvm.memcpy.* intrinsics do -// not return a value, and takes an extra alignment argument. - -pragma(intrinsic, "llvm.memcpy.i#") - void llvm_memcpy(T)(void* dst, void* src, T len, uint alignment); - -deprecated { - alias llvm_memcpy!(uint) llvm_memcpy_i32; - alias llvm_memcpy!(ulong) llvm_memcpy_i64; -} - - -// The 'llvm.memmove.*' intrinsics move a block of memory from the source -// location to the destination location. It is similar to the 'llvm.memcpy' -// intrinsic but allows the two memory locations to overlap. -// Note that, unlike the standard libc function, the llvm.memmove.* intrinsics -// do not return a value, and takes an extra alignment argument. - -pragma(intrinsic, "llvm.memmove.i#") - void llvm_memmove(T)(void* dst, void* src, T len, uint alignment); - -deprecated { - alias llvm_memmove!(uint) llvm_memmove_i32; - alias llvm_memmove!(ulong) llvm_memmove_i64; -} - - -// The 'llvm.memset.*' intrinsics fill a block of memory with a particular byte -// value. -// Note that, unlike the standard libc function, the llvm.memset intrinsic does -// not return a value, and takes an extra alignment argument. - -pragma(intrinsic, "llvm.memset.i#") - void llvm_memset(T)(void* dst, ubyte val, T len, uint alignment); - -deprecated { - alias llvm_memset!(uint) llvm_memset_i32; - alias llvm_memset!(ulong) llvm_memset_i64; -} - - -// The 'llvm.sqrt' intrinsics return the sqrt of the specified operand, -// returning the same value as the libm 'sqrt' functions would. Unlike sqrt in -// libm, however, llvm.sqrt has undefined behavior for negative numbers other -// than -0.0 (which allows for better optimization, because there is no need to -// worry about errno being set). llvm.sqrt(-0.0) is defined to return -0.0 like -// IEEE sqrt. - -pragma(intrinsic, "llvm.sqrt.f#") - T llvm_sqrt(T)(T val); - -deprecated { - alias llvm_sqrt!(float) llvm_sqrt_f32; - alias llvm_sqrt!(double) llvm_sqrt_f64; - alias llvm_sqrt!(real) llvm_sqrt_f80; // may not actually be .f80 -} - - -// The 'llvm.sin.*' intrinsics return the sine of the operand. - -pragma(intrinsic, "llvm.sin.f#") - T llvm_sin(T)(T val); - -deprecated { - alias llvm_sin!(float) llvm_sin_f32; - alias llvm_sin!(double) llvm_sin_f64; - alias llvm_sin!(real) llvm_sin_f80; // may not actually be .f80 -} - - -// The 'llvm.cos.*' intrinsics return the cosine of the operand. - -pragma(intrinsic, "llvm.cos.f#") - T llvm_cos(T)(T val); - -deprecated { - alias llvm_cos!(float) llvm_cos_f32; - alias llvm_cos!(double) llvm_cos_f64; - alias llvm_cos!(real) llvm_cos_f80; // may not actually be .f80 -} - - -// The 'llvm.powi.*' intrinsics return the first operand raised to the specified -// (positive or negative) power. The order of evaluation of multiplications is -// not defined. When a vector of floating point type is used, the second -// argument remains a scalar integer value. - -pragma(intrinsic, "llvm.powi.f#") - T llvm_powi(T)(T val, int power); - -deprecated { - alias llvm_powi!(float) llvm_powi_f32; - alias llvm_powi!(double) llvm_powi_f64; - alias llvm_powi!(real) llvm_powi_f80; // may not actually be .f80 -} - - -// The 'llvm.pow.*' intrinsics return the first operand raised to the specified -// (positive or negative) power. - -pragma(intrinsic, "llvm.pow.f#") - T llvm_pow(T)(T val, T power); - -deprecated { - alias llvm_pow!(float) llvm_pow_f32; - alias llvm_pow!(double) llvm_pow_f64; - alias llvm_pow!(real) llvm_pow_f80; // may not actually be .f80 -} - - -// -// BIT MANIPULATION INTRINSICS -// - -// The 'llvm.bswap' family of intrinsics is used to byte swap integer values -// with an even number of bytes (positive multiple of 16 bits). These are -// useful for performing operations on data that is not in the target's native -// byte order. - -pragma(intrinsic, "llvm.bswap.i#.i#") - T llvm_bswap(T)(T val); - -deprecated { - alias llvm_bswap!(ushort) llvm_bswap_i16; - alias llvm_bswap!(uint) llvm_bswap_i32; - alias llvm_bswap!(ulong) llvm_bswap_i64; -} - - -// The 'llvm.ctpop' family of intrinsics counts the number of bits set in a -// value. - -pragma(intrinsic, "llvm.ctpop.i#") - T llvm_ctpop(T)(T src); - -deprecated { - alias llvm_ctpop!(ubyte) llvm_ctpop_i8; - alias llvm_ctpop!(ushort) llvm_ctpop_i16; - alias llvm_ctpop!(uint) llvm_ctpop_i32; - alias llvm_ctpop!(ulong) llvm_ctpop_i64; -} - - -// The 'llvm.ctlz' family of intrinsic functions counts the number of leading -// zeros in a variable. - -pragma(intrinsic, "llvm.ctlz.i#") - T llvm_ctlz(T)(T src); - -deprecated { - alias llvm_ctlz!(ubyte) llvm_ctlz_i8; - alias llvm_ctlz!(ushort) llvm_ctlz_i16; - alias llvm_ctlz!(uint) llvm_ctlz_i32; - alias llvm_ctlz!(ulong) llvm_ctlz_i64; -} - - -// The 'llvm.cttz' family of intrinsic functions counts the number of trailing -// zeros. - -pragma(intrinsic, "llvm.cttz.i#") - T llvm_cttz(T)(T src); - -deprecated { - alias llvm_cttz!(ubyte) llvm_cttz_i8; - alias llvm_cttz!(ushort) llvm_cttz_i16; - alias llvm_cttz!(uint) llvm_cttz_i32; - alias llvm_cttz!(ulong) llvm_cttz_i64; -} - - -// The 'llvm.part.select' family of intrinsic functions selects a range of bits -// from an integer value and returns them in the same bit width as the original -// value. - -pragma(intrinsic, "llvm.part.select.i#") - T llvm_part_select(T)(T val, uint loBit, uint hiBit); - -deprecated { - alias llvm_part_select!(ubyte) llvm_part_select_i; - alias llvm_part_select!(ushort) llvm_part_select_i; - alias llvm_part_select!(uint) llvm_part_select_i; - alias llvm_part_select!(ulong) llvm_part_select_i; -} - - -// The 'llvm.part.set' family of intrinsic functions replaces a range of bits -// in an integer value with another integer value. It returns the integer with -// the replaced bits. - -// TODO -// declare i17 @llvm.part.set.i17.i9 (i17 %val, i9 %repl, i32 %lo, i32 %hi) -// declare i29 @llvm.part.set.i29.i9 (i29 %val, i9 %repl, i32 %lo, i32 %hi) - - - - -// -// ATOMIC OPERATIONS AND SYNCHRONIZATION INTRINSICS -// - -// The llvm.memory.barrier intrinsic guarantees ordering between specific -// pairs of memory access types. - -pragma(intrinsic, "llvm.memory.barrier") - void llvm_memory_barrier(bool ll, bool ls, bool sl, bool ss, bool device); - -// This loads a value in memory and compares it to a given value. If they are -// equal, it stores a new value into the memory. - -pragma(intrinsic, "llvm.atomic.cmp.swap.i#.p0i#") - T llvm_atomic_cmp_swap(T)(T* ptr, T cmp, T val); - -// This intrinsic loads the value stored in memory at ptr and yields the value -// from memory. It then stores the value in val in the memory at ptr. - -pragma(intrinsic, "llvm.atomic.swap.i#.p0i#") - T llvm_atomic_swap(T)(T* ptr, T val); - -// This intrinsic adds delta to the value stored in memory at ptr. It yields -// the original value at ptr. - -pragma(intrinsic, "llvm.atomic.load.add.i#.p0i#") - T llvm_atomic_load_add(T)(T* ptr, T val); - -// This intrinsic subtracts delta to the value stored in memory at ptr. It -// yields the original value at ptr. - -pragma(intrinsic, "llvm.atomic.load.sub.i#.p0i#") - T llvm_atomic_load_sub(T)(T* ptr, T val); - -// These intrinsics bitwise the operation (and, nand, or, xor) delta to the -// value stored in memory at ptr. It yields the original value at ptr. - -pragma(intrinsic, "llvm.atomic.load.and.i#.p0i#") - T llvm_atomic_load_and(T)(T* ptr, T val); - -pragma(intrinsic, "llvm.atomic.load.nand.i#.p0i#") - T llvm_atomic_load_nand(T)(T* ptr, T val); - -pragma(intrinsic, "llvm.atomic.load.or.i#.p0i#") - T llvm_atomic_load_or(T)(T* ptr, T val); - -pragma(intrinsic, "llvm.atomic.load.xor.i#.p0i#") - T llvm_atomic_load_xor(T)(T* ptr, T val); - -// These intrinsics takes the signed or unsigned minimum or maximum of delta -// and the value stored in memory at ptr. It yields the original value at ptr. - -pragma(intrinsic, "llvm.atomic.load.max.i#.p0i#") - T llvm_atomic_load_max(T)(T* ptr, T val); - -pragma(intrinsic, "llvm.atomic.load.min.i#.p0i#") - T llvm_atomic_load_min(T)(T* ptr, T val); - -pragma(intrinsic, "llvm.atomic.load.umax.i#.p0i#") - T llvm_atomic_load_umax(T)(T* ptr, T val); - -pragma(intrinsic, "llvm.atomic.load.umin.i#.p0i#") - T llvm_atomic_load_umin(T)(T* ptr, T val); - - -// -// ARITHMETIC-WITH-OVERFLOW INTRINSICS -// - -struct OverflowRet(T) { - static assert(is(T : int), T.stringof ~ " is not an integer type!"); - T result; - bool overflow; -} - -// Signed and unsigned addition -pragma(intrinsic, "llvm.sadd.with.overflow.i#") - OverflowRet!(T) llvm_sadd_with_overflow(T)(T lhs, T rhs); - -pragma(intrinsic, "llvm.uadd.with.overflow.i#") - OverflowRet!(T) llvm_uadd_with_overflow(T)(T lhs, T rhs); - - -// Signed and unsigned subtraction -pragma(intrinsic, "llvm.ssub.with.overflow.i#") - OverflowRet!(T) llvm_ssub_with_overflow(T)(T lhs, T rhs); - -pragma(intrinsic, "llvm.usub.with.overflow.i#") - OverflowRet!(T) llvm_usub_with_overflow(T)(T lhs, T rhs); - - -// Signed and unsigned multiplication -pragma(intrinsic, "llvm.smul.with.overflow.i#") - OverflowRet!(T) llvm_smul_with_overflow(T)(T lhs, T rhs); - -/* Note: LLVM documentations says: - * Warning: 'llvm.umul.with.overflow' is badly broken. - * It is actively being fixed, but it should not currently be used! - * - * See: http://llvm.org/docs/LangRef.html#int_umul_overflow - */ -//pragma(intrinsic, "llvm.umul.with.overflow.i#") -// OverflowRet!(T) llvm_umul_with_overflow(T)(T lhs, T rhs); - - -// -// GENERAL INTRINSICS -// - - -// This intrinsics is lowered to the target dependent trap instruction. If the -// target does not have a trap instruction, this intrinsic will be lowered to -// the call of the abort() function. - -pragma(intrinsic, "llvm.trap") - void llvm_trap(); diff --git a/runtime/import/ldc/llvmasm.di b/runtime/import/ldc/llvmasm.di deleted file mode 100644 index a7750c27..00000000 --- a/runtime/import/ldc/llvmasm.di +++ /dev/null @@ -1,17 +0,0 @@ -module ldc.llvmasm; - -struct __asmtuple_t(T...) -{ - T v; -} - -pragma(llvm_inline_asm) -{ - void __asm( )(char[] asmcode, char[] constraints, ...); - T __asm(T)(char[] asmcode, char[] constraints, ...); - - template __asmtuple(T...) - { - __asmtuple_t!(T) __asmtuple(char[] asmcode, char[] constraints, ...); - } -} diff --git a/runtime/internal/aApply.d b/runtime/internal/aApply.d deleted file mode 100644 index 28311dc3..00000000 --- a/runtime/internal/aApply.d +++ /dev/null @@ -1,414 +0,0 @@ -/** - * Part of the D programming language runtime library. - */ - -/* - * Copyright (C) 2004-2006 by Digital Mars, www.digitalmars.com - * Written by Walter Bright - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, in both source and binary form, subject to the following - * restrictions: - * - * o The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * o Altered source versions must be plainly marked as such, and must not - * be misrepresented as being the original software. - * o This notice may not be removed or altered from any source - * distribution. - */ - -/* - * Modified by Sean Kelly for use with Tango. - */ - -/* This code handles decoding UTF strings for foreach loops. - * There are 6 combinations of conversions between char, wchar, - * and dchar, and 2 of each of those. - */ - -private import util.utf; - -//debug = apply; -debug(apply) -{ - extern(C) int printf(char*, ...); -} - -/********************************************** - */ - -// dg is D, but _aApplycd() is C -extern (D) typedef int delegate(void *) dg_t; - -extern (C) int _aApplycd1(char[] aa, dg_t dg) -{ int result; - size_t i; - size_t len = aa.length; - - debug(apply) printf("_aApplycd1(), len = %d\n", len); - for (i = 0; i < len; ) - { dchar d; - - d = aa[i]; - if (d & 0x80) - d = decode(aa, i); - else - i++; - result = dg(cast(void *)&d); - if (result) - break; - } - return result; -} - -extern (C) int _aApplywd1(wchar[] aa, dg_t dg) -{ int result; - size_t i; - size_t len = aa.length; - - debug(apply) printf("_aApplywd1(), len = %d\n", len); - for (i = 0; i < len; ) - { dchar d; - - d = aa[i]; - if (d & ~0x7F) - d = decode(aa, i); - else - i++; - result = dg(cast(void *)&d); - if (result) - break; - } - return result; -} - -extern (C) int _aApplycw1(char[] aa, dg_t dg) -{ int result; - size_t i; - size_t len = aa.length; - - debug(apply) printf("_aApplycw1(), len = %d\n", len); - for (i = 0; i < len; ) - { dchar d; - wchar w; - - w = aa[i]; - if (w & 0x80) - { d = decode(aa, i); - if (d <= 0xFFFF) - w = cast(wchar) d; - else - { - w = cast(wchar)((((d - 0x10000) >> 10) & 0x3FF) + 0xD800); - result = dg(cast(void *)&w); - if (result) - break; - w = cast(wchar)(((d - 0x10000) & 0x3FF) + 0xDC00); - } - } - else - i++; - result = dg(cast(void *)&w); - if (result) - break; - } - return result; -} - -extern (C) int _aApplywc1(wchar[] aa, dg_t dg) -{ int result; - size_t i; - size_t len = aa.length; - - debug(apply) printf("_aApplywc1(), len = %d\n", len); - for (i = 0; i < len; ) - { dchar d; - wchar w; - char c; - - w = aa[i]; - if (w & ~0x7F) - { - char[4] buf; - - d = decode(aa, i); - auto b = toUTF8(buf, d); - foreach (char c2; b) - { - result = dg(cast(void *)&c2); - if (result) - return result; - } - continue; - } - else - { c = cast(char)w; - i++; - } - result = dg(cast(void *)&c); - if (result) - break; - } - return result; -} - -extern (C) int _aApplydc1(dchar[] aa, dg_t dg) -{ int result; - - debug(apply) printf("_aApplydc1(), len = %d\n", aa.length); - foreach (dchar d; aa) - { - char c; - - if (d & ~0x7F) - { - char[4] buf; - - auto b = toUTF8(buf, d); - foreach (char c2; b) - { - result = dg(cast(void *)&c2); - if (result) - return result; - } - continue; - } - else - { - c = cast(char)d; - } - result = dg(cast(void *)&c); - if (result) - break; - } - return result; -} - -extern (C) int _aApplydw1(dchar[] aa, dg_t dg) -{ int result; - - debug(apply) printf("_aApplydw1(), len = %d\n", aa.length); - foreach (dchar d; aa) - { - wchar w; - - if (d <= 0xFFFF) - w = cast(wchar) d; - else - { - w = cast(wchar)((((d - 0x10000) >> 10) & 0x3FF) + 0xD800); - result = dg(cast(void *)&w); - if (result) - break; - w = cast(wchar)(((d - 0x10000) & 0x3FF) + 0xDC00); - } - result = dg(cast(void *)&w); - if (result) - break; - } - return result; -} - - -/****************************************************************************/ - -// dg is D, but _aApplycd2() is C -extern (D) typedef int delegate(void *, void *) dg2_t; - -extern (C) int _aApplycd2(char[] aa, dg2_t dg) -{ int result; - size_t i; - size_t n; - size_t len = aa.length; - - debug(apply) printf("_aApplycd2(), len = %d\n", len); - for (i = 0; i < len; i += n) - { dchar d; - - d = aa[i]; - if (d & 0x80) - { - n = i; - d = decode(aa, n); - n -= i; - } - else - n = 1; - result = dg(&i, cast(void *)&d); - if (result) - break; - } - return result; -} - -extern (C) int _aApplywd2(wchar[] aa, dg2_t dg) -{ int result; - size_t i; - size_t n; - size_t len = aa.length; - - debug(apply) printf("_aApplywd2(), len = %d\n", len); - for (i = 0; i < len; i += n) - { dchar d; - - d = aa[i]; - if (d & ~0x7F) - { - n = i; - d = decode(aa, n); - n -= i; - } - else - n = 1; - result = dg(&i, cast(void *)&d); - if (result) - break; - } - return result; -} - -extern (C) int _aApplycw2(char[] aa, dg2_t dg) -{ int result; - size_t i; - size_t n; - size_t len = aa.length; - - debug(apply) printf("_aApplycw2(), len = %d\n", len); - for (i = 0; i < len; i += n) - { dchar d; - wchar w; - - w = aa[i]; - if (w & 0x80) - { n = i; - d = decode(aa, n); - n -= i; - if (d <= 0xFFFF) - w = cast(wchar) d; - else - { - w = cast(wchar) ((((d - 0x10000) >> 10) & 0x3FF) + 0xD800); - result = dg(&i, cast(void *)&w); - if (result) - break; - w = cast(wchar) (((d - 0x10000) & 0x3FF) + 0xDC00); - } - } - else - n = 1; - result = dg(&i, cast(void *)&w); - if (result) - break; - } - return result; -} - -extern (C) int _aApplywc2(wchar[] aa, dg2_t dg) -{ int result; - size_t i; - size_t n; - size_t len = aa.length; - - debug(apply) printf("_aApplywc2(), len = %d\n", len); - for (i = 0; i < len; i += n) - { dchar d; - wchar w; - char c; - - w = aa[i]; - if (w & ~0x7F) - { - char[4] buf; - - n = i; - d = decode(aa, n); - n -= i; - auto b = toUTF8(buf, d); - foreach (char c2; b) - { - result = dg(&i, cast(void *)&c2); - if (result) - return result; - } - continue; - } - else - { c = cast(char)w; - n = 1; - } - result = dg(&i, cast(void *)&c); - if (result) - break; - } - return result; -} - -extern (C) int _aApplydc2(dchar[] aa, dg2_t dg) -{ int result; - size_t i; - size_t len = aa.length; - - debug(apply) printf("_aApplydc2(), len = %d\n", len); - for (i = 0; i < len; i++) - { dchar d; - char c; - - d = aa[i]; - debug(apply) printf("d = %u\n", d); - if (d & ~0x7F) - { - char[4] buf; - - auto b = toUTF8(buf, d); - foreach (char c2; b) - { - debug(apply) printf("c2 = %d\n", c2); - result = dg(&i, cast(void *)&c2); - if (result) - return result; - } - continue; - } - else - { c = cast(char)d; - } - result = dg(&i, cast(void *)&c); - if (result) - break; - } - return result; -} - -extern (C) int _aApplydw2(dchar[] aa, dg2_t dg) -{ int result; - - debug(apply) printf("_aApplydw2(), len = %d\n", aa.length); - foreach (size_t i, dchar d; aa) - { - wchar w; - auto j = i; - - if (d <= 0xFFFF) - w = cast(wchar) d; - else - { - w = cast(wchar) ((((d - 0x10000) >> 10) & 0x3FF) + 0xD800); - result = dg(&j, cast(void *)&w); - if (result) - break; - w = cast(wchar) (((d - 0x10000) & 0x3FF) + 0xDC00); - } - result = dg(&j, cast(void *)&w); - if (result) - break; - } - return result; -} diff --git a/runtime/internal/aApplyR.d b/runtime/internal/aApplyR.d deleted file mode 100644 index 1d301da9..00000000 --- a/runtime/internal/aApplyR.d +++ /dev/null @@ -1,975 +0,0 @@ - -/** - * Part of the D programming language runtime library. - */ - -/* - * Copyright (C) 2004-2006 by Digital Mars, www.digitalmars.com - * Written by Walter Bright - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, in both source and binary form, subject to the following - * restrictions: - * - * o The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * o Altered source versions must be plainly marked as such, and must not - * be misrepresented as being the original software. - * o This notice may not be removed or altered from any source - * distribution. - */ - -/* - * Modified by Sean Kelly for use with Tango. - */ - -/* This code handles decoding UTF strings for foreach_reverse loops. - * There are 6 combinations of conversions between char, wchar, - * and dchar, and 2 of each of those. - */ - -private import util.utf; - -/**********************************************/ -/* 1 argument versions */ - -// dg is D, but _aApplyRcd() is C -extern (D) typedef int delegate(void *) dg_t; - -extern (C) int _aApplyRcd1(in char[] aa, dg_t dg) -{ int result; - - debug(apply) printf("_aApplyRcd1(), len = %d\n", aa.length); - for (size_t i = aa.length; i != 0; ) - { dchar d; - - i--; - d = aa[i]; - if (d & 0x80) - { char c = cast(char)d; - uint j; - uint m = 0x3F; - d = 0; - while ((c & 0xC0) != 0xC0) - { if (i == 0) - onUnicodeError("Invalid UTF-8 sequence", 0); - i--; - d |= (c & 0x3F) << j; - j += 6; - m >>= 1; - c = aa[i]; - } - d |= (c & m) << j; - } - result = dg(cast(void *)&d); - if (result) - break; - } - return result; -} - -unittest -{ - debug(apply) printf("_aApplyRcd1.unittest\n"); - - char[] s = "hello"c; - int i; - - foreach_reverse(dchar d; s) - { - switch (i) - { - case 0: assert(d == 'o'); break; - case 1: assert(d == 'l'); break; - case 2: assert(d == 'l'); break; - case 3: assert(d == 'e'); break; - case 4: assert(d == 'h'); break; - default: assert(0); - } - i++; - } - assert(i == 5); - - s = "a\u1234\U00100456b"; - i = 0; - foreach_reverse(dchar d; s) - { - //printf("i = %d, d = %x\n", i, d); - switch (i) - { - case 0: assert(d == 'b'); break; - case 1: assert(d == '\U00100456'); break; - case 2: assert(d == '\u1234'); break; - case 3: assert(d == 'a'); break; - default: assert(0); - } - i++; - } - assert(i == 4); -} - -/*****************************/ - -extern (C) int _aApplyRwd1(in wchar[] aa, dg_t dg) -{ int result; - - debug(apply) printf("_aApplyRwd1(), len = %d\n", aa.length); - for (size_t i = aa.length; i != 0; ) - { dchar d; - - i--; - d = aa[i]; - if (d >= 0xDC00 && d <= 0xDFFF) - { if (i == 0) - onUnicodeError("Invalid UTF-16 sequence", 0); - i--; - d = ((aa[i] - 0xD7C0) << 10) + (d - 0xDC00); - } - result = dg(cast(void *)&d); - if (result) - break; - } - return result; -} - -unittest -{ - debug(apply) printf("_aApplyRwd1.unittest\n"); - - wchar[] s = "hello"w; - int i; - - foreach_reverse(dchar d; s) - { - switch (i) - { - case 0: assert(d == 'o'); break; - case 1: assert(d == 'l'); break; - case 2: assert(d == 'l'); break; - case 3: assert(d == 'e'); break; - case 4: assert(d == 'h'); break; - default: assert(0); - } - i++; - } - assert(i == 5); - - s = "a\u1234\U00100456b"; - i = 0; - foreach_reverse(dchar d; s) - { - //printf("i = %d, d = %x\n", i, d); - switch (i) - { - case 0: assert(d == 'b'); break; - case 1: assert(d == '\U00100456'); break; - case 2: assert(d == '\u1234'); break; - case 3: assert(d == 'a'); break; - default: assert(0); - } - i++; - } - assert(i == 4); -} - -/*****************************/ - -extern (C) int _aApplyRcw1(in char[] aa, dg_t dg) -{ int result; - - debug(apply) printf("_aApplyRcw1(), len = %d\n", aa.length); - for (size_t i = aa.length; i != 0; ) - { dchar d; - wchar w; - - i--; - w = aa[i]; - if (w & 0x80) - { char c = cast(char)w; - uint j; - uint m = 0x3F; - d = 0; - while ((c & 0xC0) != 0xC0) - { if (i == 0) - onUnicodeError("Invalid UTF-8 sequence", 0); - i--; - d |= (c & 0x3F) << j; - j += 6; - m >>= 1; - c = aa[i]; - } - d |= (c & m) << j; - - if (d <= 0xFFFF) - w = cast(wchar) d; - else - { - w = cast(wchar) ((((d - 0x10000) >> 10) & 0x3FF) + 0xD800); - result = dg(cast(void *)&w); - if (result) - break; - w = cast(wchar) (((d - 0x10000) & 0x3FF) + 0xDC00); - } - } - result = dg(cast(void *)&w); - if (result) - break; - } - return result; -} - -unittest -{ - debug(apply) printf("_aApplyRcw1.unittest\n"); - - char[] s = "hello"c; - int i; - - foreach_reverse(wchar d; s) - { - switch (i) - { - case 0: assert(d == 'o'); break; - case 1: assert(d == 'l'); break; - case 2: assert(d == 'l'); break; - case 3: assert(d == 'e'); break; - case 4: assert(d == 'h'); break; - default: assert(0); - } - i++; - } - assert(i == 5); - - s = "a\u1234\U00100456b"; - i = 0; - foreach_reverse(wchar d; s) - { - //printf("i = %d, d = %x\n", i, d); - switch (i) - { - case 0: assert(d == 'b'); break; - case 1: assert(d == 0xDBC1); break; - case 2: assert(d == 0xDC56); break; - case 3: assert(d == 0x1234); break; - case 4: assert(d == 'a'); break; - default: assert(0); - } - i++; - } - assert(i == 5); -} - -/*****************************/ - -extern (C) int _aApplyRwc1(in wchar[] aa, dg_t dg) -{ int result; - - debug(apply) printf("_aApplyRwc1(), len = %d\n", aa.length); - for (size_t i = aa.length; i != 0; ) - { dchar d; - char c; - - i--; - d = aa[i]; - if (d >= 0xDC00 && d <= 0xDFFF) - { if (i == 0) - onUnicodeError("Invalid UTF-16 sequence", 0); - i--; - d = ((aa[i] - 0xD7C0) << 10) + (d - 0xDC00); - } - - if (d & ~0x7F) - { - char[4] buf; - - auto b = toUTF8(buf, d); - foreach (char c2; b) - { - result = dg(cast(void *)&c2); - if (result) - return result; - } - continue; - } - c = cast(char)d; - result = dg(cast(void *)&c); - if (result) - break; - } - return result; -} - -unittest -{ - debug(apply) printf("_aApplyRwc1.unittest\n"); - - wchar[] s = "hello"w; - int i; - - foreach_reverse(char d; s) - { - switch (i) - { - case 0: assert(d == 'o'); break; - case 1: assert(d == 'l'); break; - case 2: assert(d == 'l'); break; - case 3: assert(d == 'e'); break; - case 4: assert(d == 'h'); break; - default: assert(0); - } - i++; - } - assert(i == 5); - - s = "a\u1234\U00100456b"; - i = 0; - foreach_reverse(char d; s) - { - //printf("i = %d, d = %x\n", i, d); - switch (i) - { - case 0: assert(d == 'b'); break; - case 1: assert(d == 0xF4); break; - case 2: assert(d == 0x80); break; - case 3: assert(d == 0x91); break; - case 4: assert(d == 0x96); break; - case 5: assert(d == 0xE1); break; - case 6: assert(d == 0x88); break; - case 7: assert(d == 0xB4); break; - case 8: assert(d == 'a'); break; - default: assert(0); - } - i++; - } - assert(i == 9); -} - -/*****************************/ - -extern (C) int _aApplyRdc1(in dchar[] aa, dg_t dg) -{ int result; - - debug(apply) printf("_aApplyRdc1(), len = %d\n", aa.length); - for (size_t i = aa.length; i != 0;) - { dchar d = aa[--i]; - char c; - - if (d & ~0x7F) - { - char[4] buf; - - auto b = toUTF8(buf, d); - foreach (char c2; b) - { - result = dg(cast(void *)&c2); - if (result) - return result; - } - continue; - } - else - { - c = cast(char)d; - } - result = dg(cast(void *)&c); - if (result) - break; - } - return result; -} - -unittest -{ - debug(apply) printf("_aApplyRdc1.unittest\n"); - - dchar[] s = "hello"d; - int i; - - foreach_reverse(char d; s) - { - switch (i) - { - case 0: assert(d == 'o'); break; - case 1: assert(d == 'l'); break; - case 2: assert(d == 'l'); break; - case 3: assert(d == 'e'); break; - case 4: assert(d == 'h'); break; - default: assert(0); - } - i++; - } - assert(i == 5); - - s = "a\u1234\U00100456b"; - i = 0; - foreach_reverse(char d; s) - { - //printf("i = %d, d = %x\n", i, d); - switch (i) - { - case 0: assert(d == 'b'); break; - case 1: assert(d == 0xF4); break; - case 2: assert(d == 0x80); break; - case 3: assert(d == 0x91); break; - case 4: assert(d == 0x96); break; - case 5: assert(d == 0xE1); break; - case 6: assert(d == 0x88); break; - case 7: assert(d == 0xB4); break; - case 8: assert(d == 'a'); break; - default: assert(0); - } - i++; - } - assert(i == 9); -} - -/*****************************/ - -extern (C) int _aApplyRdw1(in dchar[] aa, dg_t dg) -{ int result; - - debug(apply) printf("_aApplyRdw1(), len = %d\n", aa.length); - for (size_t i = aa.length; i != 0; ) - { dchar d = aa[--i]; - wchar w; - - if (d <= 0xFFFF) - w = cast(wchar) d; - else - { - w = cast(wchar) ((((d - 0x10000) >> 10) & 0x3FF) + 0xD800); - result = dg(cast(void *)&w); - if (result) - break; - w = cast(wchar) (((d - 0x10000) & 0x3FF) + 0xDC00); - } - result = dg(cast(void *)&w); - if (result) - break; - } - return result; -} - -unittest -{ - debug(apply) printf("_aApplyRdw1.unittest\n"); - - dchar[] s = "hello"d; - int i; - - foreach_reverse(wchar d; s) - { - switch (i) - { - case 0: assert(d == 'o'); break; - case 1: assert(d == 'l'); break; - case 2: assert(d == 'l'); break; - case 3: assert(d == 'e'); break; - case 4: assert(d == 'h'); break; - default: assert(0); - } - i++; - } - assert(i == 5); - - s = "a\u1234\U00100456b"; - i = 0; - foreach_reverse(wchar d; s) - { - //printf("i = %d, d = %x\n", i, d); - switch (i) - { - case 0: assert(d == 'b'); break; - case 1: assert(d == 0xDBC1); break; - case 2: assert(d == 0xDC56); break; - case 3: assert(d == 0x1234); break; - case 4: assert(d == 'a'); break; - default: assert(0); - } - i++; - } - assert(i == 5); -} - - -/****************************************************************************/ -/* 2 argument versions */ - -// dg is D, but _aApplyRcd2() is C -extern (D) typedef int delegate(void *, void *) dg2_t; - -extern (C) int _aApplyRcd2(in char[] aa, dg2_t dg) -{ int result; - size_t i; - size_t len = aa.length; - - debug(apply) printf("_aApplyRcd2(), len = %d\n", len); - for (i = len; i != 0; ) - { dchar d; - - i--; - d = aa[i]; - if (d & 0x80) - { char c = cast(char)d; - uint j; - uint m = 0x3F; - d = 0; - while ((c & 0xC0) != 0xC0) - { if (i == 0) - onUnicodeError("Invalid UTF-8 sequence", 0); - i--; - d |= (c & 0x3F) << j; - j += 6; - m >>= 1; - c = aa[i]; - } - d |= (c & m) << j; - } - result = dg(&i, cast(void *)&d); - if (result) - break; - } - return result; -} - -unittest -{ - debug(apply) printf("_aApplyRcd2.unittest\n"); - - char[] s = "hello"c; - int i; - - foreach_reverse(k, dchar d; s) - { - assert(k == 4 - i); - switch (i) - { - case 0: assert(d == 'o'); break; - case 1: assert(d == 'l'); break; - case 2: assert(d == 'l'); break; - case 3: assert(d == 'e'); break; - case 4: assert(d == 'h'); break; - default: assert(0); - } - i++; - } - assert(i == 5); - - s = "a\u1234\U00100456b"; - i = 0; - foreach_reverse(k, dchar d; s) - { - //printf("i = %d, k = %d, d = %x\n", i, k, d); - switch (i) - { - case 0: assert(d == 'b'); assert(k == 8); break; - case 1: assert(d == '\U00100456'); assert(k == 4); break; - case 2: assert(d == '\u1234'); assert(k == 1); break; - case 3: assert(d == 'a'); assert(k == 0); break; - default: assert(0); - } - i++; - } - assert(i == 4); -} - -/*****************************/ - -extern (C) int _aApplyRwd2(in wchar[] aa, dg2_t dg) -{ int result; - - debug(apply) printf("_aApplyRwd2(), len = %d\n", aa.length); - for (size_t i = aa.length; i != 0; ) - { dchar d; - - i--; - d = aa[i]; - if (d >= 0xDC00 && d <= 0xDFFF) - { if (i == 0) - onUnicodeError("Invalid UTF-16 sequence", 0); - i--; - d = ((aa[i] - 0xD7C0) << 10) + (d - 0xDC00); - } - result = dg(&i, cast(void *)&d); - if (result) - break; - } - return result; -} - -unittest -{ - debug(apply) printf("_aApplyRwd2.unittest\n"); - - wchar[] s = "hello"w; - int i; - - foreach_reverse(k, dchar d; s) - { - //printf("i = %d, k = %d, d = %x\n", i, k, d); - assert(k == 4 - i); - switch (i) - { - case 0: assert(d == 'o'); break; - case 1: assert(d == 'l'); break; - case 2: assert(d == 'l'); break; - case 3: assert(d == 'e'); break; - case 4: assert(d == 'h'); break; - default: assert(0); - } - i++; - } - assert(i == 5); - - s = "a\u1234\U00100456b"; - i = 0; - foreach_reverse(k, dchar d; s) - { - //printf("i = %d, k = %d, d = %x\n", i, k, d); - switch (i) - { - case 0: assert(k == 4); assert(d == 'b'); break; - case 1: assert(k == 2); assert(d == '\U00100456'); break; - case 2: assert(k == 1); assert(d == '\u1234'); break; - case 3: assert(k == 0); assert(d == 'a'); break; - default: assert(0); - } - i++; - } - assert(i == 4); -} - -/*****************************/ - -extern (C) int _aApplyRcw2(in char[] aa, dg2_t dg) -{ int result; - - debug(apply) printf("_aApplyRcw2(), len = %d\n", aa.length); - for (size_t i = aa.length; i != 0; ) - { dchar d; - wchar w; - - i--; - w = aa[i]; - if (w & 0x80) - { char c = cast(char)w; - uint j; - uint m = 0x3F; - d = 0; - while ((c & 0xC0) != 0xC0) - { if (i == 0) - onUnicodeError("Invalid UTF-8 sequence", 0); - i--; - d |= (c & 0x3F) << j; - j += 6; - m >>= 1; - c = aa[i]; - } - d |= (c & m) << j; - - if (d <= 0xFFFF) - w = cast(wchar) d; - else - { - w = cast(wchar) ((((d - 0x10000) >> 10) & 0x3FF) + 0xD800); - result = dg(&i, cast(void *)&w); - if (result) - break; - w = cast(wchar) (((d - 0x10000) & 0x3FF) + 0xDC00); - } - } - result = dg(&i, cast(void *)&w); - if (result) - break; - } - return result; -} - -unittest -{ - debug(apply) printf("_aApplyRcw2.unittest\n"); - - char[] s = "hello"c; - int i; - - foreach_reverse(k, wchar d; s) - { - //printf("i = %d, k = %d, d = %x\n", i, k, d); - assert(k == 4 - i); - switch (i) - { - case 0: assert(d == 'o'); break; - case 1: assert(d == 'l'); break; - case 2: assert(d == 'l'); break; - case 3: assert(d == 'e'); break; - case 4: assert(d == 'h'); break; - default: assert(0); - } - i++; - } - assert(i == 5); - - s = "a\u1234\U00100456b"; - i = 0; - foreach_reverse(k, wchar d; s) - { - //printf("i = %d, k = %d, d = %x\n", i, k, d); - switch (i) - { - case 0: assert(k == 8); assert(d == 'b'); break; - case 1: assert(k == 4); assert(d == 0xDBC1); break; - case 2: assert(k == 4); assert(d == 0xDC56); break; - case 3: assert(k == 1); assert(d == 0x1234); break; - case 4: assert(k == 0); assert(d == 'a'); break; - default: assert(0); - } - i++; - } - assert(i == 5); -} - -/*****************************/ - -extern (C) int _aApplyRwc2(in wchar[] aa, dg2_t dg) -{ int result; - - debug(apply) printf("_aApplyRwc2(), len = %d\n", aa.length); - for (size_t i = aa.length; i != 0; ) - { dchar d; - char c; - - i--; - d = aa[i]; - if (d >= 0xDC00 && d <= 0xDFFF) - { if (i == 0) - onUnicodeError("Invalid UTF-16 sequence", 0); - i--; - d = ((aa[i] - 0xD7C0) << 10) + (d - 0xDC00); - } - - if (d & ~0x7F) - { - char[4] buf; - - auto b = toUTF8(buf, d); - foreach (char c2; b) - { - result = dg(&i, cast(void *)&c2); - if (result) - return result; - } - continue; - } - c = cast(char)d; - result = dg(&i, cast(void *)&c); - if (result) - break; - } - return result; -} - -unittest -{ - debug(apply) printf("_aApplyRwc2.unittest\n"); - - wchar[] s = "hello"w; - int i; - - foreach_reverse(k, char d; s) - { - //printf("i = %d, k = %d, d = %x\n", i, k, d); - assert(k == 4 - i); - switch (i) - { - case 0: assert(d == 'o'); break; - case 1: assert(d == 'l'); break; - case 2: assert(d == 'l'); break; - case 3: assert(d == 'e'); break; - case 4: assert(d == 'h'); break; - default: assert(0); - } - i++; - } - assert(i == 5); - - s = "a\u1234\U00100456b"; - i = 0; - foreach_reverse(k, char d; s) - { - //printf("i = %d, k = %d, d = %x\n", i, k, d); - switch (i) - { - case 0: assert(k == 4); assert(d == 'b'); break; - case 1: assert(k == 2); assert(d == 0xF4); break; - case 2: assert(k == 2); assert(d == 0x80); break; - case 3: assert(k == 2); assert(d == 0x91); break; - case 4: assert(k == 2); assert(d == 0x96); break; - case 5: assert(k == 1); assert(d == 0xE1); break; - case 6: assert(k == 1); assert(d == 0x88); break; - case 7: assert(k == 1); assert(d == 0xB4); break; - case 8: assert(k == 0); assert(d == 'a'); break; - default: assert(0); - } - i++; - } - assert(i == 9); -} - -/*****************************/ - -extern (C) int _aApplyRdc2(in dchar[] aa, dg2_t dg) -{ int result; - - debug(apply) printf("_aApplyRdc2(), len = %d\n", aa.length); - for (size_t i = aa.length; i != 0; ) - { dchar d = aa[--i]; - char c; - - if (d & ~0x7F) - { - char[4] buf; - - auto b = toUTF8(buf, d); - foreach (char c2; b) - { - result = dg(&i, cast(void *)&c2); - if (result) - return result; - } - continue; - } - else - { c = cast(char)d; - } - result = dg(&i, cast(void *)&c); - if (result) - break; - } - return result; -} - -unittest -{ - debug(apply) printf("_aApplyRdc2.unittest\n"); - - dchar[] s = "hello"d; - int i; - - foreach_reverse(k, char d; s) - { - //printf("i = %d, k = %d, d = %x\n", i, k, d); - assert(k == 4 - i); - switch (i) - { - case 0: assert(d == 'o'); break; - case 1: assert(d == 'l'); break; - case 2: assert(d == 'l'); break; - case 3: assert(d == 'e'); break; - case 4: assert(d == 'h'); break; - default: assert(0); - } - i++; - } - assert(i == 5); - - s = "a\u1234\U00100456b"; - i = 0; - foreach_reverse(k, char d; s) - { - //printf("i = %d, k = %d, d = %x\n", i, k, d); - switch (i) - { - case 0: assert(k == 3); assert(d == 'b'); break; - case 1: assert(k == 2); assert(d == 0xF4); break; - case 2: assert(k == 2); assert(d == 0x80); break; - case 3: assert(k == 2); assert(d == 0x91); break; - case 4: assert(k == 2); assert(d == 0x96); break; - case 5: assert(k == 1); assert(d == 0xE1); break; - case 6: assert(k == 1); assert(d == 0x88); break; - case 7: assert(k == 1); assert(d == 0xB4); break; - case 8: assert(k == 0); assert(d == 'a'); break; - default: assert(0); - } - i++; - } - assert(i == 9); -} - -/*****************************/ - -extern (C) int _aApplyRdw2(in dchar[] aa, dg2_t dg) -{ int result; - - debug(apply) printf("_aApplyRdw2(), len = %d\n", aa.length); - for (size_t i = aa.length; i != 0; ) - { dchar d = aa[--i]; - wchar w; - - if (d <= 0xFFFF) - w = cast(wchar) d; - else - { - w = cast(wchar) ((((d - 0x10000) >> 10) & 0x3FF) + 0xD800); - result = dg(&i, cast(void *)&w); - if (result) - break; - w = cast(wchar) (((d - 0x10000) & 0x3FF) + 0xDC00); - } - result = dg(&i, cast(void *)&w); - if (result) - break; - } - return result; -} - -unittest -{ - debug(apply) printf("_aApplyRdw2.unittest\n"); - - dchar[] s = "hello"d; - int i; - - foreach_reverse(k, wchar d; s) - { - //printf("i = %d, k = %d, d = %x\n", i, k, d); - assert(k == 4 - i); - switch (i) - { - case 0: assert(d == 'o'); break; - case 1: assert(d == 'l'); break; - case 2: assert(d == 'l'); break; - case 3: assert(d == 'e'); break; - case 4: assert(d == 'h'); break; - default: assert(0); - } - i++; - } - assert(i == 5); - - s = "a\u1234\U00100456b"; - i = 0; - foreach_reverse(k, wchar d; s) - { - //printf("i = %d, k = %d, d = %x\n", i, k, d); - switch (i) - { - case 0: assert(k == 3); assert(d == 'b'); break; - case 1: assert(k == 2); assert(d == 0xDBC1); break; - case 2: assert(k == 2); assert(d == 0xDC56); break; - case 3: assert(k == 1); assert(d == 0x1234); break; - case 4: assert(k == 0); assert(d == 'a'); break; - default: assert(0); - } - i++; - } - assert(i == 5); -} - - diff --git a/runtime/internal/aaA.d b/runtime/internal/aaA.d deleted file mode 100644 index 2bd01378..00000000 --- a/runtime/internal/aaA.d +++ /dev/null @@ -1,798 +0,0 @@ -//_ aaA.d - -/** - * Part of the D programming language runtime library. - * Implementation of associative arrays. - */ - -/* - * Copyright (C) 2000-2008 by Digital Mars, www.digitalmars.com - * Written by Walter Bright - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * o The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * o Altered source versions must be plainly marked as such, and must not - * be misrepresented as being the original software. - * o This notice may not be removed or altered from any source - * distribution. - */ - -/* - * Modified by Sean Kelly for use with Tango. - * Modified by Tomas Lindquist Olsen for use with LDC. - */ - -private -{ - import tango.stdc.stdarg; - import tango.stdc.string; - - enum BlkAttr : uint - { - FINALIZE = 0b0000_0001, - NO_SCAN = 0b0000_0010, - NO_MOVE = 0b0000_0100, - ALL_BITS = 0b1111_1111 - } - - extern (C) void* gc_malloc( size_t sz, uint ba = 0 ); - extern (C) void* gc_calloc( size_t sz, uint ba = 0 ); - extern (C) void gc_free( void* p ); -} - -// Auto-rehash and pre-allocate - Dave Fladebo - -static size_t[] prime_list = [ - 97UL, 389UL, - 1_543UL, 6_151UL, - 24_593UL, 98_317UL, - 393_241UL, 1_572_869UL, - 6_291_469UL, 25_165_843UL, - 100_663_319UL, 402_653_189UL, - 1_610_612_741UL, 4_294_967_291UL, -// 8_589_934_513UL, 17_179_869_143UL -]; - -struct aaA -{ - aaA *left; - aaA *right; - hash_t hash; - /* key */ - /* value */ -} - -struct BB -{ - aaA*[] b; - size_t nodes; // total number of aaA nodes - TypeInfo keyti; // TODO: replace this with TypeInfo_AssociativeArray when available in _aaGet() -} - -/* This is the type actually seen by the programmer, although - * it is completely opaque. - */ - -// LDC doesn't pass structs in registers so no need to wrap it ... -alias BB* AA; - -/********************************** - * Align to next pointer boundary, so that - * GC won't be faced with misaligned pointers - * in value. - */ - -size_t aligntsize(size_t tsize) -{ - return (tsize + size_t.sizeof - 1) & ~(size_t.sizeof - 1); -} - -extern (C): - -/************************************************* - * Invariant for aa. - */ - -/+ -void _aaInvAh(aaA*[] aa) -{ - for (size_t i = 0; i < aa.length; i++) - { - if (aa[i]) - _aaInvAh_x(aa[i]); - } -} - -private int _aaCmpAh_x(aaA *e1, aaA *e2) -{ int c; - - c = e1.hash - e2.hash; - if (c == 0) - { - c = e1.key.length - e2.key.length; - if (c == 0) - c = memcmp((char *)e1.key, (char *)e2.key, e1.key.length); - } - return c; -} - -private void _aaInvAh_x(aaA *e) -{ - hash_t key_hash; - aaA *e1; - aaA *e2; - - key_hash = getHash(e.key); - assert(key_hash == e.hash); - - while (1) - { int c; - - e1 = e.left; - if (e1) - { - _aaInvAh_x(e1); // ordinary recursion - do - { - c = _aaCmpAh_x(e1, e); - assert(c < 0); - e1 = e1.right; - } while (e1 != null); - } - - e2 = e.right; - if (e2) - { - do - { - c = _aaCmpAh_x(e, e2); - assert(c < 0); - e2 = e2.left; - } while (e2 != null); - e = e.right; // tail recursion - } - else - break; - } -} -+/ - -/**************************************************** - * Determine number of entries in associative array. - */ - -size_t _aaLen(AA aa) -in -{ - //printf("_aaLen()+\n"); - //_aaInv(aa); -} -out (result) -{ - size_t len = 0; - - void _aaLen_x(aaA* ex) - { - auto e = ex; - len++; - - while (1) - { - if (e.right) - _aaLen_x(e.right); - e = e.left; - if (!e) - break; - len++; - } - } - - if (aa) - { - foreach (e; aa.b) - { - if (e) - _aaLen_x(e); - } - } - assert(len == result); - - //printf("_aaLen()-\n"); -} -body -{ - return aa ? aa.nodes : 0; -} - - -/************************************************* - * Get pointer to value in associative array indexed by key. - * Add entry for key if it is not already there. - */ - -void* _aaGet(AA* aa_arg, TypeInfo keyti, size_t valuesize, void* pkey) -in -{ - assert(aa_arg); -} -out (result) -{ - assert(result); - assert(*aa_arg); - assert((*aa_arg).b.length); - //assert(_aaInAh(*aa, key)); -} -body -{ - //auto pkey = cast(void *)(&valuesize + 1); - size_t i; - aaA *e; - auto keysize = aligntsize(keyti.tsize()); - - if (!*aa_arg) - *aa_arg = new BB(); - auto aa = *aa_arg; - aa.keyti = keyti; - - if (!aa.b.length) - { - alias aaA *pa; - auto len = prime_list[0]; - - aa.b = new pa[len]; - } - - auto key_hash = keyti.getHash(pkey); - //printf("hash = %d\n", key_hash); - i = key_hash % aa.b.length; - auto pe = &aa.b[i]; - while ((e = *pe) !is null) - { - if (key_hash == e.hash) - { - auto c = keyti.compare(pkey, e + 1); - if (c == 0) - goto Lret; - pe = (c < 0) ? &e.left : &e.right; - } - else - pe = (key_hash < e.hash) ? &e.left : &e.right; - } - - // Not found, create new elem - //printf("create new one\n"); - size_t size = aaA.sizeof + keysize + valuesize; - e = cast(aaA *) gc_calloc(size); - memcpy(e + 1, pkey, keysize); - e.hash = key_hash; - *pe = e; - - auto nodes = ++aa.nodes; - //printf("length = %d, nodes = %d\n", (*aa).length, nodes); - if (nodes > aa.b.length * 4) - { - _aaRehash(aa_arg,keyti); - } - -Lret: - return cast(void *)(e + 1) + keysize; -} - - -/************************************************* - * Get pointer to value in associative array indexed by key. - * Returns null if it is not already there. - * Used for both "aa[key]" and "key in aa" - * Returns: - * null not in aa - * !=null in aa, return pointer to value - */ - -void* _aaIn(AA aa, TypeInfo keyti, void *pkey) -in -{ -} -out (result) -{ - //assert(result == 0 || result == 1); -} -body -{ - if (aa) - { - //auto pkey = cast(void *)(&keyti + 1); - - //printf("_aaIn(), .length = %d, .ptr = %x\n", aa.length, cast(uint)aa.ptr); - auto len = aa.b.length; - - if (len) - { - auto key_hash = keyti.getHash(pkey); - //printf("hash = %d\n", key_hash); - size_t i = key_hash % len; - auto e = aa.b[i]; - while (e !is null) - { - if (key_hash == e.hash) - { - auto c = keyti.compare(pkey, e + 1); - if (c == 0) - return cast(void *)(e + 1) + aligntsize(keyti.tsize()); - e = (c < 0) ? e.left : e.right; - } - else - e = (key_hash < e.hash) ? e.left : e.right; - } - } - } - - // Not found - return null; -} - -/************************************************* - * Delete key entry in aa[]. - * If key is not in aa[], do nothing. - */ - -void _aaDel(AA aa, TypeInfo keyti, void *pkey) -{ - //auto pkey = cast(void *)(&keyti + 1); - aaA *e; - - if (aa && aa.b.length) - { - auto key_hash = keyti.getHash(pkey); - //printf("hash = %d\n", key_hash); - size_t i = key_hash % aa.b.length; - auto pe = &aa.b[i]; - while ((e = *pe) !is null) // null means not found - { - if (key_hash == e.hash) - { - auto c = keyti.compare(pkey, e + 1); - if (c == 0) - { - if (!e.left && !e.right) - { - *pe = null; - } - else if (e.left && !e.right) - { - *pe = e.left; - e.left = null; - } - else if (!e.left && e.right) - { - *pe = e.right; - e.right = null; - } - else - { - *pe = e.left; - e.left = null; - do - pe = &(*pe).right; - while (*pe); - *pe = e.right; - e.right = null; - } - - aa.nodes--; - gc_free(e); - - break; - } - pe = (c < 0) ? &e.left : &e.right; - } - else - pe = (key_hash < e.hash) ? &e.left : &e.right; - } - } -} - - -/******************************************** - * Produce array of values from aa. - * The actual type is painted on the return value by the frontend - * This means the returned length should be the number of elements - */ - -void[] _aaValues(AA aa, size_t keysize, size_t valuesize) -in -{ - assert(keysize == aligntsize(keysize)); -} -body -{ - size_t resi; - void[] a; - - void _aaValues_x(aaA* e) - { - do - { - memcpy(a.ptr + resi * valuesize, - cast(byte*)e + aaA.sizeof + keysize, - valuesize); - resi++; - if (e.left) - { if (!e.right) - { e = e.left; - continue; - } - _aaValues_x(e.left); - } - e = e.right; - } while (e !is null); - } - - if (aa) - { - auto len = _aaLen(aa); - auto ptr = cast(byte*) gc_malloc(len * valuesize, - valuesize < (void*).sizeof ? BlkAttr.NO_SCAN : 0); - a = ptr[0 .. len]; - resi = 0; - foreach (e; aa.b) - { - if (e) - _aaValues_x(e); - } - assert(resi == a.length); - } - return a; -} - - -/******************************************** - * Rehash an array. - */ - -void* _aaRehash(AA* paa, TypeInfo keyti) -in -{ - //_aaInvAh(paa); -} -out (result) -{ - //_aaInvAh(result); -} -body -{ - BB newb; - - void _aaRehash_x(aaA* olde) - { - while (1) - { - auto left = olde.left; - auto right = olde.right; - olde.left = null; - olde.right = null; - - aaA *e; - - //printf("rehash %p\n", olde); - auto key_hash = olde.hash; - size_t i = key_hash % newb.b.length; - auto pe = &newb.b[i]; - while ((e = *pe) !is null) - { - //printf("\te = %p, e.left = %p, e.right = %p\n", e, e.left, e.right); - assert(e.left != e); - assert(e.right != e); - if (key_hash == e.hash) - { - auto c = keyti.compare(olde + 1, e + 1); - assert(c != 0); - pe = (c < 0) ? &e.left : &e.right; - } - else - pe = (key_hash < e.hash) ? &e.left : &e.right; - } - *pe = olde; - - if (right) - { - if (!left) - { olde = right; - continue; - } - _aaRehash_x(right); - } - if (!left) - break; - olde = left; - } - } - - //printf("Rehash\n"); - if (*paa) - { - auto aa = *paa; - auto len = _aaLen(aa); - if (len) - { size_t i; - - for (i = 0; i < prime_list.length - 1; i++) - { - if (len <= prime_list[i]) - break; - } - len = prime_list[i]; - newb.b = new aaA*[len]; - newb.keyti = keyti; - - foreach (e; aa.b) - { - if (e) - _aaRehash_x(e); - } - - newb.nodes = (*aa).nodes; - } - - **paa = newb; - } - return *paa; -} - - -/******************************************** - * Produce array of N byte keys from aa. - * The actual type is painted on the return value by the frontend - * This means the returned length should be the number of elements - */ - -void[] _aaKeys(AA aa, size_t keysize) -{ - byte[] res; - size_t resi; - - void _aaKeys_x(aaA* e) - { - do - { - memcpy(&res[resi * keysize], cast(byte*)(e + 1), keysize); - resi++; - if (e.left) - { if (!e.right) - { e = e.left; - continue; - } - _aaKeys_x(e.left); - } - e = e.right; - } while (e !is null); - } - - auto len = _aaLen(aa); - if (!len) - return null; - res = (cast(byte*) gc_malloc(len * keysize, - !(aa.keyti.flags() & 1) ? BlkAttr.NO_SCAN : 0)) [0 .. len * keysize]; - resi = 0; - foreach (e; aa.b) - { - if (e) - _aaKeys_x(e); - } - assert(resi == len); - - return res.ptr[0 .. len]; -} - - -/********************************************** - * 'apply' for associative arrays - to support foreach - */ - -// dg is D, but _aaApply() is C -extern (D) typedef int delegate(void *) dg_t; - -int _aaApply(AA aa, size_t keysize, dg_t dg) -in -{ - assert(aligntsize(keysize) == keysize); -} -body -{ int result; - - //printf("_aaApply(aa = x%llx, keysize = %d, dg = x%llx)\n", aa, keysize, dg); - - int treewalker(aaA* e) - { int result; - - do - { - //printf("treewalker(e = %p, dg = x%llx)\n", e, dg); - result = dg(cast(void *)(e + 1) + keysize); - if (result) - break; - if (e.right) - { if (!e.left) - { - e = e.right; - continue; - } - result = treewalker(e.right); - if (result) - break; - } - e = e.left; - } while (e); - - return result; - } - - if (aa) - { - foreach (e; aa.b) - { - if (e) - { - result = treewalker(e); - if (result) - break; - } - } - } - return result; -} - -// dg is D, but _aaApply2() is C -extern (D) typedef int delegate(void *, void *) dg2_t; - -int _aaApply2(AA aa, size_t keysize, dg2_t dg) -in -{ - assert(aligntsize(keysize) == keysize); -} -body -{ int result; - - //printf("_aaApply(aa = x%llx, keysize = %d, dg = x%llx)\n", aa, keysize, dg); - - int treewalker(aaA* e) - { int result; - - do - { - //printf("treewalker(e = %p, dg = x%llx)\n", e, dg); - result = dg(cast(void *)(e + 1), cast(void *)(e + 1) + keysize); - if (result) - break; - if (e.right) - { if (!e.left) - { - e = e.right; - continue; - } - result = treewalker(e.right); - if (result) - break; - } - e = e.left; - } while (e); - - return result; - } - - if (aa) - { - foreach (e; aa.b) - { - if (e) - { - result = treewalker(e); - if (result) - break; - } - } - } - return result; -} - - -int _aaEq(AA aa, AA ab, TypeInfo_AssociativeArray ti) -{ - return ti.equals(&aa, &ab); -} - -/*********************************** - * Construct an associative array of type ti from - * length pairs of key/value pairs. - */ - -/+ - -extern (C) -BB* _d_assocarrayliteralT(TypeInfo_AssociativeArray ti, size_t length, ...) -{ - auto valuesize = ti.next.tsize(); // value size - auto keyti = ti.key; - auto keysize = keyti.tsize(); // key size - BB* result; - - //printf("_d_assocarrayliteralT(keysize = %d, valuesize = %d, length = %d)\n", keysize, valuesize, length); - //printf("tivalue = %.*s\n", ti.next.classinfo.name); - if (length == 0 || valuesize == 0 || keysize == 0) - { - ; - } - else - { - va_list q; - va_start!(size_t)(q, length); - - result = new BB(); - size_t i; - - for (i = 0; i < prime_list.length - 1; i++) - { - if (length <= prime_list[i]) - break; - } - auto len = prime_list[i]; - result.b = new aaA*[len]; - - size_t keystacksize = (keysize + int.sizeof - 1) & ~(int.sizeof - 1); - size_t valuestacksize = (valuesize + int.sizeof - 1) & ~(int.sizeof - 1); - - size_t keytsize = aligntsize(keysize); - - for (size_t j = 0; j < length; j++) - { void* pkey = q; - q += keystacksize; - void* pvalue = q; - q += valuestacksize; - aaA* e; - - auto key_hash = keyti.getHash(pkey); - //printf("hash = %d\n", key_hash); - i = key_hash % len; - auto pe = &result.b[i]; - while (1) - { - e = *pe; - if (!e) - { - // Not found, create new elem - //printf("create new one\n"); - e = cast(aaA *) cast(void*) new void[aaA.sizeof + keytsize + valuesize]; - memcpy(e + 1, pkey, keysize); - e.hash = key_hash; - *pe = e; - result.nodes++; - break; - } - if (key_hash == e.hash) - { - auto c = keyti.compare(pkey, e + 1); - if (c == 0) - break; - pe = (c < 0) ? &e.left : &e.right; - } - else - pe = (key_hash < e.hash) ? &e.left : &e.right; - } - memcpy(cast(void *)(e + 1) + keytsize, pvalue, valuesize); - } - - va_end(q); - } - return result; -} - -+/ diff --git a/runtime/internal/adi.d b/runtime/internal/adi.d deleted file mode 100644 index 5a45b8df..00000000 --- a/runtime/internal/adi.d +++ /dev/null @@ -1,610 +0,0 @@ -//_ adi.d - -/** - * Part of the D programming language runtime library. - * Dynamic array property support routines - */ - -/* - * Copyright (C) 2000-2006 by Digital Mars, www.digitalmars.com - * Written by Walter Bright - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, in both source and binary form, subject to the following - * restrictions: - * - * o The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * o Altered source versions must be plainly marked as such, and must not - * be misrepresented as being the original software. - * o This notice may not be removed or altered from any source - * distribution. - */ - -/* - * Modified by Sean Kelly for use with Tango. - */ - - -//debug=adi; // uncomment to turn on debugging printf's - -private -{ - import tango.stdc.string; - import tango.stdc.stdlib; - import util.utf; - - enum BlkAttr : uint - { - FINALIZE = 0b0000_0001, - NO_SCAN = 0b0000_0010, - NO_MOVE = 0b0000_0100, - ALL_BITS = 0b1111_1111 - } - - extern (C) void* gc_malloc( size_t sz, uint ba = 0 ); - extern (C) void* gc_calloc( size_t sz, uint ba = 0 ); - extern (C) void gc_free( void* p ); -} - - -/********************************************** - * Reverse array of chars. - * Handled separately because embedded multibyte encodings should not be - * reversed. - */ - -extern (C) char[] _adReverseChar(char[] a) -{ - bool hadErrors = false; - if (a.length > 1) - { - char[6] tmp; - char[6] tmplo; - char* lo = a.ptr; - char* hi = &a[length - 1]; - - while (lo < hi) - { auto clo = *lo; - auto chi = *hi; - - debug(adi) printf("lo = %d, hi = %d\n", lo, hi); - if (clo <= 0x7F && chi <= 0x7F) - { - debug(adi) printf("\tascii\n"); - *lo = chi; - *hi = clo; - lo++; - hi--; - continue; - } - - uint stridelo = UTF8stride[clo]; - if (stridelo > 6) { // invalid UTF-8 0xFF - stridelo = 1; - hadErrors=true; - } - - uint stridehi = 1; - while ((chi & 0xC0) == 0x80 && hi >= lo) - { - chi = *--hi; - stridehi++; - } - if (lo >= hi) { - if (lo > hi) { - hadErrors = true; - } - break; - } - if (stridehi > 6) { - hadErrors = true; - stridehi = 6; - } - - debug(adi) printf("\tstridelo = %d, stridehi = %d\n", stridelo, stridehi); - if (stridelo == stridehi) - { - memcpy(tmp.ptr, lo, stridelo); - memcpy(lo, hi, stridelo); - memcpy(hi, tmp.ptr, stridelo); - lo += stridelo; - hi--; - continue; - } - - /* Shift the whole array. This is woefully inefficient - */ - memcpy(tmp.ptr, hi, stridehi); - memcpy(tmplo.ptr, lo, stridelo); - memmove(lo + stridehi, lo + stridelo , cast(size_t)(hi - lo) - stridelo); - memcpy(lo, tmp.ptr, stridehi); - memcpy(hi + stridehi - stridelo, tmplo.ptr, stridelo); - - lo += stridehi; - hi = hi - 1 + (stridehi - stridelo); - } - } - if (hadErrors) - throw new Exception("invalid UTF-8 sequence",__FILE__,__LINE__); - return a; -} - -unittest -{ - char[] a = "abcd"c; - - char[] r = a.dup.reverse; - //writefln(r); - assert(r == "dcba"); - - a = "a\u1235\u1234c"; - //writefln(a); - r = a.dup.reverse; - //writefln(r); - assert(r == "c\u1234\u1235a"); - - a = "ab\u1234c"; - //writefln(a); - r = a.dup.reverse; - //writefln(r); - assert(r == "c\u1234ba"); - - a = "\u3026\u2021\u3061\n"; - r = a.dup.reverse; - assert(r == "\n\u3061\u2021\u3026"); -} - - -/********************************************** - * Reverse array of wchars. - * Handled separately because embedded multiword encodings should not be - * reversed. - */ - -extern (C) wchar[] _adReverseWchar(wchar[] a) -{ - bool hadErrors = false; - if (a.length > 1) - { - wchar[2] tmp; - wchar* lo = a.ptr; - wchar* hi = &a[length - 1]; - - while (lo < hi) - { auto clo = *lo; - auto chi = *hi; - - if ((clo < 0xD800 || clo > 0xDFFF) && - (chi < 0xD800 || chi > 0xDFFF)) - { - *lo = chi; - *hi = clo; - lo++; - hi--; - continue; - } - - int stridelo = 1 + (clo >= 0xD800 && clo <= 0xDBFF); - - int stridehi = 1; - if (chi >= 0xDC00 && chi <= 0xDFFF) - { - chi = *--hi; - stridehi++; - } - if (lo >= hi) { - if (lo > hi) { - hadErrors = true; - } - break; - } - - if (stridelo == stridehi) - { int stmp; - - assert(stridelo == 2); - assert(stmp.sizeof == 2 * (*lo).sizeof); - stmp = *cast(int*)lo; - *cast(int*)lo = *cast(int*)hi; - *cast(int*)hi = stmp; - lo += stridelo; - hi--; - continue; - } - - /* Shift the whole array. This is woefully inefficient - */ - memcpy(tmp.ptr, hi, stridehi * wchar.sizeof); - memcpy(hi + stridehi - stridelo, lo, stridelo * wchar.sizeof); - memmove(lo + stridehi, lo + stridelo , (hi - (lo + stridelo)) * wchar.sizeof); - memcpy(lo, tmp.ptr, stridehi * wchar.sizeof); - - lo += stridehi; - hi = hi - 1 + (stridehi - stridelo); - } - } - if (hadErrors) - throw new Exception("invalid UTF-8 sequence",__FILE__,__LINE__); - return a; -} - -unittest -{ - wchar[] a = "abcd"; - wchar[] r; - - r = a.dup.reverse; - assert(r == "dcba"); - - a = "a\U00012356\U00012346c"; - r = a.dup.reverse; - assert(r == "c\U00012346\U00012356a"); - - a = "ab\U00012345c"; - r = a.dup.reverse; - assert(r == "c\U00012345ba"); -} - - -/********************************************** - * Support for array.reverse property. - * The actual type is painted on the return value by the frontend - * Given and returned length are number of elements - */ - -extern (C) void[] _adReverse(void[] a, size_t szelem) - out (result) - { - assert(result.ptr is a.ptr); - } - body - { - if (a.length >= 2) - { - byte* tmp; - byte[16] buffer; - - void* lo = a.ptr; - void* hi = a.ptr + (a.length - 1) * szelem; - - tmp = buffer.ptr; - if (szelem > 16) - { - //version (Win32) - //tmp = cast(byte*) alloca(szelem); - //else - tmp = cast(byte*) gc_malloc(szelem); - } - - for (; lo < hi; lo += szelem, hi -= szelem) - { - memcpy(tmp, lo, szelem); - memcpy(lo, hi, szelem); - memcpy(hi, tmp, szelem); - } - - version (Win32) - { - } - else - { - //if (szelem > 16) - // BUG: bad code is generate for delete pointer, tries - // to call delclass. - //gc_free(tmp); - } - } - return a.ptr[0 .. a.length]; - } - -unittest -{ - debug(adi) printf("array.reverse.unittest\n"); - - int[] a = new int[5]; - int[] b; - size_t i; - - for (i = 0; i < 5; i++) - a[i] = i; - b = a.reverse; - assert(b is a); - for (i = 0; i < 5; i++) - assert(a[i] == 4 - i); - - struct X20 - { // More than 16 bytes in size - int a; - int b, c, d, e; - } - - X20[] c = new X20[5]; - X20[] d; - - for (i = 0; i < 5; i++) - { c[i].a = i; - c[i].e = 10; - } - d = c.reverse; - assert(d is c); - for (i = 0; i < 5; i++) - { - assert(c[i].a == 4 - i); - assert(c[i].e == 10); - } -} - -/********************************************** - * Sort array of chars. - */ - -extern (C) char[] _adSortChar(char[] a) -{ - if (a.length > 1) - { - dchar[] da = toUTF32(a); - da.sort; - size_t i = 0; - foreach (dchar d; da) - { char[4] buf; - auto t = toUTF8(buf, d); - a[i .. i + t.length] = t[]; - i += t.length; - } - delete da; - } - return a; -} - -/********************************************** - * Sort array of wchars. - */ - -extern (C) wchar[] _adSortWchar(wchar[] a) -{ - if (a.length > 1) - { - dchar[] da = toUTF32(a); - da.sort; - size_t i = 0; - foreach (dchar d; da) - { wchar[2] buf; - auto t = toUTF16(buf, d); - a[i .. i + t.length] = t[]; - i += t.length; - } - delete da; - } - return a; -} - -/*************************************** - * Support for array equality test. - * The actual type is painted on the return value by the frontend - * Given lengths are number of elements - */ - -extern (C) int _adEq(void[] a1, void[] a2, TypeInfo ti) -{ - debug(adi) printf("_adEq(a1.length = %d, a2.length = %d)\n", a1.length, a2.length); - - if (a1.length != a2.length) - return 0; // not equal - else if (a1.ptr == a2.ptr) - return 1; // equal - - // let typeinfo decide - return ti.equals(&a1, &a2); -} - -unittest -{ - debug(adi) printf("array.Eq unittest\n"); - - char[] a = "hello"c; - - assert(a != "hel"); - assert(a != "helloo"); - assert(a != "betty"); - assert(a == "hello"); - assert(a != "hxxxx"); -} - -/*************************************** - * Support for array compare test. - * The actual type is painted on the return value by the frontend - * Given lengths are number of elements - */ - -extern (C) int _adCmp(void[] a1, void[] a2, TypeInfo ti) -{ - debug(adi) printf("adCmp()\n"); - - if (a1.ptr == a2.ptr && - a1.length == a2.length) - return 0; - - auto len = a1.length; - if (a2.length < len) - len = a2.length; - - // let typeinfo decide - return ti.compare(&a1, &a2); -} - -unittest -{ - debug(adi) printf("array.Cmp unittest\n"); - - char[] a = "hello"c; - - assert(a > "hel"); - assert(a >= "hel"); - assert(a < "helloo"); - assert(a <= "helloo"); - assert(a > "betty"); - assert(a >= "betty"); - assert(a == "hello"); - assert(a <= "hello"); - assert(a >= "hello"); -} - -/*************************************** - * Support for array compare test. - * The actual type is painted on the return value by the frontend - * Given lengths are number of elements - */ - -extern (C) int _adCmpChar(void[] a1, void[] a2) -{ - version(D_InlineAsm_X86) - { - //version = Asm86; - } - version (Asm86) - { - asm - { naked ; - - push EDI ; - push ESI ; - - mov ESI,a1+4[4+ESP] ; - mov EDI,a2+4[4+ESP] ; - - mov ECX,a1[4+ESP] ; - mov EDX,a2[4+ESP] ; - - cmp ECX,EDX ; - jb GotLength ; - - mov ECX,EDX ; - -GotLength: - cmp ECX,4 ; - jb DoBytes ; - - // Do alignment if neither is dword aligned - test ESI,3 ; - jz Aligned ; - - test EDI,3 ; - jz Aligned ; -DoAlign: - mov AL,[ESI] ; //align ESI to dword bounds - mov DL,[EDI] ; - - cmp AL,DL ; - jnz Unequal ; - - inc ESI ; - inc EDI ; - - test ESI,3 ; - - lea ECX,[ECX-1] ; - jnz DoAlign ; -Aligned: - mov EAX,ECX ; - - // do multiple of 4 bytes at a time - - shr ECX,2 ; - jz TryOdd ; - - repe ; - cmpsd ; - - jnz UnequalQuad ; - -TryOdd: - mov ECX,EAX ; -DoBytes: - // if still equal and not end of string, do up to 3 bytes slightly - // slower. - - and ECX,3 ; - jz Equal ; - - repe ; - cmpsb ; - - jnz Unequal ; -Equal: - mov EAX,a1[4+ESP] ; - mov EDX,a2[4+ESP] ; - - sub EAX,EDX ; - pop ESI ; - - pop EDI ; - ret ; - -UnequalQuad: - mov EDX,[EDI-4] ; - mov EAX,[ESI-4] ; - - cmp AL,DL ; - jnz Unequal ; - - cmp AH,DH ; - jnz Unequal ; - - shr EAX,16 ; - - shr EDX,16 ; - - cmp AL,DL ; - jnz Unequal ; - - cmp AH,DH ; -Unequal: - sbb EAX,EAX ; - pop ESI ; - - or EAX,1 ; - pop EDI ; - - ret ; - } - } - else - { - int len; - int c; - - debug(adi) printf("adCmpChar()\n"); - len = cast(int)a1.length; - if (a2.length < len) - len = cast(int)a2.length; - c = memcmp(cast(char *)a1.ptr, cast(char *)a2.ptr, len); - if (!c) - c = cast(int)a1.length - cast(int)a2.length; - return c; - } -} - -unittest -{ - debug(adi) printf("array.CmpChar unittest\n"); - - char[] a = "hello"c; - - assert(a > "hel"); - assert(a >= "hel"); - assert(a < "helloo"); - assert(a <= "helloo"); - assert(a > "betty"); - assert(a >= "betty"); - assert(a == "hello"); - assert(a <= "hello"); - assert(a >= "hello"); -} diff --git a/runtime/internal/arrayInit.d b/runtime/internal/arrayInit.d deleted file mode 100644 index f33415c4..00000000 --- a/runtime/internal/arrayInit.d +++ /dev/null @@ -1,153 +0,0 @@ -private import ldc.intrinsics; - -extern(C): - -int memcmp(void*,void*,size_t); -size_t strlen(char*); - -version(LLVM64) -alias llvm_memcpy_i64 llvm_memcpy; -else -alias llvm_memcpy_i32 llvm_memcpy; - -// per-element array init routines - -void _d_array_init_i16(ushort* a, size_t n, ushort v) -{ - auto p = a; - auto end = a+n; - while (p !is end) - *p++ = v; -} - -void _d_array_init_i32(uint* a, size_t n, uint v) -{ - auto p = a; - auto end = a+n; - while (p !is end) - *p++ = v; -} - -void _d_array_init_i64(ulong* a, size_t n, ulong v) -{ - auto p = a; - auto end = a+n; - while (p !is end) - *p++ = v; -} - -void _d_array_init_float(float* a, size_t n, float v) -{ - auto p = a; - auto end = a+n; - while (p !is end) - *p++ = v; -} - -void _d_array_init_double(double* a, size_t n, double v) -{ - auto p = a; - auto end = a+n; - while (p !is end) - *p++ = v; -} - -void _d_array_init_real(real* a, size_t n, real v) -{ - auto p = a; - auto end = a+n; - while (p !is end) - *p++ = v; -} - -void _d_array_init_cfloat(cfloat* a, size_t n, cfloat v) -{ - auto p = a; - auto end = a+n; - while (p !is end) - *p++ = v; -} - -void _d_array_init_cdouble(cdouble* a, size_t n, cdouble v) -{ - auto p = a; - auto end = a+n; - while (p !is end) - *p++ = v; -} - -void _d_array_init_creal(creal* a, size_t n, creal v) -{ - auto p = a; - auto end = a+n; - while (p !is end) - *p++ = v; -} - -void _d_array_init_pointer(void** a, size_t n, void* v) -{ - auto p = a; - auto end = a+n; - while (p !is end) - *p++ = v; -} - -void _d_array_init_mem(void* a, size_t na, void* v, size_t nv) -{ - auto p = a; - auto end = a + na*nv; - while (p !is end) { - llvm_memcpy(p,v,nv,0); - p += nv; - } -} - -/* -void _d_array_init(TypeInfo ti, void* a) -{ - auto initializer = ti.next.init(); - auto isize = initializer.length; - auto q = initializer.ptr; - - if (isize == 1) - memset(p, *cast(ubyte*)q, size); - else if (isize == int.sizeof) - { - int init = *cast(int*)q; - size /= int.sizeof; - for (size_t u = 0; u < size; u++) - { - (cast(int*)p)[u] = init; - } - } - else - { - for (size_t u = 0; u < size; u += isize) - { - memcpy(p + u, q, isize); - } - } -}*/ - -// for array cast -size_t _d_array_cast_len(size_t len, size_t elemsz, size_t newelemsz) -{ - if (newelemsz == 1) { - return len*elemsz; - } - else if ((len*elemsz) % newelemsz) { - throw new Exception("Bad array cast"); - } - return (len*elemsz)/newelemsz; -} - -// slice copy when assertions are enabled -void _d_array_slice_copy(void* dst, size_t dstlen, void* src, size_t srclen) -{ - if (dstlen != srclen) - throw new Exception("lengths don't match for array copy"); - else if (dst+dstlen <= src || src+srclen <= dst) - llvm_memcpy(dst, src, dstlen, 0); - else - throw new Exception("overlapping array copy"); -} diff --git a/runtime/internal/cast.d b/runtime/internal/cast.d deleted file mode 100644 index 2c9ae6e4..00000000 --- a/runtime/internal/cast.d +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright (C) 2004-2006 by Digital Mars, www.digitalmars.com - * Written by Walter Bright - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, in both source and binary form, subject to the following - * restrictions: - * - * o The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * o Altered source versions must be plainly marked as such, and must not - * be misrepresented as being the original software. - * o This notice may not be removed or altered from any source - * distribution. - */ - -/* - * Modified by Sean Kelly for use with Tango. - */ - -extern (C): - -//debug = PRINTF; -debug(PRINTF) int printf(char*, ...); - -/****************************************** - * Given a pointer: - * If it is an Object, return that Object. - * If it is an interface, return the Object implementing the interface. - * If it is null, return null. - * Else, undefined crash - */ - -Object _d_toObject(void* p) -{ Object o; - debug(PRINTF) printf("toObject(%p)\n", p); - if (p) - { - o = cast(Object)p; - debug(PRINTF) printf("o = %p\n", o); - debug(PRINTF) printf("o.vtbl = %p\n", *cast(void**)p); - ClassInfo oc = o.classinfo; - debug(PRINTF) printf("oc = %p\n", oc); - Interface *pi = **cast(Interface ***)p; - debug(PRINTF) printf("pi = %p\n", pi); - - /* Interface.offset lines up with ClassInfo.name.ptr, - * so we rely on pointers never being less than 64K, - * and interface vtable offsets never being greater. - */ - if (pi.offset < 0x10000) - { - debug(PRINTF) printf("\tpi.offset = %d\n", pi.offset); - o = cast(Object)(p - pi.offset); - } - } - debug(PRINTF) printf("toObject = %p\n", o); - return o; -} - - -/************************************* - * Attempts to cast Object o to class c. - * Returns o if successful, null if not. - */ - -Object _d_interface_cast(void* p, ClassInfo c) -{ Object o; - - debug(PRINTF) printf("_d_interface_cast(p = %p, c = '%.*s')\n", p, c.name.length, c.name.ptr); - if (p) - { - Interface *pi = **cast(Interface ***)p; - - debug(PRINTF) printf("\tpi.offset = %d\n", pi.offset); - o = cast(Object)(p - pi.offset); - return _d_dynamic_cast(o, c); - } - debug(PRINTF) printf("_d_interface_cast = %p\n", o); - return o; -} - -Object _d_dynamic_cast(Object o, ClassInfo c) -{ ClassInfo oc; - size_t offset = 0; - - debug(PRINTF) printf("_d_dynamic_cast(o = %p, c = '%.*s')\n", o, c.name.length, c.name.ptr); - - if (o) - { - oc = o.classinfo; - if (_d_isbaseof2(oc, c, offset)) - { - debug(PRINTF) printf("\toffset = %d\n", offset); - o = cast(Object)(cast(void*)o + offset); - } - else - o = null; - } - //printf("\tresult = %p\n", o); - debug(PRINTF) printf("_d_dynamic_cast = %p\n", o); - return o; -} - -int _d_isbaseof2(ClassInfo oc, ClassInfo c, ref size_t offset) -{ int i; - - debug(PRINTF) printf("_d_isbaseof2(%.*s, %.*s, %ul)\n", oc.name.length, oc.name.ptr, c.name.length, c.name.ptr, offset); - - if (oc is c) - return 1; - do - { - debug(PRINTF) printf("oc.interfaces.length = %ul\n", oc.interfaces.length); - if (oc.base is c) - return 1; - for (i = 0; i < oc.interfaces.length; i++) - { - ClassInfo ic; - - ic = oc.interfaces[i].classinfo; - debug(PRINTF) printf("checking %.*s\n", ic.name.length, ic.name.ptr); - if (ic is c) - { offset = cast(size_t)oc.interfaces[i].offset; - return 1; - } - } - for (i = 0; i < oc.interfaces.length; i++) - { - ClassInfo ic; - - ic = oc.interfaces[i].classinfo; - if (_d_isbaseof2(ic, c, offset)) - { offset = cast(size_t)oc.interfaces[i].offset; - return 1; - } - } - oc = oc.base; - } while (oc); - return 0; -} - -int _d_isbaseof(ClassInfo oc, ClassInfo c) -{ int i; - - if (oc is c) - return 1; - do - { - if (oc.base is c) - return 1; - for (i = 0; i < oc.interfaces.length; i++) - { - ClassInfo ic; - - ic = oc.interfaces[i].classinfo; - if (ic is c || _d_isbaseof(ic, c)) - return 1; - } - oc = oc.base; - } while (oc); - return 0; -} - -/********************************* - * Find the vtbl[] associated with Interface ic. - */ - -void *_d_interface_vtbl(ClassInfo ic, Object o) -{ int i; - ClassInfo oc; - - //printf("__d_interface_vtbl(o = %p, ic = %p)\n", o, ic); - - assert(o); - - oc = o.classinfo; - for (i = 0; i < oc.interfaces.length; i++) - { - ClassInfo oic; - - oic = oc.interfaces[i].classinfo; - if (oic is ic) - { - return cast(void *)oc.interfaces[i].vtbl; - } - } - assert(0); -} diff --git a/runtime/internal/critical.c b/runtime/internal/critical.c deleted file mode 100644 index 0d1d082a..00000000 --- a/runtime/internal/critical.c +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Placed into the Public Domain - * written by Walter Bright, Digital Mars - * www.digitalmars.com - */ - -/* ================================= Win32 ============================ */ - -#if _WIN32 - -#include - -/****************************************** - * Enter/exit critical section. - */ - -/* We don't initialize critical sections unless we actually need them. - * So keep a linked list of the ones we do use, and in the static destructor - * code, walk the list and release them. - */ - -typedef struct D_CRITICAL_SECTION -{ - struct D_CRITICAL_SECTION *next; - CRITICAL_SECTION cs; -} D_CRITICAL_SECTION; - -static D_CRITICAL_SECTION *dcs_list; -static D_CRITICAL_SECTION critical_section; -static volatile int inited; - -void _d_criticalenter(D_CRITICAL_SECTION *dcs) -{ - if (!dcs->next) - { - EnterCriticalSection(&critical_section.cs); - if (!dcs->next) // if, in the meantime, another thread didn't set it - { - dcs->next = dcs_list; - dcs_list = dcs; - InitializeCriticalSection(&dcs->cs); - } - LeaveCriticalSection(&critical_section.cs); - } - EnterCriticalSection(&dcs->cs); -} - -void _d_criticalexit(D_CRITICAL_SECTION *dcs) -{ - LeaveCriticalSection(&dcs->cs); -} - -void _STI_critical_init() -{ - if (!inited) - { InitializeCriticalSection(&critical_section.cs); - dcs_list = &critical_section; - inited = 1; - } -} - -void _STD_critical_term() -{ - if (inited) - { inited = 0; - while (dcs_list) - { - DeleteCriticalSection(&dcs_list->cs); - dcs_list = dcs_list->next; - } - } -} - -#endif - -/* ================================= linux ============================ */ - -#if linux || __APPLE__ || __FreeBSD__ || (defined(__SVR4) && defined (__sun)) - -#include -#include -#include - -#if !linux -#define PTHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE -#endif - -/****************************************** - * Enter/exit critical section. - */ - -/* We don't initialize critical sections unless we actually need them. - * So keep a linked list of the ones we do use, and in the static destructor - * code, walk the list and release them. - */ - -typedef struct D_CRITICAL_SECTION -{ - struct D_CRITICAL_SECTION *next; - pthread_mutex_t cs; -} D_CRITICAL_SECTION; - -static D_CRITICAL_SECTION *dcs_list; -static D_CRITICAL_SECTION critical_section; -static pthread_mutexattr_t _criticals_attr; - -void _STI_critical_init(void); -void _STD_critical_term(void); - -void _d_criticalenter(D_CRITICAL_SECTION *dcs) -{ - if (!dcs_list) - { _STI_critical_init(); - atexit(_STD_critical_term); - } - //printf("_d_criticalenter(dcs = x%x)\n", dcs); - if (!dcs->next) - { - pthread_mutex_lock(&critical_section.cs); - if (!dcs->next) // if, in the meantime, another thread didn't set it - { - dcs->next = dcs_list; - dcs_list = dcs; - pthread_mutex_init(&dcs->cs, &_criticals_attr); - } - pthread_mutex_unlock(&critical_section.cs); - } - pthread_mutex_lock(&dcs->cs); -} - -void _d_criticalexit(D_CRITICAL_SECTION *dcs) -{ - //printf("_d_criticalexit(dcs = x%x)\n", dcs); - pthread_mutex_unlock(&dcs->cs); -} - -void _STI_critical_init() -{ - if (!dcs_list) - { //printf("_STI_critical_init()\n"); - pthread_mutexattr_init(&_criticals_attr); - pthread_mutexattr_settype(&_criticals_attr, PTHREAD_MUTEX_RECURSIVE_NP); - - // The global critical section doesn't need to be recursive - pthread_mutex_init(&critical_section.cs, 0); - dcs_list = &critical_section; - } -} - -void _STD_critical_term() -{ - if (dcs_list) - { //printf("_STI_critical_term()\n"); - while (dcs_list) - { - //printf("\tlooping... %x\n", dcs_list); - pthread_mutex_destroy(&dcs_list->cs); - dcs_list = dcs_list->next; - } - } -} - -#endif - diff --git a/runtime/internal/dmain2.d b/runtime/internal/dmain2.d deleted file mode 100644 index b8088ebc..00000000 --- a/runtime/internal/dmain2.d +++ /dev/null @@ -1,284 +0,0 @@ -/* - * Placed into the Public Domain. - * written by Walter Bright - * www.digitalmars.com - */ - -/* - * Modified by Sean Kelly for use with Tango. - */ - -private -{ - import util.console; - - import tango.stdc.stddef; - import tango.stdc.stdlib; - import tango.stdc.string; - import memory; -} - -version( Win32 ) -{ - extern (Windows) void* LocalFree(void*); - extern (Windows) wchar_t* GetCommandLineW(); - extern (Windows) wchar_t** CommandLineToArgvW(wchar_t*, int*); - extern (Windows) export int WideCharToMultiByte(uint, uint, wchar_t*, int, char*, int, char*, int); - //pragma(lib, "shell32.lib"); // needed for CommandLineToArgvW - //pragma(lib, "tango-win32-dmd.lib"); // links Tango's Win32 library to reduce EXE size -} - -extern (C) void _STI_monitor_staticctor(); -extern (C) void _STD_monitor_staticdtor(); -extern (C) void _STI_critical_init(); -extern (C) void _STD_critical_term(); -extern (C) void gc_init(); -extern (C) void gc_term(); -extern (C) void _moduleCtor(); -extern (C) void _moduleDtor(); -extern (C) void thread_joinAll(); - -//debug=PRINTF; -debug(PRINTF) extern (C) int printf(char*, ...); - -/*********************************** - * These functions must be defined for any D program linked - * against this library. - */ -extern (C) void onAssertError( char[] file, size_t line ); -extern (C) void onAssertErrorMsg( char[] file, size_t line, char[] msg ); -extern (C) void onArrayBoundsError( char[] file, size_t line ); -extern (C) void onSwitchError( char[] file, size_t line ); -extern (C) bool runModuleUnitTests(); - -// this function is called from the utf module -//extern (C) void onUnicodeError( char[] msg, size_t idx ); - -/*********************************** - * These are internal callbacks for various language errors. - */ -extern (C) void _d_assert( char[] file, uint line ) -{ - onAssertError( file, line ); -} - -extern (C) void _d_assert_msg( char[] msg, char[] file, uint line ) -{ - onAssertErrorMsg( file, line, msg ); -} - -extern (C) void _d_array_bounds( char[] file, uint line ) -{ - onArrayBoundsError( file, line ); -} - -extern (C) void _d_switch_error( char[] file, uint line ) -{ - onSwitchError( file, line ); -} - -bool _d_isHalting = false; - -extern (C) bool rt_isHalting() -{ - return _d_isHalting; -} - -extern (C) bool rt_trapExceptions = true; - -void _d_criticalInit() -{ - _STI_monitor_staticctor(); - _STI_critical_init(); - initStaticDataPtrs(); -} - -alias void delegate( Exception ) ExceptionHandler; - -// this is here so users can manually initialize the runtime -// for example, when there is no main function etc. -extern (C) bool rt_init( ExceptionHandler dg = null ) -{ - _d_criticalInit(); - - try - { - gc_init(); - _moduleCtor(); - return true; - } - catch( Exception e ) - { - if( dg ) - dg( e ); - } - catch - { - - } - _d_criticalTerm(); - return false; -} - -void _d_criticalTerm() -{ - _STD_critical_term(); - _STD_monitor_staticdtor(); -} - -// this is here so users can manually terminate the runtime -// for example, when there is no main function etc. -extern (C) bool rt_term( ExceptionHandler dg = null ) -{ - try - { - thread_joinAll(); - _d_isHalting = true; - _moduleDtor(); - gc_term(); - return true; - } - catch( Exception e ) - { - if( dg ) - dg( e ); - } - catch - { - - } - finally - { - _d_criticalTerm(); - } - return false; -} - -/*********************************** - * The D main() function supplied by the user's program - */ -int main(char[][] args); - -/*********************************** - * Substitutes for the C main() function. - * It's purpose is to wrap the call to the D main() - * function and catch any unhandled exceptions. - */ - -extern (C) int main(int argc, char **argv, char** env) -{ - char[][] args; - int result; - - debug(PRINTF) printf("main ctors\n"); - _STI_monitor_staticctor(); - _STI_critical_init(); - initStaticDataPtrs(); - - debug(PRINTF) printf("main args\n"); - // GDC seems to get by without this Windows special case... - version (Win32) - { - wchar_t* wcbuf = GetCommandLineW(); - size_t wclen = wcslen(wcbuf); - int wargc = 0; - wchar_t** wargs = CommandLineToArgvW(wcbuf, &wargc); - assert(wargc == argc); - - char* cargp = null; - size_t cargl = WideCharToMultiByte(65001, 0, wcbuf, wclen, null, 0, null, 0); - - cargp = cast(char*) alloca(cargl); - args = ((cast(char[]*) alloca(wargc * (char[]).sizeof)))[0 .. wargc]; - - for (size_t i = 0, p = 0; i < wargc; i++) - { - int wlen = wcslen( wargs[i] ); - int clen = WideCharToMultiByte(65001, 0, &wargs[i][0], wlen, null, 0, null, 0); - args[i] = cargp[p .. p+clen]; - p += clen; assert(p <= cargl); - WideCharToMultiByte(65001, 0, &wargs[i][0], wlen, &args[i][0], clen, null, 0); - } - LocalFree(wargs); - wargs = null; - wargc = 0; - } - else - { - char[]* am = cast(char[]*) malloc(argc * (char[]).sizeof); - scope(exit) free(am); - - for (size_t i = 0; i < argc; i++) - { - auto len = strlen(argv[i]); - am[i] = argv[i][0 .. len]; - } - args = am[0 .. argc]; - } - - debug(PRINTF) printf("main trap exceptions\n"); - bool trapExceptions = rt_trapExceptions; - - void tryExec(void delegate() dg) - { - debug(PRINTF) printf("main try exec\n"); - if (trapExceptions) - { - try - { - dg(); - } - catch (Exception e) - { - e.writeOut(delegate void(char[]s){ console(s); }); - result = EXIT_FAILURE; - } - catch (Object o) - { - // fprintf(stderr, "%.*s\n", o.toString()); - console (o.toString)("\n"); - result = EXIT_FAILURE; - } - } - else - { - dg(); - } - } - - // NOTE: The lifetime of a process is much like the lifetime of an object: - // it is initialized, then used, then destroyed. If initialization - // fails, the successive two steps are never reached. However, if - // initialization succeeds, then cleanup will occur even if the use - // step fails in some way. Here, the use phase consists of running - // the user's main function. If main terminates with an exception, - // the exception is handled and then cleanup begins. An exception - // thrown during cleanup, however, will abort the cleanup process. - - void runMain() - { - debug(PRINTF) printf("main runMain\n"); - result = main(args); - } - - void runAll() - { - debug(PRINTF) printf("main runAll\n"); - gc_init(); - _moduleCtor(); - if (runModuleUnitTests()) - tryExec(&runMain); - thread_joinAll(); - _d_isHalting = true; - _moduleDtor(); - gc_term(); - } - - tryExec(&runAll); - - debug(PRINTF) printf("main dtor\n"); - _STD_critical_term(); - _STD_monitor_staticdtor(); - - return result; -} diff --git a/runtime/internal/eh.d b/runtime/internal/eh.d deleted file mode 100644 index 5324a3dd..00000000 --- a/runtime/internal/eh.d +++ /dev/null @@ -1,430 +0,0 @@ -/** - * This module contains functions and structures required for - * exception handling. - */ -module eh; - -import util.console; -import ldc.cstdarg; - -// debug = EH_personality; -// debug = EH_personality_verbose; - -// current EH implementation works on x86 -// if it has a working unwind runtime -version(X86) { - version(linux) version=X86_UNWIND; - version(darwin) version=X86_UNWIND; - version(solaris) version=X86_UNWIND; -} -version(X86_64) { - version(linux) version=X86_UNWIND; - version(darwin) version=X86_UNWIND; - version(solaris) version=X86_UNWIND; -} - -//version = HP_LIBUNWIND; - -private extern(C) void abort(); -private extern(C) int printf(char*, ...); -private extern(C) int vprintf(char*, va_list va); - -// D runtime functions -extern(C) { - int _d_isbaseof(ClassInfo oc, ClassInfo c); -} - -// libunwind headers -extern(C) -{ - enum _Unwind_Reason_Code : int - { - NO_REASON = 0, - FOREIGN_EXCEPTION_CAUGHT = 1, - FATAL_PHASE2_ERROR = 2, - FATAL_PHASE1_ERROR = 3, - NORMAL_STOP = 4, - END_OF_STACK = 5, - HANDLER_FOUND = 6, - INSTALL_CONTEXT = 7, - CONTINUE_UNWIND = 8 - } - - enum _Unwind_Action : int - { - SEARCH_PHASE = 1, - CLEANUP_PHASE = 2, - HANDLER_FRAME = 4, - FORCE_UNWIND = 8 - } - - alias void* _Unwind_Context_Ptr; - - alias void function(_Unwind_Reason_Code, _Unwind_Exception*) _Unwind_Exception_Cleanup_Fn; - - struct _Unwind_Exception - { - ulong exception_class; - _Unwind_Exception_Cleanup_Fn exception_cleanup; - ptrdiff_t private_1; - ptrdiff_t private_2; - } - -// interface to HP's libunwind from http://www.nongnu.org/libunwind/ -version(HP_LIBUNWIND) -{ - void __libunwind_Unwind_Resume(_Unwind_Exception *); - _Unwind_Reason_Code __libunwind_Unwind_RaiseException(_Unwind_Exception *); - ptrdiff_t __libunwind_Unwind_GetLanguageSpecificData(_Unwind_Context_Ptr - context); - ptrdiff_t __libunwind_Unwind_GetIP(_Unwind_Context_Ptr context); - ptrdiff_t __libunwind_Unwind_SetIP(_Unwind_Context_Ptr context, - ptrdiff_t new_value); - ptrdiff_t __libunwind_Unwind_SetGR(_Unwind_Context_Ptr context, int index, - ptrdiff_t new_value); - ptrdiff_t __libunwind_Unwind_GetRegionStart(_Unwind_Context_Ptr context); - - alias __libunwind_Unwind_Resume _Unwind_Resume; - alias __libunwind_Unwind_RaiseException _Unwind_RaiseException; - alias __libunwind_Unwind_GetLanguageSpecificData - _Unwind_GetLanguageSpecificData; - alias __libunwind_Unwind_GetIP _Unwind_GetIP; - alias __libunwind_Unwind_SetIP _Unwind_SetIP; - alias __libunwind_Unwind_SetGR _Unwind_SetGR; - alias __libunwind_Unwind_GetRegionStart _Unwind_GetRegionStart; -} -else version(X86_UNWIND) -{ - void _Unwind_Resume(_Unwind_Exception*); - _Unwind_Reason_Code _Unwind_RaiseException(_Unwind_Exception*); - ptrdiff_t _Unwind_GetLanguageSpecificData(_Unwind_Context_Ptr context); - ptrdiff_t _Unwind_GetIP(_Unwind_Context_Ptr context); - ptrdiff_t _Unwind_SetIP(_Unwind_Context_Ptr context, ptrdiff_t new_value); - ptrdiff_t _Unwind_SetGR(_Unwind_Context_Ptr context, int index, - ptrdiff_t new_value); - ptrdiff_t _Unwind_GetRegionStart(_Unwind_Context_Ptr context); -} -else -{ - // runtime calls these directly - void _Unwind_Resume(_Unwind_Exception*) - { - console("_Unwind_Resume is not implemented on this platform.\n"); - } - _Unwind_Reason_Code _Unwind_RaiseException(_Unwind_Exception*) - { - console("_Unwind_RaiseException is not implemented on this platform.\n"); - return _Unwind_Reason_Code.FATAL_PHASE1_ERROR; - } -} - -} - -// error and exit -extern(C) private void fatalerror(char* format, ...) -{ - va_list args; - va_start(args, format); - printf("Fatal error in EH code: "); - vprintf(format, args); - printf("\n"); - abort(); -} - - -// helpers for reading certain DWARF data -private ubyte* get_uleb128(ubyte* addr, ref size_t res) -{ - res = 0; - size_t bitsize = 0; - - // read as long as high bit is set - while(*addr & 0x80) { - res |= (*addr & 0x7f) << bitsize; - bitsize += 7; - addr += 1; - if(bitsize >= size_t.sizeof*8) - fatalerror("tried to read uleb128 that exceeded size of size_t"); - } - // read last - if(bitsize != 0 && *addr >= 1 << size_t.sizeof*8 - bitsize) - fatalerror("Fatal error in EH code: tried to read uleb128 that exceeded size of size_t"); - res |= (*addr) << bitsize; - - return addr + 1; -} - -private ubyte* get_sleb128(ubyte* addr, ref ptrdiff_t res) -{ - res = 0; - size_t bitsize = 0; - - // read as long as high bit is set - while(*addr & 0x80) { - res |= (*addr & 0x7f) << bitsize; - bitsize += 7; - addr += 1; - if(bitsize >= size_t.sizeof*8) - fatalerror("tried to read sleb128 that exceeded size of size_t"); - } - // read last - if(bitsize != 0 && *addr >= 1 << size_t.sizeof*8 - bitsize) - fatalerror("tried to read sleb128 that exceeded size of size_t"); - res |= (*addr) << bitsize; - - // take care of sign - if(bitsize < size_t.sizeof*8 && ((*addr) & 0x40)) - res |= cast(ptrdiff_t)(-1) ^ ((1 << (bitsize+7)) - 1); - - return addr + 1; -} - - -// exception struct used by the runtime. -// _d_throw allocates a new instance and passes the address of its -// _Unwind_Exception member to the unwind call. The personality -// routine is then able to get the whole struct by looking at the data -// surrounding the unwind info. -struct _d_exception -{ - Object exception_object; - _Unwind_Exception unwind_info; -} - -// the 8-byte string identifying the type of exception -// the first 4 are for vendor, the second 4 for language -//TODO: This may be the wrong way around -char[8] _d_exception_class = "LLDCD1\0\0"; - - -// -// x86 unwind specific implementation of personality function -// and helpers -// -version(X86_UNWIND) -{ - -// the personality routine gets called by the unwind handler and is responsible for -// reading the EH tables and deciding what to do -extern(C) _Unwind_Reason_Code _d_eh_personality(int ver, _Unwind_Action actions, ulong exception_class, _Unwind_Exception* exception_info, _Unwind_Context_Ptr context) -{ - debug(EH_personality_verbose) printf("entering personality function. context: %p\n", context); - // check ver: the C++ Itanium ABI only allows ver == 1 - if(ver != 1) - return _Unwind_Reason_Code.FATAL_PHASE1_ERROR; - - // check exceptionClass - //TODO: Treat foreign exceptions with more respect - if((cast(char*)&exception_class)[0..8] != _d_exception_class) - return _Unwind_Reason_Code.FATAL_PHASE1_ERROR; - - // find call site table, action table and classinfo table - // Note: callsite and action tables do not contain static-length - // data and will be parsed as needed - // Note: classinfo_table points past the end of the table - ubyte* callsite_table; - ubyte* action_table; - ClassInfo* classinfo_table; - _d_getLanguageSpecificTables(context, callsite_table, action_table, classinfo_table); - if (callsite_table is null) - return _Unwind_Reason_Code.CONTINUE_UNWIND; - - /* - find landing pad and action table index belonging to ip by walking - the callsite_table - */ - ubyte* callsite_walker = callsite_table; - - // get the instruction pointer - // will be used to find the right entry in the callsite_table - // -1 because it will point past the last instruction - ptrdiff_t ip = _Unwind_GetIP(context) - 1; - - // address block_start is relative to - ptrdiff_t region_start = _Unwind_GetRegionStart(context); - - // table entries - uint block_start_offset, block_size; - ptrdiff_t landing_pad; - size_t action_offset; - - while(true) { - // if we've gone through the list and found nothing... - if(callsite_walker >= action_table) - return _Unwind_Reason_Code.CONTINUE_UNWIND; - - block_start_offset = *cast(uint*)callsite_walker; - block_size = *(cast(uint*)callsite_walker + 1); - landing_pad = *(cast(uint*)callsite_walker + 2); - if(landing_pad) - landing_pad += region_start; - callsite_walker = get_uleb128(callsite_walker + 3*uint.sizeof, action_offset); - - debug(EH_personality_verbose) printf("ip=%llx %d %d %llx\n", ip, block_start_offset, block_size, landing_pad); - - // since the list is sorted, as soon as we're past the ip - // there's no handler to be found - if(ip < region_start + block_start_offset) - return _Unwind_Reason_Code.CONTINUE_UNWIND; - - // if we've found our block, exit - if(ip < region_start + block_start_offset + block_size) - break; - } - - debug(EH_personality) printf("Found correct landing pad and actionOffset %d\n", action_offset); - - // now we need the exception's classinfo to find a handler - // the exception_info is actually a member of a larger _d_exception struct - // the runtime allocated. get that now - _d_exception* exception_struct = cast(_d_exception*)(cast(ubyte*)exception_info - _d_exception.unwind_info.offsetof); - - // if there's no action offset and no landing pad, continue unwinding - if(!action_offset && !landing_pad) - return _Unwind_Reason_Code.CONTINUE_UNWIND; - - // if there's no action offset but a landing pad, this is a cleanup handler - else if(!action_offset && landing_pad) - return _d_eh_install_finally_context(actions, landing_pad, exception_struct, context); - - /* - walk action table chain, comparing classinfos using _d_isbaseof - */ - ubyte* action_walker = action_table + action_offset - 1; - - ptrdiff_t ti_offset, next_action_offset; - while(true) { - action_walker = get_sleb128(action_walker, ti_offset); - // it is intentional that we not modify action_walker here - // next_action_offset is from current action_walker position - get_sleb128(action_walker, next_action_offset); - - // negative are 'filters' which we don't use - if(!(ti_offset >= 0)) - fatalerror("Filter actions are unsupported"); - - // zero means cleanup, which we require to be the last action - if(ti_offset == 0) { - if(!(next_action_offset == 0)) - fatalerror("Cleanup action must be last in chain"); - return _d_eh_install_finally_context(actions, landing_pad, exception_struct, context); - } - - // get classinfo for action and check if the one in the - // exception structure is a base - ClassInfo catch_ci = *(classinfo_table - ti_offset); - debug(EH_personality) printf("Comparing catch %s to exception %s\n", catch_ci.name.ptr, exception_struct.exception_object.classinfo.name.ptr); - if(_d_isbaseof(exception_struct.exception_object.classinfo, catch_ci)) - return _d_eh_install_catch_context(actions, ti_offset, landing_pad, exception_struct, context); - - // we've walked through all actions and found nothing... - if(next_action_offset == 0) - return _Unwind_Reason_Code.CONTINUE_UNWIND; - else - action_walker += next_action_offset; - } - - fatalerror("reached unreachable"); - return _Unwind_Reason_Code.FATAL_PHASE1_ERROR; -} - -// These are the register numbers for SetGR that -// llvm's eh.exception and eh.selector intrinsics -// will pick up. -// Hints for these can be found by looking at the -// EH_RETURN_DATA_REGNO macro in GCC, careful testing -// is required though. -version (X86_64) -{ - private int eh_exception_regno = 0; - private int eh_selector_regno = 1; -} else { - private int eh_exception_regno = 0; - private int eh_selector_regno = 2; -} - -private _Unwind_Reason_Code _d_eh_install_catch_context(_Unwind_Action actions, ptrdiff_t switchval, ptrdiff_t landing_pad, _d_exception* exception_struct, _Unwind_Context_Ptr context) -{ - debug(EH_personality) printf("Found catch clause!\n"); - - if(actions & _Unwind_Action.SEARCH_PHASE) - return _Unwind_Reason_Code.HANDLER_FOUND; - - else if(actions & _Unwind_Action.CLEANUP_PHASE) - { - debug(EH_personality) printf("Setting switch value to: %d!\n", switchval); - _Unwind_SetGR(context, eh_exception_regno, cast(ptrdiff_t)cast(void*)(exception_struct.exception_object)); - _Unwind_SetGR(context, eh_selector_regno, cast(ptrdiff_t)switchval); - _Unwind_SetIP(context, landing_pad); - return _Unwind_Reason_Code.INSTALL_CONTEXT; - } - - fatalerror("reached unreachable"); - return _Unwind_Reason_Code.FATAL_PHASE2_ERROR; -} - -private _Unwind_Reason_Code _d_eh_install_finally_context(_Unwind_Action actions, ptrdiff_t landing_pad, _d_exception* exception_struct, _Unwind_Context_Ptr context) -{ - // if we're merely in search phase, continue - if(actions & _Unwind_Action.SEARCH_PHASE) - return _Unwind_Reason_Code.CONTINUE_UNWIND; - - debug(EH_personality) printf("Calling cleanup routine...\n"); - - _Unwind_SetGR(context, eh_exception_regno, cast(ptrdiff_t)exception_struct); - _Unwind_SetGR(context, eh_selector_regno, 0); - _Unwind_SetIP(context, landing_pad); - return _Unwind_Reason_Code.INSTALL_CONTEXT; -} - -private void _d_getLanguageSpecificTables(_Unwind_Context_Ptr context, ref ubyte* callsite, ref ubyte* action, ref ClassInfo* ci) -{ - ubyte* data = cast(ubyte*)_Unwind_GetLanguageSpecificData(context); - if (data is null) - { - //printf("language specific data was null\n"); - callsite = null; - action = null; - ci = null; - return; - } - - //TODO: Do proper DWARF reading here - if(*data++ != 0xff) - fatalerror("DWARF header has unexpected format 1"); - - if(*data++ != 0x00) - fatalerror("DWARF header has unexpected format 2"); - size_t cioffset; - data = get_uleb128(data, cioffset); - ci = cast(ClassInfo*)(data + cioffset); - - if(*data++ != 0x03) - fatalerror("DWARF header has unexpected format 3"); - size_t callsitelength; - data = get_uleb128(data, callsitelength); - action = data + callsitelength; - - callsite = data; -} - -} // end of x86 Linux specific implementation - - -extern(C) void _d_throw_exception(Object e) -{ - if (e !is null) - { - _d_exception* exc_struct = new _d_exception; - exc_struct.unwind_info.exception_class = *cast(ulong*)_d_exception_class.ptr; - exc_struct.exception_object = e; - _Unwind_Reason_Code ret = _Unwind_RaiseException(&exc_struct.unwind_info); - console("_Unwind_RaiseException failed with reason code: ")(ret)("\n"); - } - abort(); -} - -extern(C) void _d_eh_resume_unwind(_d_exception* exception_struct) -{ - _Unwind_Resume(&exception_struct.unwind_info); -} diff --git a/runtime/internal/genobj.d b/runtime/internal/genobj.d deleted file mode 100644 index b1dd9b2d..00000000 --- a/runtime/internal/genobj.d +++ /dev/null @@ -1,1465 +0,0 @@ -/** - * Part of the D programming language runtime library. - * Forms the symbols available to all D programs. Includes - * Object, which is the root of the class object hierarchy. - * - * This module is implicitly imported. - * Macros: - * WIKI = Object - */ - -/* - * Copyright (C) 2004-2007 by Digital Mars, www.digitalmars.com - * Written by Walter Bright - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, in both source and binary form, subject to the following - * restrictions: - * - * o The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * o Altered source versions must be plainly marked as such, and must not - * be misrepresented as being the original software. - * o This notice may not be removed or altered from any source - * distribution. - */ - -/* - * Modified by Sean Kelly for use with Tango. - * Modified by Tomas Lindquist Olsen for use with LDC. - */ - -module object; - -//debug=PRINTF - -private -{ - import tango.stdc.string; // : memcmp, memcpy, memmove; - import tango.stdc.stdlib; // : calloc, realloc, free; - import util.string; - import tango.stdc.stdio; // : printf, snprintf; - import tango.core.Version; - - import aaA; - - extern (C) void onOutOfMemoryError(); - extern (C) Object _d_allocclass(ClassInfo ci); -} - -// NOTE: For some reason, this declaration method doesn't work -// in this particular file (and this file only). It must -// be a DMD thing. -//alias typeof(int.sizeof) size_t; -//alias typeof(cast(void*)0 - cast(void*)0) ptrdiff_t; - -version( LLVM64 ) -{ - alias ulong size_t; - alias long ptrdiff_t; -} -else -{ - alias uint size_t; - alias int ptrdiff_t; -} - -alias size_t hash_t; - -/** - * All D class objects inherit from Object. - */ -class Object -{ - /** - * Convert Object to a human readable string. - */ - char[] toString() - { - return this.classinfo.name; - } - - /** - * Compute hash function for Object. - */ - hash_t toHash() - { - // BUG: this prevents a compacting GC from working, needs to be fixed - return cast(hash_t)cast(void*)this; - } - - /** - * Compare with another Object obj. - * Returns: - * $(TABLE - * $(TR $(TD this < obj) $(TD < 0)) - * $(TR $(TD this == obj) $(TD 0)) - * $(TR $(TD this > obj) $(TD > 0)) - * ) - */ - int opCmp(Object o) - { - // BUG: this prevents a compacting GC from working, needs to be fixed - //return cast(int)cast(void*)this - cast(int)cast(void*)o; - - //throw new Exception("need opCmp for class " ~ this.classinfo.name); - return this !is o; - } - - /** - * Returns !=0 if this object does have the same contents as obj. - */ - int opEquals(Object o) - { - return cast(int)(this is o); - } - - interface Monitor - { - void lock(); - void unlock(); - } -} - -/** - * Information about an interface. - * When an object is accessed via an interface, an Interface* appears as the - * first entry in its vtbl. - */ -struct Interface -{ - ClassInfo classinfo; /// .classinfo for this interface (not for containing class) - void*[] vtbl; - ptrdiff_t offset; /// offset to Interface 'this' from Object 'this' -} - -/** - * Runtime type information about a class. Can be retrieved for any class type - * or instance by using the .classinfo property. - * A pointer to this appears as the first entry in the class's vtbl[]. - */ -class ClassInfo : Object -{ - byte[] init; /** class static initializer - * (init.length gives size in bytes of class) - */ - char[] name; /// class name - void*[] vtbl; /// virtual function pointer table - Interface[] interfaces; /// interfaces this class implements - ClassInfo base; /// base class - void* destructor; // Only use as delegate.funcptr! - void* classInvariant; // Only use as delegate.funcptr! - uint flags; - // 1: // IUnknown - // 2: // has no possible pointers into GC memory - // 4: // has offTi[] member - // 8: // has constructors - // 32: // has typeinfo - void* deallocator; - OffsetTypeInfo[] offTi; - void* defaultConstructor; // default Constructor. Only use as delegate.funcptr! - TypeInfo typeinfo; - - /** - * Search all modules for ClassInfo corresponding to classname. - * Returns: null if not found - */ - static ClassInfo find(char[] classname) - { - foreach (m; ModuleInfo) - { - //writefln("module %s, %d", m.name, m.localClasses.length); - foreach (c; m.localClasses) - { - //writefln("\tclass %s", c.name); - if (c.name == classname) - return c; - } - } - return null; - } - - /** - * Create instance of Object represented by 'this'. - */ - Object create() - { - if (flags & 8 && !defaultConstructor) - return null; - - Object o = _d_allocclass(this); - // initialize it - (cast(byte*) o)[0 .. init.length] = init[]; - - if (flags & 8 && defaultConstructor) - { - Object delegate() ctor; - ctor.ptr = cast(void*)o; - ctor.funcptr = cast(Object function())defaultConstructor; - return ctor(); - } - return o; - } -} - -/** - * Array of pairs giving the offset and type information for each - * member in an aggregate. - */ -struct OffsetTypeInfo -{ - size_t offset; /// Offset of member from start of object - TypeInfo ti; /// TypeInfo for this member -} - -/** - * Runtime type information about a type. - * Can be retrieved for any type using a - * TypeidExpression. - */ -class TypeInfo -{ - hash_t toHash() - { hash_t hash; - - foreach (char c; this.toString()) - hash = hash * 9 + c; - return hash; - } - - int opCmp(Object o) - { - if (this is o) - return 0; - TypeInfo ti = cast(TypeInfo)o; - if (ti is null) - return 1; - return stringCompare(this.toString(), ti.toString()); - } - - int opEquals(Object o) - { - /* TypeInfo instances are singletons, but duplicates can exist - * across DLL's. Therefore, comparing for a name match is - * sufficient. - */ - if (this is o) - return 1; - TypeInfo ti = cast(TypeInfo)o; - return cast(int)(ti && this.toString() == ti.toString()); - } - - /// Returns a hash of the instance of a type. - hash_t getHash(void *p) { return cast(hash_t)p; } - - /// Compares two instances for equality. - int equals(void *p1, void *p2) { return cast(int)(p1 == p2); } - - /// Compares two instances for <, ==, or >. - int compare(void *p1, void *p2) { return 0; } - - /// Returns size of the type. - size_t tsize() { return 0; } - - /// Swaps two instances of the type. - void swap(void *p1, void *p2) - { - size_t n = tsize(); - for (size_t i = 0; i < n; i++) - { byte t; - - t = (cast(byte *)p1)[i]; - (cast(byte *)p1)[i] = (cast(byte *)p2)[i]; - (cast(byte *)p2)[i] = t; - } - } - - /// Get TypeInfo for 'next' type, as defined by what kind of type this is, - /// null if none. - TypeInfo next() { return null; } - - /// Return default initializer, null if default initialize to 0 - void[] init() { return null; } - - /// Get flags for type: 1 means GC should scan for pointers - uint flags() { return 0; } - - /// Get type information on the contents of the type; null if not available - OffsetTypeInfo[] offTi() { return null; } -} - -class TypeInfo_Typedef : TypeInfo -{ - char[] toString() { return name; } - - int opEquals(Object o) - { TypeInfo_Typedef c; - - return cast(int) - (this is o || - ((c = cast(TypeInfo_Typedef)o) !is null && - this.name == c.name && - this.base == c.base)); - } - - hash_t getHash(void *p) { return base.getHash(p); } - int equals(void *p1, void *p2) { return base.equals(p1, p2); } - int compare(void *p1, void *p2) { return base.compare(p1, p2); } - size_t tsize() { return base.tsize(); } - void swap(void *p1, void *p2) { return base.swap(p1, p2); } - - TypeInfo next() { return base; } - uint flags() { return base.flags(); } - void[] init() { return m_init.length ? m_init : base.init(); } - - TypeInfo base; - char[] name; - void[] m_init; -} - -class TypeInfo_Enum : TypeInfo_Typedef -{ -} - -class TypeInfo_Pointer : TypeInfo -{ - char[] toString() { return m_next.toString() ~ "*"; } - - int opEquals(Object o) - { TypeInfo_Pointer c; - - return this is o || - ((c = cast(TypeInfo_Pointer)o) !is null && - this.m_next == c.m_next); - } - - hash_t getHash(void *p) - { - return cast(hash_t)*cast(void**)p; - } - - int equals(void *p1, void *p2) - { - return cast(int)(*cast(void* *)p1 == *cast(void* *)p2); - } - - int compare(void *p1, void *p2) - { - if (*cast(void* *)p1 < *cast(void* *)p2) - return -1; - else if (*cast(void* *)p1 > *cast(void* *)p2) - return 1; - else - return 0; - } - - size_t tsize() - { - return (void*).sizeof; - } - - void swap(void *p1, void *p2) - { void* tmp; - tmp = *cast(void**)p1; - *cast(void**)p1 = *cast(void**)p2; - *cast(void**)p2 = tmp; - } - - TypeInfo next() { return m_next; } - uint flags() { return 1; } - - TypeInfo m_next; -} - -class TypeInfo_Array : TypeInfo -{ - char[] toString() { return value.toString() ~ "[]"; } - - int opEquals(Object o) - { TypeInfo_Array c; - - return cast(int) - (this is o || - ((c = cast(TypeInfo_Array)o) !is null && - this.value == c.value)); - } - - hash_t getHash(void *p) - { size_t sz = value.tsize(); - hash_t hash = 0; - void[] a = *cast(void[]*)p; - for (size_t i = 0; i < a.length; i++) - hash += value.getHash(a.ptr + i * sz); - return hash; - } - - int equals(void *p1, void *p2) - { - void[] a1 = *cast(void[]*)p1; - void[] a2 = *cast(void[]*)p2; - if (a1.length != a2.length) - return 0; - size_t sz = value.tsize(); - for (size_t i = 0; i < a1.length; i++) - { - if (!value.equals(a1.ptr + i * sz, a2.ptr + i * sz)) - return 0; - } - return 1; - } - - int compare(void *p1, void *p2) - { - void[] a1 = *cast(void[]*)p1; - void[] a2 = *cast(void[]*)p2; - size_t sz = value.tsize(); - size_t len = a1.length; - - if (a2.length < len) - len = a2.length; - for (size_t u = 0; u < len; u++) - { - int result = value.compare(a1.ptr + u * sz, a2.ptr + u * sz); - if (result) - return result; - } - return cast(int)a1.length - cast(int)a2.length; - } - - size_t tsize() - { - return (void[]).sizeof; - } - - void swap(void *p1, void *p2) - { void[] tmp; - tmp = *cast(void[]*)p1; - *cast(void[]*)p1 = *cast(void[]*)p2; - *cast(void[]*)p2 = tmp; - } - - TypeInfo value; - - TypeInfo next() - { - return value; - } - - uint flags() { return 1; } -} - -class TypeInfo_StaticArray : TypeInfo -{ - char[] toString() - { - char [20] tmp = void; - return value.toString() ~ "[" ~ intToUtf8(tmp, len) ~ "]"; - } - - int opEquals(Object o) - { TypeInfo_StaticArray c; - - return cast(int) - (this is o || - ((c = cast(TypeInfo_StaticArray)o) !is null && - this.len == c.len && - this.value == c.value)); - } - - hash_t getHash(void *p) - { size_t sz = value.tsize(); - hash_t hash = 0; - for (size_t i = 0; i < len; i++) - hash += value.getHash(p + i * sz); - return hash; - } - - int equals(void *p1, void *p2) - { - size_t sz = value.tsize(); - - for (size_t u = 0; u < len; u++) - { - if (!value.equals(p1 + u * sz, p2 + u * sz)) - return 0; - } - return 1; - } - - int compare(void *p1, void *p2) - { - size_t sz = value.tsize(); - - for (size_t u = 0; u < len; u++) - { - int result = value.compare(p1 + u * sz, p2 + u * sz); - if (result) - return result; - } - return 0; - } - - size_t tsize() - { - return len * value.tsize(); - } - - void swap(void *p1, void *p2) - { void* tmp; - size_t sz = value.tsize(); - ubyte[16] buffer; - void* pbuffer; - - if (sz < buffer.sizeof) - tmp = buffer.ptr; - else - tmp = pbuffer = (new void[sz]).ptr; - - for (size_t u = 0; u < len; u += sz) - { size_t o = u * sz; - memcpy(tmp, p1 + o, sz); - memcpy(p1 + o, p2 + o, sz); - memcpy(p2 + o, tmp, sz); - } - if (pbuffer) - delete pbuffer; - } - - void[] init() { return value.init(); } - TypeInfo next() { return value; } - uint flags() { return value.flags(); } - - TypeInfo value; - size_t len; -} - -class TypeInfo_AssociativeArray : TypeInfo -{ - char[] toString() - { - return next.toString() ~ "[" ~ key.toString() ~ "]"; - } - - int opEquals(Object o) - { TypeInfo_AssociativeArray c; - - return this is o || - ((c = cast(TypeInfo_AssociativeArray)o) !is null && - this.key == c.key && - this.value == c.value); - } - - // BUG: need to add the rest of the functions - - int equals(void *p1, void *p2) - { - AA aa = *cast(AA*)p1; - AA ab = *cast(AA*)p2; - - if (_aaLen(aa) != _aaLen(ab)) - return 0; - - int equal = 1; - int eq_x(void* k, void* va) - { - void* vb = _aaIn(ab, key, k); - if (!vb || !value.equals(va, vb)) - { - equal = 0; - return 1; // break - } - return 0; - } - _aaApply2(aa, key.tsize(), &eq_x); - return equal; - } - - size_t tsize() - { - return (char[int]).sizeof; - } - - TypeInfo next() { return value; } - uint flags() { return 1; } - - TypeInfo value; - TypeInfo key; -} - -class TypeInfo_Function : TypeInfo -{ - char[] toString() - { - return next.toString() ~ "()"; - } - - int opEquals(Object o) - { TypeInfo_Function c; - - return this is o || - ((c = cast(TypeInfo_Function)o) !is null && - this.next == c.next); - } - - // BUG: need to add the rest of the functions - - size_t tsize() - { - return 0; // no size for functions - } - - TypeInfo next; -} - -class TypeInfo_Delegate : TypeInfo -{ - char[] toString() - { - return next.toString() ~ " delegate()"; - } - - int opEquals(Object o) - { TypeInfo_Delegate c; - - return this is o || - ((c = cast(TypeInfo_Delegate)o) !is null && - this.next == c.next); - } - - // BUG: need to add the rest of the functions - - size_t tsize() - { alias int delegate() dg; - return dg.sizeof; - } - - uint flags() { return 1; } - - TypeInfo next; -} - -class TypeInfo_Class : TypeInfo -{ - char[] toString() { return info.name; } - - int opEquals(Object o) - { TypeInfo_Class c; - - return this is o || - ((c = cast(TypeInfo_Class)o) !is null && - this.info.name == c.classinfo.name); - } - - hash_t getHash(void *p) - { - Object o = *cast(Object*)p; - return o ? o.toHash() : 0; - } - - int equals(void *p1, void *p2) - { - Object o1 = *cast(Object*)p1; - Object o2 = *cast(Object*)p2; - - return (o1 is o2) || (o1 && o1.opEquals(o2)); - } - - int compare(void *p1, void *p2) - { - Object o1 = *cast(Object*)p1; - Object o2 = *cast(Object*)p2; - int c = 0; - - // Regard null references as always being "less than" - if (o1 !is o2) - { - if (o1) - { if (!o2) - c = 1; - else - c = o1.opCmp(o2); - } - else - c = -1; - } - return c; - } - - size_t tsize() - { - return Object.sizeof; - } - - uint flags() { return 1; } - - OffsetTypeInfo[] offTi() - { - return (info.flags & 4) ? info.offTi : null; - } - - ClassInfo info; -} - -class TypeInfo_Interface : TypeInfo -{ - char[] toString() { return info.name; } - - int opEquals(Object o) - { TypeInfo_Interface c; - - return this is o || - ((c = cast(TypeInfo_Interface)o) !is null && - this.info.name == c.classinfo.name); - } - - hash_t getHash(void *p) - { - Interface* pi = **cast(Interface ***)*cast(void**)p; - Object o = cast(Object)(*cast(void**)p - pi.offset); - assert(o); - return o.toHash(); - } - - int equals(void *p1, void *p2) - { - Interface* pi = **cast(Interface ***)*cast(void**)p1; - Object o1 = cast(Object)(*cast(void**)p1 - pi.offset); - pi = **cast(Interface ***)*cast(void**)p2; - Object o2 = cast(Object)(*cast(void**)p2 - pi.offset); - - return o1 == o2 || (o1 && o1.opCmp(o2) == 0); - } - - int compare(void *p1, void *p2) - { - Interface* pi = **cast(Interface ***)*cast(void**)p1; - Object o1 = cast(Object)(*cast(void**)p1 - pi.offset); - pi = **cast(Interface ***)*cast(void**)p2; - Object o2 = cast(Object)(*cast(void**)p2 - pi.offset); - int c = 0; - - // Regard null references as always being "less than" - if (o1 != o2) - { - if (o1) - { if (!o2) - c = 1; - else - c = o1.opCmp(o2); - } - else - c = -1; - } - return c; - } - - size_t tsize() - { - return Object.sizeof; - } - - uint flags() { return 1; } - - ClassInfo info; -} - -class TypeInfo_Struct : TypeInfo -{ - char[] toString() { return name; } - - int opEquals(Object o) - { TypeInfo_Struct s; - - return this is o || - ((s = cast(TypeInfo_Struct)o) !is null && - this.name == s.name && - this.init.length == s.init.length); - } - - hash_t getHash(void *p) - { hash_t h; - - assert(p); - if (xtoHash) - { debug(PRINTF) printf("getHash() using xtoHash\n"); - hash_t delegate() toHash; - toHash.ptr = p; - toHash.funcptr = xtoHash; - h = toHash(); - } - else - { - debug(PRINTF) printf("getHash() using default hash\n"); - // A sorry hash algorithm. - // Should use the one for strings. - // BUG: relies on the GC not moving objects - for (size_t i = 0; i < m_init.length; i++) - { h = h * 9 + *cast(ubyte*)p; - p++; - } - } - return h; - } - - int equals(void *p1, void *p2) - { int c; - - if (p1 == p2) - c = 1; - else if (!p1 || !p2) - c = 0; - else if (xopEquals) { - int delegate(void*) opEquals; - opEquals.ptr = p1; - opEquals.funcptr = xopEquals; - c = opEquals(p2); - } else - // BUG: relies on the GC not moving objects - c = (memcmp(p1, p2, m_init.length) == 0); - return c; - } - - int compare(void *p1, void *p2) - { - int c = 0; - - // Regard null references as always being "less than" - if (p1 != p2) - { - if (p1) - { if (!p2) - c = 1; - else if (xopCmp) { - int delegate(void*) opCmp; - opCmp.ptr = p1; - opCmp.funcptr = xopCmp; - c = opCmp(p2); - } else - // BUG: relies on the GC not moving objects - c = memcmp(p1, p2, m_init.length); - } - else - c = -1; - } - return c; - } - - size_t tsize() - { - return m_init.length; - } - - void[] init() { return m_init; } - - uint flags() { return m_flags; } - - char[] name; - void[] m_init; // initializer; never null - - // These are ONLY for use as a delegate.funcptr! - hash_t function() xtoHash; - int function(void*) xopEquals; - int function(void*) xopCmp; - char[] function() xtoString; - - uint m_flags; -} - -class TypeInfo_Tuple : TypeInfo -{ - TypeInfo[] elements; - - char[] toString() - { - char[] s; - s = "("; - foreach (i, element; elements) - { - if (i) - s ~= ','; - s ~= element.toString(); - } - s ~= ")"; - return s; - } - - int opEquals(Object o) - { - if (this is o) - return 1; - - auto t = cast(TypeInfo_Tuple)o; - if (t && elements.length == t.elements.length) - { - for (size_t i = 0; i < elements.length; i++) - { - if (elements[i] != t.elements[i]) - return 0; - } - return 1; - } - return 0; - } - - hash_t getHash(void *p) - { - assert(0); - } - - int equals(void *p1, void *p2) - { - assert(0); - } - - int compare(void *p1, void *p2) - { - assert(0); - } - - size_t tsize() - { - assert(0); - } - - void swap(void *p1, void *p2) - { - assert(0); - } -} - - -//////////////////////////////////////////////////////////////////////////////// -// Exception -//////////////////////////////////////////////////////////////////////////////// - - -class Exception : Object -{ - static if (Tango.Minor > 998) { - struct FrameInfo{ - long line; - size_t iframe; - ptrdiff_t offsetSymb; - size_t baseSymb; - ptrdiff_t offsetImg; - size_t baseImg; - size_t address; - char[] file; - char[] func; - char[] extra; - bool exactAddress; - bool internalFunction; - void writeOut(void delegate(char[])sink){ - char[25] buf; - if (func.length) { - sink(func); - } else { - sink("???"); - } - auto len=sprintf(buf.ptr,"@%zx",baseSymb); - sink(buf[0..len]); - len=sprintf(buf.ptr,"%+td ",offsetSymb); - sink(buf[0..len]); - if (extra.length){ - sink(extra); - sink(" "); - } - sink(file); - len=sprintf(buf.ptr,":%ld ",line); - sink(buf[0..len]); - len=sprintf(buf.ptr,"%zx",baseImg); - sink(buf[0..len]); - len=sprintf(buf.ptr,"%+td ",offsetImg); - sink(buf[0..len]); - len=sprintf(buf.ptr,"[%zx]",address); - sink(buf[0..len]); - } - void clear(){ - line=0; - iframe=-1; - offsetImg=0; - baseImg=0; - offsetSymb=0; - baseSymb=0; - address=0; - exactAddress=true; - internalFunction=false; - file=null; - func=null; - extra=null; - } - } - interface TraceInfo - { - int opApply( int delegate( ref FrameInfo fInfo ) ); - void writeOut(void delegate(char[])sink); - } - } else static if (Tango.Minor == 998) { - struct FrameInfo{ - long line; - ptrdiff_t iframe; - ptrdiff_t offset; - size_t address; - char[] file; - char[] func; - char[256] charBuf; - void writeOut(void delegate(char[])sink){ - char[25] buf; - sink(func); - auto len = snprintf(buf.ptr,buf.length,"@%zx ",address); - sink(buf[0..len]); - len = snprintf(buf.ptr,buf.length," %+td ",address); - sink(buf[0..len]); - if (file.length != 0 || line) { - sink(file); - len = snprintf(buf.ptr,buf.length,":%ld",line); - sink(buf[0..len]); - } - } - } - interface TraceInfo - { - int opApply( int delegate( ref FrameInfo fInfo ) ); - } - } else { - static assert(0, "Don't know FrameInfo, TraceInfo definition for Tango < 0.99.8"); - } - - char[] msg; - char[] file; - size_t line; - TraceInfo info; - Exception next; - - this( char[] msg, char[] file, long line, Exception next, TraceInfo info ) - { - // main constructor, breakpoint this if you want... - this.msg = msg; - this.next = next; - this.file = file; - this.line = cast(size_t)line; - this.info = info; - } - - this( char[] msg, Exception next=null ) - { - this(msg,null,0,next,rt_createTraceContext(null)); - } - - this( char[] msg, char[] file, long line, Exception next=null ) - { - this(msg,file,line,next,rt_createTraceContext(null)); - } - - char[] toString() - { - return msg; - } - - void writeOut(void delegate(char[])sink){ - if (file.length != 0 || line) - { - char[25]buf; - sink(this.classinfo.name); - sink("@"); - sink(file); - sink("("); - auto len = snprintf(buf.ptr,buf.length,"%ld",line); - sink(buf[0..len]); - sink("): "); - sink(toString()); - sink("\n"); - } - else - { - sink(this.classinfo.name); - sink(": "); - sink(toString); - sink("\n"); - } - if (info) - { - sink("----------------\n"); - foreach (ref t; info){ - t.writeOut(sink); - sink("\n"); - } - } - if (next){ - sink("\n"); - next.writeOut(sink); - } - } -} - - -alias Exception.TraceInfo function( void* ptr = null ) TraceHandler; -private TraceHandler traceHandler = null; - - -/** - * Overrides the default trace hander with a user-supplied version. - * - * Params: - * h = The new trace handler. Set to null to use the default handler. - */ -extern (C) void rt_setTraceHandler( TraceHandler h ) -{ - traceHandler = h; -} - - -/** - * This function will be called when an Exception is constructed. The - * user-supplied trace handler will be called if one has been supplied, - * otherwise no trace will be generated. - * - * Params: - * ptr = A pointer to the location from which to generate the trace, or null - * if the trace should be generated from within the trace handler - * itself. - * - * Returns: - * An object describing the current calling context or null if no handler is - * supplied. - */ -extern(C) Exception.TraceInfo rt_createTraceContext( void* ptr ) -{ - if( traceHandler is null ) - return null; - return traceHandler( ptr ); -} - - -//////////////////////////////////////////////////////////////////////////////// -// ModuleInfo -//////////////////////////////////////////////////////////////////////////////// - - -enum -{ - MIctorstart = 1, // we've started constructing it - MIctordone = 2, // finished construction - MIstandalone = 4, // module ctor does not depend on other module - // ctors being done first - MIhasictor = 8, // has ictor member -} - - -class ModuleInfo -{ - char[] name; - ModuleInfo[] importedModules; - ClassInfo[] localClasses; - uint flags; - - void function() ctor; // module static constructor (order dependent) - void function() dtor; // module static destructor - void function() unitTest; // module unit tests - - void* xgetMembers; // module getMembers() function - - void function() ictor; // module static constructor (order independent) - - static int opApply( int delegate( inout ModuleInfo ) dg ) - { - int ret = 0; - - foreach( m; _moduleinfo_array ) - { - ret = dg( m ); - if( ret ) - break; - } - return ret; - } -} - - -// this gets initialized in _moduleCtor() -extern (C) ModuleInfo[] _moduleinfo_array; - -// This linked list is created by a compiler generated function inserted -// into the .ctor list by the compiler. -struct ModuleReference -{ - ModuleReference* next; - ModuleInfo mod; -} -extern (C) ModuleReference* _Dmodule_ref; // start of linked list - -// this list is built from the linked list above -ModuleInfo[] _moduleinfo_dtors; -uint _moduleinfo_dtors_i; - -/** - * Initialize the modules. - */ - -extern (C) void _moduleCtor() -{ - debug(PRINTF) printf("_moduleCtor()\n"); - - int len = 0; - ModuleReference *mr; - - for (mr = _Dmodule_ref; mr; mr = mr.next) - len++; - _moduleinfo_array = new ModuleInfo[len]; - len = 0; - for (mr = _Dmodule_ref; mr; mr = mr.next) - { _moduleinfo_array[len] = mr.mod; - len++; - } - - _moduleinfo_dtors = new ModuleInfo[_moduleinfo_array.length]; - debug(PRINTF) printf("_moduleinfo_dtors = x%x\n", cast(void *)_moduleinfo_dtors); - _moduleIndependentCtors(); - _moduleCtor2(null, _moduleinfo_array, 0); -} - -extern (C) void _moduleIndependentCtors() -{ - debug(PRINTF) printf("_moduleIndependentCtors()\n"); - foreach (m; _moduleinfo_array) - { - if (m && m.flags & MIhasictor && m.ictor) - { - (*m.ictor)(); - } - } - debug(PRINTF) printf("_moduleIndependentCtors() DONE\n"); -} - -void _moduleCtor2(ModuleInfo from, ModuleInfo[] mi, int skip) -{ - debug(PRINTF) printf("_moduleCtor2(): %d modules\n", mi.length); - for (uint i = 0; i < mi.length; i++) - { - ModuleInfo m = mi[i]; - - debug(PRINTF) printf("\tmodule[%d] = '%p'\n", i, m); - if (!m) - continue; - debug(PRINTF) printf("\tmodule[%d] = '%.*s'\n", i, m.name.length, m.name.ptr); - if (m.flags & MIctordone) - continue; - debug(PRINTF) printf("\tmodule[%d] = '%.*s', m = x%x\n", i, m.name.length, m.name.ptr, m); - - if (m.ctor || m.dtor) - { - if (m.flags & MIctorstart) - { if (skip || m.flags & MIstandalone) - continue; - assert(from !is null); - throw new Exception( "Cyclic dependency in module " ~ from.name ~ " for import " ~ m.name); - } - - m.flags |= MIctorstart; - _moduleCtor2(m, m.importedModules, 0); - if (m.ctor) - (*m.ctor)(); - m.flags &= ~MIctorstart; - m.flags |= MIctordone; - - // Now that construction is done, register the destructor - //printf("\tadding module dtor x%x\n", m); - assert(_moduleinfo_dtors_i < _moduleinfo_dtors.length); - _moduleinfo_dtors[_moduleinfo_dtors_i++] = m; - } - else - { - m.flags |= MIctordone; - _moduleCtor2(m, m.importedModules, 1); - } - } - debug(PRINTF) printf("_moduleCtor2() DONE\n"); -} - -/** - * Destruct the modules. - */ - -// Starting the name with "_STD" means under linux a pointer to the -// function gets put in the .dtors segment. - -extern (C) void _moduleDtor() -{ - debug(PRINTF) printf("_moduleDtor(): %d modules\n", _moduleinfo_dtors_i); - - for (uint i = _moduleinfo_dtors_i; i-- != 0;) - { - ModuleInfo m = _moduleinfo_dtors[i]; - - debug(PRINTF) printf("\tmodule[%d] = '%.*s', x%x\n", i, m.name, m); - if (m.dtor) - { - (*m.dtor)(); - } - } - debug(PRINTF) printf("_moduleDtor() done\n"); -} - -//////////////////////////////////////////////////////////////////////////////// -// Monitor -//////////////////////////////////////////////////////////////////////////////// - -alias Object.Monitor IMonitor; -alias void delegate(Object) DEvent; - -// NOTE: The dtor callback feature is only supported for monitors that are not -// supplied by the user. The assumption is that any object with a user- -// supplied monitor may have special storage or lifetime requirements and -// that as a result, storing references to local objects within Monitor -// may not be safe or desirable. Thus, devt is only valid if impl is -// null. -struct Monitor -{ - IMonitor impl; - /* internal */ - DEvent[] devt; - /* stuff */ -} - -Monitor* getMonitor(Object h) -{ - return cast(Monitor*) (cast(void**) h)[1]; -} - -void setMonitor(Object h, Monitor* m) -{ - (cast(void**) h)[1] = m; -} - -extern (C) void _d_monitor_create(Object); -extern (C) void _d_monitor_destroy(Object); -extern (C) void _d_monitor_lock(Object); -extern (C) int _d_monitor_unlock(Object); - -extern (C) void _d_monitordelete(Object h, bool det) -{ - Monitor* m = getMonitor(h); - - if (m !is null) - { - IMonitor i = m.impl; - if (i is null) - { - _d_monitor_devt(m, h); - _d_monitor_destroy(h); - setMonitor(h, null); - return; - } - if (det && (cast(void*) i) !is (cast(void*) h)) - delete i; - setMonitor(h, null); - } -} - -extern (C) void _d_monitorenter(Object h) -{ - Monitor* m = getMonitor(h); - - if (m is null) - { - _d_monitor_create(h); - m = getMonitor(h); - } - - IMonitor i = m.impl; - - if (i is null) - { - _d_monitor_lock(h); - return; - } - i.lock(); -} - -extern (C) void _d_monitorexit(Object h) -{ - Monitor* m = getMonitor(h); - IMonitor i = m.impl; - - if (i is null) - { - _d_monitor_unlock(h); - return; - } - i.unlock(); -} - -extern (C) void _d_monitor_devt(Monitor* m, Object h) -{ - if (m.devt.length) - { - DEvent[] devt; - - synchronized (h) - { - devt = m.devt; - m.devt = null; - } - foreach (v; devt) - { - if (v) - v(h); - } - free(devt.ptr); - } -} - -extern (C) void rt_attachDisposeEvent(Object h, DEvent e) -{ - synchronized (h) - { - Monitor* m = getMonitor(h); - assert(m.impl is null); - - foreach (inout v; m.devt) - { - if (v is null || v == e) - { - v = e; - return; - } - } - - auto len = m.devt.length + 4; // grow by 4 elements - auto pos = m.devt.length; // insert position - auto p = realloc(m.devt.ptr, DEvent.sizeof * len); - if (!p) - onOutOfMemoryError(); - m.devt = (cast(DEvent*)p)[0 .. len]; - m.devt[pos+1 .. len] = null; - m.devt[pos] = e; - } -} - -extern (C) void rt_detachDisposeEvent(Object h, DEvent e) -{ - synchronized (h) - { - Monitor* m = getMonitor(h); - assert(m.impl is null); - - foreach (p, v; m.devt) - { - if (v == e) - { - memmove(&m.devt[p], - &m.devt[p+1], - (m.devt.length - p - 1) * DEvent.sizeof); - m.devt[$ - 1] = null; - return; - } - } - } -} diff --git a/runtime/internal/invariant.d b/runtime/internal/invariant.d deleted file mode 100644 index 6c96ede9..00000000 --- a/runtime/internal/invariant.d +++ /dev/null @@ -1,28 +0,0 @@ - -/* - * Placed into the Public Domain - * written by Walter Bright - * www.digitalmars.com - */ - -extern(C) void _d_invariant(Object o) -{ ClassInfo c; - - //printf("__d_invariant(%p)\n", o); - - // BUG: needs to be filename/line of caller, not library routine - assert(o !is null); // just do null check, not invariant check - - c = o.classinfo; - do - { - if (c.classInvariant) - { - void delegate() inv; - inv.ptr = cast(void*) o; - inv.funcptr = c.classInvariant; - inv(); - } - c = c.base; - } while (c); -} diff --git a/runtime/internal/ldc.mak b/runtime/internal/ldc.mak deleted file mode 100644 index c843ed76..00000000 --- a/runtime/internal/ldc.mak +++ /dev/null @@ -1,261 +0,0 @@ -# Makefile to build the LDC compiler runtime D library for Linux -# Designed to work with GNU make -# Targets: -# make -# Same as make all -# make lib -# Build the compiler runtime library -# make doc -# Generate documentation -# make clean -# Delete unneeded files created by build process - -LIB_TARGET_FULL=libldc-runtime.a -LIB_TARGET_BC_ONLY=libldc-runtime-bc-only.a -LIB_TARGET_C_ONLY=libldc-runtime-c-only.a -LIB_TARGET_SHARED=libldc-runtime-shared.so -LIB_MASK=libldc-runtime*.* - - -CP=cp -f -RM=rm -f -MD=mkdir -p - -#CFLAGS=-O3 $(ADD_CFLAGS) -CFLAGS=$(ADD_CFLAGS) - -#DFLAGS=-release -O3 -inline -w $(ADD_DFLAGS) -DFLAGS=-w $(ADD_DFLAGS) - -#TFLAGS=-O3 -inline -w $(ADD_DFLAGS) -TFLAGS=-w $(ADD_DFLAGS) - -DOCFLAGS=-version=DDoc - -CC=gcc -LC=llvm-ar rsv -LLINK=llvm-link -LCC=llc -CLC=ar rsv -DC=ldc -LLC=llvm-as - -LIB_DEST=.. - -.SUFFIXES: .s .S .c .cpp .d .ll .html .o .bc - -.s.o: - $(CC) -c $(CFLAGS) $< -o$@ - -.S.o: - $(CC) -c $(CFLAGS) $< -o$@ - -.c.o: - $(CC) -c $(CFLAGS) $< -o$@ - -.cpp.o: - g++ -c $(CFLAGS) $< -o$@ - -.d.o: - $(DC) -c $(DFLAGS) $< -of$@ -output-bc - -.d.html: - $(DC) -c -o- $(DOCFLAGS) -Df$*.html ldc.ddoc $< - -targets : lib sharedlib doc -all : lib sharedlib doc -#lib : ldc.bclib ldc.clib ldc.lib -lib : ldc.clib ldc.lib -sharedlib : ldc.sharedlib -doc : ldc.doc - -###################################################### -OBJ_C= \ - monitor.o \ - critical.o - -OBJ_BASE_BC= \ - aaA.bc \ - aApply.bc \ - aApplyR.bc \ - adi.bc \ - arrayInit.bc \ - cast.bc \ - dmain2.bc \ - eh.bc \ - genobj.bc \ - lifetime.bc \ - memory.bc \ - qsort2.bc \ - switch.bc \ - invariant.bc - -OBJ_UTIL_BC= \ - util/console.bc \ - util/ctype.bc \ - util/string.bc \ - util/utf.bc - -OBJ_LDC_BC= \ - ldc/bitmanip.bc \ - ldc/vararg.bc - -OBJ_TI_BC= \ - typeinfo/ti_AC.bc \ - typeinfo/ti_Acdouble.bc \ - typeinfo/ti_Acfloat.bc \ - typeinfo/ti_Acreal.bc \ - typeinfo/ti_Adouble.bc \ - typeinfo/ti_Afloat.bc \ - typeinfo/ti_Ag.bc \ - typeinfo/ti_Aint.bc \ - typeinfo/ti_Along.bc \ - typeinfo/ti_Areal.bc \ - typeinfo/ti_Ashort.bc \ - typeinfo/ti_byte.bc \ - typeinfo/ti_C.bc \ - typeinfo/ti_cdouble.bc \ - typeinfo/ti_cfloat.bc \ - typeinfo/ti_char.bc \ - typeinfo/ti_creal.bc \ - typeinfo/ti_dchar.bc \ - typeinfo/ti_delegate.bc \ - typeinfo/ti_double.bc \ - typeinfo/ti_float.bc \ - typeinfo/ti_idouble.bc \ - typeinfo/ti_ifloat.bc \ - typeinfo/ti_int.bc \ - typeinfo/ti_ireal.bc \ - typeinfo/ti_long.bc \ - typeinfo/ti_ptr.bc \ - typeinfo/ti_real.bc \ - typeinfo/ti_short.bc \ - typeinfo/ti_ubyte.bc \ - typeinfo/ti_uint.bc \ - typeinfo/ti_ulong.bc \ - typeinfo/ti_ushort.bc \ - typeinfo/ti_void.bc \ - typeinfo/ti_wchar.bc - -OBJ_BASE_O= \ - aaA.o \ - aApply.o \ - aApplyR.o \ - adi.o \ - arrayInit.o \ - cast.o \ - dmain2.o \ - eh.o \ - genobj.o \ - lifetime.o \ - memory.o \ - qsort2.o \ - switch.o \ - invariant.o - -OBJ_UTIL_O= \ - util/console.o \ - util/ctype.o \ - util/string.o \ - util/utf.o - -OBJ_LDC_O= \ - ldc/bitmanip.o \ - ldc/vararg.o - -OBJ_TI_O= \ - typeinfo/ti_AC.o \ - typeinfo/ti_Acdouble.o \ - typeinfo/ti_Acfloat.o \ - typeinfo/ti_Acreal.o \ - typeinfo/ti_Adouble.o \ - typeinfo/ti_Afloat.o \ - typeinfo/ti_Ag.o \ - typeinfo/ti_Aint.o \ - typeinfo/ti_Along.o \ - typeinfo/ti_Areal.o \ - typeinfo/ti_Ashort.o \ - typeinfo/ti_byte.o \ - typeinfo/ti_C.o \ - typeinfo/ti_cdouble.o \ - typeinfo/ti_cfloat.o \ - typeinfo/ti_char.o \ - typeinfo/ti_creal.o \ - typeinfo/ti_dchar.o \ - typeinfo/ti_delegate.o \ - typeinfo/ti_double.o \ - typeinfo/ti_float.o \ - typeinfo/ti_idouble.o \ - typeinfo/ti_ifloat.o \ - typeinfo/ti_int.o \ - typeinfo/ti_ireal.o \ - typeinfo/ti_long.o \ - typeinfo/ti_ptr.o \ - typeinfo/ti_real.o \ - typeinfo/ti_short.o \ - typeinfo/ti_ubyte.o \ - typeinfo/ti_uint.o \ - typeinfo/ti_ulong.o \ - typeinfo/ti_ushort.o \ - typeinfo/ti_void.o \ - typeinfo/ti_wchar.o - -ALL_OBJS_BC= \ - $(OBJ_BASE_BC) \ - $(OBJ_UTIL_BC) \ - $(OBJ_TI_BC) \ - $(OBJ_LDC_BC) - -ALL_OBJS_O= \ - $(OBJ_BASE_O) \ - $(OBJ_UTIL_O) \ - $(OBJ_TI_O) \ - $(OBJ_LDC_O) \ - $(OBJ_C) - -###################################################### - -ALL_DOCS= - -###################################################### - -#ldc.bclib : $(LIB_TARGET_BC_ONLY) -ldc.clib : $(LIB_TARGET_C_ONLY) -ldc.lib : $(LIB_TARGET_FULL) -ldc.sharedlib : $(LIB_TARGET_SHARED) - -#$(LIB_TARGET_BC_ONLY) : $(ALL_OBJS_O) -# $(RM) $@ -# $(LC) $@ $(ALL_OBJS_BC) - - -$(LIB_TARGET_FULL) : $(ALL_OBJS_O) - $(RM) $@ - $(CLC) $@ $(ALL_OBJS_O) - - -$(LIB_TARGET_C_ONLY) : $(OBJ_C) - $(RM) $@ - $(CLC) $@ $(OBJ_C) - - -$(LIB_TARGET_SHARED) : $(ALL_OBJS_O) - $(RM) $@ - $(CC) -shared -o $@ $(ALL_OBJS_O) - - -ldc.doc : $(ALL_DOCS) - echo No documentation available. - -###################################################### - -clean : - find . -name "*.di" | xargs $(RM) -# $(RM) $(ALL_OBJS_BC) - $(RM) $(ALL_OBJS_O) - $(RM) $(ALL_DOCS) - $(RM) $(LIB_MASK) - -install : - $(MD) $(LIB_DEST) - $(CP) $(LIB_MASK) $(LIB_DEST)/. diff --git a/runtime/internal/ldc/bitmanip.d b/runtime/internal/ldc/bitmanip.d deleted file mode 100644 index 24c5e702..00000000 --- a/runtime/internal/ldc/bitmanip.d +++ /dev/null @@ -1,81 +0,0 @@ -/* - * D phobos intrinsics for LDC - * - * From GDC ... public domain! - */ -module ldc.bitmanip; - -// Check for the right compiler -version(LDC) -{ - // OK -} -else -{ - static assert(false, "This module is only valid for LDC"); -} - -int bsf(uint v) -{ - uint m = 1; - uint i; - for (i = 0; i < 32; i++,m<<=1) { - if (v&m) - return i; - } - return i; // supposed to be undefined -} - -int bsr(uint v) -{ - uint m = 0x80000000; - uint i; - for (i = 32; i ; i--,m>>>=1) { - if (v&m) - return i-1; - } - return i; // supposed to be undefined -} - -int bt(uint *p, uint bitnum) -{ - return (p[bitnum / (uint.sizeof*8)] & (1<<(bitnum & ((uint.sizeof*8)-1)))) ? -1 : 0 ; -} - -int btc(uint *p, uint bitnum) -{ - uint * q = p + (bitnum / (uint.sizeof*8)); - uint mask = 1 << (bitnum & ((uint.sizeof*8) - 1)); - int result = *q & mask; - *q ^= mask; - return result ? -1 : 0; -} - -int btr(uint *p, uint bitnum) -{ - uint * q = p + (bitnum / (uint.sizeof*8)); - uint mask = 1 << (bitnum & ((uint.sizeof*8) - 1)); - int result = *q & mask; - *q &= ~mask; - return result ? -1 : 0; -} - -int bts(uint *p, uint bitnum) -{ - uint * q = p + (bitnum / (uint.sizeof*8)); - uint mask = 1 << (bitnum & ((uint.sizeof*8) - 1)); - int result = *q & mask; - *q |= mask; - return result ? -1 : 0; -} - -pragma(intrinsic, "llvm.bswap.i32") - uint bswap(uint val); - -ubyte inp(uint p) { throw new Exception("inp intrinsic not yet implemented"); } -ushort inpw(uint p) { throw new Exception("inpw intrinsic not yet implemented"); } -uint inpl(uint p) { throw new Exception("inpl intrinsic not yet implemented"); } - -ubyte outp(uint p, ubyte v) { throw new Exception("outp intrinsic not yet implemented"); } -ushort outpw(uint p, ushort v) { throw new Exception("outpw intrinsic not yet implemented"); } -uint outpl(uint p, uint v) { throw new Exception("outpl intrinsic not yet implemented"); } diff --git a/runtime/internal/ldc/vararg.d b/runtime/internal/ldc/vararg.d deleted file mode 100644 index 9202cf8d..00000000 --- a/runtime/internal/ldc/vararg.d +++ /dev/null @@ -1,43 +0,0 @@ -/* - * This module holds the implementation of special vararg templates for D style var args. - * - * Provides the functions tango.core.Vararg expects to be present! - */ - -module ldc.Vararg; - -// Check for the right compiler -version(LDC) -{ - // OK -} -else -{ - static assert(false, "This module is only valid for LDC"); -} - -alias void* va_list; - -void va_start(T) ( out va_list ap, inout T parmn ) -{ - // not needed ! -} - -T va_arg(T)(ref va_list vp) -{ - T* arg = cast(T*) vp; - // ldc always aligns to size_t.sizeof in vararg lists - vp = cast(va_list) ( cast(void*) vp + ( ( T.sizeof + size_t.sizeof - 1 ) & ~( size_t.sizeof - 1 ) ) ); - return *arg; -} - -void va_end( va_list ap ) -{ - // not needed ! -} - -void va_copy( out va_list dst, va_list src ) -{ - // seems pretty useless ! - dst = src; -} diff --git a/runtime/internal/lifetime.d b/runtime/internal/lifetime.d deleted file mode 100644 index be78f9ce..00000000 --- a/runtime/internal/lifetime.d +++ /dev/null @@ -1,1083 +0,0 @@ -/** - * This module contains all functions related to an object's lifetime: - * allocation, resizing, deallocation, and finalization. - * - * Copyright: Copyright (C) 2004-2007 Digital Mars, www.digitalmars.com. - * All rights reserved. - * License: - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, in both source and binary form, subject to the following - * restrictions: - * - * o The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * o Altered source versions must be plainly marked as such, and must not - * be misrepresented as being the original software. - * o This notice may not be removed or altered from any source - * distribution. - * Authors: Walter Bright, Sean Kelly, Tomas Lindquist Olsen - */ -module lifetime; - -//debug=PRINTF; -//debug=PRINTF2; - -private -{ - import tango.stdc.stdlib; - import tango.stdc.string; - import tango.stdc.stdarg; - debug(PRINTF) import tango.stdc.stdio; - else debug(PRINTF2) import tango.stdc.stdio; -} - - -private -{ - enum BlkAttr : uint - { - FINALIZE = 0b0000_0001, - NO_SCAN = 0b0000_0010, - NO_MOVE = 0b0000_0100, - ALL_BITS = 0b1111_1111 - } - - struct BlkInfo - { - void* base; - size_t size; - uint attr; - } - - extern (C) uint gc_getAttr( void* p ); - extern (C) uint gc_setAttr( void* p, uint a ); - extern (C) uint gc_clrAttr( void* p, uint a ); - - extern (C) void* gc_malloc( size_t sz, uint ba = 0 ); - extern (C) void* gc_calloc( size_t sz, uint ba = 0 ); - extern (C) size_t gc_extend( void* p, size_t mx, size_t sz ); - extern (C) void gc_free( void* p ); - - extern (C) void* gc_addrOf( void* p ); - extern (C) size_t gc_sizeOf( void* p ); - extern (C) BlkInfo gc_query( void* p ); - - extern (C) bool onCollectResource( Object o ); - extern (C) void onFinalizeError( ClassInfo c, Exception e ); - extern (C) void onOutOfMemoryError(); - - extern (C) void _d_monitordelete(Object h, bool det = true); - - enum - { - PAGESIZE = 4096 - } - - alias bool function(Object) CollectHandler; - CollectHandler collectHandler = null; - - size_t length_adjust(size_t sizeelem, size_t newlength) - { - size_t newsize = void; - static if (size_t.sizeof < ulong.sizeof) - { - ulong s = cast(ulong)sizeelem * cast(ulong)newlength; - if (s > size_t.max) - onOutOfMemoryError(); - newsize = cast(size_t)s; - } - else - { - newsize = sizeelem * newlength; - if (newsize / newlength != sizeelem) - onOutOfMemoryError(); - } - return newsize; - } -} - - -/** - * - */ -extern (C) void* _d_allocclass(ClassInfo ci) -{ - void* p; - - debug(PRINTF2) printf("_d_allocclass(ci = %p, %s)\n", ci, cast(char *)ci.name.ptr); - /+ - if (ci.flags & 1) // if COM object - { /* COM objects are not garbage collected, they are reference counted - * using AddRef() and Release(). They get free'd by C's free() - * function called by Release() when Release()'s reference count goes - * to zero. - */ - p = tango.stdc.stdlib.malloc(ci.init.length); - if (!p) - onOutOfMemoryError(); - } - else - +/ - { - p = gc_malloc(ci.init.length, - BlkAttr.FINALIZE | (ci.flags & 2 ? BlkAttr.NO_SCAN : 0)); - debug(PRINTF2) printf(" p = %p\n", p); - } - - debug(PRINTF2) - { - printf("p = %p\n", p); - printf("ci = %p, ci.init = %p, len = %d\n", ci, ci.init.ptr, ci.init.length); - printf("vptr = %p\n", *cast(void**) ci.init.ptr); - printf("vtbl[0] = %p\n", (*cast(void***) ci.init.ptr)[0]); - printf("vtbl[1] = %p\n", (*cast(void***) ci.init.ptr)[1]); - printf("init[0] = %p\n", (cast(uint**) ci.init.ptr)[0]); - printf("init[1] = %p\n", (cast(uint**) ci.init.ptr)[1]); - printf("init[2] = %p\n", (cast(uint**) ci.init.ptr)[2]); - printf("init[3] = %p\n", (cast(uint**) ci.init.ptr)[3]); - printf("init[4] = %p\n", (cast(uint**) ci.init.ptr)[4]); - } - - // initialize it - // ldc does this inline - //(cast(byte*) p)[0 .. ci.init.length] = ci.init[]; - - debug(PRINTF) printf("initialization done\n"); - return p; -} - -/** - * - */ -extern (C) void _d_delinterface(void* p) -{ - if (p) - { - Interface* pi = **cast(Interface ***)p; - Object o = cast(Object)(p - pi.offset); - - _d_delclass(o); - //*p = null; - } -} - -// used for deletion -private extern (D) alias void function(Object) fp_t; - - -/** - * - */ -extern (C) void _d_delclass(Object p) -{ - if (p) - { - debug(PRINTF) printf("_d_delclass(%p)\n", p); - - ClassInfo **pc = cast(ClassInfo **)p; - if (*pc) - { - ClassInfo c = **pc; - - rt_finalize(cast(void*) p); - - if (c.deallocator) - { - fp_t fp = cast(fp_t)c.deallocator; - (*fp)(p); // call deallocator - //*p = null; - return; - } - } - else - { - rt_finalize(cast(void*) p); - } - gc_free(cast(void*) p); - //*p = null; - } -} - -/+ - -/** - * - */ -struct Array -{ - size_t length; - void* data; -} - -+/ - -/** - * Allocate a new array of length elements. - * ti is the type of the resulting array, or pointer to element. - * The resulting array is initialized to 0 - */ -extern (C) void* _d_newarrayT(TypeInfo ti, size_t length) -{ - void* p; - auto size = ti.next.tsize(); // array element size - - debug(PRINTF) printf("_d_newarrayT(length = %u, size = %d)\n", length, size); - if (length == 0 || size == 0) - return null; - - size = length_adjust(size, length); - - p = gc_malloc(size + 1, !(ti.next.flags() & 1) ? BlkAttr.NO_SCAN : 0); - debug(PRINTF) printf(" p = %p\n", p); - memset(p, 0, size); - - return p; -} - -/** - * As _d_newarrayT, but - * for when the array has a non-zero initializer. - */ -extern (C) void* _d_newarrayiT(TypeInfo ti, size_t length) -{ - void* result; - auto size = ti.next.tsize(); // array element size - - debug(PRINTF) printf("_d_newarrayiT(length = %d, size = %d)\n", length, size); - - if (length == 0 || size == 0) - result = null; - else - { - auto initializer = ti.next.init(); - auto isize = initializer.length; - auto q = initializer.ptr; - - size = length_adjust(size, length); - - auto p = gc_malloc(size + 1, !(ti.next.flags() & 1) ? BlkAttr.NO_SCAN : 0); - debug(PRINTF) printf(" p = %p\n", p); - if (isize == 1) - memset(p, *cast(ubyte*)q, size); - else if (isize == int.sizeof) - { - int init = *cast(int*)q; - size /= int.sizeof; - for (size_t u = 0; u < size; u++) - { - (cast(int*)p)[u] = init; - } - } - else - { - for (size_t u = 0; u < size; u += isize) - { - memcpy(p + u, q, isize); - } - } - result = p; - } - return result; -} - -/** - * As _d_newarrayT, but without initialization - */ -extern (C) void* _d_newarrayvT(TypeInfo ti, size_t length) -{ - void* p; - auto size = ti.next.tsize(); // array element size - - debug(PRINTF) printf("_d_newarrayvT(length = %u, size = %d)\n", length, size); - if (length == 0 || size == 0) - return null; - - size = length_adjust(size, length); - - p = gc_malloc(size + 1, !(ti.next.flags() & 1) ? BlkAttr.NO_SCAN : 0); - debug(PRINTF) printf(" p = %p\n", p); - return p; -} - -/** - * Allocate a new array of arrays of arrays of arrays ... - * ti is the type of the resulting array. - * ndims is the number of nested arrays. - * dims it the array of dimensions, its size is ndims. - * The resulting array is initialized to 0 - */ -extern (C) void* _d_newarraymT(TypeInfo ti, int ndims, size_t* dims) -{ - void* result; - - debug(PRINTF) printf("_d_newarraymT(ndims = %d)\n", ndims); - if (ndims == 0) - result = null; - else - { - static void[] foo(TypeInfo ti, size_t* pdim, int ndims) - { - size_t dim = *pdim; - void[] p; - - debug(PRINTF) printf("foo(ti = %p, ti.next = %p, dim = %d, ndims = %d\n", ti, ti.next, dim, ndims); - if (ndims == 1) - { - auto r = _d_newarrayT(ti, dim); - return r[0 .. dim]; - } - else - { - p = gc_malloc(dim * (void[]).sizeof + 1)[0 .. dim]; - for (int i = 0; i < dim; i++) - { - (cast(void[]*)p.ptr)[i] = foo(ti.next, pdim + 1, ndims - 1); - } - } - return p; - } - - result = foo(ti, dims, ndims).ptr; - debug(PRINTF) printf("result = %p\n", result); - - version (none) - { - for (int i = 0; i < ndims; i++) - { - printf("index %d: %d\n", i, *dims++); - } - } - } - return result; -} - - -/** - * As _d_newarraymT, but - * for when the array has a non-zero initializer. - */ -extern (C) void* _d_newarraymiT(TypeInfo ti, int ndims, size_t* dims) -{ - void* result; - - debug(PRINTF) printf("_d_newarraymiT(ndims = %d)\n", ndims); - if (ndims == 0) - result = null; - else - { - static void[] foo(TypeInfo ti, size_t* pdim, int ndims) - { - size_t dim = *pdim; - void[] p; - - if (ndims == 1) - { - auto r = _d_newarrayiT(ti, dim); - p = r[0 .. dim]; - } - else - { - p = gc_malloc(dim * (void[]).sizeof + 1)[0 .. dim]; - for (int i = 0; i < dim; i++) - { - (cast(void[]*)p.ptr)[i] = foo(ti.next, pdim + 1, ndims - 1); - } - } - return p; - } - - result = foo(ti, dims, ndims).ptr; - debug(PRINTF) printf("result = %p\n", result); - - version (none) - { - for (int i = 0; i < ndims; i++) - { - printf("index %d: %d\n", i, *dims++); - printf("init = %d\n", *dims++); - } - } - } - return result; -} - -/** - * As _d_newarraymT, but without initialization - */ -extern (C) void* _d_newarraymvT(TypeInfo ti, int ndims, size_t* dims) -{ - void* result; - - debug(PRINTF) printf("_d_newarraymvT(ndims = %d)\n", ndims); - if (ndims == 0) - result = null; - else - { - static void[] foo(TypeInfo ti, size_t* pdim, int ndims) - { - size_t dim = *pdim; - void[] p; - - debug(PRINTF) printf("foo(ti = %p, ti.next = %p, dim = %d, ndims = %d\n", ti, ti.next, dim, ndims); - if (ndims == 1) - { - auto r = _d_newarrayvT(ti, dim); - return r[0 .. dim]; - } - else - { - p = gc_malloc(dim * (void[]).sizeof + 1)[0 .. dim]; - for (int i = 0; i < dim; i++) - { - (cast(void[]*)p.ptr)[i] = foo(ti.next, pdim + 1, ndims - 1); - } - } - return p; - } - - result = foo(ti, dims, ndims).ptr; - debug(PRINTF) printf("result = %p\n", result); - - version (none) - { - for (int i = 0; i < ndims; i++) - { - printf("index %d: %d\n", i, *dims++); - } - } - } - return result; -} - -/+ - -/** - * - */ -void* _d_allocmemory(size_t nbytes) -{ - return gc_malloc(nbytes); -} - -+/ - -/** - * for allocating a single POD value - */ -extern (C) void* _d_allocmemoryT(TypeInfo ti) -{ - return gc_malloc(ti.tsize(), !(ti.flags() & 1) ? BlkAttr.NO_SCAN : 0); -} - -/** - * - */ -extern (C) void _d_delarray(size_t plength, void* pdata) -{ -// if (p) -// { -// This assert on array consistency may fail with casts or in unions. -// This function still does something sensible even if plength && !pdata. -// assert(!plength || pdata); - - if (pdata) - gc_free(pdata); -// p.data = null; -// p.length = 0; -// } -} - -/** - * - */ -extern (C) void _d_delmemory(void* p) -{ - if (p) - { - gc_free(p); - //*p = null; - } -} - -/** - * - */ -extern (C) void _d_callinterfacefinalizer(void *p) -{ - if (p) - { - Interface *pi = **cast(Interface ***)p; - Object o = cast(Object)(p - pi.offset); - rt_finalize(cast(void*)o); - } -} - -/** - * - */ -extern (C) void _d_callfinalizer(void* p) -{ - rt_finalize( p ); -} - - -/** - * - */ -extern (C) void rt_setCollectHandler(CollectHandler h) -{ - collectHandler = h; -} - -/** - * - */ -extern (C) void rt_finalize(void* p, bool det = true) -{ - debug(PRINTF) printf("rt_finalize(p = %p)\n", p); - - if (p) // not necessary if called from gc - { - ClassInfo** pc = cast(ClassInfo**)p; - - if (*pc) - { - ClassInfo c = **pc; - - try - { - if (det || collectHandler is null || collectHandler(cast(Object)p)) - { - do - { - if (c.destructor) - { - debug(PRINTF) printf("calling dtor of %.*s\n", c.name.length, c.name.ptr); - void delegate() dg; - dg.ptr = p; - dg.funcptr = cast(void function()) c.destructor; - dg(); // call destructor - } - c = c.base; - } while (c); - } - if ((cast(void**)p)[1]) // if monitor is not null - _d_monitordelete(cast(Object)p, det); - } - catch (Exception e) - { - onFinalizeError(**pc, e); - } - finally - { - *pc = null; // zero vptr - } - } - } -} - -/** - * Resize dynamic arrays with 0 initializers. - */ -extern (C) byte* _d_arraysetlengthT(TypeInfo ti, size_t newlength, size_t plength, byte* pdata) -in -{ - assert(ti); -// This assert on array consistency may fail with casts or in unions. -// This function still does something sensible even if plength && !pdata. -// assert(!plength || pdata); -} -body -{ - byte* newdata; - size_t sizeelem = ti.next.tsize(); - - debug(PRINTF) - { - printf("_d_arraysetlengthT(sizeelem = %d, newlength = %d)\n", sizeelem, newlength); - printf("\tp.data = %p, p.length = %d\n", pdata, plength); - } - - if (newlength) - { - size_t newsize = length_adjust(sizeelem, newlength); - - debug(PRINTF) printf("newsize = %x, newlength = %x\n", newsize, newlength); - - if (pdata) - { - newdata = pdata; - if (newlength > plength) - { - size_t size = plength * sizeelem; - auto info = gc_query(pdata); - - if (info.size <= newsize || info.base != pdata) - { - if (info.size >= PAGESIZE && info.base == pdata) - { // Try to extend in-place - auto u = gc_extend(pdata, (newsize + 1) - info.size, (newsize + 1) - info.size); - if (u) - { - goto L1; - } - } - newdata = cast(byte *)gc_malloc(newsize + 1, info.attr); - newdata[0 .. size] = pdata[0 .. size]; - } - L1: - newdata[size .. newsize] = 0; - } - } - else - { - newdata = cast(byte *)gc_calloc(newsize + 1, !(ti.next.flags() & 1) ? BlkAttr.NO_SCAN : 0); - } - } - else - { - newdata = pdata; - } - - return newdata; -} - - -/** - * Resize arrays for non-zero initializers. - * p pointer to array lvalue to be updated - * newlength new .length property of array - * sizeelem size of each element of array - * initsize size of initializer - * ... initializer - */ -extern (C) byte* _d_arraysetlengthiT(TypeInfo ti, size_t newlength, size_t plength, byte* pdata) -in -{ -// This assert on array consistency may fail with casts or in unions. -// This function still does something sensible even if plength && !pdata. -// assert(!plength || pdata); -} -body -{ - byte* newdata; - TypeInfo tinext = ti.next; - size_t sizeelem = tinext.tsize(); - void[] initializer = tinext.init(); - size_t initsize = initializer.length; - - assert(sizeelem); - assert(initsize); - assert(initsize <= sizeelem); - assert((sizeelem / initsize) * initsize == sizeelem); - - debug(PRINTF) - { - printf("_d_arraysetlengthiT(sizeelem = %d, newlength = %d, initsize = %d)\n", sizeelem, newlength, initsize); - printf("\tp.data = %p, p.length = %d\n", pdata, plength); - } - - if (newlength) - { - size_t newsize = length_adjust(sizeelem, newlength); - debug(PRINTF) printf("newsize = %x, newlength = %x\n", newsize, newlength); - - size_t size = plength * sizeelem; - - if (pdata) - { - newdata = pdata; - if (newlength > plength) - { - auto info = gc_query(pdata); - - if (info.size <= newsize || info.base != pdata) - { - if (info.size >= PAGESIZE && info.base == pdata) - { // Try to extend in-place - auto u = gc_extend(pdata, (newsize + 1) - info.size, (newsize + 1) - info.size); - if (u) - { - goto L1; - } - } - newdata = cast(byte *)gc_malloc(newsize + 1, info.attr); - newdata[0 .. size] = pdata[0 .. size]; - L1: ; - } - } - } - else - { - newdata = cast(byte *)gc_malloc(newsize + 1, !(tinext.flags() & 1) ? BlkAttr.NO_SCAN : 0); - } - - auto q = initializer.ptr; // pointer to initializer - - if (newsize > size) - { - if (initsize == 1) - { - debug(PRINTF) printf("newdata = %p, size = %d, newsize = %d, *q = %d\n", newdata, size, newsize, *cast(byte*)q); - newdata[size .. newsize] = *(cast(byte*)q); - } - else - { - for (size_t u = size; u < newsize; u += initsize) - { - memcpy(newdata + u, q, initsize); - } - } - } - } - else - { - newdata = pdata; - } - - return newdata; - -Loverflow: - onOutOfMemoryError(); - return null; -} - -/+ - -/** - * Append y[] to array x[]. - * size is size of each array element. - */ -extern (C) long _d_arrayappendT(TypeInfo ti, Array *px, byte[] y) -{ - auto sizeelem = ti.next.tsize(); // array element size - auto info = gc_query(px.data); - auto length = px.length; - auto newlength = length + y.length; - auto newsize = newlength * sizeelem; - - if (info.size < newsize || info.base != px.data) - { byte* newdata; - - if (info.size >= PAGESIZE && info.base == px.data) - { // Try to extend in-place - auto u = gc_extend(px.data, (newsize + 1) - info.size, (newsize + 1) - info.size); - if (u) - { - goto L1; - } - } - newdata = cast(byte *)gc_malloc(newCapacity(newlength, sizeelem) + 1, info.attr); - memcpy(newdata, px.data, length * sizeelem); - px.data = newdata; - } - L1: - px.length = newlength; - memcpy(px.data + length * sizeelem, y.ptr, y.length * sizeelem); - return *cast(long*)px; -} - - -/** - * - */ -size_t newCapacity(size_t newlength, size_t size) -{ - version(none) - { - size_t newcap = newlength * size; - } - else - { - /* - * Better version by Dave Fladebo: - * This uses an inverse logorithmic algorithm to pre-allocate a bit more - * space for larger arrays. - * - Arrays smaller than PAGESIZE bytes are left as-is, so for the most - * common cases, memory allocation is 1 to 1. The small overhead added - * doesn't affect small array perf. (it's virtually the same as - * current). - * - Larger arrays have some space pre-allocated. - * - As the arrays grow, the relative pre-allocated space shrinks. - * - The logorithmic algorithm allocates relatively more space for - * mid-size arrays, making it very fast for medium arrays (for - * mid-to-large arrays, this turns out to be quite a bit faster than the - * equivalent realloc() code in C, on Linux at least. Small arrays are - * just as fast as GCC). - * - Perhaps most importantly, overall memory usage and stress on the GC - * is decreased significantly for demanding environments. - */ - size_t newcap = newlength * size; - size_t newext = 0; - - if (newcap > PAGESIZE) - { - //double mult2 = 1.0 + (size / log10(pow(newcap * 2.0,2.0))); - - // redo above line using only integer math - - static int log2plus1(size_t c) - { int i; - - if (c == 0) - i = -1; - else - for (i = 1; c >>= 1; i++) - { - } - return i; - } - - /* The following setting for mult sets how much bigger - * the new size will be over what is actually needed. - * 100 means the same size, more means proportionally more. - * More means faster but more memory consumption. - */ - //long mult = 100 + (1000L * size) / (6 * log2plus1(newcap)); - long mult = 100 + (1000L * size) / log2plus1(newcap); - - // testing shows 1.02 for large arrays is about the point of diminishing return - if (mult < 102) - mult = 102; - newext = cast(size_t)((newcap * mult) / 100); - newext -= newext % size; - debug(PRINTF) printf("mult: %2.2f, alloc: %2.2f\n",mult/100.0,newext / cast(double)size); - } - newcap = newext > newcap ? newext : newcap; - debug(PRINTF) printf("newcap = %d, newlength = %d, size = %d\n", newcap, newlength, size); - } - return newcap; -} - - -/** - * - */ -extern (C) byte[] _d_arrayappendcT(TypeInfo ti, inout byte[] x, ...) -{ - auto sizeelem = ti.next.tsize(); // array element size - auto info = gc_query(x.ptr); - auto length = x.length; - auto newlength = length + 1; - auto newsize = newlength * sizeelem; - - assert(info.size == 0 || length * sizeelem <= info.size); - - debug(PRINTF) printf("_d_arrayappendcT(sizeelem = %d, ptr = %p, length = %d, cap = %d)\n", sizeelem, x.ptr, x.length, info.size); - - if (info.size <= newsize || info.base != x.ptr) - { byte* newdata; - - if (info.size >= PAGESIZE && info.base == x.ptr) - { // Try to extend in-place - auto u = gc_extend(x.ptr, (newsize + 1) - info.size, (newsize + 1) - info.size); - if (u) - { - goto L1; - } - } - debug(PRINTF) printf("_d_arrayappendcT(length = %d, newlength = %d, cap = %d)\n", length, newlength, info.size); - auto newcap = newCapacity(newlength, sizeelem); - assert(newcap >= newlength * sizeelem); - newdata = cast(byte *)gc_malloc(newcap + 1, info.attr); - memcpy(newdata, x.ptr, length * sizeelem); - (cast(void**)(&x))[1] = newdata; - } - L1: - byte *argp = cast(byte *)(&ti + 2); - - *cast(size_t *)&x = newlength; - x.ptr[length * sizeelem .. newsize] = argp[0 .. sizeelem]; - assert((cast(size_t)x.ptr & 15) == 0); - assert(gc_sizeOf(x.ptr) > x.length * sizeelem); - return x; -} - - -/** - * - */ -extern (C) byte[] _d_arraycatT(TypeInfo ti, byte[] x, byte[] y) -out (result) -{ - auto sizeelem = ti.next.tsize(); // array element size - debug(PRINTF) printf("_d_arraycatT(%d,%p ~ %d,%p sizeelem = %d => %d,%p)\n", x.length, x.ptr, y.length, y.ptr, sizeelem, result.length, result.ptr); - assert(result.length == x.length + y.length); - for (size_t i = 0; i < x.length * sizeelem; i++) - assert((cast(byte*)result)[i] == (cast(byte*)x)[i]); - for (size_t i = 0; i < y.length * sizeelem; i++) - assert((cast(byte*)result)[x.length * sizeelem + i] == (cast(byte*)y)[i]); - - size_t cap = gc_sizeOf(result.ptr); - assert(!cap || cap > result.length * sizeelem); -} -body -{ - version (none) - { - /* Cannot use this optimization because: - * char[] a, b; - * char c = 'a'; - * b = a ~ c; - * c = 'b'; - * will change the contents of b. - */ - if (!y.length) - return x; - if (!x.length) - return y; - } - - debug(PRINTF) printf("_d_arraycatT(%d,%p ~ %d,%p)\n", x.length, x.ptr, y.length, y.ptr); - auto sizeelem = ti.next.tsize(); // array element size - debug(PRINTF) printf("_d_arraycatT(%d,%p ~ %d,%p sizeelem = %d)\n", x.length, x.ptr, y.length, y.ptr, sizeelem); - size_t xlen = x.length * sizeelem; - size_t ylen = y.length * sizeelem; - size_t len = xlen + ylen; - - if (!len) - return null; - - byte* p = cast(byte*)gc_malloc(len + 1, !(ti.next.flags() & 1) ? BlkAttr.NO_SCAN : 0); - memcpy(p, x.ptr, xlen); - memcpy(p + xlen, y.ptr, ylen); - p[len] = 0; - return p[0 .. x.length + y.length]; -} - - -/** - * - */ -extern (C) byte[] _d_arraycatnT(TypeInfo ti, uint n, ...) -{ void* a; - size_t length; - byte[]* p; - uint i; - byte[] b; - auto size = ti.next.tsize(); // array element size - - p = cast(byte[]*)(&n + 1); - - for (i = 0; i < n; i++) - { - b = *p++; - length += b.length; - } - if (!length) - return null; - - a = gc_malloc(length * size, !(ti.next.flags() & 1) ? BlkAttr.NO_SCAN : 0); - p = cast(byte[]*)(&n + 1); - - uint j = 0; - for (i = 0; i < n; i++) - { - b = *p++; - if (b.length) - { - memcpy(a + j, b.ptr, b.length * size); - j += b.length * size; - } - } - - byte[] result; - *cast(int *)&result = length; // jam length - (cast(void **)&result)[1] = a; // jam ptr - return result; -} - - -/** - * - */ -extern (C) void* _d_arrayliteralT(TypeInfo ti, size_t length, ...) -{ - auto sizeelem = ti.next.tsize(); // array element size - void* result; - - debug(PRINTF) printf("_d_arrayliteralT(sizeelem = %d, length = %d)\n", sizeelem, length); - if (length == 0 || sizeelem == 0) - result = null; - else - { - result = gc_malloc(length * sizeelem, !(ti.next.flags() & 1) ? BlkAttr.NO_SCAN : 0); - - va_list q; - va_start!(size_t)(q, length); - - size_t stacksize = (sizeelem + int.sizeof - 1) & ~(int.sizeof - 1); - - if (stacksize == sizeelem) - { - memcpy(result, q, length * sizeelem); - } - else - { - for (size_t i = 0; i < length; i++) - { - memcpy(result + i * sizeelem, q, sizeelem); - q += stacksize; - } - } - - va_end(q); - } - return result; -} - -+/ - - -/** - * Support for array.dup property. - * The actual type is painted on the return value by the frontend - * Given length is number of elements - * Returned length is number of elements - */ - - -/** - * - */ -extern (C) void[] _adDupT(TypeInfo ti, void[] a) -out (result) -{ - auto sizeelem = ti.next.tsize(); // array element size - assert(memcmp(result.ptr, a.ptr, a.length * sizeelem) == 0); -} -body -{ - void* ptr; - - if (a.length) - { - auto sizeelem = ti.next.tsize(); // array element size - auto size = a.length * sizeelem; - ptr = gc_malloc(size, !(ti.next.flags() & 1) ? BlkAttr.NO_SCAN : 0); - memcpy(ptr, a.ptr, size); - } - return ptr[0 .. a.length]; -} - - -unittest -{ - int[] a; - int[] b; - int i; - - a = new int[3]; - a[0] = 1; a[1] = 2; a[2] = 3; - b = a.dup; - assert(b.length == 3); - for (i = 0; i < 3; i++) - assert(b[i] == i + 1); -} diff --git a/runtime/internal/mars.h b/runtime/internal/mars.h deleted file mode 100644 index cca67710..00000000 --- a/runtime/internal/mars.h +++ /dev/null @@ -1,105 +0,0 @@ - -/* - * Placed into the Public Domain - * written by Walter Bright, Digital Mars - * www.digitalmars.com - */ - -/* - * Modified by Sean Kelly for use with Tango. - */ - -#include - -#if __cplusplus -extern "C" { -#endif - -struct ClassInfo; -struct Vtbl; - -typedef struct Vtbl -{ - size_t len; - void **vptr; -} Vtbl; - -typedef struct Interface -{ - struct ClassInfo *classinfo; - struct Vtbl vtbl; - int offset; -} Interface; - -typedef struct Object -{ - void **vptr; - void *monitor; -} Object; - -typedef struct ClassInfo -{ - Object object; - - size_t initlen; - void *init; - - size_t namelen; - char *name; - - Vtbl vtbl; - - size_t interfacelen; - Interface *interfaces; - - struct ClassInfo *baseClass; - - void *destructor; - void *invariant; - - int flags; -} ClassInfo; - -typedef struct Exception -{ - Object object; - - size_t msglen; - char* msg; - - size_t filelen; - char* file; - - size_t line; - - struct Interface *info; - struct Exception *next; -} Exception; - -typedef struct Array -{ - size_t length; - void *ptr; -} Array; - -typedef struct Delegate -{ - void *thisptr; - void (*funcptr)(); -} Delegate; - -void _d_monitorenter(Object *h); -void _d_monitorexit(Object *h); - -int _d_isbaseof(ClassInfo *b, ClassInfo *c); -Object *_d_dynamic_cast(Object *o, ClassInfo *ci); - -Object * _d_allocclass(ClassInfo *ci); -void _d_delclass(Object **p); - -void _d_OutOfMemory(); - -#if __cplusplus -} -#endif - diff --git a/runtime/internal/memory.d b/runtime/internal/memory.d deleted file mode 100644 index b807bf69..00000000 --- a/runtime/internal/memory.d +++ /dev/null @@ -1,635 +0,0 @@ -/** - * This module exposes functionality for inspecting and manipulating memory. - * - * Copyright: Copyright (C) 2005-2006 Digital Mars, www.digitalmars.com. - * All rights reserved. - * License: - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, in both source and binary form, subject to the following - * restrictions: - * - * o The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * o Altered source versions must be plainly marked as such, and must not - * be misrepresented as being the original software. - * o This notice may not be removed or altered from any source - * distribution. - * Authors: Walter Bright, Sean Kelly - */ -module memory; - -version = GC_Use_Dynamic_Ranges; - -version(darwin) -{ - version = GC_Use_Data_Dyld; - version = GC_Use_Dynamic_Ranges; -} -else version(Posix) -{ - version = GC_Use_Data_Proc_Maps; -} -else version(solaris) -{ - version = GC_Use_Data_Proc_Maps; -} - -version(GC_Use_Data_Proc_Maps) -{ - version(Posix) {} else { - static assert(false, "Proc Maps only supported on Posix systems"); - } - private import tango.stdc.posix.unistd; - private import tango.stdc.posix.fcntl; - private import tango.stdc.string; - - version = GC_Use_Dynamic_Ranges; -} - -private -{ - version( linux ) - { - //version = SimpleLibcStackEnd; - - version( SimpleLibcStackEnd ) - { - extern (C) extern void* __libc_stack_end; - } - else - { - import tango.stdc.posix.dlfcn; - } - } - pragma(intrinsic, "llvm.frameaddress") - { - void* llvm_frameaddress(uint level=0); - } -} - - -/** - * - */ - -version( solaris ) { - version(X86_64) { - extern (C) void* _userlimit; - } -} - -extern (C) void* rt_stackBottom() -{ - version( Win32 ) - { - void* bottom; - asm - { - mov EAX, FS:4; - mov bottom, EAX; - } - return bottom; - } - else version( linux ) - { - version( SimpleLibcStackEnd ) - { - return __libc_stack_end; - } - else - { - // See discussion: http://autopackage.org/forums/viewtopic.php?t=22 - static void** libc_stack_end; - - if( libc_stack_end == libc_stack_end.init ) - { - void* handle = dlopen( null, RTLD_NOW ); - libc_stack_end = cast(void**) dlsym( handle, "__libc_stack_end" ); - dlclose( handle ); - } - return *libc_stack_end; - } - } - else version( darwin ) - { - // darwin has a fixed stack bottom - version(X86_64) - return cast(void*) 0x7fff5fc00000; - else - return cast(void*) 0xc0000000; - } - else version( solaris ) - { - version(X86_64) { - return _userlimit; - } - else { - // - return cast(void*) 0x8048000; - } - } - else - { - static assert( false, "Operating system not supported." ); - } -} - - -/** - * - */ -extern (C) void* rt_stackTop() -{ - version( D_InlineAsm_X86 ) - { - asm - { - naked; - mov EAX, ESP; - ret; - } - } - else - { - return llvm_frameaddress(); - } -} - - -private -{ - version( Win32 ) - { - extern (C) - { - extern int _data_start__; - extern int _bss_end__; - } - - alias _data_start__ Data_Start; - alias _bss_end__ Data_End; - } - else version( linux ) - { - extern (C) - { - extern int _data; - extern int __data_start; - extern int _end; - extern int _data_start__; - extern int _data_end__; - extern int _bss_start__; - extern int _bss_end__; - extern int __fini_array_end; - } - - alias __data_start Data_Start; - alias _end Data_End; - } - else version( solaris ) - { - extern(C) - { - extern int _environ; - extern int _end; - } - - alias _environ Data_Start; - alias _end Data_End; - } - - version( GC_Use_Dynamic_Ranges ) - { - private import tango.stdc.stdlib; - - struct DataSeg - { - void* beg; - void* end; - } - - DataSeg* allSegs = null; - size_t numSegs = 0; - - extern (C) void _d_gc_add_range( void* beg, void* end ) - { - void* ptr = realloc( allSegs, (numSegs + 1) * DataSeg.sizeof ); - - if( ptr ) // if realloc fails, we have problems - { - allSegs = cast(DataSeg*) ptr; - allSegs[numSegs].beg = beg; - allSegs[numSegs].end = end; - numSegs++; - } - } - - extern (C) void _d_gc_remove_range( void* beg ) - { - for( size_t pos = 0; pos < numSegs; ++pos ) - { - if( beg == allSegs[pos].beg ) - { - while( ++pos < numSegs ) - { - allSegs[pos-1] = allSegs[pos]; - } - numSegs--; - return; - } - } - } - } - - alias void delegate( void*, void* ) scanFn; - - void* dataStart, dataEnd; -} - - -/** - * - */ -extern (C) void rt_scanStaticData( scanFn scan ) -{ - scan( dataStart, dataEnd ); - - version( GC_Use_Dynamic_Ranges ) - { - for( size_t pos = 0; pos < numSegs; ++pos ) - { - scan( allSegs[pos].beg, allSegs[pos].end ); - } - } -} - -void initStaticDataPtrs() -{ - const int S = (void*).sizeof; - - // Can't assume the input addresses are word-aligned - static void* adjust_up( void* p ) - { - return p + ((S - (cast(size_t)p & (S-1))) & (S-1)); // cast ok even if 64-bit - } - - static void * adjust_down( void* p ) - { - return p - (cast(size_t) p & (S-1)); - } - - version( Win32 ) - { - dataStart = adjust_up( &Data_Start ); - dataEnd = adjust_down( &Data_End ); - } - else version(linux) - { - dataStart = adjust_up( &Data_Start ); - dataEnd = adjust_down( &Data_End ); - } - else version(solaris) - { - dataStart = adjust_up( &Data_Start ); - dataEnd = adjust_down( &Data_End ); - } - else version(GC_Use_Data_Dyld) - { - _d_dyld_start(); - } - else - { - static assert( false, "Operating system not supported." ); - } - - version( GC_Use_Data_Proc_Maps ) - { - parseDataProcMaps(); - } -} - -version( GC_Use_Data_Proc_Maps ) -{ -version(solaris) -{ - typedef long offset_t; - enum : uint { PRMAPSZ = 64, MA_WRITE = 0x02 } - extern(C) - { - struct prmap { - uintptr_t pr_vaddr; /* virtual address of mapping */ - size_t pr_size; /* size of mapping in bytes */ - char[PRMAPSZ] pr_mapname; /* name in /proc//object */ - private offset_t pr_offset; /* offset into mapped object, if any */ - int pr_mflags; /* protection and attribute flags (see below) */ - int pr_pagesize; /* pagesize (bytes) for this mapping */ - int pr_shmid; /* SysV shmid, -1 if not SysV shared memory */ - - private int[1] pr_filler; - } - } - - debug (ProcMaps) extern (C) int printf(char*, ...); - - void parseDataProcMaps() - { - debug (ProcMaps) printf("initStaticDataPtrs()\n"); - // http://docs.sun.com/app/docs/doc/816-5174/proc-4 - prmap pr; - - int fd = open("/proc/self/map", O_RDONLY); - scope (exit) close(fd); - - while (prmap.sizeof == read(fd, &pr, prmap.sizeof)) - if (pr.pr_mflags & MA_WRITE) - { - void* start = cast(void*) pr.pr_vaddr; - void* end = cast(void*)(pr.pr_vaddr + pr.pr_size); - debug (ProcMaps) printf(" vmem at %p - %p with size %d bytes\n", start, end, pr.pr_size); - - // Exclude stack and dataStart..dataEnd - if ( ( !dataEnd || - !( dataStart >= start && dataEnd <= end ) ) && - !( &pr >= start && &pr < end ) ) - { - // we already have static data from this region. anything else - // is heap (%% check) - debug (ProcMaps) printf(" Adding map range %p - %p\n", start, end); - _d_gc_add_range(start, end); - } - } - } -} -else -{ - const int S = (void*).sizeof; - - // TODO: This could use cleanup! - void parseDataProcMaps() - { - // TODO: Exclude zero-mapped regions - - int fd = open("/proc/self/maps", O_RDONLY); - ptrdiff_t count; // %% need to configure ret for read.. - char buf[2024]; - char* p; - char* e; - char* s; - void* start; - void* end; - - p = buf.ptr; - if (fd != -1) - { - while ( (count = read(fd, p, buf.sizeof - (p - buf.ptr))) > 0 ) - { - e = p + count; - p = buf.ptr; - while (true) - { - s = p; - while (p < e && *p != '\n') - p++; - if (p < e) - { - // parse the entry in [s, p) - static if( S == 4 ) - { - enum Ofs - { - Write_Prot = 19, - Start_Addr = 0, - End_Addr = 9, - Addr_Len = 8, - } - } - else static if( S == 8 ) - { - //X86-64 only has 12 bytes address space(in PAE mode) - not 16 - //We also need the 32 bit offsets for 32 bit apps - version(X86_64) { - enum Ofs - { - Write_Prot = 27, - Start_Addr = 0, - End_Addr = 13, - Addr_Len = 12, - Write_Prot_32 = 19, - Start_Addr_32 = 0, - End_Addr_32 = 9, - Addr_Len_32 = 8, - } - } - else - { - enum Ofs - { - Write_Prot = 35, - Start_Addr = 0, - End_Addr = 9, - Addr_Len = 17, - } - } - } - else - { - static assert( false ); - } - - // %% this is wrong for 64-bit: - // long strtoul(const char*,char**,int); - // but seems to work on x86-64: - // probably because C's long is 64 bit there - - if( s[Ofs.Write_Prot] == 'w' ) - { - s[Ofs.Start_Addr + Ofs.Addr_Len] = '\0'; - s[Ofs.End_Addr + Ofs.Addr_Len] = '\0'; - start = cast(void*) strtoul(s + Ofs.Start_Addr, null, 16); - end = cast(void*) strtoul(s + Ofs.End_Addr, null, 16); - - // 1. Exclude anything overlapping [dataStart, dataEnd) - // 2. Exclude stack - if ( ( !dataEnd || - !( dataStart >= start && dataEnd <= end ) ) && - !( &buf[0] >= start && &buf[0] < end ) ) - { - // we already have static data from this region. anything else - // is heap (%% check) - debug (ProcMaps) printf("Adding map range %p 0%p\n", start, end); - _d_gc_add_range(start, end); - } - } - version(X86_64) - { - //We need to check here for 32 bit apps like ldc produces - //and add them to the gc scan range - if( s[Ofs.Write_Prot_32] == 'w' ) - { - s[Ofs.Start_Addr_32 + Ofs.Addr_Len_32] = '\0'; - s[Ofs.End_Addr_32 + Ofs.Addr_Len_32] = '\0'; - start = cast(void*) strtoul(s + Ofs.Start_Addr_32, null, 16); - end = cast(void*) strtoul(s + Ofs.End_Addr_32, null, 16); - if ( ( !dataEnd || - !( dataStart >= start && dataEnd <= end ) ) && - !( &buf[0] >= start && &buf[0] < end ) ) - { - _d_gc_add_range(start, end); - } - } - } - - p++; - } - else - { - count = p - s; - memmove(buf.ptr, s, cast(size_t)count); - p = buf.ptr + count; - break; - } - } - } - close(fd); - } - } -} -} - -/* - * GDC dyld memory module: - * http://www.dsource.org/projects/tango/browser/trunk/lib/compiler/gdc/memory_dyld.c - * Port to the D programming language: Jacob Carlborg - */ -version (GC_Use_Data_Dyld) -{ - private - { - const char* SEG_DATA = "__DATA".ptr; - const char* SECT_DATA = "__data".ptr; - const char* SECT_BSS = "__bss".ptr; - const char* SECT_COMMON = "__common".ptr; - - struct SegmentSection - { - const char* segment; - const char* section; - } - - struct mach_header - { - uint magic; - int cputype; - int cpusubtype; - uint filetype; - uint ncmds; - uint sizeofcmds; - uint flags; - version(X86_64) - uint reserved; - } - - struct section - { - char[16] sectname; - char[16] segname; - version(X86_64) - { - ulong addr; - ulong size; - } - else - { - uint addr; - uint size; - } - uint offset; - uint align_; - uint reloff; - uint nreloc; - uint flags; - uint reserved1; - uint reserved2; - version(X86_64) - uint reserved3; - } - - alias extern (C) void function (mach_header* mh, ptrdiff_t vmaddr_slide) DyldFuncPointer; - - version(X86_64) - extern (C) /*const*/ section* getsectbynamefromheader_64(/*const*/ mach_header* mhp, /*const*/ char* segname, /*const*/ char* sectname); - else - extern (C) /*const*/ section* getsectbynamefromheader(/*const*/ mach_header* mhp, /*const*/ char* segname, /*const*/ char* sectname); - extern (C) void _dyld_register_func_for_add_image(DyldFuncPointer func); - extern (C) void _dyld_register_func_for_remove_image(DyldFuncPointer func); - - const SegmentSection[3] GC_dyld_sections = [SegmentSection(SEG_DATA, SECT_DATA), SegmentSection(SEG_DATA, SECT_BSS), SegmentSection(SEG_DATA, SECT_COMMON)]; - - extern (C) void on_dyld_add_image (/*const*/ mach_header* hdr, ptrdiff_t slide) - { - void* start; - void* end; - /*const*/ section* sec; - - foreach (s ; GC_dyld_sections) - { - version(X86_64) - sec = getsectbynamefromheader_64(hdr, s.segment, s.section); - else - sec = getsectbynamefromheader(hdr, s.segment, s.section); - - if (sec == null || sec.size == 0) - continue; - - start = cast(void*) (sec.addr + slide); - end = cast(void*) (start + sec.size); - - _d_gc_add_range(start, end); - } - } - - extern (C) void on_dyld_remove_image (/*const*/ mach_header* hdr, ptrdiff_t slide) - { - void* start; - void* end; - /*const*/ section* sec; - - foreach (s ; GC_dyld_sections) - { - version(X86_64) - sec = getsectbynamefromheader_64(hdr, s.segment, s.section); - else - sec = getsectbynamefromheader(hdr, s.segment, s.section); - - if (sec == null || sec.size == 0) - continue; - - start = cast(void*) (sec.addr + slide); - end = cast(void*) (start + sec.size); - - _d_gc_remove_range(start); - } - } - - void _d_dyld_start () - { - static bool started; - - if (!started) - { - started = true; - - _dyld_register_func_for_add_image(&on_dyld_add_image); - _dyld_register_func_for_remove_image(&on_dyld_remove_image); - } - } - } -} - diff --git a/runtime/internal/monitor.c b/runtime/internal/monitor.c deleted file mode 100644 index b36948b7..00000000 --- a/runtime/internal/monitor.c +++ /dev/null @@ -1,212 +0,0 @@ -// D programming language runtime library -// Public Domain -// written by Walter Bright, Digital Mars -// www.digitalmars.com - -// This is written in C because nobody has written a pthreads interface -// to D yet. - - -#include -#include -#include - -#if _WIN32 -#elif linux || __APPLE__ || (defined (__SVR4) && defined (__sun)) -#define USE_PTHREADS 1 -#else -#endif - -#if _WIN32 -#include -#endif - -#if USE_PTHREADS -#include -#endif - -#include "mars.h" - -// This is what the monitor reference in Object points to -typedef struct Monitor -{ - void* impl; // for user-level monitors - Array devt; // for internal monitors - -#if _WIN32 - CRITICAL_SECTION mon; -#endif - -#if USE_PTHREADS - pthread_mutex_t mon; -#endif -} Monitor; - -#define MONPTR(h) (&((Monitor *)(h)->monitor)->mon) - -static volatile int inited; - -/* =============================== Win32 ============================ */ - -#if _WIN32 - -static CRITICAL_SECTION _monitor_critsec; - -void _STI_monitor_staticctor() -{ - if (!inited) - { InitializeCriticalSection(&_monitor_critsec); - inited = 1; - } -} - -void _STD_monitor_staticdtor() -{ - if (inited) - { inited = 0; - DeleteCriticalSection(&_monitor_critsec); - } -} - -void _d_monitor_create(Object *h) -{ - /* - * NOTE: Assume this is only called when h->monitor is null prior to the - * call. However, please note that another thread may call this function - * at the same time, so we can not assert this here. Instead, try and - * create a lock, and if one already exists then forget about it. - */ - - //printf("+_d_monitor_create(%p)\n", h); - assert(h); - Monitor *cs = NULL; - EnterCriticalSection(&_monitor_critsec); - if (!h->monitor) - { - cs = (Monitor *)calloc(sizeof(Monitor), 1); - assert(cs); - InitializeCriticalSection(&cs->mon); - h->monitor = (void *)cs; - cs = NULL; - } - LeaveCriticalSection(&_monitor_critsec); - if (cs) - free(cs); - //printf("-_d_monitor_create(%p)\n", h); -} - -void _d_monitor_destroy(Object *h) -{ - //printf("+_d_monitor_destroy(%p)\n", h); - assert(h && h->monitor && !(((Monitor*)h->monitor)->impl)); - DeleteCriticalSection(MONPTR(h)); - free((void *)h->monitor); - h->monitor = NULL; - //printf("-_d_monitor_destroy(%p)\n", h); -} - -int _d_monitor_lock(Object *h) -{ - //printf("+_d_monitor_acquire(%p)\n", h); - assert(h && h->monitor && !(((Monitor*)h->monitor)->impl)); - EnterCriticalSection(MONPTR(h)); - //printf("-_d_monitor_acquire(%p)\n", h); -} - -void _d_monitor_unlock(Object *h) -{ - //printf("+_d_monitor_release(%p)\n", h); - assert(h && h->monitor && !(((Monitor*)h->monitor)->impl)); - LeaveCriticalSection(MONPTR(h)); - //printf("-_d_monitor_release(%p)\n", h); -} - -#endif - -/* =============================== linux ============================ */ - -#if USE_PTHREADS - -#if !linux -#define PTHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE -#endif - -// Includes attribute fixes from David Friedman's GDC port - -static pthread_mutex_t _monitor_critsec; -static pthread_mutexattr_t _monitors_attr; - -void _STI_monitor_staticctor() -{ - if (!inited) - { - pthread_mutexattr_init(&_monitors_attr); - pthread_mutexattr_settype(&_monitors_attr, PTHREAD_MUTEX_RECURSIVE_NP); - pthread_mutex_init(&_monitor_critsec, 0); - inited = 1; - } -} - -void _STD_monitor_staticdtor() -{ - if (inited) - { inited = 0; - pthread_mutex_destroy(&_monitor_critsec); - pthread_mutexattr_destroy(&_monitors_attr); - } -} - -void _d_monitor_create(Object *h) -{ - /* - * NOTE: Assume this is only called when h->monitor is null prior to the - * call. However, please note that another thread may call this function - * at the same time, so we can not assert this here. Instead, try and - * create a lock, and if one already exists then forget about it. - */ - - //printf("+_d_monitor_create(%p)\n", h); - assert(h); - Monitor *cs = NULL; - pthread_mutex_lock(&_monitor_critsec); - if (!h->monitor) - { - cs = (Monitor *)calloc(sizeof(Monitor), 1); - assert(cs); - pthread_mutex_init(&cs->mon, & _monitors_attr); - h->monitor = (void *)cs; - cs = NULL; - } - pthread_mutex_unlock(&_monitor_critsec); - if (cs) - free(cs); - //printf("-_d_monitor_create(%p)\n", h); -} - -void _d_monitor_destroy(Object *h) -{ - //printf("+_d_monitor_destroy(%p)\n", h); - assert(h && h->monitor && !(((Monitor*)h->monitor)->impl)); - pthread_mutex_destroy(MONPTR(h)); - free((void *)h->monitor); - h->monitor = NULL; - //printf("-_d_monitor_destroy(%p)\n", h); -} - -int _d_monitor_lock(Object *h) -{ - //printf("+_d_monitor_acquire(%p)\n", h); - assert(h && h->monitor && !(((Monitor*)h->monitor)->impl)); - pthread_mutex_lock(MONPTR(h)); - //printf("-_d_monitor_acquire(%p)\n", h); -} - -void _d_monitor_unlock(Object *h) -{ - //printf("+_d_monitor_release(%p)\n", h); - assert(h && h->monitor && !(((Monitor*)h->monitor)->impl)); - pthread_mutex_unlock(MONPTR(h)); - //printf("-_d_monitor_release(%p)\n", h); -} - -#endif diff --git a/runtime/internal/qsort2.d b/runtime/internal/qsort2.d deleted file mode 100644 index 9b794318..00000000 --- a/runtime/internal/qsort2.d +++ /dev/null @@ -1,64 +0,0 @@ - -/* - * Placed into Public Domain - * written by Walter Bright - * www.digitalmars.com - * - * This is a public domain version of qsort.d. - * All it does is call C's qsort(), but runs a little slower since - * it needs to synchronize a global variable. - */ - -/* - * Modified by Sean Kelly for use with Tango. - */ - -//debug=qsort; - -private import tango.stdc.stdlib; - -private TypeInfo tiglobal; - -extern (C) int cmp(void* p1, void* p2) -{ - return tiglobal.compare(p1, p2); -} - -extern (C) void[] _adSort(void[] a, TypeInfo ti) -{ - synchronized - { - tiglobal = ti; - tango.stdc.stdlib.qsort(a.ptr, a.length, cast(size_t)ti.tsize(), &cmp); - } - return a; -} - - - -unittest -{ - debug(qsort) printf("array.sort.unittest()\n"); - - int a[] = new int[10]; - - a[0] = 23; - a[1] = 1; - a[2] = 64; - a[3] = 5; - a[4] = 6; - a[5] = 5; - a[6] = 17; - a[7] = 3; - a[8] = 0; - a[9] = -1; - - a.sort; - - for (int i = 0; i < a.length - 1; i++) - { - //printf("i = %d", i); - //printf(" %d %d\n", a[i], a[i + 1]); - assert(a[i] <= a[i + 1]); - } -} diff --git a/runtime/internal/switch.d b/runtime/internal/switch.d deleted file mode 100644 index eea280e4..00000000 --- a/runtime/internal/switch.d +++ /dev/null @@ -1,425 +0,0 @@ -/* - * Copyright (C) 2004-2007 by Digital Mars, www.digitalmars.com - * Written by Walter Bright - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, in both source and binary form, subject to the following - * restrictions: - * - * o The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * o Altered source versions must be plainly marked as such, and must not - * be misrepresented as being the original software. - * o This notice may not be removed or altered from any source - * distribution. - */ - -/* - * Modified by Sean Kelly for use with Tango. - */ - -private import tango.stdc.string; -//private import tango.stdc.stdio; - -/****************************************************** - * Support for switch statements switching on strings. - * Input: - * table[] sorted array of strings generated by compiler - * ca string to look up in table - * Output: - * result index of match in table[] - * -1 if not in table - */ - -extern (C): - -int _d_switch_string(char[][] table, char[] ca) -in -{ - //printf("in _d_switch_string()\n"); - assert(table.length >= 0); - assert(ca.length >= 0); - - // Make sure table[] is sorted correctly - int j; - - for (j = 1; j < table.length; j++) - { - size_t len1 = table[j - 1].length; - size_t len2 = table[j].length; - - assert(len1 <= len2); - if (len1 == len2) - { - int ci; - - ci = memcmp(table[j - 1].ptr, table[j].ptr, len1); - assert(ci < 0); // ci==0 means a duplicate - } - } -} -out (result) -{ - int i; - int cj; - - //printf("out _d_switch_string()\n"); - if (result == -1) - { - // Not found - for (i = 0; i < table.length; i++) - { - if (table[i].length == ca.length) - { cj = memcmp(table[i].ptr, ca.ptr, ca.length); - assert(cj != 0); - } - } - } - else - { - assert(0 <= result && result < table.length); - for (i = 0; 1; i++) - { - assert(i < table.length); - if (table[i].length == ca.length) - { - cj = memcmp(table[i].ptr, ca.ptr, ca.length); - if (cj == 0) - { - assert(i == result); - break; - } - } - } - } -} -body -{ - //printf("body _d_switch_string(%.*s)\n", ca.length, ca.ptr); - size_t low; - size_t high; - size_t mid; - ptrdiff_t c; - char[] pca; - - low = 0; - high = table.length; - - version (none) - { - // Print table - printf("ca[] = '%s'\n", cast(char *)ca); - for (mid = 0; mid < high; mid++) - { - pca = table[mid]; - printf("table[%d] = %d, '%.*s'\n", mid, pca.length, pca); - } - } - if (high && - ca.length >= table[0].length && - ca.length <= table[high - 1].length) - { - // Looking for 0 length string, which would only be at the beginning - if (ca.length == 0) - return 0; - - char c1 = ca[0]; - - // Do binary search - while (low < high) - { - mid = (low + high) >> 1; - pca = table[mid]; - c = cast(ptrdiff_t)(ca.length - pca.length); - if (c == 0) - { - c = cast(ubyte)c1 - cast(ubyte)pca[0]; - if (c == 0) - { - c = memcmp(ca.ptr, pca.ptr, ca.length); - if (c == 0) - { //printf("found %d\n", mid); - return cast(int)mid; - } - } - } - if (c < 0) - { - high = mid; - } - else - { - low = mid + 1; - } - } - } - - //printf("not found\n"); - return -1; // not found -} - -unittest -{ - switch (cast(char []) "c") - { - case "coo": - default: - break; - } -} - -/********************************** - * Same thing, but for wide chars. - */ - -int _d_switch_ustring(wchar[][] table, wchar[] ca) -in -{ - //printf("in _d_switch_ustring()\n"); - assert(table.length >= 0); - assert(ca.length >= 0); - - // Make sure table[] is sorted correctly - int j; - - for (j = 1; j < table.length; j++) - { - size_t len1 = table[j - 1].length; - size_t len2 = table[j].length; - - assert(len1 <= len2); - if (len1 == len2) - { - int c; - - c = memcmp(table[j - 1].ptr, table[j].ptr, len1 * wchar.sizeof); - assert(c < 0); // c==0 means a duplicate - } - } -} -out (result) -{ - int i; - int c; - - //printf("out _d_switch_string()\n"); - if (result == -1) - { - // Not found - for (i = 0; i < table.length; i++) - { - if (table[i].length == ca.length) - { c = memcmp(table[i].ptr, ca.ptr, ca.length * wchar.sizeof); - assert(c != 0); - } - } - } - else - { - assert(0 <= result && result < table.length); - for (i = 0; 1; i++) - { - assert(i < table.length); - if (table[i].length == ca.length) - { - c = memcmp(table[i].ptr, ca.ptr, ca.length * wchar.sizeof); - if (c == 0) - { - assert(i == result); - break; - } - } - } - } -} -body -{ - //printf("body _d_switch_ustring()\n"); - size_t low; - size_t high; - size_t mid; - ptrdiff_t c; - wchar[] pca; - - low = 0; - high = table.length; - -/* - // Print table - wprintf("ca[] = '%.*s'\n", ca); - for (mid = 0; mid < high; mid++) - { - pca = table[mid]; - wprintf("table[%d] = %d, '%.*s'\n", mid, pca.length, pca); - } -*/ - - // Do binary search - while (low < high) - { - mid = (low + high) >> 1; - pca = table[mid]; - c = cast(ptrdiff_t)(ca.length - pca.length); - if (c == 0) - { - c = memcmp(ca.ptr, pca.ptr, ca.length * wchar.sizeof); - if (c == 0) - { //printf("found %d\n", mid); - return cast(int)mid; - } - } - if (c < 0) - { - high = mid; - } - else - { - low = mid + 1; - } - } - //printf("not found\n"); - return -1; // not found -} - - -unittest -{ - switch (cast(wchar []) "c") - { - case "coo": - default: - break; - } -} - - -/********************************** - * Same thing, but for wide chars. - */ - -int _d_switch_dstring(dchar[][] table, dchar[] ca) -in -{ - //printf("in _d_switch_dstring()\n"); - assert(table.length >= 0); - assert(ca.length >= 0); - - // Make sure table[] is sorted correctly - int j; - - for (j = 1; j < table.length; j++) - { - size_t len1 = table[j - 1].length; - size_t len2 = table[j].length; - - assert(len1 <= len2); - if (len1 == len2) - { - int c; - - c = memcmp(table[j - 1].ptr, table[j].ptr, len1 * dchar.sizeof); - assert(c < 0); // c==0 means a duplicate - } - } -} -out (result) -{ - int i; - int c; - - //printf("out _d_switch_string()\n"); - if (result == -1) - { - // Not found - for (i = 0; i < table.length; i++) - { - if (table[i].length == ca.length) - { c = memcmp(table[i].ptr, ca.ptr, ca.length * dchar.sizeof); - assert(c != 0); - } - } - } - else - { - assert(0 <= result && result < table.length); - for (i = 0; 1; i++) - { - assert(i < table.length); - if (table[i].length == ca.length) - { - c = memcmp(table[i].ptr, ca.ptr, ca.length * dchar.sizeof); - if (c == 0) - { - assert(i == result); - break; - } - } - } - } -} -body -{ - //printf("body _d_switch_ustring()\n"); - size_t low; - size_t high; - size_t mid; - ptrdiff_t c; - dchar[] pca; - - low = 0; - high = table.length; - -/* - // Print table - wprintf("ca[] = '%.*s'\n", ca); - for (mid = 0; mid < high; mid++) - { - pca = table[mid]; - wprintf("table[%d] = %d, '%.*s'\n", mid, pca.length, pca); - } -*/ - - // Do binary search - while (low < high) - { - mid = (low + high) >> 1; - pca = table[mid]; - c = cast(ptrdiff_t)(ca.length - pca.length); - if (c == 0) - { - c = memcmp(ca.ptr, pca.ptr, ca.length * dchar.sizeof); - if (c == 0) - { //printf("found %d\n", mid); - return cast(int)mid; - } - } - if (c < 0) - { - high = mid; - } - else - { - low = mid + 1; - } - } - //printf("not found\n"); - return -1; // not found -} - - -unittest -{ - switch (cast(dchar []) "c") - { - case "coo": - default: - break; - } -} diff --git a/runtime/internal/typeinfo/ti_AC.d b/runtime/internal/typeinfo/ti_AC.d deleted file mode 100644 index f65acb5e..00000000 --- a/runtime/internal/typeinfo/ti_AC.d +++ /dev/null @@ -1,95 +0,0 @@ -module typeinfo.ti_AC; - -// Object[] - -class TypeInfo_AC : TypeInfo_Array -{ - hash_t getHash(void *p) - { Object[] s = *cast(Object[]*)p; - hash_t hash = 0; - - foreach (Object o; s) - { - if (o) - hash += o.toHash(); - } - return hash; - } - - int equals(void *p1, void *p2) - { - Object[] s1 = *cast(Object[]*)p1; - Object[] s2 = *cast(Object[]*)p2; - - if (s1.length == s2.length) - { - for (size_t u = 0; u < s1.length; u++) - { Object o1 = s1[u]; - Object o2 = s2[u]; - - // Do not pass null's to Object.opEquals() - if (o1 is o2 || - (!(o1 is null) && !(o2 is null) && o1.opEquals(o2))) - continue; - return 0; - } - return 1; - } - return 0; - } - - int compare(void *p1, void *p2) - { - Object[] s1 = *cast(Object[]*)p1; - Object[] s2 = *cast(Object[]*)p2; - ptrdiff_t c; - - c = cast(ptrdiff_t)s1.length - cast(ptrdiff_t)s2.length; - if (c == 0) - { - for (size_t u = 0; u < s1.length; u++) - { Object o1 = s1[u]; - Object o2 = s2[u]; - - if (o1 is o2) - continue; - - // Regard null references as always being "less than" - if (o1) - { - if (!o2) - { c = 1; - break; - } - c = o1.opCmp(o2); - if (c) - break; - } - else - { c = -1; - break; - } - } - } - if (c < 0) - c = -1; - else - c = 1; - return cast(int)c; - } - - size_t tsize() - { - return (Object[]).sizeof; - } - - uint flags() - { - return 1; - } - - TypeInfo next() - { - return typeid(Object); - } -} diff --git a/runtime/internal/typeinfo/ti_Acdouble.d b/runtime/internal/typeinfo/ti_Acdouble.d deleted file mode 100644 index a61b3678..00000000 --- a/runtime/internal/typeinfo/ti_Acdouble.d +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (C) 2004-2005 by Digital Mars, www.digitalmars.com - * Written by Walter Bright - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, in both source and binary form, subject to the following - * restrictions: - * - * o The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * o Altered source versions must be plainly marked as such, and must not - * be misrepresented as being the original software. - * o This notice may not be removed or altered from any source - * distribution. - */ - -module typeinfo.ti_Acdouble; - -private import typeinfo.ti_cdouble; - -// cdouble[] - -class TypeInfo_Ar : TypeInfo_Array -{ - char[] toString() { return "cdouble[]"; } - - hash_t getHash(void *p) - { cdouble[] s = *cast(cdouble[]*)p; - size_t len = s.length; - cdouble *str = s.ptr; - hash_t hash = 0; - - while (len) - { - hash *= 9; - hash += (cast(uint *)str)[0]; - hash += (cast(uint *)str)[1]; - hash += (cast(uint *)str)[2]; - hash += (cast(uint *)str)[3]; - str++; - len--; - } - - return hash; - } - - int equals(void *p1, void *p2) - { - cdouble[] s1 = *cast(cdouble[]*)p1; - cdouble[] s2 = *cast(cdouble[]*)p2; - size_t len = s1.length; - - if (len != s2.length) - return 0; - for (size_t u = 0; u < len; u++) - { - int c = TypeInfo_r._equals(s1[u], s2[u]); - if (c == 0) - return 0; - } - return 1; - } - - int compare(void *p1, void *p2) - { - cdouble[] s1 = *cast(cdouble[]*)p1; - cdouble[] s2 = *cast(cdouble[]*)p2; - size_t len = s1.length; - - if (s2.length < len) - len = s2.length; - for (size_t u = 0; u < len; u++) - { - int c = TypeInfo_r._compare(s1[u], s2[u]); - if (c) - return c; - } - if (s1.length < s2.length) - return -1; - else if (s1.length > s2.length) - return 1; - return 0; - } - - size_t tsize() - { - return (cdouble[]).sizeof; - } - - uint flags() - { - return 1; - } - - TypeInfo next() - { - return typeid(cdouble); - } -} diff --git a/runtime/internal/typeinfo/ti_Acfloat.d b/runtime/internal/typeinfo/ti_Acfloat.d deleted file mode 100644 index 516431cd..00000000 --- a/runtime/internal/typeinfo/ti_Acfloat.d +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (C) 2004-2005 by Digital Mars, www.digitalmars.com - * Written by Walter Bright - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, in both source and binary form, subject to the following - * restrictions: - * - * o The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * o Altered source versions must be plainly marked as such, and must not - * be misrepresented as being the original software. - * o This notice may not be removed or altered from any source - * distribution. - */ - -module typeinfo.ti_Acfloat; - -private import typeinfo.ti_cfloat; - -// cfloat[] - -class TypeInfo_Aq : TypeInfo_Array -{ - char[] toString() { return "cfloat[]"; } - - hash_t getHash(void *p) - { cfloat[] s = *cast(cfloat[]*)p; - size_t len = s.length; - cfloat *str = s.ptr; - hash_t hash = 0; - - while (len) - { - hash *= 9; - hash += (cast(uint *)str)[0]; - hash += (cast(uint *)str)[1]; - str++; - len--; - } - - return hash; - } - - int equals(void *p1, void *p2) - { - cfloat[] s1 = *cast(cfloat[]*)p1; - cfloat[] s2 = *cast(cfloat[]*)p2; - size_t len = s1.length; - - if (len != s2.length) - return 0; - for (size_t u = 0; u < len; u++) - { - int c = TypeInfo_q._equals(s1[u], s2[u]); - if (c == 0) - return 0; - } - return 1; - } - - int compare(void *p1, void *p2) - { - cfloat[] s1 = *cast(cfloat[]*)p1; - cfloat[] s2 = *cast(cfloat[]*)p2; - size_t len = s1.length; - - if (s2.length < len) - len = s2.length; - for (size_t u = 0; u < len; u++) - { - int c = TypeInfo_q._compare(s1[u], s2[u]); - if (c) - return c; - } - if (s1.length < s2.length) - return -1; - else if (s1.length > s2.length) - return 1; - return 0; - } - - size_t tsize() - { - return (cfloat[]).sizeof; - } - - uint flags() - { - return 1; - } - - TypeInfo next() - { - return typeid(cfloat); - } -} diff --git a/runtime/internal/typeinfo/ti_Acreal.d b/runtime/internal/typeinfo/ti_Acreal.d deleted file mode 100644 index 7f12f726..00000000 --- a/runtime/internal/typeinfo/ti_Acreal.d +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (C) 2004-2005 by Digital Mars, www.digitalmars.com - * Written by Walter Bright - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, in both source and binary form, subject to the following - * restrictions: - * - * o The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * o Altered source versions must be plainly marked as such, and must not - * be misrepresented as being the original software. - * o This notice may not be removed or altered from any source - * distribution. - */ - -module typeinfo.ti_Acreal; - -private import typeinfo.ti_creal; - -// creal[] - -class TypeInfo_Ac : TypeInfo_Array -{ - char[] toString() { return "creal[]"; } - - hash_t getHash(void *p) - { creal[] s = *cast(creal[]*)p; - size_t len = s.length; - creal *str = s.ptr; - hash_t hash = 0; - - while (len) - { - hash *= 9; - hash += (cast(uint *)str)[0]; - hash += (cast(uint *)str)[1]; - hash += (cast(uint *)str)[2]; - hash += (cast(uint *)str)[3]; - hash += (cast(uint *)str)[4]; - str++; - len--; - } - - return hash; - } - - int equals(void *p1, void *p2) - { - creal[] s1 = *cast(creal[]*)p1; - creal[] s2 = *cast(creal[]*)p2; - size_t len = s1.length; - - if (len != s2.length) - return 0; - for (size_t u = 0; u < len; u++) - { - int c = TypeInfo_c._equals(s1[u], s2[u]); - if (c == 0) - return 0; - } - return 1; - } - - int compare(void *p1, void *p2) - { - creal[] s1 = *cast(creal[]*)p1; - creal[] s2 = *cast(creal[]*)p2; - size_t len = s1.length; - - if (s2.length < len) - len = s2.length; - for (size_t u = 0; u < len; u++) - { - int c = TypeInfo_c._compare(s1[u], s2[u]); - if (c) - return c; - } - if (s1.length < s2.length) - return -1; - else if (s1.length > s2.length) - return 1; - return 0; - } - - size_t tsize() - { - return (creal[]).sizeof; - } - - uint flags() - { - return 1; - } - - TypeInfo next() - { - return typeid(creal); - } -} diff --git a/runtime/internal/typeinfo/ti_Adouble.d b/runtime/internal/typeinfo/ti_Adouble.d deleted file mode 100644 index d3a9ea70..00000000 --- a/runtime/internal/typeinfo/ti_Adouble.d +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (C) 2004-2005 by Digital Mars, www.digitalmars.com - * Written by Walter Bright - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, in both source and binary form, subject to the following - * restrictions: - * - * o The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * o Altered source versions must be plainly marked as such, and must not - * be misrepresented as being the original software. - * o This notice may not be removed or altered from any source - * distribution. - */ - -module typeinfo.ti_Adouble; - -private import typeinfo.ti_double; - -// double[] - -class TypeInfo_Ad : TypeInfo_Array -{ - char[] toString() { return "double[]"; } - - hash_t getHash(void *p) - { double[] s = *cast(double[]*)p; - size_t len = s.length; - auto str = s.ptr; - hash_t hash = 0; - - while (len) - { - hash *= 9; - hash += (cast(uint *)str)[0]; - hash += (cast(uint *)str)[1]; - str++; - len--; - } - - return hash; - } - - int equals(void *p1, void *p2) - { - double[] s1 = *cast(double[]*)p1; - double[] s2 = *cast(double[]*)p2; - size_t len = s1.length; - - if (len != s2.length) - return 0; - for (size_t u = 0; u < len; u++) - { - int c = TypeInfo_d._equals(s1[u], s2[u]); - if (c == 0) - return 0; - } - return 1; - } - - int compare(void *p1, void *p2) - { - double[] s1 = *cast(double[]*)p1; - double[] s2 = *cast(double[]*)p2; - size_t len = s1.length; - - if (s2.length < len) - len = s2.length; - for (size_t u = 0; u < len; u++) - { - int c = TypeInfo_d._compare(s1[u], s2[u]); - if (c) - return c; - } - if (s1.length < s2.length) - return -1; - else if (s1.length > s2.length) - return 1; - return 0; - } - - size_t tsize() - { - return (double[]).sizeof; - } - - uint flags() - { - return 1; - } - - TypeInfo next() - { - return typeid(double); - } -} - -// idouble[] - -class TypeInfo_Ap : TypeInfo_Ad -{ - char[] toString() { return "idouble[]"; } - - TypeInfo next() - { - return typeid(idouble); - } -} diff --git a/runtime/internal/typeinfo/ti_Afloat.d b/runtime/internal/typeinfo/ti_Afloat.d deleted file mode 100644 index ca42a460..00000000 --- a/runtime/internal/typeinfo/ti_Afloat.d +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (C) 2004-2005 by Digital Mars, www.digitalmars.com - * Written by Walter Bright - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, in both source and binary form, subject to the following - * restrictions: - * - * o The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * o Altered source versions must be plainly marked as such, and must not - * be misrepresented as being the original software. - * o This notice may not be removed or altered from any source - * distribution. - */ - -module typeinfo.ti_Afloat; - -private import typeinfo.ti_float; - -// float[] - -class TypeInfo_Af : TypeInfo_Array -{ - char[] toString() { return "float[]"; } - - hash_t getHash(void *p) - { float[] s = *cast(float[]*)p; - size_t len = s.length; - auto str = s.ptr; - hash_t hash = 0; - - while (len) - { - hash *= 9; - hash += *cast(uint *)str; - str++; - len--; - } - - return hash; - } - - int equals(void *p1, void *p2) - { - float[] s1 = *cast(float[]*)p1; - float[] s2 = *cast(float[]*)p2; - size_t len = s1.length; - - if (len != s2.length) - return 0; - for (size_t u = 0; u < len; u++) - { - int c = TypeInfo_f._equals(s1[u], s2[u]); - if (c == 0) - return 0; - } - return 1; - } - - int compare(void *p1, void *p2) - { - float[] s1 = *cast(float[]*)p1; - float[] s2 = *cast(float[]*)p2; - size_t len = s1.length; - - if (s2.length < len) - len = s2.length; - for (size_t u = 0; u < len; u++) - { - int c = TypeInfo_f._compare(s1[u], s2[u]); - if (c) - return c; - } - if (s1.length < s2.length) - return -1; - else if (s1.length > s2.length) - return 1; - return 0; - } - - size_t tsize() - { - return (float[]).sizeof; - } - - uint flags() - { - return 1; - } - - TypeInfo next() - { - return typeid(float); - } -} - -// ifloat[] - -class TypeInfo_Ao : TypeInfo_Af -{ - char[] toString() { return "ifloat[]"; } - - TypeInfo next() - { - return typeid(ifloat); - } -} diff --git a/runtime/internal/typeinfo/ti_Ag.d b/runtime/internal/typeinfo/ti_Ag.d deleted file mode 100644 index 67833e04..00000000 --- a/runtime/internal/typeinfo/ti_Ag.d +++ /dev/null @@ -1,206 +0,0 @@ - -module typeinfo.ti_Ag; - -private import tango.stdc.string; -private import util.string; - -// byte[] - -class TypeInfo_Ag : TypeInfo_Array -{ - char[] toString() { return "byte[]"; } - - hash_t getHash(void *p) - { byte[] s = *cast(byte[]*)p; - size_t len = s.length; - byte *str = s.ptr; - hash_t hash = 0; - - while (1) - { - switch (len) - { - case 0: - return hash; - - case 1: - hash *= 9; - hash += *cast(ubyte *)str; - return hash; - - case 2: - hash *= 9; - hash += *cast(ushort *)str; - return hash; - - case 3: - hash *= 9; - hash += (*cast(ushort *)str << 8) + - (cast(ubyte *)str)[2]; - return hash; - - default: - hash *= 9; - hash += *cast(uint *)str; - str += 4; - len -= 4; - break; - } - } - - return hash; - } - - int equals(void *p1, void *p2) - { - byte[] s1 = *cast(byte[]*)p1; - byte[] s2 = *cast(byte[]*)p2; - - return s1.length == s2.length && - memcmp(cast(byte *)s1, cast(byte *)s2, s1.length) == 0; - } - - int compare(void *p1, void *p2) - { - byte[] s1 = *cast(byte[]*)p1; - byte[] s2 = *cast(byte[]*)p2; - size_t len = s1.length; - - if (s2.length < len) - len = s2.length; - for (size_t u = 0; u < len; u++) - { - int result = s1[u] - s2[u]; - if (result) - return result; - } - if (s1.length < s2.length) - return -1; - else if (s1.length > s2.length) - return 1; - return 0; - } - - size_t tsize() - { - return (byte[]).sizeof; - } - - uint flags() - { - return 1; - } - - TypeInfo next() - { - return typeid(byte); - } -} - - -// ubyte[] - -class TypeInfo_Ah : TypeInfo_Ag -{ - char[] toString() { return "ubyte[]"; } - - int compare(void *p1, void *p2) - { - char[] s1 = *cast(char[]*)p1; - char[] s2 = *cast(char[]*)p2; - - return stringCompare(s1, s2); - } - - TypeInfo next() - { - return typeid(ubyte); - } -} - -// void[] - -class TypeInfo_Av : TypeInfo_Ah -{ - char[] toString() { return "void[]"; } - - TypeInfo next() - { - return typeid(void); - } -} - -// bool[] - -class TypeInfo_Ab : TypeInfo_Ah -{ - char[] toString() { return "bool[]"; } - - TypeInfo next() - { - return typeid(bool); - } -} - -// char[] - -class TypeInfo_Aa : TypeInfo_Ag -{ - char[] toString() { return "char[]"; } - - hash_t getHash(void *p) - { char[] s = *cast(char[]*)p; - hash_t hash = 0; - -version (all) -{ - foreach (char c; s) - hash = hash * 11 + c; -} -else -{ - size_t len = s.length; - char *str = s; - - while (1) - { - switch (len) - { - case 0: - return hash; - - case 1: - hash *= 9; - hash += *cast(ubyte *)str; - return hash; - - case 2: - hash *= 9; - hash += *cast(ushort *)str; - return hash; - - case 3: - hash *= 9; - hash += (*cast(ushort *)str << 8) + - (cast(ubyte *)str)[2]; - return hash; - - default: - hash *= 9; - hash += *cast(uint *)str; - str += 4; - len -= 4; - break; - } - } -} - return hash; - } - - TypeInfo next() - { - return typeid(char); - } -} - - diff --git a/runtime/internal/typeinfo/ti_Aint.d b/runtime/internal/typeinfo/ti_Aint.d deleted file mode 100644 index 68158763..00000000 --- a/runtime/internal/typeinfo/ti_Aint.d +++ /dev/null @@ -1,119 +0,0 @@ - -module typeinfo.ti_Aint; - -private import tango.stdc.string; - -// int[] - -class TypeInfo_Ai : TypeInfo_Array -{ - char[] toString() { return "int[]"; } - - hash_t getHash(void *p) - { int[] s = *cast(int[]*)p; - auto len = s.length; - auto str = s.ptr; - hash_t hash = 0; - - while (len) - { - hash *= 9; - hash += *cast(uint *)str; - str++; - len--; - } - - return hash; - } - - int equals(void *p1, void *p2) - { - int[] s1 = *cast(int[]*)p1; - int[] s2 = *cast(int[]*)p2; - - return s1.length == s2.length && - memcmp(cast(void *)s1, cast(void *)s2, s1.length * int.sizeof) == 0; - } - - int compare(void *p1, void *p2) - { - int[] s1 = *cast(int[]*)p1; - int[] s2 = *cast(int[]*)p2; - size_t len = s1.length; - - if (s2.length < len) - len = s2.length; - for (size_t u = 0; u < len; u++) - { - int result = s1[u] - s2[u]; - if (result) - return result; - } - if (s1.length < s2.length) - return -1; - else if (s1.length > s2.length) - return 1; - return 0; - } - - size_t tsize() - { - return (int[]).sizeof; - } - - uint flags() - { - return 1; - } - - TypeInfo next() - { - return typeid(int); - } -} - -// uint[] - -class TypeInfo_Ak : TypeInfo_Ai -{ - char[] toString() { return "uint[]"; } - - int compare(void *p1, void *p2) - { - uint[] s1 = *cast(uint[]*)p1; - uint[] s2 = *cast(uint[]*)p2; - size_t len = s1.length; - - if (s2.length < len) - len = s2.length; - for (size_t u = 0; u < len; u++) - { - int result = s1[u] - s2[u]; - if (result) - return result; - } - if (s1.length < s2.length) - return -1; - else if (s1.length > s2.length) - return 1; - return 0; - } - - TypeInfo next() - { - return typeid(uint); - } -} - -// dchar[] - -class TypeInfo_Aw : TypeInfo_Ak -{ - char[] toString() { return "dchar[]"; } - - TypeInfo next() - { - return typeid(dchar); - } -} - diff --git a/runtime/internal/typeinfo/ti_Along.d b/runtime/internal/typeinfo/ti_Along.d deleted file mode 100644 index df87a768..00000000 --- a/runtime/internal/typeinfo/ti_Along.d +++ /dev/null @@ -1,109 +0,0 @@ - -module typeinfo.ti_Along; - -private import tango.stdc.string; - -// long[] - -class TypeInfo_Al : TypeInfo_Array -{ - char[] toString() { return "long[]"; } - - hash_t getHash(void *p) - { long[] s = *cast(long[]*)p; - size_t len = s.length; - auto str = s.ptr; - hash_t hash = 0; - - while (len) - { - hash *= 9; - hash += *cast(uint *)str + *(cast(uint *)str + 1); - str++; - len--; - } - - return hash; - } - - int equals(void *p1, void *p2) - { - long[] s1 = *cast(long[]*)p1; - long[] s2 = *cast(long[]*)p2; - - return s1.length == s2.length && - memcmp(cast(void *)s1, cast(void *)s2, s1.length * long.sizeof) == 0; - } - - int compare(void *p1, void *p2) - { - long[] s1 = *cast(long[]*)p1; - long[] s2 = *cast(long[]*)p2; - size_t len = s1.length; - - if (s2.length < len) - len = s2.length; - for (size_t u = 0; u < len; u++) - { - if (s1[u] < s2[u]) - return -1; - else if (s1[u] > s2[u]) - return 1; - } - if (s1.length < s2.length) - return -1; - else if (s1.length > s2.length) - return 1; - return 0; - } - - size_t tsize() - { - return (long[]).sizeof; - } - - uint flags() - { - return 1; - } - - TypeInfo next() - { - return typeid(long); - } -} - - -// ulong[] - -class TypeInfo_Am : TypeInfo_Al -{ - char[] toString() { return "ulong[]"; } - - int compare(void *p1, void *p2) - { - ulong[] s1 = *cast(ulong[]*)p1; - ulong[] s2 = *cast(ulong[]*)p2; - size_t len = s1.length; - - if (s2.length < len) - len = s2.length; - for (size_t u = 0; u < len; u++) - { - if (s1[u] < s2[u]) - return -1; - else if (s1[u] > s2[u]) - return 1; - } - if (s1.length < s2.length) - return -1; - else if (s1.length > s2.length) - return 1; - return 0; - } - - TypeInfo next() - { - return typeid(ulong); - } -} diff --git a/runtime/internal/typeinfo/ti_Areal.d b/runtime/internal/typeinfo/ti_Areal.d deleted file mode 100644 index 24f43fa3..00000000 --- a/runtime/internal/typeinfo/ti_Areal.d +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (C) 2004-2006 by Digital Mars, www.digitalmars.com - * Written by Walter Bright - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, in both source and binary form, subject to the following - * restrictions: - * - * o The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * o Altered source versions must be plainly marked as such, and must not - * be misrepresented as being the original software. - * o This notice may not be removed or altered from any source - * distribution. - */ - -module typeinfo.ti_Areal; - -private import typeinfo.ti_real; - -// real[] - -class TypeInfo_Ae : TypeInfo_Array -{ - char[] toString() { return "real[]"; } - - hash_t getHash(void *p) - { real[] s = *cast(real[]*)p; - size_t len = s.length; - auto str = s.ptr; - hash_t hash = 0; - - while (len) - { - hash *= 9; - hash += (cast(uint *)str)[0]; - hash += (cast(uint *)str)[1]; - hash += (cast(ushort *)str)[4]; - str++; - len--; - } - - return hash; - } - - int equals(void *p1, void *p2) - { - real[] s1 = *cast(real[]*)p1; - real[] s2 = *cast(real[]*)p2; - size_t len = s1.length; - - if (len != s2.length) - return 0; - for (size_t u = 0; u < len; u++) - { - int c = TypeInfo_e._equals(s1[u], s2[u]); - if (c == 0) - return 0; - } - return 1; - } - - int compare(void *p1, void *p2) - { - real[] s1 = *cast(real[]*)p1; - real[] s2 = *cast(real[]*)p2; - size_t len = s1.length; - - if (s2.length < len) - len = s2.length; - for (size_t u = 0; u < len; u++) - { - int c = TypeInfo_e._compare(s1[u], s2[u]); - if (c) - return c; - } - if (s1.length < s2.length) - return -1; - else if (s1.length > s2.length) - return 1; - return 0; - } - - size_t tsize() - { - return (real[]).sizeof; - } - - uint flags() - { - return 1; - } - - TypeInfo next() - { - return typeid(real); - } -} - -// ireal[] - -class TypeInfo_Aj : TypeInfo_Ae -{ - char[] toString() { return "ireal[]"; } - - TypeInfo next() - { - return typeid(ireal); - } -} diff --git a/runtime/internal/typeinfo/ti_Ashort.d b/runtime/internal/typeinfo/ti_Ashort.d deleted file mode 100644 index 8ac3fbf7..00000000 --- a/runtime/internal/typeinfo/ti_Ashort.d +++ /dev/null @@ -1,132 +0,0 @@ - -module typeinfo.ti_Ashort; - -private import tango.stdc.string; - -// short[] - -class TypeInfo_As : TypeInfo_Array -{ - char[] toString() { return "short[]"; } - - hash_t getHash(void *p) - { short[] s = *cast(short[]*)p; - size_t len = s.length; - short *str = s.ptr; - hash_t hash = 0; - - while (1) - { - switch (len) - { - case 0: - return hash; - - case 1: - hash *= 9; - hash += *cast(ushort *)str; - return hash; - - default: - hash *= 9; - hash += *cast(uint *)str; - str += 2; - len -= 2; - break; - } - } - - return hash; - } - - int equals(void *p1, void *p2) - { - short[] s1 = *cast(short[]*)p1; - short[] s2 = *cast(short[]*)p2; - - return s1.length == s2.length && - memcmp(cast(void *)s1, cast(void *)s2, s1.length * short.sizeof) == 0; - } - - int compare(void *p1, void *p2) - { - short[] s1 = *cast(short[]*)p1; - short[] s2 = *cast(short[]*)p2; - size_t len = s1.length; - - if (s2.length < len) - len = s2.length; - for (size_t u = 0; u < len; u++) - { - int result = s1[u] - s2[u]; - if (result) - return result; - } - if (s1.length < s2.length) - return -1; - else if (s1.length > s2.length) - return 1; - return 0; - } - - size_t tsize() - { - return (short[]).sizeof; - } - - uint flags() - { - return 1; - } - - TypeInfo next() - { - return typeid(short); - } -} - - -// ushort[] - -class TypeInfo_At : TypeInfo_As -{ - char[] toString() { return "ushort[]"; } - - int compare(void *p1, void *p2) - { - ushort[] s1 = *cast(ushort[]*)p1; - ushort[] s2 = *cast(ushort[]*)p2; - size_t len = s1.length; - - if (s2.length < len) - len = s2.length; - for (size_t u = 0; u < len; u++) - { - int result = s1[u] - s2[u]; - if (result) - return result; - } - if (s1.length < s2.length) - return -1; - else if (s1.length > s2.length) - return 1; - return 0; - } - - TypeInfo next() - { - return typeid(ushort); - } -} - -// wchar[] - -class TypeInfo_Au : TypeInfo_At -{ - char[] toString() { return "wchar[]"; } - - TypeInfo next() - { - return typeid(wchar); - } -} diff --git a/runtime/internal/typeinfo/ti_C.d b/runtime/internal/typeinfo/ti_C.d deleted file mode 100644 index 2f8c380d..00000000 --- a/runtime/internal/typeinfo/ti_C.d +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2004-2005 by Digital Mars, www.digitalmars.com - * Written by Walter Bright - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, in both source and binary form, subject to the following - * restrictions: - * - * o The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * o Altered source versions must be plainly marked as such, and must not - * be misrepresented as being the original software. - * o This notice may not be removed or altered from any source - * distribution. - */ - -module typeinfo.ti_C; - -// Object - -class TypeInfo_C : TypeInfo -{ - hash_t getHash(void *p) - { - Object o = *cast(Object*)p; - return o ? o.toHash() : 0; - } - - int equals(void *p1, void *p2) - { - Object o1 = *cast(Object*)p1; - Object o2 = *cast(Object*)p2; - - return o1 == o2; - } - - int compare(void *p1, void *p2) - { - Object o1 = *cast(Object*)p1; - Object o2 = *cast(Object*)p2; - int c = 0; - - // Regard null references as always being "less than" - if (!(o1 is o2)) - { - if (o1) - { if (!o2) - c = 1; - else - c = o1.opCmp(o2); - } - else - c = -1; - } - return c; - } - - size_t tsize() - { - return Object.sizeof; - } - - uint flags() - { - return 1; - } -} diff --git a/runtime/internal/typeinfo/ti_byte.d b/runtime/internal/typeinfo/ti_byte.d deleted file mode 100644 index 2f6e0f9f..00000000 --- a/runtime/internal/typeinfo/ti_byte.d +++ /dev/null @@ -1,39 +0,0 @@ - -// byte - -module typeinfo.ti_byte; - -class TypeInfo_g : TypeInfo -{ - char[] toString() { return "byte"; } - - hash_t getHash(void *p) - { - return *cast(byte *)p; - } - - int equals(void *p1, void *p2) - { - return *cast(byte *)p1 == *cast(byte *)p2; - } - - int compare(void *p1, void *p2) - { - return *cast(byte *)p1 - *cast(byte *)p2; - } - - size_t tsize() - { - return byte.sizeof; - } - - void swap(void *p1, void *p2) - { - byte t; - - t = *cast(byte *)p1; - *cast(byte *)p1 = *cast(byte *)p2; - *cast(byte *)p2 = t; - } -} - diff --git a/runtime/internal/typeinfo/ti_cdouble.d b/runtime/internal/typeinfo/ti_cdouble.d deleted file mode 100644 index 7a37f895..00000000 --- a/runtime/internal/typeinfo/ti_cdouble.d +++ /dev/null @@ -1,66 +0,0 @@ - -// cdouble - -module typeinfo.ti_cdouble; - -class TypeInfo_r : TypeInfo -{ - char[] toString() { return "cdouble"; } - - hash_t getHash(void *p) - { - return (cast(uint *)p)[0] + (cast(uint *)p)[1] + - (cast(uint *)p)[2] + (cast(uint *)p)[3]; - } - - static int _equals(cdouble f1, cdouble f2) - { - return f1 == f2; - } - - static int _compare(cdouble f1, cdouble f2) - { int result; - - if (f1.re < f2.re) - result = -1; - else if (f1.re > f2.re) - result = 1; - else if (f1.im < f2.im) - result = -1; - else if (f1.im > f2.im) - result = 1; - else - result = 0; - return result; - } - - int equals(void *p1, void *p2) - { - return _equals(*cast(cdouble *)p1, *cast(cdouble *)p2); - } - - int compare(void *p1, void *p2) - { - return _compare(*cast(cdouble *)p1, *cast(cdouble *)p2); - } - - size_t tsize() - { - return cdouble.sizeof; - } - - void swap(void *p1, void *p2) - { - cdouble t; - - t = *cast(cdouble *)p1; - *cast(cdouble *)p1 = *cast(cdouble *)p2; - *cast(cdouble *)p2 = t; - } - - void[] init() - { static cdouble r; - - return (cast(cdouble *)&r)[0 .. 1]; - } -} diff --git a/runtime/internal/typeinfo/ti_cfloat.d b/runtime/internal/typeinfo/ti_cfloat.d deleted file mode 100644 index 2546870b..00000000 --- a/runtime/internal/typeinfo/ti_cfloat.d +++ /dev/null @@ -1,65 +0,0 @@ - -// cfloat - -module typeinfo.ti_cfloat; - -class TypeInfo_q : TypeInfo -{ - char[] toString() { return "cfloat"; } - - hash_t getHash(void *p) - { - return (cast(uint *)p)[0] + (cast(uint *)p)[1]; - } - - static int _equals(cfloat f1, cfloat f2) - { - return f1 == f2; - } - - static int _compare(cfloat f1, cfloat f2) - { int result; - - if (f1.re < f2.re) - result = -1; - else if (f1.re > f2.re) - result = 1; - else if (f1.im < f2.im) - result = -1; - else if (f1.im > f2.im) - result = 1; - else - result = 0; - return result; - } - - int equals(void *p1, void *p2) - { - return _equals(*cast(cfloat *)p1, *cast(cfloat *)p2); - } - - int compare(void *p1, void *p2) - { - return _compare(*cast(cfloat *)p1, *cast(cfloat *)p2); - } - - size_t tsize() - { - return cfloat.sizeof; - } - - void swap(void *p1, void *p2) - { - cfloat t; - - t = *cast(cfloat *)p1; - *cast(cfloat *)p1 = *cast(cfloat *)p2; - *cast(cfloat *)p2 = t; - } - - void[] init() - { static cfloat r; - - return (cast(cfloat *)&r)[0 .. 1]; - } -} diff --git a/runtime/internal/typeinfo/ti_char.d b/runtime/internal/typeinfo/ti_char.d deleted file mode 100644 index a88c9904..00000000 --- a/runtime/internal/typeinfo/ti_char.d +++ /dev/null @@ -1,42 +0,0 @@ - -module typeinfo.ti_char; - -class TypeInfo_a : TypeInfo -{ - char[] toString() { return "char"; } - - hash_t getHash(void *p) - { - return *cast(char *)p; - } - - int equals(void *p1, void *p2) - { - return *cast(char *)p1 == *cast(char *)p2; - } - - int compare(void *p1, void *p2) - { - return *cast(char *)p1 - *cast(char *)p2; - } - - size_t tsize() - { - return char.sizeof; - } - - void swap(void *p1, void *p2) - { - char t; - - t = *cast(char *)p1; - *cast(char *)p1 = *cast(char *)p2; - *cast(char *)p2 = t; - } - - void[] init() - { static char c; - - return (cast(char *)&c)[0 .. 1]; - } -} diff --git a/runtime/internal/typeinfo/ti_creal.d b/runtime/internal/typeinfo/ti_creal.d deleted file mode 100644 index 13cd6533..00000000 --- a/runtime/internal/typeinfo/ti_creal.d +++ /dev/null @@ -1,67 +0,0 @@ - -// creal - -module typeinfo.ti_creal; - -class TypeInfo_c : TypeInfo -{ - char[] toString() { return "creal"; } - - hash_t getHash(void *p) - { - return (cast(uint *)p)[0] + (cast(uint *)p)[1] + - (cast(uint *)p)[2] + (cast(uint *)p)[3] + - (cast(uint *)p)[4]; - } - - static int _equals(creal f1, creal f2) - { - return f1 == f2; - } - - static int _compare(creal f1, creal f2) - { int result; - - if (f1.re < f2.re) - result = -1; - else if (f1.re > f2.re) - result = 1; - else if (f1.im < f2.im) - result = -1; - else if (f1.im > f2.im) - result = 1; - else - result = 0; - return result; - } - - int equals(void *p1, void *p2) - { - return _equals(*cast(creal *)p1, *cast(creal *)p2); - } - - int compare(void *p1, void *p2) - { - return _compare(*cast(creal *)p1, *cast(creal *)p2); - } - - size_t tsize() - { - return creal.sizeof; - } - - void swap(void *p1, void *p2) - { - creal t; - - t = *cast(creal *)p1; - *cast(creal *)p1 = *cast(creal *)p2; - *cast(creal *)p2 = t; - } - - void[] init() - { static creal r; - - return (cast(creal *)&r)[0 .. 1]; - } -} diff --git a/runtime/internal/typeinfo/ti_dchar.d b/runtime/internal/typeinfo/ti_dchar.d deleted file mode 100644 index 15f4923e..00000000 --- a/runtime/internal/typeinfo/ti_dchar.d +++ /dev/null @@ -1,44 +0,0 @@ - -// dchar - -module typeinfo.ti_dchar; - -class TypeInfo_w : TypeInfo -{ - char[] toString() { return "dchar"; } - - hash_t getHash(void *p) - { - return *cast(dchar *)p; - } - - int equals(void *p1, void *p2) - { - return *cast(dchar *)p1 == *cast(dchar *)p2; - } - - int compare(void *p1, void *p2) - { - return *cast(dchar *)p1 - *cast(dchar *)p2; - } - - size_t tsize() - { - return dchar.sizeof; - } - - void swap(void *p1, void *p2) - { - dchar t; - - t = *cast(dchar *)p1; - *cast(dchar *)p1 = *cast(dchar *)p2; - *cast(dchar *)p2 = t; - } - - void[] init() - { static dchar c; - - return (cast(dchar *)&c)[0 .. 1]; - } -} diff --git a/runtime/internal/typeinfo/ti_delegate.d b/runtime/internal/typeinfo/ti_delegate.d deleted file mode 100644 index 34f948cd..00000000 --- a/runtime/internal/typeinfo/ti_delegate.d +++ /dev/null @@ -1,39 +0,0 @@ - -// delegate - -module typeinfo.ti_delegate; - -alias void delegate(int) dg; - -class TypeInfo_D : TypeInfo -{ - hash_t getHash(void *p) - { long l = *cast(long *)p; - - return cast(uint)(l + (l >> 32)); - } - - int equals(void *p1, void *p2) - { - return *cast(dg *)p1 == *cast(dg *)p2; - } - - size_t tsize() - { - return dg.sizeof; - } - - void swap(void *p1, void *p2) - { - dg t; - - t = *cast(dg *)p1; - *cast(dg *)p1 = *cast(dg *)p2; - *cast(dg *)p2 = t; - } - - uint flags() - { - return 1; - } -} diff --git a/runtime/internal/typeinfo/ti_double.d b/runtime/internal/typeinfo/ti_double.d deleted file mode 100644 index 6f770a43..00000000 --- a/runtime/internal/typeinfo/ti_double.d +++ /dev/null @@ -1,65 +0,0 @@ - -// double - -module typeinfo.ti_double; - -class TypeInfo_d : TypeInfo -{ - char[] toString() { return "double"; } - - hash_t getHash(void *p) - { - return (cast(uint *)p)[0] + (cast(uint *)p)[1]; - } - - static int _equals(double f1, double f2) - { - return f1 == f2 || - (f1 !<>= f1 && f2 !<>= f2); - } - - static int _compare(double d1, double d2) - { - if (d1 !<>= d2) // if either are NaN - { - if (d1 !<>= d1) - { if (d2 !<>= d2) - return 0; - return -1; - } - return 1; - } - return (d1 == d2) ? 0 : ((d1 < d2) ? -1 : 1); - } - - int equals(void *p1, void *p2) - { - return _equals(*cast(double *)p1, *cast(double *)p2); - } - - int compare(void *p1, void *p2) - { - return _compare(*cast(double *)p1, *cast(double *)p2); - } - - size_t tsize() - { - return double.sizeof; - } - - void swap(void *p1, void *p2) - { - double t; - - t = *cast(double *)p1; - *cast(double *)p1 = *cast(double *)p2; - *cast(double *)p2 = t; - } - - void[] init() - { static double r; - - return (cast(double *)&r)[0 .. 1]; - } -} - diff --git a/runtime/internal/typeinfo/ti_float.d b/runtime/internal/typeinfo/ti_float.d deleted file mode 100644 index f6afa629..00000000 --- a/runtime/internal/typeinfo/ti_float.d +++ /dev/null @@ -1,64 +0,0 @@ - -// float - -module typeinfo.ti_float; - -class TypeInfo_f : TypeInfo -{ - char[] toString() { return "float"; } - - hash_t getHash(void *p) - { - return *cast(uint *)p; - } - - static int _equals(float f1, float f2) - { - return f1 == f2 || - (f1 !<>= f1 && f2 !<>= f2); - } - - static int _compare(float d1, float d2) - { - if (d1 !<>= d2) // if either are NaN - { - if (d1 !<>= d1) - { if (d2 !<>= d2) - return 0; - return -1; - } - return 1; - } - return (d1 == d2) ? 0 : ((d1 < d2) ? -1 : 1); - } - - int equals(void *p1, void *p2) - { - return _equals(*cast(float *)p1, *cast(float *)p2); - } - - int compare(void *p1, void *p2) - { - return _compare(*cast(float *)p1, *cast(float *)p2); - } - - size_t tsize() - { - return float.sizeof; - } - - void swap(void *p1, void *p2) - { - float t; - - t = *cast(float *)p1; - *cast(float *)p1 = *cast(float *)p2; - *cast(float *)p2 = t; - } - - void[] init() - { static float r; - - return (cast(float *)&r)[0 .. 1]; - } -} diff --git a/runtime/internal/typeinfo/ti_idouble.d b/runtime/internal/typeinfo/ti_idouble.d deleted file mode 100644 index 4ed960df..00000000 --- a/runtime/internal/typeinfo/ti_idouble.d +++ /dev/null @@ -1,12 +0,0 @@ - -// idouble - -module typeinfo.ti_idouble; - -private import typeinfo.ti_double; - -class TypeInfo_p : TypeInfo_d -{ - char[] toString() { return "idouble"; } -} - diff --git a/runtime/internal/typeinfo/ti_ifloat.d b/runtime/internal/typeinfo/ti_ifloat.d deleted file mode 100644 index cbd6cbd7..00000000 --- a/runtime/internal/typeinfo/ti_ifloat.d +++ /dev/null @@ -1,12 +0,0 @@ - -// ifloat - -module typeinfo.ti_ifloat; - -private import typeinfo.ti_float; - -class TypeInfo_o : TypeInfo_f -{ - char[] toString() { return "ifloat"; } -} - diff --git a/runtime/internal/typeinfo/ti_int.d b/runtime/internal/typeinfo/ti_int.d deleted file mode 100644 index c5a24ee9..00000000 --- a/runtime/internal/typeinfo/ti_int.d +++ /dev/null @@ -1,43 +0,0 @@ - -// int - -module typeinfo.ti_int; - -class TypeInfo_i : TypeInfo -{ - char[] toString() { return "int"; } - - hash_t getHash(void *p) - { - return *cast(uint *)p; - } - - int equals(void *p1, void *p2) - { - return *cast(uint *)p1 == *cast(uint *)p2; - } - - int compare(void *p1, void *p2) - { - if (*cast(int*) p1 < *cast(int*) p2) - return -1; - else if (*cast(int*) p1 > *cast(int*) p2) - return 1; - return 0; - } - - size_t tsize() - { - return int.sizeof; - } - - void swap(void *p1, void *p2) - { - int t; - - t = *cast(int *)p1; - *cast(int *)p1 = *cast(int *)p2; - *cast(int *)p2 = t; - } -} - diff --git a/runtime/internal/typeinfo/ti_ireal.d b/runtime/internal/typeinfo/ti_ireal.d deleted file mode 100644 index 0c7d3e7b..00000000 --- a/runtime/internal/typeinfo/ti_ireal.d +++ /dev/null @@ -1,12 +0,0 @@ - -// ireal - -module typeinfo.ti_ireal; - -private import typeinfo.ti_real; - -class TypeInfo_j : TypeInfo_e -{ - char[] toString() { return "ireal"; } -} - diff --git a/runtime/internal/typeinfo/ti_long.d b/runtime/internal/typeinfo/ti_long.d deleted file mode 100644 index 771fec6e..00000000 --- a/runtime/internal/typeinfo/ti_long.d +++ /dev/null @@ -1,43 +0,0 @@ - -// long - -module typeinfo.ti_long; - -class TypeInfo_l : TypeInfo -{ - char[] toString() { return "long"; } - - hash_t getHash(void *p) - { - return *cast(uint *)p + (cast(uint *)p)[1]; - } - - int equals(void *p1, void *p2) - { - return *cast(long *)p1 == *cast(long *)p2; - } - - int compare(void *p1, void *p2) - { - if (*cast(long *)p1 < *cast(long *)p2) - return -1; - else if (*cast(long *)p1 > *cast(long *)p2) - return 1; - return 0; - } - - size_t tsize() - { - return long.sizeof; - } - - void swap(void *p1, void *p2) - { - long t; - - t = *cast(long *)p1; - *cast(long *)p1 = *cast(long *)p2; - *cast(long *)p2 = t; - } -} - diff --git a/runtime/internal/typeinfo/ti_ptr.d b/runtime/internal/typeinfo/ti_ptr.d deleted file mode 100644 index 523c3385..00000000 --- a/runtime/internal/typeinfo/ti_ptr.d +++ /dev/null @@ -1,46 +0,0 @@ - -// pointer - -module typeinfo.ti_ptr; - -class TypeInfo_P : TypeInfo -{ - hash_t getHash(void *p) - { - return cast(uint)*cast(void* *)p; - } - - int equals(void *p1, void *p2) - { - return *cast(void* *)p1 == *cast(void* *)p2; - } - - int compare(void *p1, void *p2) - { - auto c = *cast(void* *)p1 - *cast(void* *)p2; - if (c < 0) - return -1; - else if (c > 0) - return 1; - return 0; - } - - size_t tsize() - { - return (void*).sizeof; - } - - void swap(void *p1, void *p2) - { - void* t; - - t = *cast(void* *)p1; - *cast(void* *)p1 = *cast(void* *)p2; - *cast(void* *)p2 = t; - } - - uint flags() - { - return 1; - } -} diff --git a/runtime/internal/typeinfo/ti_real.d b/runtime/internal/typeinfo/ti_real.d deleted file mode 100644 index bdd0854b..00000000 --- a/runtime/internal/typeinfo/ti_real.d +++ /dev/null @@ -1,64 +0,0 @@ - -// real - -module typeinfo.ti_real; - -class TypeInfo_e : TypeInfo -{ - char[] toString() { return "real"; } - - hash_t getHash(void *p) - { - return (cast(uint *)p)[0] + (cast(uint *)p)[1] + (cast(ushort *)p)[4]; - } - - static int _equals(real f1, real f2) - { - return f1 == f2 || - (f1 !<>= f1 && f2 !<>= f2); - } - - static int _compare(real d1, real d2) - { - if (d1 !<>= d2) // if either are NaN - { - if (d1 !<>= d1) - { if (d2 !<>= d2) - return 0; - return -1; - } - return 1; - } - return (d1 == d2) ? 0 : ((d1 < d2) ? -1 : 1); - } - - int equals(void *p1, void *p2) - { - return _equals(*cast(real *)p1, *cast(real *)p2); - } - - int compare(void *p1, void *p2) - { - return _compare(*cast(real *)p1, *cast(real *)p2); - } - - size_t tsize() - { - return real.sizeof; - } - - void swap(void *p1, void *p2) - { - real t; - - t = *cast(real *)p1; - *cast(real *)p1 = *cast(real *)p2; - *cast(real *)p2 = t; - } - - void[] init() - { static real r; - - return (cast(real *)&r)[0 .. 1]; - } -} diff --git a/runtime/internal/typeinfo/ti_short.d b/runtime/internal/typeinfo/ti_short.d deleted file mode 100644 index 7f67d301..00000000 --- a/runtime/internal/typeinfo/ti_short.d +++ /dev/null @@ -1,39 +0,0 @@ - -// short - -module typeinfo.ti_short; - -class TypeInfo_s : TypeInfo -{ - char[] toString() { return "short"; } - - hash_t getHash(void *p) - { - return *cast(short *)p; - } - - int equals(void *p1, void *p2) - { - return *cast(short *)p1 == *cast(short *)p2; - } - - int compare(void *p1, void *p2) - { - return *cast(short *)p1 - *cast(short *)p2; - } - - size_t tsize() - { - return short.sizeof; - } - - void swap(void *p1, void *p2) - { - short t; - - t = *cast(short *)p1; - *cast(short *)p1 = *cast(short *)p2; - *cast(short *)p2 = t; - } -} - diff --git a/runtime/internal/typeinfo/ti_ubyte.d b/runtime/internal/typeinfo/ti_ubyte.d deleted file mode 100644 index 9711e29c..00000000 --- a/runtime/internal/typeinfo/ti_ubyte.d +++ /dev/null @@ -1,43 +0,0 @@ - -// ubyte - -module typeinfo.ti_ubyte; - -class TypeInfo_h : TypeInfo -{ - char[] toString() { return "ubyte"; } - - hash_t getHash(void *p) - { - return *cast(ubyte *)p; - } - - int equals(void *p1, void *p2) - { - return *cast(ubyte *)p1 == *cast(ubyte *)p2; - } - - int compare(void *p1, void *p2) - { - return *cast(ubyte *)p1 - *cast(ubyte *)p2; - } - - size_t tsize() - { - return ubyte.sizeof; - } - - void swap(void *p1, void *p2) - { - ubyte t; - - t = *cast(ubyte *)p1; - *cast(ubyte *)p1 = *cast(ubyte *)p2; - *cast(ubyte *)p2 = t; - } -} - -class TypeInfo_b : TypeInfo_h -{ - char[] toString() { return "bool"; } -} diff --git a/runtime/internal/typeinfo/ti_uint.d b/runtime/internal/typeinfo/ti_uint.d deleted file mode 100644 index ccb18fc0..00000000 --- a/runtime/internal/typeinfo/ti_uint.d +++ /dev/null @@ -1,43 +0,0 @@ - -// uint - -module typeinfo.ti_uint; - -class TypeInfo_k : TypeInfo -{ - char[] toString() { return "uint"; } - - hash_t getHash(void *p) - { - return *cast(uint *)p; - } - - int equals(void *p1, void *p2) - { - return *cast(uint *)p1 == *cast(uint *)p2; - } - - int compare(void *p1, void *p2) - { - if (*cast(uint*) p1 < *cast(uint*) p2) - return -1; - else if (*cast(uint*) p1 > *cast(uint*) p2) - return 1; - return 0; - } - - size_t tsize() - { - return uint.sizeof; - } - - void swap(void *p1, void *p2) - { - int t; - - t = *cast(uint *)p1; - *cast(uint *)p1 = *cast(uint *)p2; - *cast(uint *)p2 = t; - } -} - diff --git a/runtime/internal/typeinfo/ti_ulong.d b/runtime/internal/typeinfo/ti_ulong.d deleted file mode 100644 index a0d1a36c..00000000 --- a/runtime/internal/typeinfo/ti_ulong.d +++ /dev/null @@ -1,43 +0,0 @@ - -// ulong - -module typeinfo.ti_ulong; - -class TypeInfo_m : TypeInfo -{ - char[] toString() { return "ulong"; } - - hash_t getHash(void *p) - { - return *cast(uint *)p + (cast(uint *)p)[1]; - } - - int equals(void *p1, void *p2) - { - return *cast(ulong *)p1 == *cast(ulong *)p2; - } - - int compare(void *p1, void *p2) - { - if (*cast(ulong *)p1 < *cast(ulong *)p2) - return -1; - else if (*cast(ulong *)p1 > *cast(ulong *)p2) - return 1; - return 0; - } - - size_t tsize() - { - return ulong.sizeof; - } - - void swap(void *p1, void *p2) - { - ulong t; - - t = *cast(ulong *)p1; - *cast(ulong *)p1 = *cast(ulong *)p2; - *cast(ulong *)p2 = t; - } -} - diff --git a/runtime/internal/typeinfo/ti_ushort.d b/runtime/internal/typeinfo/ti_ushort.d deleted file mode 100644 index 7eeff590..00000000 --- a/runtime/internal/typeinfo/ti_ushort.d +++ /dev/null @@ -1,39 +0,0 @@ - -// ushort - -module typeinfo.ti_ushort; - -class TypeInfo_t : TypeInfo -{ - char[] toString() { return "ushort"; } - - hash_t getHash(void *p) - { - return *cast(ushort *)p; - } - - int equals(void *p1, void *p2) - { - return *cast(ushort *)p1 == *cast(ushort *)p2; - } - - int compare(void *p1, void *p2) - { - return *cast(ushort *)p1 - *cast(ushort *)p2; - } - - size_t tsize() - { - return ushort.sizeof; - } - - void swap(void *p1, void *p2) - { - ushort t; - - t = *cast(ushort *)p1; - *cast(ushort *)p1 = *cast(ushort *)p2; - *cast(ushort *)p2 = t; - } -} - diff --git a/runtime/internal/typeinfo/ti_void.d b/runtime/internal/typeinfo/ti_void.d deleted file mode 100644 index c1288e7f..00000000 --- a/runtime/internal/typeinfo/ti_void.d +++ /dev/null @@ -1,43 +0,0 @@ - -// void - -module typeinfo.ti_void; - -class TypeInfo_v : TypeInfo -{ - char[] toString() { return "void"; } - - hash_t getHash(void *p) - { - assert(0); - } - - int equals(void *p1, void *p2) - { - return *cast(byte *)p1 == *cast(byte *)p2; - } - - int compare(void *p1, void *p2) - { - return *cast(byte *)p1 - *cast(byte *)p2; - } - - size_t tsize() - { - return void.sizeof; - } - - void swap(void *p1, void *p2) - { - byte t; - - t = *cast(byte *)p1; - *cast(byte *)p1 = *cast(byte *)p2; - *cast(byte *)p2 = t; - } - - uint flags() - { - return 1; - } -} diff --git a/runtime/internal/typeinfo/ti_wchar.d b/runtime/internal/typeinfo/ti_wchar.d deleted file mode 100644 index 3f01d275..00000000 --- a/runtime/internal/typeinfo/ti_wchar.d +++ /dev/null @@ -1,43 +0,0 @@ - -module typeinfo.ti_wchar; - - -class TypeInfo_u : TypeInfo -{ - char[] toString() { return "wchar"; } - - hash_t getHash(void *p) - { - return *cast(wchar *)p; - } - - int equals(void *p1, void *p2) - { - return *cast(wchar *)p1 == *cast(wchar *)p2; - } - - int compare(void *p1, void *p2) - { - return *cast(wchar *)p1 - *cast(wchar *)p2; - } - - size_t tsize() - { - return wchar.sizeof; - } - - void swap(void *p1, void *p2) - { - wchar t; - - t = *cast(wchar *)p1; - *cast(wchar *)p1 = *cast(wchar *)p2; - *cast(wchar *)p2 = t; - } - - void[] init() - { static wchar c; - - return (cast(wchar *)&c)[0 .. 1]; - } -} diff --git a/runtime/internal/util/console.d b/runtime/internal/util/console.d deleted file mode 100644 index a091c313..00000000 --- a/runtime/internal/util/console.d +++ /dev/null @@ -1,86 +0,0 @@ -/******************************************************************************* - - copyright: Copyright (c) 2004 Tango group. All rights reserved - - license: BSD style: $(LICENSE) - - version: Initial release: July 2006 - - - Various low-level console oriented utilities - -*******************************************************************************/ - -module util.console; - -private import util.string; - -version (Win32) - { - private extern (Windows) int GetStdHandle (int); - private extern (Windows) int WriteFile (int, char*, int, int*, void*); - } - -else - -version (Posix) - { - private extern (C) ptrdiff_t write (int, void*, size_t); - } - -/+ -// emit a char[] to the console. Note that Win32 does not handle utf8, but -// then neither does fprintf (stderr). This will handle redirection though. -// May need to remedy the utf8 issue -int console (char[] s) -{ - version (Win32) - { - int count; - if (WriteFile (GetStdHandle(0xfffffff5), s.ptr, s.length, &count, null)) - return count; - return -1; - } - else - version (Posix) - { - return write (2, s.ptr, s.length); - } -} - -// emit an integer to the console -int console (uint i) -{ - char[10] tmp = void; - - return console (intToUtf8 (tmp, i)); -} -+/ - -struct Console -{ - Console opCall (char[] s) - { - version (Win32) - { - int count; - WriteFile (GetStdHandle(0xfffffff5), s.ptr, s.length, &count, null); - } - else - version (Posix) - { - write (2, s.ptr, s.length); - } - return *this; - } - - // emit an integer to the console - Console opCall (size_t i) - { - char[25] tmp = void; - - return console (intToUtf8 (tmp, i)); - } -} - -Console console; diff --git a/runtime/internal/util/ctype.d b/runtime/internal/util/ctype.d deleted file mode 100644 index 7881c604..00000000 --- a/runtime/internal/util/ctype.d +++ /dev/null @@ -1,106 +0,0 @@ - -/* - * Copyright (C) 2004-2005 by Digital Mars, www.digitalmars.com - * Written by Walter Bright - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, in both source and binary form, subject to the following - * restrictions: - * - * o The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * o Altered source versions must be plainly marked as such, and must not - * be misrepresented as being the original software. - * o This notice may not be removed or altered from any source - * distribution. - */ - -// Simple ASCII char classification functions - -module util.ctype; - -int isalnum(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_ALP|_DIG) : 0; } -int isalpha(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_ALP) : 0; } -int iscntrl(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_CTL) : 0; } -int isdigit(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_DIG) : 0; } -int islower(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_LC) : 0; } -int ispunct(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_PNC) : 0; } -int isspace(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_SPC) : 0; } -int isupper(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_UC) : 0; } -int isxdigit(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_HEX) : 0; } -int isgraph(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_ALP|_DIG|_PNC) : 0; } -int isprint(dchar c) { return (c <= 0x7F) ? _ctype[c] & (_ALP|_DIG|_PNC|_BLK) : 0; } -int isascii(dchar c) { return c <= 0x7F; } - -dchar tolower(dchar c) - out (result) - { - assert(!isupper(result)); - } - body - { - return isupper(c) ? c + (cast(dchar)'a' - 'A') : c; - } - -dchar toupper(dchar c) - out (result) - { - assert(!islower(result)); - } - body - { - return islower(c) ? c - (cast(dchar)'a' - 'A') : c; - } - -private: - -enum -{ - _SPC = 8, - _CTL = 0x20, - _BLK = 0x40, - _HEX = 0x80, - _UC = 1, - _LC = 2, - _PNC = 0x10, - _DIG = 4, - _ALP = _UC|_LC, -} - -ubyte _ctype[128] = -[ - _CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL, - _CTL,_CTL|_SPC,_CTL|_SPC,_CTL|_SPC,_CTL|_SPC,_CTL|_SPC,_CTL,_CTL, - _CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL, - _CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL,_CTL, - _SPC|_BLK,_PNC,_PNC,_PNC,_PNC,_PNC,_PNC,_PNC, - _PNC,_PNC,_PNC,_PNC,_PNC,_PNC,_PNC,_PNC, - _DIG|_HEX,_DIG|_HEX,_DIG|_HEX,_DIG|_HEX,_DIG|_HEX, - _DIG|_HEX,_DIG|_HEX,_DIG|_HEX,_DIG|_HEX,_DIG|_HEX, - _PNC,_PNC,_PNC,_PNC,_PNC,_PNC, - _PNC,_UC|_HEX,_UC|_HEX,_UC|_HEX,_UC|_HEX,_UC|_HEX,_UC|_HEX,_UC, - _UC,_UC,_UC,_UC,_UC,_UC,_UC,_UC, - _UC,_UC,_UC,_UC,_UC,_UC,_UC,_UC, - _UC,_UC,_UC,_PNC,_PNC,_PNC,_PNC,_PNC, - _PNC,_LC|_HEX,_LC|_HEX,_LC|_HEX,_LC|_HEX,_LC|_HEX,_LC|_HEX,_LC, - _LC,_LC,_LC,_LC,_LC,_LC,_LC,_LC, - _LC,_LC,_LC,_LC,_LC,_LC,_LC,_LC, - _LC,_LC,_LC,_PNC,_PNC,_PNC,_PNC,_CTL -]; - - -unittest -{ - assert(isspace(' ')); - assert(!isspace('z')); - assert(toupper('a') == 'A'); - assert(tolower('Q') == 'q'); - assert(!isxdigit('G')); -} diff --git a/runtime/internal/util/string.d b/runtime/internal/util/string.d deleted file mode 100644 index 776f7ed5..00000000 --- a/runtime/internal/util/string.d +++ /dev/null @@ -1,50 +0,0 @@ -/******************************************************************************* - - copyright: Copyright (c) 2004 Tango group. All rights reserved - - license: BSD style: $(LICENSE) - - version: Initial release: July 2006 - - - Various char[] utilities - -*******************************************************************************/ - -module util.string; - -private import tango.stdc.string; - -// convert uint to char[], within the given buffer -// Returns a valid slice of the populated buffer -char[] intToUtf8 (char[] tmp, size_t val) -in { - assert (tmp.length >= 20, "atoi buffer should be 20 or more chars wide"); - } -body -{ - char* p = tmp.ptr + tmp.length; - - do { - *--p = cast(char)((val % 10) + '0'); - } while (val /= 10); - - return tmp [cast(size_t)(p - tmp.ptr) .. $]; -} - - -// function to compare two strings -int stringCompare (char[] s1, char[] s2) -{ - auto len = s1.length; - - if (s2.length < len) - len = s2.length; - - int result = memcmp(s1.ptr, s2.ptr, len); - - if (result == 0) - result = cast(int)s1.length - cast(int)s2.length; - - return result; -} diff --git a/runtime/internal/util/utf.d b/runtime/internal/util/utf.d deleted file mode 100644 index 5696f669..00000000 --- a/runtime/internal/util/utf.d +++ /dev/null @@ -1,851 +0,0 @@ -// utf.d - -/* - * Copyright (C) 2003-2004 by Digital Mars, www.digitalmars.com - * Written by Walter Bright - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * o The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * o Altered source versions must be plainly marked as such, and must not - * be misrepresented as being the original software. - * o This notice may not be removed or altered from any source - * distribution. - */ - -// Description of UTF-8 at: -// http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 -// http://anubis.dkuug.dk/JTC1/SC2/WG2/docs/n1335 - - -module util.utf; - - -extern (C) void onUnicodeError( char[] msg, size_t idx ); - - -bool isValidDchar(dchar c) -{ - /* Note: FFFE and FFFF are specifically permitted by the - * Unicode standard for application internal use, but are not - * allowed for interchange. - * (thanks to Arcane Jill) - */ - - return c < 0xD800 || - (c > 0xDFFF && c <= 0x10FFFF /*&& c != 0xFFFE && c != 0xFFFF*/); -} - -unittest -{ - debug(utf) printf("utf.isValidDchar.unittest\n"); - assert(isValidDchar(cast(dchar)'a') == true); - assert(isValidDchar(cast(dchar)0x1FFFFF) == false); -} - - -/* This array gives the length of a UTF-8 sequence indexed by the value - * of the leading byte. An FF represents an illegal starting value of - * a UTF-8 sequence. - * FF is used instead of 0 to avoid having loops hang. - */ - -ubyte[256] UTF8stride = -[ - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, - 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, - 4,4,4,4,4,4,4,4,5,5,5,5,6,6,0xFF,0xFF, -]; - -uint stride(char[] s, size_t i) -{ - return UTF8stride[s[i]]; -} - -uint stride(wchar[] s, size_t i) -{ uint u = s[i]; - return 1 + (u >= 0xD800 && u <= 0xDBFF); -} - -uint stride(dchar[] s, size_t i) -{ - return 1; -} - -/******************************************* - * Given an index into an array of char's, - * and assuming that index is at the start of a UTF character, - * determine the number of UCS characters up to that index. - */ - -size_t toUCSindex(char[] s, size_t i) -{ - size_t n; - size_t j; - size_t stride; - - for (j = 0; j < i; j += stride) - { - stride = UTF8stride[s[j]]; - if (stride == 0xFF) - goto Lerr; - n++; - } - if (j > i) - { - Lerr: - onUnicodeError("invalid UTF-8 sequence", j); - } - return n; -} - -size_t toUCSindex(wchar[] s, size_t i) -{ - size_t n; - size_t j; - - for (j = 0; j < i; ) - { uint u = s[j]; - - j += 1 + (u >= 0xD800 && u <= 0xDBFF); - n++; - } - if (j > i) - { - Lerr: - onUnicodeError("invalid UTF-16 sequence", j); - } - return n; -} - -size_t toUCSindex(dchar[] s, size_t i) -{ - return i; -} - -/****************************************** - * Given a UCS index into an array of characters, return the UTF index. - */ - -size_t toUTFindex(char[] s, size_t n) -{ - size_t i; - - while (n--) - { - uint j = UTF8stride[s[i]]; - if (j == 0xFF) - onUnicodeError("invalid UTF-8 sequence", i); - i += j; - } - return i; -} - -size_t toUTFindex(wchar[] s, size_t n) -{ - size_t i; - - while (n--) - { wchar u = s[i]; - - i += 1 + (u >= 0xD800 && u <= 0xDBFF); - } - return i; -} - -size_t toUTFindex(dchar[] s, size_t n) -{ - return n; -} - -/* =================== Decode ======================= */ - -dchar decode(char[] s, inout size_t idx) - in - { - assert(idx >= 0 && idx < s.length); - } - out (result) - { - assert(isValidDchar(result)); - } - body - { - size_t len = s.length; - dchar V; - size_t i = idx; - char u = s[i]; - - if (u & 0x80) - { uint n; - char u2; - - /* The following encodings are valid, except for the 5 and 6 byte - * combinations: - * 0xxxxxxx - * 110xxxxx 10xxxxxx - * 1110xxxx 10xxxxxx 10xxxxxx - * 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - * 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx - * 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx - */ - for (n = 1; ; n++) - { - if (n > 4) - goto Lerr; // only do the first 4 of 6 encodings - if (((u << n) & 0x80) == 0) - { - if (n == 1) - goto Lerr; - break; - } - } - - // Pick off (7 - n) significant bits of B from first byte of octet - V = cast(dchar)(u & ((1 << (7 - n)) - 1)); - - if (i + (n - 1) >= len) - goto Lerr; // off end of string - - /* The following combinations are overlong, and illegal: - * 1100000x (10xxxxxx) - * 11100000 100xxxxx (10xxxxxx) - * 11110000 1000xxxx (10xxxxxx 10xxxxxx) - * 11111000 10000xxx (10xxxxxx 10xxxxxx 10xxxxxx) - * 11111100 100000xx (10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx) - */ - u2 = s[i + 1]; - if ((u & 0xFE) == 0xC0 || - (u == 0xE0 && (u2 & 0xE0) == 0x80) || - (u == 0xF0 && (u2 & 0xF0) == 0x80) || - (u == 0xF8 && (u2 & 0xF8) == 0x80) || - (u == 0xFC && (u2 & 0xFC) == 0x80)) - goto Lerr; // overlong combination - - for (uint j = 1; j != n; j++) - { - u = s[i + j]; - if ((u & 0xC0) != 0x80) - goto Lerr; // trailing bytes are 10xxxxxx - V = (V << 6) | (u & 0x3F); - } - if (!isValidDchar(V)) - goto Lerr; - i += n; - } - else - { - V = cast(dchar) u; - i++; - } - - idx = i; - return V; - - Lerr: - onUnicodeError("invalid UTF-8 sequence", i); - return V; // dummy return - } - -unittest -{ size_t i; - dchar c; - - debug(utf) printf("utf.decode.unittest\n"); - - static char[] s1 = "abcd"; - i = 0; - c = decode(s1, i); - assert(c == cast(dchar)'a'); - assert(i == 1); - c = decode(s1, i); - assert(c == cast(dchar)'b'); - assert(i == 2); - - static char[] s2 = "\xC2\xA9"; - i = 0; - c = decode(s2, i); - assert(c == cast(dchar)'\u00A9'); - assert(i == 2); - - static char[] s3 = "\xE2\x89\xA0"; - i = 0; - c = decode(s3, i); - assert(c == cast(dchar)'\u2260'); - assert(i == 3); - - static char[][] s4 = - [ "\xE2\x89", // too short - "\xC0\x8A", - "\xE0\x80\x8A", - "\xF0\x80\x80\x8A", - "\xF8\x80\x80\x80\x8A", - "\xFC\x80\x80\x80\x80\x8A", - ]; - - for (int j = 0; j < s4.length; j++) - { - try - { - i = 0; - c = decode(s4[j], i); - assert(0); - } - catch (Object o) - { - i = 23; - } - assert(i == 23); - } -} - -/********************************************************/ - -dchar decode(wchar[] s, inout size_t idx) - in - { - assert(idx >= 0 && idx < s.length); - } - out (result) - { - assert(isValidDchar(result)); - } - body - { - char[] msg; - dchar V; - size_t i = idx; - uint u = s[i]; - - if (u & ~0x7F) - { if (u >= 0xD800 && u <= 0xDBFF) - { uint u2; - - if (i + 1 == s.length) - { msg = "surrogate UTF-16 high value past end of string"; - goto Lerr; - } - u2 = s[i + 1]; - if (u2 < 0xDC00 || u2 > 0xDFFF) - { msg = "surrogate UTF-16 low value out of range"; - goto Lerr; - } - u = ((u - 0xD7C0) << 10) + (u2 - 0xDC00); - i += 2; - } - else if (u >= 0xDC00 && u <= 0xDFFF) - { msg = "unpaired surrogate UTF-16 value"; - goto Lerr; - } - else if (u == 0xFFFE || u == 0xFFFF) - { msg = "illegal UTF-16 value"; - goto Lerr; - } - else - i++; - } - else - { - i++; - } - - idx = i; - return cast(dchar)u; - - Lerr: - onUnicodeError(msg, i); - return cast(dchar)u; // dummy return - } - -/********************************************************/ - -dchar decode(dchar[] s, inout size_t idx) - in - { - assert(idx >= 0 && idx < s.length); - } - body - { - size_t i = idx; - dchar c = s[i]; - - if (!isValidDchar(c)) - goto Lerr; - idx = i + 1; - return c; - - Lerr: - onUnicodeError("invalid UTF-32 value", i); - return c; // dummy return - } - - -/* =================== Encode ======================= */ - -void encode(inout char[] s, dchar c) - in - { - assert(isValidDchar(c)); - } - body - { - char[] r = s; - - if (c <= 0x7F) - { - r ~= cast(char) c; - } - else - { - char[4] buf; - uint L; - - if (c <= 0x7FF) - { - buf[0] = cast(char)(0xC0 | (c >> 6)); - buf[1] = cast(char)(0x80 | (c & 0x3F)); - L = 2; - } - else if (c <= 0xFFFF) - { - buf[0] = cast(char)(0xE0 | (c >> 12)); - buf[1] = cast(char)(0x80 | ((c >> 6) & 0x3F)); - buf[2] = cast(char)(0x80 | (c & 0x3F)); - L = 3; - } - else if (c <= 0x10FFFF) - { - buf[0] = cast(char)(0xF0 | (c >> 18)); - buf[1] = cast(char)(0x80 | ((c >> 12) & 0x3F)); - buf[2] = cast(char)(0x80 | ((c >> 6) & 0x3F)); - buf[3] = cast(char)(0x80 | (c & 0x3F)); - L = 4; - } - else - { - assert(0); - } - r ~= buf[0 .. L]; - } - s = r; - } - -unittest -{ - debug(utf) printf("utf.encode.unittest\n"); - - char[] s = "abcd"; - encode(s, cast(dchar)'a'); - assert(s.length == 5); - assert(s == "abcda"); - - encode(s, cast(dchar)'\u00A9'); - assert(s.length == 7); - assert(s == "abcda\xC2\xA9"); - //assert(s == "abcda\u00A9"); // BUG: fix compiler - - encode(s, cast(dchar)'\u2260'); - assert(s.length == 10); - assert(s == "abcda\xC2\xA9\xE2\x89\xA0"); -} - -/********************************************************/ - -void encode(inout wchar[] s, dchar c) - in - { - assert(isValidDchar(c)); - } - body - { - wchar[] r = s; - - if (c <= 0xFFFF) - { - r ~= cast(wchar) c; - } - else - { - wchar[2] buf; - - buf[0] = cast(wchar) ((((c - 0x10000) >> 10) & 0x3FF) + 0xD800); - buf[1] = cast(wchar) (((c - 0x10000) & 0x3FF) + 0xDC00); - r ~= buf; - } - s = r; - } - -void encode(inout dchar[] s, dchar c) - in - { - assert(isValidDchar(c)); - } - body - { - s ~= c; - } - -/* =================== Validation ======================= */ - -void validate(char[] s) -{ - size_t len = s.length; - size_t i; - - for (i = 0; i < len; ) - { - decode(s, i); - } -} - -void validate(wchar[] s) -{ - size_t len = s.length; - size_t i; - - for (i = 0; i < len; ) - { - decode(s, i); - } -} - -void validate(dchar[] s) -{ - size_t len = s.length; - size_t i; - - for (i = 0; i < len; ) - { - decode(s, i); - } -} - -/* =================== Conversion to UTF8 ======================= */ - -char[] toUTF8(char[4] buf, dchar c) - in - { - assert(isValidDchar(c)); - } - body - { - if (c <= 0x7F) - { - buf[0] = cast(char) c; - return buf[0 .. 1]; - } - else if (c <= 0x7FF) - { - buf[0] = cast(char)(0xC0 | (c >> 6)); - buf[1] = cast(char)(0x80 | (c & 0x3F)); - return buf[0 .. 2]; - } - else if (c <= 0xFFFF) - { - buf[0] = cast(char)(0xE0 | (c >> 12)); - buf[1] = cast(char)(0x80 | ((c >> 6) & 0x3F)); - buf[2] = cast(char)(0x80 | (c & 0x3F)); - return buf[0 .. 3]; - } - else if (c <= 0x10FFFF) - { - buf[0] = cast(char)(0xF0 | (c >> 18)); - buf[1] = cast(char)(0x80 | ((c >> 12) & 0x3F)); - buf[2] = cast(char)(0x80 | ((c >> 6) & 0x3F)); - buf[3] = cast(char)(0x80 | (c & 0x3F)); - return buf[0 .. 4]; - } - assert(0); - } - -char[] toUTF8(char[] s) - in - { - validate(s); - } - body - { - return s; - } - -char[] toUTF8(wchar[] s) -{ - char[] r; - size_t i; - size_t slen = s.length; - - r.length = slen; - - for (i = 0; i < slen; i++) - { wchar c = s[i]; - - if (c <= 0x7F) - r[i] = cast(char)c; // fast path for ascii - else - { - r.length = i; - foreach (dchar c; s[i .. slen]) - { - encode(r, c); - } - break; - } - } - return r; -} - -char[] toUTF8(dchar[] s) -{ - char[] r; - size_t i; - size_t slen = s.length; - - r.length = slen; - - for (i = 0; i < slen; i++) - { dchar c = s[i]; - - if (c <= 0x7F) - r[i] = cast(char)c; // fast path for ascii - else - { - r.length = i; - foreach (dchar d; s[i .. slen]) - { - encode(r, d); - } - break; - } - } - return r; -} - -/* =================== Conversion to UTF16 ======================= */ - -wchar[] toUTF16(wchar[2] buf, dchar c) - in - { - assert(isValidDchar(c)); - } - body - { - if (c <= 0xFFFF) - { - buf[0] = cast(wchar) c; - return buf[0 .. 1]; - } - else - { - buf[0] = cast(wchar) ((((c - 0x10000) >> 10) & 0x3FF) + 0xD800); - buf[1] = cast(wchar) (((c - 0x10000) & 0x3FF) + 0xDC00); - return buf[0 .. 2]; - } - } - -wchar[] toUTF16(char[] s) -{ - wchar[] r; - size_t slen = s.length; - - r.length = slen; - r.length = 0; - for (size_t i = 0; i < slen; ) - { - dchar c = s[i]; - if (c <= 0x7F) - { - i++; - r ~= cast(wchar)c; - } - else - { - c = decode(s, i); - encode(r, c); - } - } - return r; -} - -wchar* toUTF16z(char[] s) -{ - wchar[] r; - size_t slen = s.length; - - r.length = slen + 1; - r.length = 0; - for (size_t i = 0; i < slen; ) - { - dchar c = s[i]; - if (c <= 0x7F) - { - i++; - r ~= cast(wchar)c; - } - else - { - c = decode(s, i); - encode(r, c); - } - } - r ~= "\000"; - return r.ptr; -} - -wchar[] toUTF16(wchar[] s) - in - { - validate(s); - } - body - { - return s; - } - -wchar[] toUTF16(dchar[] s) -{ - wchar[] r; - size_t slen = s.length; - - r.length = slen; - r.length = 0; - for (size_t i = 0; i < slen; i++) - { - encode(r, s[i]); - } - return r; -} - -/* =================== Conversion to UTF32 ======================= */ - -dchar[] toUTF32(char[] s) -{ - dchar[] r; - size_t slen = s.length; - size_t j = 0; - - r.length = slen; // r[] will never be longer than s[] - for (size_t i = 0; i < slen; ) - { - dchar c = s[i]; - if (c >= 0x80) - c = decode(s, i); - else - i++; // c is ascii, no need for decode - r[j++] = c; - } - return r[0 .. j]; -} - -dchar[] toUTF32(wchar[] s) -{ - dchar[] r; - size_t slen = s.length; - size_t j = 0; - - r.length = slen; // r[] will never be longer than s[] - for (size_t i = 0; i < slen; ) - { - dchar c = s[i]; - if (c >= 0x80) - c = decode(s, i); - else - i++; // c is ascii, no need for decode - r[j++] = c; - } - return r[0 .. j]; -} - -dchar[] toUTF32(dchar[] s) - in - { - validate(s); - } - body - { - return s; - } - -/* ================================ tests ================================== */ - -unittest -{ - debug(utf) printf("utf.toUTF.unittest\n"); - - char[] c; - wchar[] w; - dchar[] d; - - c = "hello"; - w = toUTF16(c); - assert(w == "hello"); - d = toUTF32(c); - assert(d == "hello"); - - c = toUTF8(w); - assert(c == "hello"); - d = toUTF32(w); - assert(d == "hello"); - - c = toUTF8(d); - assert(c == "hello"); - w = toUTF16(d); - assert(w == "hello"); - - - c = "hel\u1234o"; - w = toUTF16(c); - assert(w == "hel\u1234o"); - d = toUTF32(c); - assert(d == "hel\u1234o"); - - c = toUTF8(w); - assert(c == "hel\u1234o"); - d = toUTF32(w); - assert(d == "hel\u1234o"); - - c = toUTF8(d); - assert(c == "hel\u1234o"); - w = toUTF16(d); - assert(w == "hel\u1234o"); - - - c = "he\U0010AAAAllo"; - w = toUTF16(c); - //foreach (wchar c; w) printf("c = x%x\n", c); - //foreach (wchar c; cast(wchar[])"he\U0010AAAAllo") printf("c = x%x\n", c); - assert(w == "he\U0010AAAAllo"); - d = toUTF32(c); - assert(d == "he\U0010AAAAllo"); - - c = toUTF8(w); - assert(c == "he\U0010AAAAllo"); - d = toUTF32(w); - assert(d == "he\U0010AAAAllo"); - - c = toUTF8(d); - assert(c == "he\U0010AAAAllo"); - w = toUTF16(d); - assert(w == "he\U0010AAAAllo"); -} diff --git a/runtime/lib/common/tango/ldc.mak b/runtime/lib/common/tango/ldc.mak deleted file mode 100644 index c8503f91..00000000 --- a/runtime/lib/common/tango/ldc.mak +++ /dev/null @@ -1,178 +0,0 @@ -# Makefile to build the common D runtime library for LLVM -# Designed to work with GNU make -# Targets: -# make -# Same as make all -# make lib -# Build the common library -# make doc -# Generate documentation -# make clean -# Delete unneeded files created by build process - -LIB_TARGET_FULL=libtango-cc-tango.a -LIB_TARGET_BC_ONLY=libtango-cc-tango-bc-only.a -LIB_TARGET_C_ONLY=libtango-cc-tango-c-only.a -LIB_TARGET_SHARED=libtango-cc-tango-shared.so -LIB_MASK=libtango-cc-tango*.* - -CP=cp -f -RM=rm -f -MD=mkdir -p - -ADD_CFLAGS= -ADD_DFLAGS= - -#CFLAGS=-O3 $(ADD_CFLAGS) -CFLAGS=$(ADD_CFLAGS) - -#DFLAGS=-release -O3 -inline -w $(ADD_DFLAGS) -DFLAGS=-w $(ADD_DFLAGS) - -#TFLAGS=-O3 -inline -w $(ADD_DFLAGS) -TFLAGS=-w $(ADD_DFLAGS) - -DOCFLAGS=-version=DDoc - -CC=gcc -LC=llvm-ar rsv -LLINK=llvm-link -LCC=llc -CLC=ar rsv -DC=ldc -LLC=llvm-as - -INC_DEST=../../../tango -LIB_DEST=.. -DOC_DEST=../../../doc/tango - -.SUFFIXES: .s .S .c .cpp .d .ll .html .o .bc - -.s.o: - $(CC) -c $(CFLAGS) $< -o$@ - -.S.o: - $(CC) -c $(CFLAGS) $< -o$@ - -.c.o: - $(CC) -c $(CFLAGS) $< -o$@ - -.cpp.o: - g++ -c $(CFLAGS) $< -o$@ - -.d.o: - $(DC) -c $(DFLAGS) -Hf$*.di $< -of$@ -output-bc - -.ll.bc: - $(LLC) -f -o=$@ $< - -.d.html: - $(DC) -c -o- $(DOCFLAGS) -Df$*.html $< -# $(DC) -c -o- $(DOCFLAGS) -Df$*.html tango.ddoc $< - -targets : lib sharedlib doc -all : lib sharedlib doc -tango : lib -lib : tango.lib tango.bclib tango.clib -sharedlib : tango.sharedlib -doc : tango.doc - -###################################################### - -OBJ_CORE_BC= \ - core/BitManip.bc \ - core/Exception.bc \ - core/Memory.bc \ - core/Runtime.bc \ - core/Thread.bc -# core/ThreadASM.o - -OBJ_CORE_O= \ - core/BitManip.o \ - core/Exception.o \ - core/Memory.o \ - core/Runtime.o \ - core/Thread.o - -OBJ_STDC= \ - stdc/wrap.o -# stdc/wrap.bc - -OBJ_STDC_POSIX= \ - stdc/posix/pthread_darwin.o - -ALL_OBJS_BC= \ - $(OBJ_CORE_BC) -# $(OBJ_STDC) -# $(OBJ_STDC_POSIX) - -ALL_OBJS_O= \ - $(OBJ_CORE_O) \ - $(OBJ_STDC) -# $(OBJ_STDC_POSIX) - -###################################################### - -DOC_CORE= \ - core/BitManip.html \ - core/Exception.html \ - core/Memory.html \ - core/Runtime.html \ - core/Thread.html - - -ALL_DOCS= - -###################################################### - -tango.bclib : $(LIB_TARGET_BC_ONLY) -tango.lib : $(LIB_TARGET_FULL) -tango.clib : $(LIB_TARGET_C_ONLY) -tango.sharedlib : $(LIB_TARGET_SHARED) - -$(LIB_TARGET_BC_ONLY) : $(ALL_OBJS_O) - $(RM) $@ - $(LC) $@ $(ALL_OBJS_BC) - - -$(LIB_TARGET_FULL) : $(ALL_OBJS_O) - $(RM) $@ - $(CLC) $@ $(ALL_OBJS_O) - - -$(LIB_TARGET_C_ONLY) : $(OBJ_STDC) - $(RM) $@ - $(CLC) $@ $(OBJ_STDC) - - -$(LIB_TARGET_SHARED) : $(ALL_OBJS_O) - $(RM) $@ - $(CC) -shared -o $@ $(ALL_OBJS_O) - - -tango.doc : $(ALL_DOCS) - echo Documentation generated. - -###################################################### - -### stdc/posix - -#stdc/posix/pthread_darwin.o : stdc/posix/pthread_darwin.d -# $(DC) -c $(DFLAGS) stdc/posix/pthread_darwin.d -of$@ - -###################################################### - -clean : - find . -name "*.di" | xargs $(RM) - $(RM) $(ALL_OBJS_BC) - $(RM) $(ALL_OBJS_O) - $(RM) $(ALL_DOCS) - find . -name "$(LIB_MASK)" | xargs $(RM) - -install : - $(MD) $(INC_DEST) - find . -name "*.di" -exec cp -f {} $(INC_DEST)/{} \; - $(MD) $(DOC_DEST) - find . -name "*.html" -exec cp -f {} $(DOC_DEST)/{} \; - $(MD) $(LIB_DEST) - find . -name "$(LIB_MASK)" -exec cp -f {} $(LIB_DEST)/{} \; diff --git a/runtime/lib/gc/basic/ldc.mak b/runtime/lib/gc/basic/ldc.mak deleted file mode 100644 index 57e4b1df..00000000 --- a/runtime/lib/gc/basic/ldc.mak +++ /dev/null @@ -1,127 +0,0 @@ -# Makefile to build the garbage collector D library for LDC -# Designed to work with GNU make -# Targets: -# make -# Same as make all -# make lib -# Build the garbage collector library -# make doc -# Generate documentation -# make clean -# Delete unneeded files created by build process - -LIB_TARGET_BC=libtango-gc-basic-bc.a -LIB_TARGET_NATIVE=libtango-gc-basic.a -LIB_TARGET_SHARED=libtango-gc-basic-shared.so -LIB_MASK=libtango-gc-basic*.* - -CP=cp -f -RM=rm -f -MD=mkdir -p - -ADD_CFLAGS= -ADD_DFLAGS= - -#CFLAGS=-O3 $(ADD_CFLAGS) -CFLAGS=$(ADD_CFLAGS) - -#DFLAGS=-release -O3 -inline -w -nofloat $(ADD_DFLAGS) -DFLAGS=-w -disable-invariants $(ADD_DFLAGS) - -#TFLAGS=-O3 -inline -w -nofloat $(ADD_DFLAGS) -TFLAGS=-w -disable-invariants $(ADD_DFLAGS) - -DOCFLAGS=-version=DDoc - -CC=gcc -LC=llvm-ar rsv -LCC=llc -LLINK=llvm-link -CLC=ar rsv -LD=llvm-ld -DC=ldc - -LIB_DEST=.. - -.SUFFIXES: .s .S .c .cpp .d .html .o .bc - -.s.o: - $(CC) -c $(CFLAGS) $< -o$@ - -.S.o: - $(CC) -c $(CFLAGS) $< -o$@ - -.c.o: - $(CC) -c $(CFLAGS) $< -o$@ - -.cpp.o: - g++ -c $(CFLAGS) $< -o$@ - -.d.o: - $(DC) -c $(DFLAGS) $< -of$@ -output-bc - -.d.html: - $(DC) -c -o- $(DOCFLAGS) -Df$*.html $< -# $(DC) -c -o- $(DOCFLAGS) -Df$*.html dmd.ddoc $< - -targets : lib sharedlib doc -all : lib sharedlib doc -lib : basic.lib basic.nlib -sharedlib : basic.sharedlib -doc : basic.doc - -###################################################### - -ALL_OBJS_BC= \ - gc.bc \ - gcalloc.bc \ - gcbits.bc \ - gcstats.bc \ - gcx.bc - -ALL_OBJS_O= \ - gc.o \ - gcalloc.o \ - gcbits.o \ - gcstats.o \ - gcx.o - -###################################################### - -ALL_DOCS= - -###################################################### - -basic.lib : $(LIB_TARGET_BC) -basic.nlib : $(LIB_TARGET_NATIVE) -basic.sharedlib : $(LIB_TARGET_SHARED) - -$(LIB_TARGET_BC) : $(ALL_OBJS_O) - $(RM) $@ - $(LC) $@ $(ALL_OBJS_BC) - - -$(LIB_TARGET_NATIVE) : $(ALL_OBJS_O) - $(RM) $@ - $(CLC) $@ $(ALL_OBJS_O) - - -$(LIB_TARGET_SHARED) : $(ALL_OBJS_O) - $(RM) $@ - $(CC) -shared -o $@ $(ALL_OBJS_O) - -basic.doc : $(ALL_DOCS) - echo No documentation available. - -###################################################### - -clean : - find . -name "*.di" | xargs $(RM) - $(RM) $(ALL_OBJS_BC) - $(RM) $(ALL_OBJS_O) - $(RM) $(ALL_DOCS) - $(RM) $(LIB_MASK) - -install : - $(MD) $(LIB_DEST) - $(CP) $(LIB_MASK) $(LIB_DEST)/. diff --git a/runtime/lib/gc/stub/ldc.mak b/runtime/lib/gc/stub/ldc.mak deleted file mode 100644 index 8b80261d..00000000 --- a/runtime/lib/gc/stub/ldc.mak +++ /dev/null @@ -1,96 +0,0 @@ -# Makefile to build the garbage collector D library for Posix -# Designed to work with GNU make -# Targets: -# make -# Same as make all -# make lib -# Build the garbage collector library -# make doc -# Generate documentation -# make clean -# Delete unneeded files created by build process - -LIB_TARGET=libtango-gc-stub.a -LIB_MASK=libtango-gc-stub*.a - -CP=cp -f -RM=rm -f -MD=mkdir -p - -ADD_CFLAGS= -ADD_DFLAGS= - -#CFLAGS=-O3 $(ADD_CFLAGS) -CFLAGS=$(ADD_CFLAGS) - -#DFLAGS=-release -O3 -inline -w $(ADD_DFLAGS) -DFLAGS=$(ADD_DFLAGS) - -#TFLAGS=-O3 -inline $(ADD_DFLAGS) -TFLAGS=$(ADD_DFLAGS) - -DOCFLAGS=-version=DDoc - -CC=gcc -LC=llvm-ar rsv -DC=ldc - -LIB_DEST=.. - -.SUFFIXES: .s .S .c .cpp .d .html .o .bc - -.s.o: - $(CC) -c $(CFLAGS) $< -o$@ - -.S.o: - $(CC) -c $(CFLAGS) $< -o$@ - -.c.o: - $(CC) -c $(CFLAGS) $< -o$@ - -.cpp.o: - g++ -c $(CFLAGS) $< -o$@ - -.d.bc: - $(DC) -c $(DFLAGS) $< -of$@ - -.d.html: - $(DC) -c -o- $(DOCFLAGS) -Df$*.html $< -# $(DC) -c -o- $(DOCFLAGS) -Df$*.html dmd.ddoc $< - -targets : lib doc -all : lib doc -lib : stub.lib -doc : stub.doc - -###################################################### - -ALL_OBJS= \ - gc.bc - -###################################################### - -ALL_DOCS= - -###################################################### - -stub.lib : $(LIB_TARGET) - -$(LIB_TARGET) : $(ALL_OBJS) - $(RM) $@ - $(LC) $@ $(ALL_OBJS) - -stub.doc : $(ALL_DOCS) - echo No documentation available. - -###################################################### - -clean : - find . -name "*.di" | xargs $(RM) - $(RM) $(ALL_OBJS) - $(RM) $(ALL_DOCS) - $(RM) $(LIB_MASK) - -install : - $(MD) $(LIB_DEST) - $(CP) $(LIB_MASK) $(LIB_DEST)/. diff --git a/runtime/lib/ldc-posix.mak b/runtime/lib/ldc-posix.mak deleted file mode 100644 index bd756f76..00000000 --- a/runtime/lib/ldc-posix.mak +++ /dev/null @@ -1,88 +0,0 @@ -# Makefile to build the composite D runtime library for Linux -# Designed to work with GNU make -# Targets: -# make -# Same as make all -# make lib -# Build the runtime library -# make doc -# Generate documentation -# make clean -# Delete unneeded files created by build process - -LIB_TARGET=libtango-base-ldc.a -LIB_MASK=libtango-base-ldc*.a -LIB_TARGET_C=libtango-base-c-ldc.a -LIB_MASK_C=libtango-base-c-ldc*.a -LIB_NAME_NATIVE=libtango-base-ldc-native -LIB_TARGET_NATIVE=$(LIB_NAME_NATIVE).a - -DIR_CC=./common/tango -DIR_RT=../../runtime/internal -DIR_GC=./gc/basic -#DIR_GC=./gc/stub - -CP=cp -f -RM=rm -f -MD=mkdir -p - -CC=gcc -LC=llvm-ar rsv -CLC=ar rsv -DC=ldc -LLVMLINK=llvm-link -LLC=llc - -ADD_CFLAGS= -#ADD_DFLAGS= -ADD_DFLAGS=-g -I`pwd`/common/ - -targets : lib sharedlib doc -all : lib sharedlib doc - -###################################################### - -ALL_OBJS= - -###################################################### - -ALL_DOCS= - -###################################################### - -lib : $(ALL_OBJS) - make -C $(DIR_CC) -fldc.mak lib DC=$(DC) ADD_DFLAGS="$(ADD_DFLAGS)" ADD_CFLAGS="$(ADD_CFLAGS)" - make -C $(DIR_RT) -fldc.mak lib DC=$(DC) ADD_DFLAGS="$(ADD_DFLAGS)" ADD_CFLAGS="$(ADD_CFLAGS)" - make -C $(DIR_GC) -fldc.mak lib DC=$(DC) ADD_DFLAGS="$(ADD_DFLAGS)" ADD_CFLAGS="$(ADD_CFLAGS)" - # could link the three parts into one here, but why should we - -sharedlib : $(ALL_OBJS) - make -C $(DIR_CC) -fldc.mak sharedlib DC=$(DC) ADD_DFLAGS="$(ADD_DFLAGS)" ADD_CFLAGS="$(ADD_CFLAGS)" - make -C $(DIR_RT) -fldc.mak sharedlib DC=$(DC) ADD_DFLAGS="$(ADD_DFLAGS)" ADD_CFLAGS="$(ADD_CFLAGS)" - make -C $(DIR_GC) -fldc.mak sharedlib DC=$(DC) ADD_DFLAGS="$(ADD_DFLAGS)" ADD_CFLAGS="$(ADD_CFLAGS)" - # could link the three parts into one here, but why should we - -doc : $(ALL_DOCS) - make -C $(DIR_CC) -fldc.mak doc - make -C $(DIR_RT) -fldc.mak doc - make -C $(DIR_GC) -fldc.mak doc - -###################################################### - -clean : - find . -name "*.di" | xargs $(RM) - $(RM) $(ALL_OBJS) - $(RM) $(ALL_DOCS) - make -C $(DIR_CC) -fldc.mak clean - make -C $(DIR_RT) -fldc.mak clean - make -C $(DIR_GC) -fldc.mak clean - $(RM) $(LIB_MASK) - $(RM) $(LIB_MASK_C) - $(RM) $(LIB_NAME_NATIVE)* - -install : - make -C $(DIR_CC) -fldc.mak install - make -C $(DIR_RT) -fldc.mak install - make -C $(DIR_GC) -fldc.mak install - $(CP) $(LIB_MASK) $(LIB_DEST)/. - $(CP) $(LIB_MASK_C) $(LIB_DEST)/.