The --optimize-for-size flag doesn't seem to have any effect on the result.
On Tuesday, November 19, 2019 at 9:50:33 AM UTC+2, Simon Zünd wrote: > > +Leszek Swirski <javascript:> > > I am unsure what impact lazy compilation has here. There might be a weird > interaction with the stack frame cache. Does the flag "--optimize-for-size" > cause any change in the result? That flag disables the stack frame cache > (among other things). > > On Tue, Nov 19, 2019 at 8:37 AM Darin Dimitrov <darin....@gmail.com > <javascript:>> wrote: > >> Further narrowed it down to the "--no-lazy" runtime flag: >> >> Working: >> >> std::string flags = "--expose_gc --jitless"; >> V8::SetFlagsFromString(flags.c_str(), flags.size()); >> >> NOT working: >> >> std::string flags = "--expose_gc --jitless --no-lazy"; >> V8::SetFlagsFromString(flags.c_str(), flags.size()); >> >> Any idea why would the --no-lazy flag affect function names in stack >> frames? I need the --no-lazy flag because I noticed that it speeds up code >> cached scripts (v8::ScriptCompiler::CreateCodeCache API). >> >> On Tuesday, November 19, 2019 at 9:30:07 AM UTC+2, Darin Dimitrov wrote: >>> >>> Simon, thanks for the clarification. Does this mean that there's no >>> reliable way to get this information with the current V8 public API? >>> >>> I went ahead and wrote a simple example illustrating the issue and tried >>> running it on different platforms. And the results were surprising. >>> >>> Here's the sample code I wrote: >>> >>> Isolate::CreateParams create_params; >>> create_params.array_buffer_allocator = &allocator_; >>> Isolate* isolate = Isolate::New(create_params); >>> Isolate::Scope isolate_scope(isolate); >>> HandleScope handle_scope(isolate); >>> Local<ObjectTemplate> globalTemplate = ObjectTemplate::New(isolate); >>> Local<Context> context = Context::New(isolate, nullptr, >>> globalTemplate); >>> context->Enter(); >>> >>> Local<v8::Function> captureFunc = v8::Function::New(context, >>> [](const FunctionCallbackInfo<Value>& info) { >>> Isolate* isolate = info.GetIsolate(); >>> Local<Context> context = isolate->GetCurrentContext(); >>> Local<Object> exception = >>> Exception::Error(v8::String::NewFromUtf8(isolate, "", >>> NewStringType::kNormal, 0).ToLocalChecked()).As<Object>(); >>> Local<Value> stackProperty = exception->Get(context, >>> v8::String::NewFromUtf8(isolate, "stack", NewStringType::kNormal, >>> 5).ToLocalChecked()).ToLocalChecked(); >>> v8::String::Utf8Value stackStr(isolate, stackProperty); >>> printf("%s\n\n", *stackStr); >>> >>> Local<StackTrace> stack = >>> v8::StackTrace::CurrentStackTrace(isolate, 10, >>> v8::StackTrace::StackTraceOptions::kDetailed); >>> >>> for (int i = 0; i < stack->GetFrameCount(); i++) { >>> Local<v8::StackFrame> frame = stack->GetFrame(isolate, i); >>> Local<v8::String> funcName = frame->GetFunctionName(); >>> v8::String::Utf8Value str(isolate, funcName); >>> const char* name = *str; >>> printf("%s (%d:%d)\n", name, frame->GetLineNumber(), >>> frame->GetColumn()); >>> } >>> }).ToLocalChecked(); >>> assert(context->Global()->Set(context, >>> v8::String::NewFromUtf8(isolate, "captureTrace", NewStringType::kNormal, >>> 12).ToLocalChecked(), captureFunc).FromMaybe(false)); >>> >>> std::string src = >>> "(function test() {" >>> " const viewModel = new Object();" >>> " viewModel.onTap = () => { captureTrace(); };" >>> " viewModel.onTap.apply(viewModel, []);" >>> "})();"; >>> Local<Script> script = Script::Compile(context, >>> v8::String::NewFromUtf8(isolate, src.c_str(), NewStringType::kNormal, >>> (int)src.length()).ToLocalChecked()).ToLocalChecked(); >>> Local<Value> result; >>> assert(script->Run(context).ToLocal(&result)); >>> >>> On V8 8.0.0 ( >>> https://chromium.googlesource.com/v8/v8.git/+/50031fae736fac7b2b309369df492bfd0edd7553), >>> >>> running in --jitless on an arm64 iOS device, I get the following output: >>> >>> Error >>> at Object.onTap (<anonymous>:1:84) >>> at test (<anonymous>:1:122) >>> at <anonymous>:1:145 >>> >>> (null) (1:84) >>> test (1:122) >>> (null) (1:145) >>> >>> and on V8 7.7.299.11 ( >>> https://chromium.googlesource.com/v8/v8.git/+/027689dbfcb2a9bbc8ceec4db2631c558e879633), >>> >>> running on an arm64 Android device, I get the following output: >>> >>> Error >>> at Object.viewModel.onTap (<anonymous>:1:84) >>> at test (<anonymous>:1:122) >>> at <anonymous>:1:145 >>> >>> viewModel.onTap (1:84) >>> test (1:122) >>> (null) (1:145) >>> >>> Do you know what might explain the discrepancy between those two >>> platforms? >>> >>> On Tuesday, November 19, 2019 at 7:58:10 AM UTC+2, Simon Zünd wrote: >>>> >>>> This is a bug in our API implementation. Or better, there is a mismatch >>>> between API and what we do internally. "Method names" and "class names" >>>> are >>>> stored separately from function names. This can be seen here, when we >>>> collect all the information for a single frame: >>>> https://cs.chromium.org/chromium/src/v8/src/heap/factory.cc?rcl=e1eb815647f334a8cf970439343a8febfa9f6d11&l=3732 >>>> >>>> There is really no reason why this information shouldn't be made >>>> available in the API. The only tricky thing is to come up with a better >>>> API, as some of the getters change meaning depending whether its a JS or >>>> WASM frame and I am not really happy with the current solution. >>>> >>>> On Mon, Nov 18, 2019 at 4:40 PM Darin Dimitrov <darin....@gmail.com> >>>> wrote: >>>> >>>>> I am embedding V8 and trying to capture the current javascript >>>>> stacktrace using the "v8::StackTrace::CurrentStackTrace": >>>>> >>>>> Isolate* isolate = info.GetIsolate(); >>>>> >>>>> Local<StackTrace> stack = v8::StackTrace::CurrentStackTrace(isolate, >>>>> 10, v8::StackTrace::StackTraceOptions::kDetailed); >>>>> >>>>> *for* (*int* i = 0; i < stack->GetFrameCount(); i++) { >>>>> >>>>> Local<v8::StackFrame> frame = stack->GetFrame(isolate, i); >>>>> >>>>> Local<v8::String> funcName = frame->GetFunctionName(); >>>>> >>>>> v8::String::Utf8Value str(isolate, funcName); >>>>> >>>>> *const* *char** name = *str; >>>>> >>>>> printf("%s (%d:%d)\n", name, frame->GetLineNumber(), frame-> >>>>> GetColumn()); >>>>> >>>>> } >>>>> >>>>> I have placed this code inside a custom function that I have >>>>> registered to the global scope. >>>>> >>>>> Before calling my custom function, I tried logging the stack property >>>>> of an Error object (by using : console.log(new Error().stack)) and I >>>>> obtained the following output: >>>>> >>>>> Error >>>>> at bar (file:///app/bundle.js:266:29) >>>>> at test (file:///app/bundle.js:267:15) >>>>> at Observable.onTap (file:///app/bundle.js:268:11) >>>>> at Button.notify (file:///app/vendor.js:3620:32) >>>>> at Button._emit (file:///app/vendor.js:3640:18) >>>>> at TapHandlerImpl.tap (file:///app/vendor.js:15540:19) >>>>> >>>>> With the "v8::StackTrace::CurrentStackTrace" method I get: >>>>> >>>>> bar (266:29) >>>>> test (267:15) >>>>> (null) (268:11) >>>>> (null) (3620:32) >>>>> (null) (3640:18) >>>>> (null) (15540:19) >>>>> >>>>> I am getting empty function names from some frames, while all the >>>>> other information is present (script name, line, column numbers, ...). >>>>> >>>>> Do you know what might be the reason for getting empty function names? >>>>> >>>>> -- >>>>> -- >>>>> v8-users mailing list >>>>> v8-u...@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-u...@googlegroups.com. >>>>> To view this discussion on the web visit >>>>> https://groups.google.com/d/msgid/v8-users/64d9e4ca-b271-4d83-aace-753c28e193f4%40googlegroups.com >>>>> >>>>> <https://groups.google.com/d/msgid/v8-users/64d9e4ca-b271-4d83-aace-753c28e193f4%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>> . >>>>> >>>> >>> >> -- >> -- >> v8-users mailing list >> v8-u...@googlegroups.com <javascript:> >> 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-u...@googlegroups.com <javascript:>. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/v8-users/358d6517-c279-459b-a675-9ad4d712638d%40googlegroups.com >> >> <https://groups.google.com/d/msgid/v8-users/358d6517-c279-459b-a675-9ad4d712638d%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > -- -- 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/9ad36916-701a-4f07-82e4-3368fd2c313b%40googlegroups.com.