One more observation, if I do not keep any argument in my javascript then I do not see conditional jump. I changed my first javascript to as given below, with this the conditional jump is not shown in valgrind report.
js1.js function js_add_elements() { return 10; } On Thu, Jun 27, 2019 at 6:11 PM Jakob Kummerow <jkumme...@chromium.org> wrote: > 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 > <https://groups.google.com/d/msgid/v8-users/CAKSzg3SmJ0xBcw_dy2Ec3VDRhv%3DeoYM%3D6rN8uhAKqCfO5Y-A_A%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/CANXt1k8xm4VXArgBic2hybgAE%3DHGumaSLwODfT%2B_kKMBFkDKyQ%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.