diff --git a/compiler/compiler.cpp b/compiler/compiler.cpp index 7a4c444..8efc2e7 100644 --- a/compiler/compiler.cpp +++ b/compiler/compiler.cpp @@ -5,7 +5,7 @@ using namespace BytecodeCompiler; -bool Compiler::CompileModule(const std::string& fileName, bool compileDependencies) +bool Compiler::CompileModule(const std::string& fileName, bool compileDependencies, bool verbose) { // Read the file if(!package->FileExists(fileName)) @@ -61,7 +61,11 @@ bool Compiler::CompileModule(const std::string& fileName, bool compileDependenci cache->buffer_policy = v8::ScriptCompiler::CachedData::BufferPolicy::BufferOwned; delete cache; - logger->Log("Converted file to bytecode: " + logger->GetHighlightColor() + fileName); + if (verbose) + { + logger->Log("Converted file to bytecode: " + logger->GetHighlightColor() + fileName); + } + compiledFiles.push_back(fileName); // Compile all dependencies diff --git a/compiler/compiler.h b/compiler/compiler.h index 69ddd90..6961ac1 100644 --- a/compiler/compiler.h +++ b/compiler/compiler.h @@ -68,7 +68,7 @@ namespace BytecodeCompiler return magicBytes; } - bool CompileModule(const std::string& fileName, bool compileDependencies = true); + bool CompileModule(const std::string& fileName, bool compileDependencies = true, bool verbose = false); bool IsBytecodeFile(void* buffer, size_t size); diff --git a/deps/cpp-sdk b/deps/cpp-sdk index 95a2cfa..22e1fdd 160000 --- a/deps/cpp-sdk +++ b/deps/cpp-sdk @@ -1 +1 @@ -Subproject commit 95a2cfadc2ba1de018c8c55c72b21984067b6181 +Subproject commit 22e1fdd37b8e379d04b279161571276cb7bb12da diff --git a/module/src/CScriptRuntimeInfo.h b/module/src/CScriptRuntimeInfo.h new file mode 100644 index 0000000..aa66042 --- /dev/null +++ b/module/src/CScriptRuntimeInfo.h @@ -0,0 +1,34 @@ +#pragma once + +#include "v8.h" +#include + +class CScriptRuntimeInfo +{ +private: + v8::Isolate* isolate; + std::unique_ptr platform; + +public: + v8::Isolate* GetIsolate() { return isolate; } + + void Instanciate() + { + v8::V8::SetFlagsFromString("--harmony-import-assertions --short-builtin-calls --no-lazy --no-flush-bytecode --no-enable-lazy-source-positions"); + platform = v8::platform::NewDefaultPlatform(); + v8::V8::InitializePlatform(platform.get()); + + v8::V8::Initialize(); + + auto createParams = v8::Isolate::CreateParams{}; + createParams.array_buffer_allocator = v8::ArrayBuffer::Allocator::NewDefaultAllocator(); + + isolate = v8::Isolate::New(createParams); + } + + static CScriptRuntimeInfo& Instance() + { + static CScriptRuntimeInfo runtimeInfo; + return runtimeInfo; + } +}; diff --git a/module/src/main.cpp b/module/src/main.cpp index 9c9ddcb..2f9b293 100644 --- a/module/src/main.cpp +++ b/module/src/main.cpp @@ -1,7 +1,9 @@ +#include "CScriptRuntimeInfo.h" #include "SDK.h" #include "version/version.h" #include "Log.h" #include "runtime.h" +#include "runtimev2.h" static void CommandHandler(const std::vector& args) { @@ -33,8 +35,10 @@ EXPORT bool altMain(alt::ICore* core) { alt::ICore::SetInstance(core); - auto& runtime = JSBytecodeRuntime::Instance(); - core->RegisterScriptRuntime("jsb", &runtime); + CScriptRuntimeInfo::Instance().Instanciate(); + + core->RegisterScriptRuntime("jsb", &JSBytecodeRuntime::Instance()); + core->RegisterScriptRuntime("jsv2b", &JSBytecodeRuntimeV2::Instance()); core->SubscribeCommand("jsb-module", &CommandHandler); diff --git a/module/src/runtime.cpp b/module/src/runtime.cpp index 8113453..4e9b24e 100644 --- a/module/src/runtime.cpp +++ b/module/src/runtime.cpp @@ -1,23 +1,13 @@ #include "runtime.h" #include "Log.h" #include "compiler.h" +#include "CScriptRuntimeInfo.h" #include "package.h" #include "logger.h" -JSBytecodeRuntime::JSBytecodeRuntime() -{ - v8::V8::SetFlagsFromString("--harmony-import-assertions --short-builtin-calls --no-lazy --no-flush-bytecode --no-enable-lazy-source-positions"); - platform = v8::platform::NewDefaultPlatform(); - v8::V8::InitializePlatform(platform.get()); - v8::V8::Initialize(); - - create_params.array_buffer_allocator = v8::ArrayBuffer::Allocator::NewDefaultAllocator(); - - isolate = v8::Isolate::New(create_params); -} - void JSBytecodeRuntime::ProcessClientFile(alt::IResource* resource, alt::IPackage* package) { + v8::Isolate* isolate = CScriptRuntimeInfo::Instance().GetIsolate(); v8::Isolate::Scope isolateScope(isolate); v8::HandleScope handleScope(isolate); @@ -31,6 +21,8 @@ void JSBytecodeRuntime::ProcessClientFile(alt::IResource* resource, alt::IPackag // Get ignored files std::vector ignoredModules = { "alt", "alt-client", "natives", "alt-worker", "alt-shared" }; Config::Value::ValuePtr ignoredFiles = config->Get("ignored-files"); + Config::Value::Bool verboseLogging = config->Get("verbose")->AsBool(false); + if(ignoredFiles->IsList()) { Config::Value::List list = ignoredFiles->As(); @@ -43,7 +35,7 @@ void JSBytecodeRuntime::ProcessClientFile(alt::IResource* resource, alt::IPackag compiler.SetIgnoredModules(ignoredModules); // Compile client main file - bool result = compiler.CompileModule(resource->GetClientMain()); + bool result = compiler.CompileModule(resource->GetClientMain(), true, verboseLogging); if(!result) return; // Compile the extra files @@ -61,7 +53,7 @@ void JSBytecodeRuntime::ProcessClientFile(alt::IResource* resource, alt::IPackag std::set files = resource->GetMatchedFiles(extraFilePatterns); for(const std::string& file : files) { - bool result = compiler.CompileModule(file, false); + bool result = compiler.CompileModule(file, false, verboseLogging); if(!result) return; } } @@ -87,6 +79,8 @@ void JSBytecodeRuntime::ProcessClientFile(alt::IResource* resource, alt::IPackag package->WriteFile(clientPkgFile, buffer.data(), buffer.size()); package->CloseFile(clientPkgFile); } + + compilerLogger.Log("Converted " + std::to_string(compiledFiles.size()) + " script files to bytecode"); } bool JSBytecodeRuntime::GetProcessClientType(std::string& clientType) diff --git a/module/src/runtime.h b/module/src/runtime.h index 7e234a1..6de9329 100644 --- a/module/src/runtime.h +++ b/module/src/runtime.h @@ -2,25 +2,13 @@ #include "SDK.h" #include "v8.h" -#include "libplatform/libplatform.h" class JSBytecodeRuntime : public alt::IScriptRuntime { - v8::Isolate* isolate; - v8::Isolate::CreateParams create_params; - std::unique_ptr platform; - public: - JSBytecodeRuntime(); - bool GetProcessClientType(std::string& clientType) override; void ProcessClientFile(alt::IResource* resource, alt::IPackage* clientPackage) override; - v8::Isolate* GetIsolate() - { - return isolate; - } - alt::IResource::Impl* CreateImpl(alt::IResource* resource) override { return nullptr; diff --git a/module/src/runtimev2.cpp b/module/src/runtimev2.cpp new file mode 100644 index 0000000..66e1e80 --- /dev/null +++ b/module/src/runtimev2.cpp @@ -0,0 +1,90 @@ +#include "runtimev2.h" +#include "Log.h" +#include "compiler.h" +#include "CScriptRuntimeInfo.h" +#include "package.h" +#include "logger.h" + +void JSBytecodeRuntimeV2::ProcessClientFile(alt::IResource* resource, alt::IPackage* package) +{ + v8::Isolate* isolate = CScriptRuntimeInfo::Instance().GetIsolate(); + v8::Isolate::Scope isolateScope(isolate); + v8::HandleScope handleScope(isolate); + + // Set up compiler + alt::IPackage* resourcePackage = resource->GetPackage(); + Package compilerPackage(package, resourcePackage, resource); + Logger compilerLogger; + BytecodeCompiler::Compiler compiler(isolate, &compilerPackage, &compilerLogger); + + Config::Value::ValuePtr config = resource->GetConfig(); + // Get ignored files + std::vector ignoredModules = { "alt", "alt-client", "natives", "alt-worker", "alt-shared", "@altv/client", "@altv/server", "@altv/shared", "@altv/natives" }; + Config::Value::ValuePtr ignoredFiles = config->Get("ignored-files"); + Config::Value::Bool verboseLogging = config->Get("verbose")->AsBool(false); + + if(ignoredFiles->IsList()) + { + Config::Value::List list = ignoredFiles->As(); + ignoredModules.reserve(ignoredModules.size() + list.size()); + for(auto& item : list) + { + if(item->IsString()) ignoredModules.push_back(item->As()); + } + } + compiler.SetIgnoredModules(ignoredModules); + + // Compile client main file + bool result = compiler.CompileModule(resource->GetClientMain(), true, verboseLogging); + if(!result) return; + + // Compile the extra files + Config::Value::ValuePtr extraCompileFiles = config->Get("extra-compile-files"); + if(extraCompileFiles->IsList()) + { + Config::Value::List list = extraCompileFiles->As(); + std::vector extraFilePatterns; + extraFilePatterns.reserve(list.size()); + for(auto& item : list) + { + if(item->IsString()) extraFilePatterns.push_back(item->As()); + } + + std::set files = resource->GetMatchedFiles(extraFilePatterns); + for(const std::string& file : files) + { + bool result = compiler.CompileModule(file, false, verboseLogging); + if(!result) return; + } + } + + // Write all other files normally + const std::vector& clientFiles = resource->GetClientFiles(); + const std::vector& compiledFiles = compiler.GetCompiledFiles(); + for(const std::string& clientFile : clientFiles) + { + // Check if the file is compiled, then we don't want to overwrite it + if(std::find(compiledFiles.begin(), compiledFiles.end(), clientFile) != compiledFiles.end()) continue; + + // Open the file from the resource package and read the content + alt::IPackage::File* file = resourcePackage->OpenFile(clientFile); + size_t fileSize = resourcePackage->GetFileSize(file); + std::string buffer; + buffer.resize(fileSize); + resourcePackage->ReadFile(file, buffer.data(), buffer.size()); + resourcePackage->CloseFile(file); + + // Write the file content into the client package + alt::IPackage::File* clientPkgFile = package->OpenFile(clientFile); + package->WriteFile(clientPkgFile, buffer.data(), buffer.size()); + package->CloseFile(clientPkgFile); + } + + compilerLogger.Log("Converted " + std::to_string(compiledFiles.size()) + " script files to bytecode"); +} + +bool JSBytecodeRuntimeV2::GetProcessClientType(std::string& clientType) +{ + clientType = "jsv2b"; + return true; +} diff --git a/module/src/runtimev2.h b/module/src/runtimev2.h new file mode 100644 index 0000000..bccb0e2 --- /dev/null +++ b/module/src/runtimev2.h @@ -0,0 +1,24 @@ +#pragma once + +#include "SDK.h" +#include "v8.h" + +class JSBytecodeRuntimeV2 : public alt::IScriptRuntime +{ +public: + bool GetProcessClientType(std::string& clientType) override; + void ProcessClientFile(alt::IResource* resource, alt::IPackage* clientPackage) override; + + alt::IResource::Impl* CreateImpl(alt::IResource* resource) override + { + return nullptr; + } + + void DestroyImpl(alt::IResource::Impl* impl) override {} + + static JSBytecodeRuntimeV2& Instance() + { + static JSBytecodeRuntimeV2 runtime; + return runtime; + } +};