alexa griffin
alexa griffin

Reputation: 115

V8 console.log does not print

I am attempting to embed v8 into my application, I am messing about seeing what is included in the V8 environment (duktape does not include a console implementation) and it seems like v8 does include an implementation however when I call console.log it does not print anything, instead it just prints undefined (which i assume to be the return value of console.log) So how would one go about linking the default std::cout output with console.log.

This is my code currently, I am working with the default hello world code very slightly modified.

int main(int argc, char* argv[]) {
    // Initialize V8.
    v8::V8::InitializeICUDefaultLocation(argv[0]);
    v8::V8::InitializeExternalStartupData(argv[0]);
    std::unique_ptr<v8::Platform> platform = v8::platform::NewDefaultPlatform();
    v8::V8::InitializePlatform(platform.get());
    v8::V8::Initialize();
    // Create a new Isolate and make it the current one.
    v8::Isolate::CreateParams create_params;
    create_params.array_buffer_allocator =
        v8::ArrayBuffer::Allocator::NewDefaultAllocator();
    v8::Isolate* isolate = v8::Isolate::New(create_params);
    {
        v8::Isolate::Scope isolate_scope(isolate);
        // Create a stack-allocated handle scope.
        v8::HandleScope handle_scope(isolate);
        // Create a new context.
        v8::Local<v8::Context> context = v8::Context::New(isolate);
        // Enter the context for compiling and running the hello world script.
        v8::Context::Scope context_scope(context);
        {
            // Create a string containing the JavaScript source code.
            v8::Local<v8::String> source =
                v8::String::NewFromUtf8(isolate, R"(
                    console.log("does not print?")
                )",
                v8::NewStringType::kNormal)
                .ToLocalChecked();
            // Compile the source code.
            v8::Local<v8::Script> script =
                v8::Script::Compile(context, source).ToLocalChecked();
            // Run the script to get the result.
            v8::Local<v8::Value> result = script->Run(context).ToLocalChecked();
            // Convert the result to an UTF8 string and print it.
            v8::String::Utf8Value utf8(isolate, result);
            printf("%s\n", *utf8);
        }
    }
    // Dispose the isolate and tear down V8.
    isolate->Dispose();
    v8::V8::Dispose();
    v8::V8::ShutdownPlatform();
    delete create_params.array_buffer_allocator;

    std::cin.get();
    return 0;
}

and I am using the prebuilt v8 binaries here

Upvotes: 3

Views: 1963

Answers (2)

alexa griffin
alexa griffin

Reputation: 115

So for anyone in the future that is dealing with this, this is the process I used to fix it.

  • download the source from here, only the src folder is needed.
  • extract it and link it in to your project where ever you put vendor code in addition to the bundle.
  • put it in the a src folder because otherwise its includes don't work
  • you will need to make a bunch of include directories for it to compile, mine include v8/src, and v8
  • make sure to link it with the nuget package, you may not have to do this, one machine needed it the other didn't.
  • you do not need to generate builtins-generated/bytecodes-builtins-list.h

Upvotes: 0

jmrk
jmrk

Reputation: 40561

Try the following:

  • #include "src/debug/interface-types.h"
  • define your own "console delegate" class, deriving from debug::ConsoleDelegate
  • override any methods you're interested in, e.g. void Log(const debug::ConsoleCallArguments& args, const v8::debug::ConsoleContext&) override;
  • instantiate it and call debug::SetConsoleDelegate(isolate, &your_console_delegate); after creating your Isolate

To see an example, start at https://cs.chromium.org/chromium/src/v8/src/d8/d8-console.h?l=14&gsn=D8Console and trace where it's used.

Upvotes: 3

Related Questions