+Leszek Swirski <lesz...@google.com>

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.dimit...@gmail.com>
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-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/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/CACswSC39BOozqABiEiE2sQh-ARoL6D1_yt1_Jm8B%3DHk-TiiAuQ%40mail.gmail.com.

Reply via email to