diff --git a/bdsx/bdsx.vcxproj b/bdsx/bdsx.vcxproj
index 484efef..0e45070 100644
--- a/bdsx/bdsx.vcxproj
+++ b/bdsx/bdsx.vcxproj
@@ -137,6 +137,7 @@ echo #define BUILD_TIME "%25date%-%time2:.=%">"gen/buildtime.h"
+
@@ -162,6 +163,7 @@ echo #define BUILD_TIME "%25date%-%time2:.=%">"gen/buildtime.h"
+
diff --git a/bdsx/bdsx.vcxproj.filters b/bdsx/bdsx.vcxproj.filters
index 86874e6..923355d 100644
--- a/bdsx/bdsx.vcxproj.filters
+++ b/bdsx/bdsx.vcxproj.filters
@@ -17,6 +17,7 @@
+
@@ -35,6 +36,7 @@
+
diff --git a/bdsx/main.cpp b/bdsx/main.cpp
index 79f4f32..0451c85 100644
--- a/bdsx/main.cpp
+++ b/bdsx/main.cpp
@@ -12,6 +12,7 @@
#include "uvasync.h"
#include "mtqueue.h"
#include "gen/version.h"
+#include "vcstring.h"
#include
#include
@@ -151,11 +152,6 @@ BOOL WINAPI DllMain(
namespace
{
- float tester(double a, float b, int64_t c) noexcept
- {
- return (float)a;
- }
-
void trycatch(void* param, void(*func)(void*), void(*_catch)(void*, pcstr)) noexcept
{
try
@@ -264,7 +260,6 @@ void nodegate::initNativeModule(void* exports_raw) noexcept
});
cgate.setMethod(u"nodeLoopOnce", nodegate::loopOnce);
cgate.set(u"nodeLoop", VoidPointer::make(nodegate::loop));
- cgate.set(u"tester", VoidPointer::make(tester));
cgate.setMethod(u"allocExecutableMemory", [](uint64_t size, uint64_t align) {
hook::ExecutableAllocator* alloc = hook::ExecutableAllocator::getInstance();
@@ -272,6 +267,9 @@ void nodegate::initNativeModule(void* exports_raw) noexcept
ptr->setAddressRaw(alloc->alloc(size, max(align, 1)));
return ptr;
});
+
+ cgate.set(u"toWide", VoidPointer::make(String_toWide));
+ cgate.set(u"toUtf8", VoidPointer::make(String_toUtf8));
}
{
diff --git a/bdsx/staticpointer.cpp b/bdsx/staticpointer.cpp
index a773be1..f93dfee 100644
--- a/bdsx/staticpointer.cpp
+++ b/bdsx/staticpointer.cpp
@@ -3,93 +3,13 @@
#include "nativepointer.h"
#include "encoding.h"
+#include "vcstring.h"
#include
#include
using namespace kr;
-struct Ucrtbase
-{
- void*(*malloc)(size_t size);
- void(*free)(void* ptr);
-
- Ucrtbase() noexcept
- {
- HMODULE dll = GetModuleHandleW(L"ucrtbase.dll");
- _assert(dll != nullptr);
- malloc = (autoptr)GetProcAddress(dll, "malloc");
- free = (autoptr)GetProcAddress(dll, "free");
- }
-};
-namespace
-{
- Ucrtbase ucrtbase;
-
- void* allocate16(size_t size) noexcept {
- if (size >= 0x1000) {
- uintptr_t res = (uintptr_t)ucrtbase.malloc(size+0x27);
- if (res == 0) return nullptr;
- void** out = (void**)((res + 0x27) & (~0x1f));
- out[-1] = (void*)res;
- return out;
- }
- else {
- return ucrtbase.malloc(size);
- }
- }
-
- void free16(void* p, size_t size) noexcept {
- if (size >= 0x1000) {
- p = ((void**)p)[-1];
- }
- ucrtbase.free(p);
- }
-}
-
-struct String
-{
- union
- {
- char buffer[16];
- char* pointer;
- };
- size_t size;
- size_t capacity;
-
- char* data() noexcept
- {
- if (capacity >= 0x10) return pointer;
- else return buffer;
- }
- void assign(Text text) noexcept
- {
- size_t nsize = text.size();
- char* dest;
- if (nsize > capacity)
- {
- if (capacity >= 0x10) free16(pointer, capacity);
- capacity = nsize;
- dest = pointer = (char*)allocate16(nsize + 1);
- if (dest == nullptr)
- {
- memcpy(buffer, "[out of memory]", 16);
- capacity = 15;
- size = 15;
- return;
- }
- }
- else
- {
- dest = data();
- }
- memcpy(dest, text.data(), nsize);
- dest[nsize] = '\0';
- size = nsize;
- }
-};
-
-
ATTR_NORETURN void accessViolation(const void* address) throws(JsException)
{
throw JsException((Text16)(TSZ16() << u"Access Violation: " << address));
@@ -252,7 +172,7 @@ JsValue StaticPointer::getBuffer(int bytes, int offset) throws(JsException)
}
TText16 StaticPointer::getCxxString(int offset, int encoding) throws(JsException)
{
- String* str = (String*)(m_address + offset);
+ String* str = (String*)(m_address + offset);
TText16 text;
try
{
@@ -413,7 +333,7 @@ void StaticPointer::setBuffer(JsValue buffer, int offset) throws(JsException)
}
void StaticPointer::setCxxString(Text16 text, int offset, int encoding) throws(JsException)
{
- String* str = (String*)(m_address + offset);
+ String* str = (String*)(m_address + offset);
TSZ utf8;
try
{
@@ -702,7 +622,6 @@ void StaticPointer::_setas(T value, int offset) throws(JsException)
}
}
-
AllocatedPointer::AllocatedPointer(const kr::JsArguments& args) noexcept
:JsObjectT(args)
{
diff --git a/bdsx/staticpointer.h b/bdsx/staticpointer.h
index 35c4caa..6d637a4 100644
--- a/bdsx/staticpointer.h
+++ b/bdsx/staticpointer.h
@@ -3,6 +3,7 @@
#include "voidpointer.h"
class NativePointer;
+template struct String;
class StaticPointer :public kr::JsObjectT
{
diff --git a/bdsx/vcstring.cpp b/bdsx/vcstring.cpp
new file mode 100644
index 0000000..ed803cb
--- /dev/null
+++ b/bdsx/vcstring.cpp
@@ -0,0 +1,93 @@
+#include "stdafx.h"
+#include "vcstring.h"
+
+#include
+
+using namespace kr;
+
+struct Ucrtbase
+{
+ void* (*malloc)(size_t size);
+ void(*free)(void* ptr);
+
+ Ucrtbase() noexcept
+ {
+ HMODULE dll = GetModuleHandleW(L"ucrtbase.dll");
+ _assert(dll != nullptr);
+ malloc = (autoptr)GetProcAddress(dll, "malloc");
+ free = (autoptr)GetProcAddress(dll, "free");
+ }
+};
+namespace {
+ Ucrtbase ucrtbase;
+}
+
+const char String::ERRMSG[BUF_SIZE] = "[out of memory]";
+const char16_t String::ERRMSG[BUF_SIZE] = u"[OOMem]";
+
+template
+CHR* String::data() noexcept {
+ if (capacity >= BUF_SIZE) return pointer;
+ else return buffer;
+}
+template
+CHR* String::resize(size_t nsize) noexcept {
+ if (nsize > capacity)
+ {
+ if (capacity >= BUF_SIZE) String_free16(pointer, capacity);
+ capacity = nsize;
+ pointer = (CHR*)String_allocate16(nsize + 1);
+ if (pointer == nullptr)
+ {
+ memcpy(buffer, "[out of memory]", 16);
+ capacity = BUF_SIZE-1;
+ size = BUF_SIZE-1;
+ }
+ return pointer;
+ }
+ else
+ {
+ return data();
+ }
+}
+template
+void String::assign(kr::Text text) noexcept {
+ size_t nsize = text.size();
+ CHR* dest = resize(nsize);
+ memcpy(dest, text.data(), nsize);
+ dest[nsize] = (CHR)'\0';
+ size = nsize;
+}
+
+template String;
+template String;
+
+void* String_allocate16(size_t size) noexcept {
+ if (size >= 0x1000) {
+ uintptr_t res = (uintptr_t)ucrtbase.malloc(size + 0x27);
+ if (res == 0) return nullptr;
+ void** out = (void**)((res + 0x27) & (~0x1f));
+ out[-1] = (void*)res;
+ return out;
+ }
+ else {
+ return ucrtbase.malloc(size);
+ }
+}
+
+void String_free16(void* p, size_t size) noexcept {
+ if (size >= 0x1000) {
+ p = ((void**)p)[-1];
+ }
+ ucrtbase.free(p);
+}
+String* String_toWide(String* out_str, StringSpan* in_str) noexcept {
+ Utf8ToUtf16 cvt = Text(in_str->data, in_str->size);
+ out_str->init(cvt);
+ return out_str;
+}
+String* String_toUtf8(String* out_str, StringSpan* in_str) noexcept {
+ Utf16ToUtf8 cvt = Text16(in_str->data, in_str->size);
+ out_str->init(cvt);
+ return out_str;
+}
diff --git a/bdsx/vcstring.h b/bdsx/vcstring.h
new file mode 100644
index 0000000..cf100e9
--- /dev/null
+++ b/bdsx/vcstring.h
@@ -0,0 +1,51 @@
+#pragma once
+
+void* String_allocate16(size_t size) noexcept;
+void String_free16(void* p, size_t size) noexcept;
+
+template
+struct String {
+ static constexpr size_t BUF_SIZE = 16 / sizeof(CHR);
+ static const CHR ERRMSG[BUF_SIZE];
+
+ union {
+ CHR buffer[BUF_SIZE];
+ CHR* pointer;
+ };
+ size_t size;
+ size_t capacity;
+
+ CHR* data() noexcept;
+ CHR* resize(size_t nsize) noexcept;
+ void assign(kr::Text text) noexcept;
+
+ template
+ void init(const kr::HasCopyTo &text) noexcept {
+ size_t sz = text.size();
+
+ if (sz < BUF_SIZE) {
+ size = sz;
+ capacity = BUF_SIZE-1;
+ text.copyTo(buffer);
+ buffer[sz] = (CHR)'\0';
+ }
+ else {
+ pointer = (CHR*)String_allocate16(sz*sizeof(CHR) + sizeof(CHR));
+ text.copyTo(pointer);
+ pointer[sz] = (CHR)'\0';
+ capacity = size = sz;
+ }
+ }
+};
+
+template
+struct StringSpan {
+ size_t size;
+ const CHR* data;
+};
+
+String* String_toWide(String* out_str, StringSpan* in_str) noexcept;
+String* String_toUtf8(String* out_str, StringSpan* in_str) noexcept;
+
+extern template String;
+extern template String;
diff --git a/bdsx/version.bat b/bdsx/version.bat
index ffb8742..48e1c14 100644
--- a/bdsx/version.bat
+++ b/bdsx/version.bat
@@ -1,2 +1,2 @@
-set BDSX_CORE_VERSION=1.0.9.3
+set BDSX_CORE_VERSION=1.0.10.0