sunnycase 6 лет назад
Родитель
Сommit
f6180b917d

+ 2 - 0
CMakeLists.txt

@@ -23,6 +23,8 @@ set(CMAKE_CXX_STANDARD 17)
 if (MSVC)
     add_definitions(/D_SILENCE_ALL_CXX17_DEPRECATION_WARNINGS /DNOMINMAX /DUNICODE)
     add_compile_options(/wd4102)
+    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi")
+    set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF")
 else()
     add_compile_options(-Wno-multichar)
 endif()

+ 13 - 2
src/Chino.Kernel/Program.cs

@@ -22,13 +22,18 @@ namespace Chino.Kernel
             terminal.Foreground(TerminalColor.White)
                 .Write("Free: ").Foreground(TerminalColor.Green).Write(Memory.MemoryManager.GetFreeMemorySize().ToString())
                 .Foreground(TerminalColor.White).WriteLine(" Bytes");
-            terminal.WriteLine(string.Empty).Reset();
+            terminal.WriteLine().Reset();
 
             var l = new List<int> { 1, 2, 3 };
+            foreach (var item in l)
+                terminal.Write(item + ", ");
+            l.Clear();
+            terminal.WriteLine();
+            l.Add(4);
             foreach (var item in l)
                 terminal.Write(item + ", ");
 
-            terminal.WriteLine(string.Empty);
+            terminal.WriteLine();
             terminal.Ready();
         }
     }
@@ -55,6 +60,12 @@ namespace Chino.Kernel
             return this;
         }
 
+        public Terminal WriteLine()
+        {
+            Debug.WriteLine(string.Empty);
+            return this;
+        }
+
         public Terminal Reset()
         {
             Debug.Write("\u001b[0m");

+ 5 - 1
src/Native/natsu.fcall.cpp

@@ -50,7 +50,11 @@ void Array::_s_Copy(gc_obj_ref<Array> sourceArray, Int32 sourceIndex, gc_obj_ref
 
 gc_ref<Byte> Array::_s_GetRawArrayGeometry(gc_obj_ref<Array> array, gc_ref<UInt32> numComponents, gc_ref<UInt32> elementSize, gc_ref<Int32> lowerBound, ::natsu::gc_ref<Boolean> containsGCPointers)
 {
-    throw_exception<NotImplementedException>();
+    *numComponents = (UInt32)Array::GetLength(array, 0);
+    *elementSize = array.header().vtable_->ElementSize;
+    *lowerBound = Array::GetLowerBound(array, 0);
+    *containsGCPointers = true;
+    return array.cast<RawSzArrayData>()->Data;
 }
 
 void Buffer::_s_Memcpy(gc_ptr<Byte> dest, gc_ptr<Byte> src, Int32 len)

+ 7 - 0
src/Native/natsu.typedef.h

@@ -104,6 +104,13 @@ struct vtable_holder
 
 typedef struct _vtable
 {
+    uint32_t ElementSize;
+
+    constexpr _vtable()
+        : ElementSize(0)
+    {
+    }
+
     virtual void dummy() const noexcept {}
 
     template <class TFunc>

+ 13 - 2
src/Natsu.Compiler/Program.cs

@@ -18,8 +18,8 @@ namespace Natsu.Compiler
             @"..\..\..\..\..\out\bin\netcoreapp3.0\Chino.Core.dll",
             //@"..\..\..\..\..\out\bin\netcoreapp3.0\Chino.Chip.K210.dll",
             @"..\..\..\..\..\out\bin\netcoreapp3.0\Chino.Chip.Emulator.dll",
-            @"..\..\..\..\..\out\bin\netcoreapp3.0\System.Private.CorLib.dll",
-            @"..\..\..\..\..\out\bin\netcoreapp3.0\System.Collections.dll",
+            //@"..\..\..\..\..\out\bin\netcoreapp3.0\System.Private.CorLib.dll",
+            //@"..\..\..\..\..\out\bin\netcoreapp3.0\System.Collections.dll",
             //@"..\..\..\..\..\out\bin\netcoreapp3.0\System.Memory.dll",
             //@"..\..\..\..\..\out\bin\netcoreapp3.0\System.Runtime.dll",
             //@"..\..\..\..\..\out\bin\netcoreapp3.0\System.Runtime.Extensions.dll",
@@ -813,6 +813,8 @@ namespace Natsu.Compiler
 
             writer.Ident(ident).WriteLine("{");
 
+            WriteVTableTypeInfo(writer, type, ident + 1);
+            writer.WriteLine();
 
             foreach (var method in type.TypeDef.Methods)
             {
@@ -844,6 +846,15 @@ namespace Natsu.Compiler
             writer.Ident(ident).WriteLine("}");
         }
 
+        private void WriteVTableTypeInfo(StreamWriter writer, TypeDesc type, int ident)
+        {
+            // array
+            if (type.TypeDef.FullName == "System.SZArray`1")
+            {
+                writer.Ident(ident).WriteLine("ElementSize = sizeof(T);");
+            }
+        }
+
         private void WriteVTableOverrideImpl(StreamWriter writer, TypeDesc type, int ident)
         {
             writer.Ident(ident).WriteLine("template <class TFunc>");