-
-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
9 changed files
with
170 additions
and
32 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
#pragma once | ||
|
||
#include "v8.h" | ||
#include <libplatform/libplatform.h> | ||
|
||
class CScriptRuntimeInfo | ||
{ | ||
private: | ||
v8::Isolate* isolate; | ||
std::unique_ptr<v8::Platform> 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; | ||
} | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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<std::string> 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<Config::Value::List>(); | ||
ignoredModules.reserve(ignoredModules.size() + list.size()); | ||
for(auto& item : list) | ||
{ | ||
if(item->IsString()) ignoredModules.push_back(item->As<std::string>()); | ||
} | ||
} | ||
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<Config::Value::List>(); | ||
std::vector<std::string> extraFilePatterns; | ||
extraFilePatterns.reserve(list.size()); | ||
for(auto& item : list) | ||
{ | ||
if(item->IsString()) extraFilePatterns.push_back(item->As<std::string>()); | ||
} | ||
|
||
std::set<std::string> 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<std::string>& clientFiles = resource->GetClientFiles(); | ||
const std::vector<std::string>& 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; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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; | ||
} | ||
}; |