Could be a bug in valgrind, or a bug in V8. Getting a line number would be helpful, along with the exact version of V8. At a quick glance, I don't see any uninitialized variables in DeclarationScope::CheckConflictingVarDeclarations.
On Thu, Jun 27, 2019 at 2:27 PM Austin Einter <austin.ein...@gmail.com> wrote: > I changed the line to > v8::Local<v8::Context> context(instance->context->Get(instance->isolate)); > > It is compiling also working fine. > > However when I execute this executable with valgrind, I get lot of > "*Conditional > jump or move depends on uninitialised value(s)*" > > One such conditional jump is given below. > > ==5158== Conditional jump or move depends on uninitialised value(s) > ==5158== at 0x8F0868: > v8::internal::DeclarationScope::CheckConflictingVarDeclarations() (in > /home/user/mjse) > ==5158== by 0x4D8F68: > v8::internal::PreParser::PreParseFunction(v8::internal::AstRawString > const*, v8::internal::FunctionKind, > v8::internal::FunctionLiteral::FunctionType, > v8::internal::DeclarationScope*, int*, > v8::internal::ProducedPreparseData**, int) (in /home/user/mjse) > ==5158== by 0x4B7935: > v8::internal::Parser::SkipFunction(v8::internal::AstRawString const*, > v8::internal::FunctionKind, v8::internal::FunctionLiteral::FunctionType, > v8::internal::DeclarationScope*, int*, int*, > v8::internal::ProducedPreparseData**) (in /home/user/mjse) > ==5158== by 0x4AB715: > v8::internal::Parser::ParseFunctionLiteral(v8::internal::AstRawString > const*, v8::internal::Scanner::Location, > v8::internal::FunctionNameValidity, v8::internal::FunctionKind, int, > v8::internal::FunctionLiteral::FunctionType, v8::internal::LanguageMode, > v8::internal::ZoneList<v8::internal::AstRawString const*>*) (in > /home/user/mjse) > ==5158== by 0x4D1EFA: > v8::internal::ParserBase<v8::internal::Parser>::ParseHoistableDeclaration(int, > v8::base::Flags<v8::internal::ParseFunctionFlag, int>, > v8::internal::ZoneList<v8::internal::AstRawString const*>*, bool) (in > /home/user/mjse) > ==5158== by 0x4AA266: > v8::internal::Parser::DoParseProgram(v8::internal::Isolate*, > v8::internal::ParseInfo*) (in /home/user/mjse) > ==5158== by 0x4A9958: > v8::internal::Parser::ParseProgram(v8::internal::Isolate*, > v8::internal::ParseInfo*) (in /home/user/mjse) > ==5158== by 0x4D5759: > v8::internal::parsing::ParseProgram(v8::internal::ParseInfo*, > v8::internal::Isolate*) (in /home/user/mjse) > ==5158== by 0x22A835: v8::internal::(anonymous > namespace)::CompileToplevel(v8::internal::ParseInfo*, > v8::internal::Isolate*, v8::internal::IsCompiledScope*) (in /home/user/mjse) > ==5158== by 0x22C128: > v8::internal::Compiler::GetSharedFunctionInfoForScript(v8::internal::Isolate*, > v8::internal::Handle<v8::internal::String>, > v8::internal::Compiler::ScriptDetails const&, v8::ScriptOriginOptions, > v8::Extension*, v8::internal::ScriptData*, > v8::ScriptCompiler::CompileOptions, v8::ScriptCompiler::NoCacheReason, > v8::internal::NativesFlag) (in /home/user/mjse) > ==5158== by 0x1F0EE4: > v8::ScriptCompiler::CompileUnboundInternal(v8::Isolate*, > v8::ScriptCompiler::Source*, v8::ScriptCompiler::CompileOptions, > v8::ScriptCompiler::NoCacheReason) (in /home/user/mjse) > ==5158== by 0x1F15D6: > v8::ScriptCompiler::Compile(v8::Local<v8::Context>, > v8::ScriptCompiler::Source*, v8::ScriptCompiler::CompileOptions, > v8::ScriptCompiler::NoCacheReason) (in /home/user/mjse) > ==5158== > > > What could be the issue? > > Thanks > Austin > > > > > On Thu, Jun 27, 2019 at 5:34 PM Austin Einter <austin.ein...@gmail.com> > wrote: > >> Thanks Ben. I followed your suggestion. >> I added *v8::Global<v8::Context> *context; *member in instance structure. >> >> I put the code as below. >> >> >> >> >> >> >> * if(instance->context == nullptr) { v8::Local<v8::Context> >> context = v8::Context::New(instance->isolate); instance->context = >> new v8::Global<v8::Context>(instance->isolate, context); }* >> >> * v8::Local<v8::Context> context(instance->isolate, >> instance->context);* >> >> * For last line (in red) I am getting below compilation error.* >> >> error: no matching function for call to >> ‘v8::Local<v8::Context>::Local(v8::Isolate*&, v8::Global<v8::Context>*&)’ >> >> Please let me know what I need to do to avoid this error. >> >> Thanks >> Austin >> >> >> On Thu, Jun 27, 2019 at 2:09 PM Ben Noordhuis <i...@bnoordhuis.nl> wrote: >> >>> On Thu, Jun 27, 2019 at 5:05 AM Austin Einter <austin.ein...@gmail.com> >>> wrote: >>> > >>> > Dear All >>> > I am quite new to v8. I am a c developer, with limited c++ knowledge. >>> Sorry if I ask very basic questions. >>> > >>> > I have a C application, that interacts with web servers. Gets >>> javascript. Need to execute javascript. >>> > Imagine a situation, where I get total 2 javascript files from server. >>> > >>> > js1.js >>> > >>> > function js_add_elements(var1, var2) >>> > { >>> > var var3 = parseInt(var1) + parseInt(var2); >>> > var result = 'Addition of ' + var1 + ' and ' + var2 + ' results ' >>> + var3; >>> > return result; >>> > } >>> > >>> > >>> > js2.js >>> > >>> > js_add_elements(2, 3); >>> > >>> > >>> > >>> > I have my c code as below. >>> > >>> > Header file >>> > typedef struct >>> > { >>> > std::unique_ptr<v8::Platform> platform; >>> > v8::Isolate::CreateParams create_params; >>> > v8::Isolate *isolate; >>> > v8::Isolate::Scope *isolate_scope; >>> > }MJSEInstance; >>> > >>> > #ifdef __cplusplus >>> > extern "C" { >>> > #endif >>> > >>> > /** >>> > * @brief Create MJSE instance >>> > */ >>> > void *mjse_create_instance(char **argv); >>> > >>> > /** >>> > * @brief Destroy MJSE instance >>> > * @param instance -> MJSE instance >>> > */ >>> > void mjse_destroy_instance(void *instance); >>> > >>> > /** >>> > * @brief Executes a script >>> > * @param minstance - MJSE instance >>> > * @param jscript - the javascript >>> > * @param scriptlen - Length of script >>> > */ >>> > void mjse_execute_script(void *instance, char *jscript); >>> > >>> > #ifdef __cplusplus >>> > } >>> > #endif >>> > >>> > CPP File >>> > #include <stdio.h> >>> > #include <stdlib.h> >>> > #include <string.h> >>> > #include "include/libplatform/libplatform.h" >>> > #include "include/v8.h" >>> > #include "mjse.h" >>> > #include "mjse_int.h" >>> > #include <new> >>> > >>> > extern "C" { >>> > using namespace v8; >>> > >>> > void *mjse_create_instance(char **argv) >>> > { >>> > MJSEInstance *instance = (MJSEInstance *)calloc(1, >>> sizeof(MJSEInstance)); >>> > >>> > v8::V8::InitializeICUDefaultLocation(argv[0]); >>> > v8::V8::InitializeExternalStartupData(argv[0]); >>> > instance->platform = v8::platform::NewDefaultPlatform(); >>> > >>> > v8::V8::InitializePlatform(instance->platform.get()); >>> > v8::V8::Initialize(); >>> > >>> > instance->create_params.array_buffer_allocator = >>> v8::ArrayBuffer::Allocator::NewDefaultAllocator(); >>> > instance->isolate = v8::Isolate::New(instance->create_params); >>> > instance->isolate_scope = new >>> v8::Isolate::Scope(instance->isolate); >>> > >>> > return instance; >>> > } >>> > >>> > void mjse_destroy_instance(void *minstance) >>> > { >>> > MJSEInstance *instance = (MJSEInstance *)minstance; >>> > >>> > if(instance == NULL) >>> > return; >>> > >>> > if(instance->isolate_scope) >>> > { >>> > delete instance->isolate_scope; >>> > } >>> > >>> > if(instance->isolate) >>> > { >>> > instance->isolate->Dispose(); >>> > } >>> > >>> > v8::V8::Dispose(); >>> > v8::V8::ShutdownPlatform(); >>> > >>> > if(instance->create_params.array_buffer_allocator) >>> > { >>> > delete instance->create_params.array_buffer_allocator; >>> > } >>> > >>> > instance->~MJSEInstance(); >>> > free(instance); >>> > } >>> > >>> > >>> > void mjse_execute_script(void *minstance, char *jscript) >>> > { >>> > MJSEInstance *instance = (MJSEInstance *)minstance; >>> > >>> > // Create a stack-allocated handle scope. >>> > v8::HandleScope handle_scope(instance->isolate); >>> > >>> > // Create a new context. >>> > v8::Local<v8::Context> context = >>> v8::Context::New(instance->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(instance->isolate, jscript, >>> > 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(instance->isolate, result); >>> > printf("%s\n", *utf8); >>> > } >>> > } >>> > } >>> > >>> > Main File >>> > int main(int argc, char **argv) >>> > { >>> > char *script; >>> > void *instance; >>> > >>> > instance = mjse_create_instance(argv); >>> > >>> > script = "function js_add_elements(var1, var2) \ >>> > { \ >>> > var var3 = parseInt(var1) + parseInt(var2); \ >>> > var result = 'Addition of ' + var1 + ' and ' + >>> var2 + ' results ' + var3; \ >>> > return result; \ >>> > };"; >>> > mjse_execute_script(instance, script); >>> > >>> > script = "js_add_elements(2, 3);"; >>> > mjse_execute_script(instance, script); >>> > >>> > mjse_destroy_instance(instance); >>> > return 0; >>> > } >>> > >>> > Now whats happening, while executing javascript first time it executes >>> fine. But while trying to execute second time (letter in red), it gets >>> exception. >>> > >>> > I understand, it is creating new v8 Local context each time, and does >>> not have js1.js details, hence getting exception. I also found in web we >>> can have v8 Global context and refer the context while executing for second >>> time. >>> > >>> > However I have not been able to find, how to declare v8 global context >>> and store / move v8 local context there and refer it during second time >>> execution. Please let me know with a sample/example code. >>> > >>> > Thanks >>> > Austin >>> >>> You can make the context persistent like this: >>> >>> if (instance->context == nullptr) { >>> v8::Local<v8::Context> context = v8::Context::New(instance->isolate); >>> instance->context = new v8::Global<v8::Context>(instance->isolate, >>> context); >>> } >>> >>> v8::Local<v8::Context> context(instance->isolate, instance->context); >>> v8::Context::Scope context_scope(context); >>> >>> -- >>> -- >>> v8-users mailing list >>> v8-users@googlegroups.com >>> http://groups.google.com/group/v8-users >>> --- >>> You received this message because you are subscribed to the Google >>> Groups "v8-users" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to v8-users+unsubscr...@googlegroups.com. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/v8-users/CAHQurc8H1d8Stfhw7rAGac9ZSL3pS5mOmrR-9%3DjGLtW2ZtMunQ%40mail.gmail.com >>> . >>> For more options, visit https://groups.google.com/d/optout. >>> >> -- > -- > v8-users mailing list > v8-users@googlegroups.com > http://groups.google.com/group/v8-users > --- > You received this message because you are subscribed to the Google Groups > "v8-users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to v8-users+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/v8-users/CANXt1k_oVrTPsa6US7Ux6Q25ut%2B-jiF5XD9swpgQKHJPcVG21Q%40mail.gmail.com > <https://groups.google.com/d/msgid/v8-users/CANXt1k_oVrTPsa6US7Ux6Q25ut%2B-jiF5XD9swpgQKHJPcVG21Q%40mail.gmail.com?utm_medium=email&utm_source=footer> > . > For more options, visit https://groups.google.com/d/optout. > -- -- v8-users mailing list v8-users@googlegroups.com http://groups.google.com/group/v8-users --- You received this message because you are subscribed to the Google Groups "v8-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to v8-users+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/v8-users/CAKSzg3SmJ0xBcw_dy2Ec3VDRhv%3DeoYM%3D6rN8uhAKqCfO5Y-A_A%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.