Expands the mechanism that moves token streams to the VM isolate to include instructions and code metadata.
Allow the isolate snapshot to reference Instructions in the VM isolate.
R=asiva@google.com
Review-Url: https://codereview.chromium.org/2909403002 .
Use the speed of previous scavenges to estimate the time required for the next scavenge. When we receive an initial notification, perform a scavenge if we have allocated enough and we estimate we can complete the scavenge before the deadline.
Expand the time recorded for a scavenge to include safepointing and iterating roots.
R=asiva@google.com
Review-Url: https://codereview.chromium.org/3001423002 .
Summary:
Previously, we would create a wrapper function in the flowgraph around converted
closures, which would forward all the closure's arguments and unpack the context
argument before calling the real closure function.
Now, we perform the unpacking at the top of the real function to avoid having
any wrapper function.
Previously, captured parameters would still be appear live to the GC even if
they're updated, because after they are copied into the context, all updates to
them are done there.
Now, as in regular closures, we zero-out the parameter variable after copying
it's value into the context, avoiding potential memory leaks.
Test Plan:
Ran the closure conversion test suite.
Ran benchmarks on Golem -- all statistically significant regressions are gone.
BUG=
R=dmitryas@google.com, regis@google.com
Review-Url: https://codereview.chromium.org/3008923002 .
Status:
- Currently the getIsolate API tries to guess the status of the isolate
when it is in between the IsolateRunnable and PauseStart, by reporting
it as already in the PauseStart status.
This can potentially make flaky all the tests that uses PauseStart to
synchronize with the actual status of the Isolate.
- In the previous situation the timestamp of the event is guessed too,
potentially reporting a wrong value.
- Even with the previous fix the is still a race condition that can lead
to a getIsolate responde with a PauseStart status to be sent before
the actual PauseStart event.
Changes:
- Fallback to None pause event if the isolate is in between
IsolateRunnable and PauseStart, avoiding double posting.
- Send the PauseStart event before the actual status change, partially
avoiding the race conditions.
- Set the pause timestamp before the actual status change, fully
avoiding the race condition.
Closes https://github.com/dart-lang/sdk/issues/28624R=asiva@google.com, rmacnak@google.com
Review-Url: https://codereview.chromium.org/3006883002 .
Before this CL, each invocation of FlowGraphTypePropagator discarded
(overwritten) all previously inferred types. Due to re-structuring of
the IR (for example, InstanceCall to _simpleInstanceOf may be replaced
with various IR sequences), FlowGraphTypePropagator may yield
better or worse results (for example, not all replacements of
_simpleInstanceOf are recognized by FlowGraphTypePropagator).
As the result, inferred type information could be lost at later
stages of the compilation pipeline. Code generation, which looks
at the types may not see the same types as earlier stages of
compilation pipeline, so EmitNativeCode() may generate code which is
out of sync with ComputeCanDeoptimize().
This CL introduces refinement of types: old type is no longer
blindly replaced with newly inferred type. Instead, more specific type
is selected among new and old types. Conservatively, the new type is
preferred if the types are unrelated (it could happen in certain
corner cases, such as unreachable code).
This CL also contains the following minor changes:
* Fix reaching type of the CheckSmi argument when CheckSmi is moved
in LICM::TrySpecializeSmiPhi. It looks like it was previosuly
unnoticed due to full recomputation of types in type propagator.
* Rename local variables to better follow style guide (follow-up
to my previous change).
* Handle kNE along with other comparisons in AOT.
R=rmacnak@google.com, vegorov@google.com
Issue: https://github.com/dart-lang/sdk/issues/30480
Review-Url: https://codereview.chromium.org/3010673002 .
An object A is said to be owned by object B if all direct references to A come from B. In particular, an object that holds unshared lists and maps will own the heap size of those lists and maps, as well as any unshared elements. We hope a table of owned sizes will be more useful than a table of shallow sizes, since the latter typically says the heap is mostly lists.
R=cbernaschina@google.com
Review-Url: https://codereview.chromium.org/3009743003 .
Fuchsia requires the ability to sandbox Isolates w.r.t. file IO.
When a new Isolate starts, Fuchsia will pass the Isolate an object
called a namespace. We can translate the namespace object into a
file descriptor suitable for passing to the *at() family of
POSIX file system calls. The file system calls will then
have visibility only into the specified namespace.
We also plumb Namespaces through on all the other platforms as well to
make the change easier to test and so that in the future we can
implement e.g. per-isolate cwds.
This change adds a new internal class to dart:io called _Namespace,
which is implemented in a patch file. See:
sdk/lib/io/namespace_impl.dart
runtime/bin/namespace_patch.dart
The embedder can set up a non-default namespace by calling
_Namespace._setupNamespace during Isolate setup.
Instances of _Namespace have a native field that holds a pointer
to a native Namespace object. See:
runtime/bin/namespace.h
Calls from e.g. file_impl.dart are now also passed a
_Namespace object. The implementations in e.g. file.cc and
file_linux.cc then extract the namespace, and use it to compute a
file descriptor and path suitable for passing to e.g. openat().
related US-313
R=asiva@google.com, rmacnak@google.com
Review-Url: https://codereview.chromium.org/3007703002 .
When a MessageHandler gets to the paused_on_exist state it should just handle service events.
If ports are open though, at the next message the isolate will consider itself still alive and handle any kind of request.
The MessageHandler is now checking for its paused_on_exit state and avoid to handle normal messages in that state.
Closes https://github.com/dart-lang/sdk/issues/30555R=asiva@google.com
Review-Url: https://codereview.chromium.org/3010503002 .
There already exists a class named "Reader" in the "kernel" namespace
which reads bytes from a kernel binary. The class KernelLoader
(KernelReader before this change) creates VM heap objects and populates
them.
R=kmillikin@google.com
Review-Url: https://codereview.chromium.org/3010543002 .
The Service Protocol exposes a new private RPC _getDefaultClassesAliases
which returns a Map from internal classes to a String.
This Map is used to group internal classes and to avoid navigation to
patch files.
R=asiva@google.com
Review-Url: https://codereview.chromium.org/3003903002 .
Summary:
Previously, we use the "Vector" type in the kernel tree for the result of the
"VectorCreation" operation as as the parameter type for converted closure
functions. In the VM, we use the "Context" type instead, which the VM treats a
little differently than normal Dart-visible types, and it doesn't not handle
type checks against it correctly, breaking all closure converted code running in
checked mode.
Now, Since we are forced to use dynamic to represent the types of elements of
the context, we may as well just use dynamic for the context type itself.
Previously, we did not correct handle converted closure type checks for closures
that capture type parameters. The way we handled these type checks also had
several latent bugs that prevented type parameters being handled properly.
Now, we handle type parameters for converted closures similarly to normal
closures, and the places we treat them specially are fewer and more integrated
with the rest of the closure type checking code.
There is still a problem where assignments to captured variables are not
checked, because they are transformed to assignments into the context, whose
elements are necessarily untyped. This breaks many co19 tests, which expect type
errors on these assignments. The example below should error in checked mode, but
after closure conversion is runs with no errors.
int b;
bool c;
(() { b = c; })()
Test Plan:
- All test cases in "pkg/kernel/testcases/closures" now run in checked mode.
- Added a test "closures_types.dart" to check that captured type parameters are
handled correctly in the converted closures' signature types.
R=dmitryas@google.com
Review-Url: https://codereview.chromium.org/3007623002 .
Snapshots don't include source and generated source is not 1-to-1.
The column offset is off for this test.
BUG=
Review-Url: https://codereview.chromium.org/3011493002 .
At the moment isolated has a name field which is on the main_port the
only exception is the vm-service isolate.
The name is used just for logging.
The service protocol though uses an extra field called debugger_name,
that at this moment is redundant and is optimized away during
compilation.
BUG=
R=rmacnak@google.com, zra@google.com
This CL:
- Removes the debugger_name in favor of a modifiable name
- Adds to all the log where the name was logged the main_port (that is
the only real identifier)
- Changes the default format of the isolate name from:
<script_uri>$<main>
to:
<script_uri>:<main>()
Review-Url: https://codereview.chromium.org/3004563003 .
After [0] landed our debug builders managed to still compile, because
the default debug-optimization-level allows the compiler to inline. This
caused a "CanReload() const { return false; }" to be inlined and
constant folded, so the call to ReloadSources() was eliminated.
Compiling with debug-optimization-level=0 disables inlining and keeps
the call, which gives us a linker error when building the
dart_precompiled_runtime target.
[0] https://codereview.chromium.org/2997243002R=vegorov@google.com
Review-Url: https://codereview.chromium.org/3003383002 .
A placeholder object must be created and registered via AddBackRef(...) *before*
any inner objects are deserialized otherwise NextAvailableObjectId() might
reuse current object id for an inner object with omitted object id leading
to inconsistent back references state.
Also handle kObjectType in ReadIndexedObject allowing it to deserialize things
like <Object>[...].
This bug was revealed by trying out to run VMService isolate in Kernel mode
with strong mode enabled leading to arrays that had no type arguments have
(inferred) type arguments.
R=kustermann@google.com
BUG=
Review-Url: https://codereview.chromium.org/3003333002 .
Obfuscation is controlled by obfuscate flag in Dart_IsolateFlags.
Obfuscation of identifiers is performed during script tokenization - when TokenStream is generated from the source. All kIDENT and kINTERPOL_VAR tokens are renamed consistently using a persistent obfuscation map stored in ObjectStore::obfuscation_map.
Some identifiers (pseudo-keywords, arithmetic operators, builtin recognized methods and entry-points) are not renamed to keep name based lookups from breaking. All other identifiers are renamed.
Constant instances of Symbol-s (both created via literal syntax #ident and using constant constructor const Symbol("ident")) are renamed consistently with corresponding identifiers.
Script urls and Library urls and names are also obfuscated.
Obfuscation map can be dumped as a JSON array at the end of precompilation using Dart_GetObfuscationMap API.
BUG=https://github.com/dart-lang/sdk/issues/30524R=rmacnak@google.com
Review-Url: https://codereview.chromium.org/3003583002 .