diff --git a/.github/workflows/es-actions.yml b/.github/workflows/es-actions.yml
index 5158b9b85..a435f7674 100644
--- a/.github/workflows/es-actions.yml
+++ b/.github/workflows/es-actions.yml
@@ -174,6 +174,61 @@ jobs:
CC=clang CXX=clang++ cmake -H. -Bout/release -DESCARGOT_ARCH=aarch64 -DESCARGOT_HOST=linux -DESCARGOT_MODE=release -DESCARGOT_TEMPORAL=ON -DESCARGOT_TCO=ON -DESCARGOT_TEST=ON -DESCARGOT_OUTPUT=shell -GNinja
ninja -Cout/release
python3 ./tools/run-tests.py --engine="./out/release/escargot" new-es
+ test-on-windows-clang-cl:
+ runs-on: windows-2022
+ strategy:
+ matrix:
+ # clang-cl with cannot generate c++ exception code well
+ # if clang-cl bug fixed, we can add x64
+ arch: [
+ {cpu: "x86", flag: "-m32"}
+ # , {cpu: "x64", flag: ""}
+ ]
+ steps:
+ - name: Set git cllf config
+ run: |
+ git config --global core.autocrlf input
+ git config --global core.eol lf
+ - uses: actions/checkout@v3
+ with:
+ submodules: true
+ - uses: szenius/set-timezone@v1.2
+ with:
+ timezoneWindows: "Pacific Standard Time"
+ - uses: lukka/get-cmake@latest
+ - uses: GuillaumeFalourd/setup-windows10-sdk-action@v1.11
+ with:
+ sdk-version: 20348
+ - uses: actions/setup-python@v4
+ with:
+ python-version: '3.11'
+ - name: Install msvc redist package
+ run: |
+ (new-object System.Net.WebClient).DownloadFile('https://github.com/abbodi1406/vcredist/releases/download/v0.73.0/VisualCppRedist_AIO_x86_x64.exe','VisualCppRedist_AIO_x86_x64.exe')
+ .\VisualCppRedist_AIO_x86_x64.exe /y
+ - uses: ilammy/msvc-dev-cmd@v1.12.1
+ with:
+ arch: ${{ matrix.arch.cpu }}
+ sdk: "10.0.20348.0"
+ - name: Build ${{ matrix.arch.cpu }} Release
+ run: |
+ CMake -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_SYSTEM_VERSION:STRING="10.0" -DCMAKE_SYSTEM_PROCESSOR=${{ matrix.arch.cpu }} -DESCARGOT_ARCH=${{ matrix.arch.cpu }} -DESCARGOT_MODE=release -Bout/ -DESCARGOT_HOST=windows -DESCARGOT_OUTPUT=shell -DESCARGOT_LIBICU_SUPPORT=ON -DESCARGOT_LIBICU_SUPPORT_WITH_DLOPEN=NO -DESCARGOT_THREADING=ON -DESCARGOT_TCO=ON -DESCARGOT_TEST=ON -G Ninja -DCMAKE_C_COMPILER=clang-cl -DCMAKE_CXX_COMPILER=clang-cl -DCMAKE_BUILD_TYPE=release -DCMAKE_C_FLAGS="${{ matrix.arch.flag }}" -DCMAKE_CXX_FLAGS="${{ matrix.arch.flag }}"
+ CMake --build out/ --config Release
+ - name: Run octane
+ run: |
+ copy test\octane\*.js
+ dir
+ .\out\escargot.exe run.js
+ # clang-cl with cannot generate c++ exception code well. if clang-cl bug fixed, we can enable test262
+ # - name: Run test262
+ # run: |
+ # set GC_FREE_SPACE_DIVISOR=1
+ # pip install chardet
+ # python tools\run-tests.py --engine=%cd%\out\escargot.exe test262 --extra-arg="--skip Temporal --skip intl402 --skip Atomics"
+ # shell: cmd
+ - if: ${{ failure() }}
+ uses: mxschmitt/action-tmate@v3
+ timeout-minutes: 15
test-on-windows-x86-x64:
runs-on: windows-2022
@@ -208,7 +263,7 @@ jobs:
sdk: "10.0.20348.0"
- name: Build ${{ matrix.arch }} Release
run: |
- CMake -G "Visual Studio 16 2019" -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_SYSTEM_VERSION:STRING="10.0" -DCMAKE_SYSTEM_PROCESSOR=${{ matrix.arch }} -DESCARGOT_ARCH=${{ matrix.arch }} -DESCARGOT_MODE=release -Bout/ -DESCARGOT_HOST=windows -DESCARGOT_OUTPUT=shell -DESCARGOT_LIBICU_SUPPORT=ON -DESCARGOT_LIBICU_SUPPORT_WITH_DLOPEN=OFF -DESCARGOT_THREADING=ON -DESCARGOT_TCO=ON -DESCARGOT_TEST=ON -G Ninja -DCMAKE_C_COMPILER=cl -DCMAKE_CXX_COMPILER=cl -DCMAKE_BUILD_TYPE=release
+ CMake -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_SYSTEM_VERSION:STRING="10.0" -DCMAKE_SYSTEM_PROCESSOR=${{ matrix.arch }} -DESCARGOT_ARCH=${{ matrix.arch }} -DESCARGOT_MODE=release -Bout/ -DESCARGOT_HOST=windows -DESCARGOT_OUTPUT=shell -DESCARGOT_LIBICU_SUPPORT=ON -DESCARGOT_LIBICU_SUPPORT_WITH_DLOPEN=OFF -DESCARGOT_THREADING=ON -DESCARGOT_TCO=ON -DESCARGOT_TEST=ON -G Ninja -DCMAKE_C_COMPILER=cl -DCMAKE_CXX_COMPILER=cl -DCMAKE_BUILD_TYPE=release
CMake --build out/ --config Release
# windows internal ICU doesn't support Temporal and intl402 well
# github action windows runner only have 2 CPUs. that's why I disable Atomics(timeout occured with some tests)
@@ -226,6 +281,44 @@ jobs:
- if: ${{ failure() }}
uses: mxschmitt/action-tmate@v3
timeout-minutes: 15
+
+ build-on-windows-x64-uwp-x86-shared:
+ runs-on: windows-2022
+ steps:
+ - name: Set git cllf config
+ run: |
+ git config --global core.autocrlf input
+ git config --global core.eol lf
+ - uses: actions/checkout@v3
+ with:
+ submodules: true
+ - uses: lukka/get-cmake@latest
+ - uses: GuillaumeFalourd/setup-windows10-sdk-action@v1.11
+ with:
+ sdk-version: 20348
+ - uses: ilammy/msvc-dev-cmd@v1.12.1
+ with:
+ arch: x64
+ sdk: "10.0.20348.0"
+ uwp: true
+ - name: Build x64 UWP Release
+ run: |
+ CMake -G "Visual Studio 17 2022" -DCMAKE_SYSTEM_NAME=WindowsStore -DCMAKE_SYSTEM_VERSION:STRING="10.0" -DCMAKE_SYSTEM_PROCESSOR=x64 -DESCARGOT_ARCH=x64 -DESCARGOT_MODE=release -Bout/win64_release_uwp/ -DESCARGOT_HOST=windows -DESCARGOT_OUTPUT=shell -DESCARGOT_LIBICU_SUPPORT=ON -DESCARGOT_LIBICU_SUPPORT_WITH_DLOPEN=OFF -DESCARGOT_TEST=ON
+ cmake --build out\win64_release_uwp --config Release
+ shell: cmd
+ - uses: ilammy/msvc-dev-cmd@v1.12.1
+ with:
+ arch: x86
+ sdk: "10.0.20348.0"
+ - name: Build x86 DLL Release
+ run: |
+ CMake -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_SYSTEM_VERSION:STRING="10.0" -DCMAKE_SYSTEM_PROCESSOR=x86 -DESCARGOT_ARCH=x86 -DESCARGOT_MODE=release -Bout/win32_release_shared/ -DESCARGOT_HOST=windows -DESCARGOT_OUTPUT=shared_lib -DESCARGOT_LIBICU_SUPPORT=ON -DESCARGOT_LIBICU_SUPPORT_WITH_DLOPEN=OFF -DESCARGOT_THREADING=ON -DESCARGOT_TCO=ON -DESCARGOT_TEST=ON -G Ninja -DCMAKE_C_COMPILER=cl -DCMAKE_CXX_COMPILER=cl -DCMAKE_BUILD_TYPE=release
+ CMake --build out/win32_release_shared --config Release
+ shell: cmd
+ - if: ${{ failure() }}
+ uses: mxschmitt/action-tmate@v3
+ timeout-minutes: 15
+
build-test-on-x86-release:
runs-on: ubuntu-latest
strategy:
diff --git a/README.md b/README.md
index 08ac6fc14..de81daf67 100644
--- a/README.md
+++ b/README.md
@@ -48,7 +48,7 @@ cmake -DESCARGOT_HOST=linux -DESCARGOT_ARCH=x64 -DESCARGOT_MODE=release -DESCARG
ninja
```
-## Build android version of Escargot
+## Build Android version
```sh
git clone https://github.com/Samsung/escargot.git
@@ -63,12 +63,26 @@ cd build/android/
./gradlew bundleHostJar # bundle jar for host
```
+## Build Windows version
+
+Install VS2022 with cmake and ninja.
+Open [ x86 Native Tools Command Prompt for VS 2022 | x64 Native Tools Command Prompt for VS 2022 ]
+```sh
+git clone https://github.com/Samsung/escargot.git
+cd escargot
+git submodule update --init third_party
+
+CMake -G "Visual Studio 17 2022" -DCMAKE_SYSTEM_NAME=[ Windows | WindowsStore ] -DCMAKE_SYSTEM_VERSION:STRING="10.0" -DCMAKE_SYSTEM_PROCESSOR=[ x86 | x64 ] -DCMAKE_GENERATOR_PLATFORM=[ Win32 | x64 ],version=10.0.18362.0 -DESCARGOT_ARCH=[ x86 | x64 ] -DESCARGOT_MODE=release -Bout -DESCARGOT_HOST=windows -DESCARGOT_OUTPUT=shell -DESCARGOT_LIBICU_SUPPORT=ON -DESCARGOT_LIBICU_SUPPORT_WITH_DLOPEN=OFF -DESCARGOT_THREADING=ON
+cd out
+msbuild ESCARGOT.sln /property:Configuration=Release /p:platform=[ Win32 | x64 ]
+```
+
#### Build options
The following build options are supported when generating ninja rules using cmake.
-* -DESCARGOT_HOST=[ linux | tizen_obs | darwin | android ]
- Compile Escargot for Linux, Tizen, or macOS platform
+* -DESCARGOT_HOST=[ linux | tizen_obs | darwin | android | windows ]
+ Compile Escargot for Linux, Tizen, macOS, or Windows platform
* -DESCARGOT_ARCH=[ x64 | x86 | arm | i686 | aarch64 ]
Compile Escargot for each architecture
* -DESCARGOT_MODE=[ debug | release ]
@@ -77,6 +91,14 @@ The following build options are supported when generating ninja rules using cmak
Define target output type
* -DESCARGOT_LIBICU_SUPPORT=[ ON | OFF ]
Enable libicu library if set ON. (Optional, default = ON)
+* -DESCARGOT_THREADING=[ ON | OFF ]
+ Enable Threading support. (Optional, default = OFF)
+* -DESCARGOT_CODE_CACHE=[ ON | OFF ]
+ Enable Code cache support. (Optional, default = OFF)
+* -DESCARGOT_WASM=[ ON | OFF ]
+ Enable WASM support. (Optional, default = OFF)
+* -DESCARGOT_SMALL_CONFIG=[ ON | OFF ]
+ Enable Options for small devices. (Optional, default = OFF)
## Testing
diff --git a/build/target.cmake b/build/target.cmake
index bd6cc080b..7498ff8fc 100644
--- a/build/target.cmake
+++ b/build/target.cmake
@@ -10,8 +10,25 @@ SET (ESCARGOT_BUILD_32BIT OFF)
SET (ESCARGOT_BUILD_64BIT OFF)
SET (ESCARGOT_BUILD_64BIT_LARGE OFF)
+# clang-cl defines ${CMAKE_CXX_COMPILER_ID} "Clang" and ${CMAKE_CXX_COMPILER_FRONTEND_VARIANT} "MSVC"
+SET (COMPILER_CLANG_CL OFF)
+IF (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang")
+ IF (DEFINED CMAKE_CXX_COMPILER_FRONTEND_VARIANT)
+ IF (${CMAKE_CXX_COMPILER_FRONTEND_VARIANT} STREQUAL "MSVC")
+ SET (COMPILER_CLANG_CL ON)
+ ENDIF()
+ ENDIF()
+ENDIF()
+
# Default options per compiler
-IF (${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU")
+IF (${CMAKE_CXX_COMPILER_ID} STREQUAL "MSVC" OR ${COMPILER_CLANG_CL})
+ SET (ESCARGOT_CXXFLAGS /std:c++17 /fp:strict /Zc:__cplusplus /EHs /source-charset:utf-8 /D_CRT_SECURE_NO_WARNINGS /DGC_NOT_DLL /D_SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING /wd4244 /wd4267 /wd4805 /wd4018 /wd4172)
+ SET (ESCARGOT_CXXFLAGS_RELEASE /O2 /Oy-)
+ SET (ESCARGOT_THIRDPARTY_CFLAGS /D_CRT_SECURE_NO_WARNINGS /DGC_NOT_DLL /Oy- /wd4146 /EHs)
+ IF (${COMPILER_CLANG_CL})
+ SET (ESCARGOT_CXXFLAGS ${ESCARGOT_CXXFLAGS} /EHs -Wno-invalid-offsetof -Wno-inline-new-delete -fintegrated-cc1)
+ ENDIF()
+ELSEIF (${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU")
SET (ESCARGOT_CXXFLAGS
${ESCARGOT_CXXFLAGS}
-std=c++11 -g3
@@ -50,11 +67,6 @@ ELSEIF (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang")
SET (ESCARGOT_CXXFLAGS_DEBUG -O0 -Wall -Wextra -Werror)
SET (ESCARGOT_CXXFLAGS_RELEASE -O2 -fno-stack-protector -fno-omit-frame-pointer)
SET (ESCARGOT_THIRDPARTY_CFLAGS -w -g3 -fdata-sections -ffunction-sections -fno-omit-frame-pointer -fvisibility=hidden)
-ELSEIF (${CMAKE_CXX_COMPILER_ID} STREQUAL "MSVC")
- SET (CMAKE_CXX_STANDARD 11)
- SET (ESCARGOT_CXXFLAGS /fp:strict /Zc:__cplusplus /source-charset:utf-8 /D_CRT_SECURE_NO_WARNINGS /DGC_NOT_DLL /wd4244 /wd4267 /wd4805 /wd4018 /wd4172)
- SET (ESCARGOT_CXXFLAGS_RELEASE /O2 /Oy-)
- SET (ESCARGOT_THIRDPARTY_CFLAGS /D_CRT_SECURE_NO_WARNINGS /DGC_NOT_DLL /Oy- /wd4146)
ELSE()
MESSAGE (FATAL_ERROR ${CMAKE_CXX_COMPILER_ID} " is Unsupported Compiler")
ENDIF()
diff --git a/src/Escargot.h b/src/Escargot.h
index dbea89d52..7d9202887 100755
--- a/src/Escargot.h
+++ b/src/Escargot.h
@@ -52,6 +52,10 @@
#if defined(__clang__)
#define COMPILER_CLANG 1
+// clang-cl defines _MSC_VER and __clang__ both
+#if defined(_MSC_VER)
+#define COMPILER_CLANG_CL 1
+#endif
#elif defined(_MSC_VER)
#define COMPILER_MSVC 1
#elif (__GNUC__)
@@ -158,11 +162,6 @@
#endif
#endif
-#if defined(COMPILER_MSVC)
-#define strncasecmp _strnicmp
-#define strcasecmp _stricmp
-#endif
-
#ifndef ATTRIBUTE_NO_SANITIZE_ADDRESS
#if defined(COMPILER_GCC) || defined(COMPILER_CLANG)
#define ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address))
@@ -217,6 +216,12 @@
#define NOMINMAX
#endif
+#if defined(OS_WINDOWS)
+#define strncasecmp _strnicmp
+#define strcasecmp _stricmp
+#endif
+
+
/*
we need to mark enum as unsigned if needs.
because processing enum in msvc is little different
@@ -226,7 +231,7 @@ struct Foo { Type type: 1; };
Foo f; f.type = 1;
if (f.type == Type::B) { puts("failed in msvc."); }
*/
-#if defined(COMPILER_MSVC)
+#if defined(OS_WINDOWS)
#define ENSURE_ENUM_UNSIGNED : unsigned int
#else
#define ENSURE_ENUM_UNSIGNED
@@ -481,7 +486,7 @@ void customEscargotErrorLogger(const char* format, ...);
#if defined(COMPILER_GCC) || defined(COMPILER_CLANG)
#define ESCARGOT_COMPUTED_GOTO_INTERPRETER
// some devices cannot support getting label address from outside well
-#if (defined(CPU_ARM64) || (defined(CPU_ARM32) && defined(COMPILER_CLANG))) || defined(OS_DARWIN) || defined(OS_ANDROID)
+#if (defined(CPU_ARM64) || (defined(CPU_ARM32) && defined(COMPILER_CLANG))) || defined(OS_DARWIN) || defined(OS_ANDROID) || defined(OS_WINDOWS)
#define ESCARGOT_COMPUTED_GOTO_INTERPRETER_INIT_WITH_NULL
#endif
#endif
diff --git a/src/api/EscargotPublic.cpp b/src/api/EscargotPublic.cpp
index 09912b1fc..c57f41057 100644
--- a/src/api/EscargotPublic.cpp
+++ b/src/api/EscargotPublic.cpp
@@ -205,20 +205,24 @@ class PlatformBridge : public Platform {
PlatformRef* m_platform;
};
-void PlatformRef::notifyHostImportModuleDynamicallyResult(ContextRef* relatedContext, ScriptRef* referrer, StringRef* src, PromiseObjectRef* promise, LoadModuleResult loadModuleResult)
+// making this function with lambda causes "cannot compile this forwarded non-trivially copyable parameter yet" on Windows/ClangCL
+static ValueRef* notifyHostImportModuleDynamicallyInnerExecute(ExecutionStateRef* state, PlatformRef::LoadModuleResult loadModuleResult, Script::ModuleData::ModulePromiseObject* promise)
{
- auto result = Evaluator::execute(relatedContext, [](ExecutionStateRef* state, LoadModuleResult loadModuleResult, Script::ModuleData::ModulePromiseObject* promise) -> ValueRef* {
- if (loadModuleResult.script) {
- if (loadModuleResult.script.value()->isExecuted()) {
- if (loadModuleResult.script.value()->wasThereErrorOnModuleEvaluation()) {
- state->throwException(loadModuleResult.script.value()->moduleEvaluationError());
- }
+ if (loadModuleResult.script) {
+ if (loadModuleResult.script.value()->isExecuted()) {
+ if (loadModuleResult.script.value()->wasThereErrorOnModuleEvaluation()) {
+ state->throwException(loadModuleResult.script.value()->moduleEvaluationError());
}
- } else {
- state->throwException(ErrorObjectRef::create(state, loadModuleResult.errorCode, loadModuleResult.errorMessage));
}
- return ValueRef::createUndefined();
- },
+ } else {
+ state->throwException(ErrorObjectRef::create(state, loadModuleResult.errorCode, loadModuleResult.errorMessage));
+ }
+ return ValueRef::createUndefined();
+}
+
+void PlatformRef::notifyHostImportModuleDynamicallyResult(ContextRef* relatedContext, ScriptRef* referrer, StringRef* src, PromiseObjectRef* promise, LoadModuleResult loadModuleResult)
+{
+ auto result = Evaluator::execute(relatedContext, notifyHostImportModuleDynamicallyInnerExecute,
loadModuleResult, (Script::ModuleData::ModulePromiseObject*)promise);
Script::ModuleData::ModulePromiseObject* mp = (Script::ModuleData::ModulePromiseObject*)promise;
diff --git a/src/interpreter/ByteCode.h b/src/interpreter/ByteCode.h
index 05c80409f..8f8bb854f 100644
--- a/src/interpreter/ByteCode.h
+++ b/src/interpreter/ByteCode.h
@@ -197,7 +197,7 @@ struct ByteCodeLOC {
}
};
-#if defined(NDEBUG) && defined(ESCARGOT_32) && !defined(COMPILER_MSVC)
+#if defined(NDEBUG) && defined(ESCARGOT_32) && !defined(OS_WINDOWS)
#define BYTECODE_SIZE_CHECK_IN_32BIT(codeName, size) COMPILE_ASSERT(sizeof(codeName) == size, "");
#else
#define BYTECODE_SIZE_CHECK_IN_32BIT(CodeName, Size)
@@ -1247,7 +1247,7 @@ class GetObjectPreComputedCase : public ByteCode {
static constexpr size_t inlineCacheProtoTraverseMaxCount = 12;
- enum GetInlineCacheMode {
+ enum GetInlineCacheMode ENSURE_ENUM_UNSIGNED {
None,
Simple,
Complex
diff --git a/src/interpreter/ByteCodeInterpreter.cpp b/src/interpreter/ByteCodeInterpreter.cpp
index 3d3900ba5..e3dc82d86 100644
--- a/src/interpreter/ByteCodeInterpreter.cpp
+++ b/src/interpreter/ByteCodeInterpreter.cpp
@@ -51,7 +51,7 @@
#include "parser/ScriptParser.h"
#include "CheckedArithmetic.h"
-#if defined(ESCARGOT_COMPUTED_GOTO_INTERPRETER)
+#if defined(ESCARGOT_COMPUTED_GOTO_INTERPRETER) && !defined(ESCARGOT_COMPUTED_GOTO_INTERPRETER_INIT_WITH_NULL)
extern char FillOpcodeTableAsmLbl[];
const void* FillOpcodeTableAddress[] = { &FillOpcodeTableAsmLbl[0] };
#endif
@@ -1654,7 +1654,11 @@ Value Interpreter::interpret(ExecutionState* state, ByteCodeBlock* byteCodeBlock
__attribute__((cold));
#endif
#if defined(ESCARGOT_COMPUTED_GOTO_INTERPRETER)
+
+#if !defined(ESCARGOT_COMPUTED_GOTO_INTERPRETER_INIT_WITH_NULL)
asm volatile("FillOpcodeTableAsmLbl:");
+#endif
+
#if defined(ENABLE_CODE_CACHE)
#define REGISTER_TABLE(opcode) \
g_opcodeTable.m_addressTable[opcode##Opcode] = &&opcode##OpcodeLbl; \
diff --git a/src/runtime/BigInt.cpp b/src/runtime/BigInt.cpp
index eaf3533ff..882c87dde 100644
--- a/src/runtime/BigInt.cpp
+++ b/src/runtime/BigInt.cpp
@@ -472,7 +472,7 @@ BigInt* BigInt::leftShift(ExecutionState& state, BigInt* src) const
bf_init(ThreadLocal::bfContext(), &r);
slimb_t v2;
-#if defined(ESCARGOT_32) || defined(COMPILER_MSVC)
+#if defined(ESCARGOT_32) || defined(OS_WINDOWS)
bf_get_int32(&v2, src->bf(), 0);
if (v2 == std::numeric_limits::min()) {
v2 = std::numeric_limits::min() + 1;
@@ -502,7 +502,7 @@ BigInt* BigInt::rightShift(ExecutionState& state, BigInt* src) const
bf_init(ThreadLocal::bfContext(), &r);
slimb_t v2;
-#if defined(ESCARGOT_32) || defined(COMPILER_MSVC)
+#if defined(ESCARGOT_32) || defined(OS_WINDOWS)
bf_get_int32(&v2, src->bf(), 0);
if (v2 == std::numeric_limits::min()) {
v2 = std::numeric_limits::min() + 1;
diff --git a/src/runtime/String.h b/src/runtime/String.h
index ada04828c..c95c9dcd0 100644
--- a/src/runtime/String.h
+++ b/src/runtime/String.h
@@ -596,7 +596,7 @@ class String : public PointerValue {
}
};
-#if defined(NDEBUG) && defined(ESCARGOT_32) && !defined(COMPILER_MSVC)
+#if defined(NDEBUG) && defined(ESCARGOT_32) && !defined(OS_WINDOWS)
COMPILE_ASSERT(sizeof(String) == sizeof(size_t) * 4, "");
#endif
diff --git a/src/runtime/ValueInlines.h b/src/runtime/ValueInlines.h
index a9f986050..1327533b6 100644
--- a/src/runtime/ValueInlines.h
+++ b/src/runtime/ValueInlines.h
@@ -751,7 +751,8 @@ inline bool Value::isCallable() const
// https://www.ecma-international.org/ecma-262/6.0/#sec-tonumber
inline double Value::toNumber(ExecutionState& state) const
{
-#ifdef ESCARGOT_64
+// there is optimizer bug on clang-cl with below block
+#if defined(ESCARGOT_64) && !defined(COMPILER_CLANG_CL)
auto n = u.asInt64 & TagTypeNumber;
if (LIKELY(n)) {
if (n == TagTypeNumber) {
diff --git a/src/shell/Shell.cpp b/src/shell/Shell.cpp
index b5e7463ba..ab6dd1b32 100644
--- a/src/shell/Shell.cpp
+++ b/src/shell/Shell.cpp
@@ -43,7 +43,7 @@
#include
#endif
-#if !defined(__APPLE__) && !defined(_WINDOWS)
+#if !defined(__APPLE__) && !defined(_WINDOWS) && !defined(_WIN32) && !defined(_WIN64)
#include
#include
@@ -873,6 +873,11 @@ static bool evalScript(ContextRef* context, StringRef* source, StringRef* srcNam
return result;
}
+// making this function with lambda causes "cannot compile this forwarded non-trivially copyable parameter yet" on Windows/ClangCL
+static void globalObjectProxyCallback(ExecutionStateRef* state, GlobalObjectProxyObjectRef* proxy, GlobalObjectRef* targetGlobalObject, GlobalObjectProxyObjectRef::AccessOperationType operationType, OptionalRef nonIndexedStringPropertyNameIfExists)
+{
+ // TODO check security
+}
PersistentRefHolder createEscargotContext(VMInstanceRef* instance, bool isMainThread)
{
@@ -881,12 +886,9 @@ PersistentRefHolder createEscargotContext(VMInstanceRef* instance, b
Evaluator::execute(context, [](ExecutionStateRef* state, bool isMainThread) -> ValueRef* {
ContextRef* context = state->context();
- GlobalObjectProxyObjectRef* proxy = GlobalObjectProxyObjectRef::create(state, state->context()->globalObject(), [](ExecutionStateRef* state, GlobalObjectProxyObjectRef* proxy, GlobalObjectRef* targetGlobalObject, GlobalObjectProxyObjectRef::AccessOperationType operationType, OptionalRef nonIndexedStringPropertyNameIfExists) {
- // TODO check security
- });
+ GlobalObjectProxyObjectRef* proxy = GlobalObjectProxyObjectRef::create(state, state->context()->globalObject(), globalObjectProxyCallback);
context->setGlobalObjectProxy(proxy);
-
{
FunctionObjectRef::NativeFunctionInfo nativeFunctionInfo(AtomicStringRef::create(context, "print"), builtinPrint, 1, true, false);
FunctionObjectRef* buildFunctionObjectRef = FunctionObjectRef::create(state, nativeFunctionInfo);
@@ -1056,13 +1058,13 @@ PersistentRefHolder createEscargotContext(VMInstanceRef* instance, b
return context;
}
-#if defined(_WINDOWS)
+#if defined(_WINDOWS) || defined(_WIN32) || defined(_WIN64)
#include // for SetConsoleOutputCP
#endif
int main(int argc, char* argv[])
{
-#if defined(_WINDOWS)
+#if defined(_WINDOWS) || defined(_WIN32) || defined(_WIN64)
SetConsoleOutputCP(65001);
#endif
#ifndef NDEBUG
@@ -1070,7 +1072,7 @@ int main(int argc, char* argv[])
setbuf(stderr, NULL);
#endif
-#if defined(ESCARGOT_ENABLE_TEST) && !defined(__APPLE__) && !defined(_WINDOWS)
+#if defined(ESCARGOT_ENABLE_TEST) && !defined(__APPLE__) && !defined(_WINDOWS) && !defined(_WIN32) && !defined(_WIN64)
struct sigaction sa;
sa.sa_handler = (void (*)(int))btSighandler;
sigemptyset(&sa.sa_mask);
diff --git a/src/util/Util.cpp b/src/util/Util.cpp
index 1dd46f277..4c21bacb9 100644
--- a/src/util/Util.cpp
+++ b/src/util/Util.cpp
@@ -43,9 +43,9 @@
#include "Vector.h"
#include "Util.h"
-#if defined(__ANDROID__)
+#if defined(OS_ANDROID)
#include
-#elif defined(_WINDOWS)
+#elif defined(OS_WINDOWS)
#include
#else
#include
diff --git a/third_party/GCutil b/third_party/GCutil
index c655a366e..da71abca1 160000
--- a/third_party/GCutil
+++ b/third_party/GCutil
@@ -1 +1 @@
-Subproject commit c655a366ee4f03d60f80f76782e35690c5fb0385
+Subproject commit da71abca1dfbea15029a4e39b317f9a41454e60e
diff --git a/third_party/libbf/cutils.h b/third_party/libbf/cutils.h
index 653588a2d..8225207b5 100644
--- a/third_party/libbf/cutils.h
+++ b/third_party/libbf/cutils.h
@@ -119,7 +119,7 @@ static inline int64_t min_int64(int64_t a, int64_t b)
return b;
}
-#if defined(_MSC_VER)
+#if defined(_MSC_VER) && !defined(__clang__)
#include
static inline int __builtin_ctz(unsigned x)
{