Revert "[vm, interpreter] Bytecode support for dynamic invocation forwarders."
This reverts commit 1d94323b5b2ef67679bb65345ca6b40350d6348a.
Reason for revert: v8_snapshot_profile_writer_test
Original change's description:
> [vm, interpreter] Bytecode support for dynamic invocation forwarders.
>
> Change-Id: I8fb26ca5b7d395c9275b7e1860b47b5c176c00b3
> Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/104941
> Commit-Queue: Ryan Macnak <rmacnak@google.com>
> Reviewed-by: Alexander Markov <alexmarkov@google.com>
> Reviewed-by: RĂ©gis Crelier <regis@google.com>
TBR=rmacnak@google.com,alexmarkov@google.com,regis@google.com
Change-Id: I7f3660e2148683567397a53f0b88ffab76671d94
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/105724
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
diff --git a/runtime/vm/class_id.h b/runtime/vm/class_id.h
index 4e23dea..f95d77f 100644
--- a/runtime/vm/class_id.h
+++ b/runtime/vm/class_id.h
@@ -36,7 +36,6 @@
V(ExceptionHandlers) \
V(Context) \
V(ContextScope) \
- V(ParameterTypeCheck) \
V(SingleTargetCache) \
V(UnlinkedCall) \
V(ICData) \
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index 39249519..a71b9cb 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -2104,71 +2104,6 @@
};
#if !defined(DART_PRECOMPILED_RUNTIME)
-class ParameterTypeCheckSerializationCluster : public SerializationCluster {
- public:
- ParameterTypeCheckSerializationCluster()
- : SerializationCluster("ParameterTypeCheck") {}
- ~ParameterTypeCheckSerializationCluster() {}
-
- void Trace(Serializer* s, RawObject* object) {
- RawParameterTypeCheck* unlinked = ParameterTypeCheck::RawCast(object);
- objects_.Add(unlinked);
- PushFromTo(unlinked);
- }
-
- void WriteAlloc(Serializer* s) {
- s->WriteCid(kParameterTypeCheckCid);
- intptr_t count = objects_.length();
- s->WriteUnsigned(count);
- for (intptr_t i = 0; i < count; i++) {
- RawParameterTypeCheck* check = objects_[i];
- s->AssignRef(check);
- }
- }
-
- void WriteFill(Serializer* s) {
- intptr_t count = objects_.length();
- for (intptr_t i = 0; i < count; i++) {
- RawParameterTypeCheck* check = objects_[i];
- s->Write<intptr_t>(check->ptr()->index_);
- WriteFromTo(check);
- }
- }
-
- private:
- GrowableArray<RawParameterTypeCheck*> objects_;
-};
-#endif // !DART_PRECOMPILED_RUNTIME
-
-class ParameterTypeCheckDeserializationCluster : public DeserializationCluster {
- public:
- ParameterTypeCheckDeserializationCluster() {}
- ~ParameterTypeCheckDeserializationCluster() {}
-
- void ReadAlloc(Deserializer* d) {
- start_index_ = d->next_index();
- PageSpace* old_space = d->heap()->old_space();
- intptr_t count = d->ReadUnsigned();
- for (intptr_t i = 0; i < count; i++) {
- d->AssignRef(
- AllocateUninitialized(old_space, ParameterTypeCheck::InstanceSize()));
- }
- stop_index_ = d->next_index();
- }
-
- void ReadFill(Deserializer* d) {
- for (intptr_t id = start_index_; id < stop_index_; id++) {
- RawParameterTypeCheck* check =
- reinterpret_cast<RawParameterTypeCheck*>(d->Ref(id));
- Deserializer::InitializeHeader(check, kParameterTypeCheckCid,
- ParameterTypeCheck::InstanceSize());
- check->ptr()->index_ = d->Read<intptr_t>();
- ReadFromTo(check);
- }
- }
-};
-
-#if !defined(DART_PRECOMPILED_RUNTIME)
class UnlinkedCallSerializationCluster : public SerializationCluster {
public:
UnlinkedCallSerializationCluster() : SerializationCluster("UnlinkedCall") {}
@@ -4340,8 +4275,6 @@
return new (Z) ContextSerializationCluster();
case kContextScopeCid:
return new (Z) ContextScopeSerializationCluster();
- case kParameterTypeCheckCid:
- return new (Z) ParameterTypeCheckSerializationCluster();
case kUnlinkedCallCid:
return new (Z) UnlinkedCallSerializationCluster();
case kICDataCid:
@@ -4779,8 +4712,6 @@
"<invoke field>");
AddBaseObject(Object::nsm_dispatcher_bytecode().raw(), "Bytecode",
"<nsm dispatcher>");
- AddBaseObject(Object::dynamic_invocation_forwarder_bytecode().raw(),
- "Bytecode", "<dyn forwarder>");
for (intptr_t i = 0; i < ArgumentsDescriptor::kCachedDescriptorCount; i++) {
AddBaseObject(ArgumentsDescriptor::cached_args_descriptors_[i],
@@ -4974,8 +4905,6 @@
return new (Z) ContextDeserializationCluster();
case kContextScopeCid:
return new (Z) ContextScopeDeserializationCluster();
- case kParameterTypeCheckCid:
- return new (Z) ParameterTypeCheckDeserializationCluster();
case kUnlinkedCallCid:
return new (Z) UnlinkedCallDeserializationCluster();
case kICDataCid:
@@ -5245,7 +5174,6 @@
AddBaseObject(Object::invoke_closure_bytecode().raw());
AddBaseObject(Object::invoke_field_bytecode().raw());
AddBaseObject(Object::nsm_dispatcher_bytecode().raw());
- AddBaseObject(Object::dynamic_invocation_forwarder_bytecode().raw());
for (intptr_t i = 0; i < ArgumentsDescriptor::kCachedDescriptorCount; i++) {
AddBaseObject(ArgumentsDescriptor::cached_args_descriptors_[i]);
diff --git a/runtime/vm/compiler/frontend/bytecode_reader.cc b/runtime/vm/compiler/frontend/bytecode_reader.cc
index c747fbd..c180689 100644
--- a/runtime/vm/compiler/frontend/bytecode_reader.cc
+++ b/runtime/vm/compiler/frontend/bytecode_reader.cc
@@ -53,7 +53,6 @@
(function.kind() != RawFunction::kImplicitStaticGetter) &&
(function.kind() != RawFunction::kMethodExtractor) &&
(function.kind() != RawFunction::kInvokeFieldDispatcher) &&
- (function.kind() != RawFunction::kDynamicInvocationForwarder) &&
(function.kind() != RawFunction::kNoSuchMethodDispatcher)) {
return;
}
@@ -270,142 +269,6 @@
}
}
-static intptr_t IndexFor(Zone* zone,
- const Function& function,
- const String& name) {
- const Bytecode& bc = Bytecode::Handle(zone, function.bytecode());
- const ObjectPool& pool = ObjectPool::Handle(zone, bc.object_pool());
- const KBCInstr* pc = reinterpret_cast<const KBCInstr*>(bc.PayloadStart());
-
- ASSERT(KernelBytecode::IsEntryOptionalOpcode(pc));
- ASSERT(KernelBytecode::DecodeB(pc) ==
- function.NumOptionalPositionalParameters());
- ASSERT(KernelBytecode::DecodeC(pc) == function.NumOptionalNamedParameters());
- pc = KernelBytecode::Next(pc);
-
- const intptr_t num_opt_params = function.NumOptionalParameters();
- const intptr_t num_fixed_params = function.num_fixed_parameters();
- for (intptr_t i = 0; i < num_opt_params; i++) {
- const KBCInstr* load_name = pc;
- const KBCInstr* load_value = KernelBytecode::Next(load_name);
- pc = KernelBytecode::Next(load_value);
- ASSERT(KernelBytecode::IsLoadConstantOpcode(load_name));
- ASSERT(KernelBytecode::IsLoadConstantOpcode(load_value));
- if (pool.ObjectAt(KernelBytecode::DecodeE(load_name)) == name.raw()) {
- return num_fixed_params + i;
- }
- }
-
- UNREACHABLE();
- return -1;
-}
-
-RawArray* BytecodeReaderHelper::CreateForwarderChecks(
- const Function& function) {
- ASSERT(function.kind() != RawFunction::kDynamicInvocationForwarder);
- ASSERT(function.is_declared_in_bytecode());
-
- TypeArguments& default_args = TypeArguments::Handle(Z);
- if (function.bytecode_offset() != 0) {
- AlternativeReadingScope alt(&reader_, function.bytecode_offset());
-
- const intptr_t flags = reader_.ReadUInt();
- const bool has_parameters_flags =
- (flags & Code::kHasParameterFlagsFlag) != 0;
- const bool has_forwarding_stub_target =
- (flags & Code::kHasForwardingStubTargetFlag) != 0;
- const bool has_default_function_type_args =
- (flags & Code::kHasDefaultFunctionTypeArgsFlag) != 0;
-
- if (has_parameters_flags) {
- intptr_t num_params = reader_.ReadUInt();
- ASSERT(num_params ==
- function.NumParameters() - function.NumImplicitParameters());
- for (intptr_t i = 0; i < num_params; ++i) {
- reader_.ReadUInt();
- }
- }
-
- if (has_forwarding_stub_target) {
- reader_.ReadUInt();
- }
-
- if (has_default_function_type_args) {
- const intptr_t index = reader_.ReadUInt();
- const Bytecode& code = Bytecode::Handle(Z, function.bytecode());
- const ObjectPool& pool = ObjectPool::Handle(Z, code.object_pool());
- default_args ^= pool.ObjectAt(index);
- }
- }
-
- auto& name = String::Handle(Z);
- auto& check = ParameterTypeCheck::Handle(Z);
- auto& checks = GrowableObjectArray::Handle(Z, GrowableObjectArray::New());
-
- checks.Add(function);
- checks.Add(default_args);
-
- const auto& type_params =
- TypeArguments::Handle(Z, function.type_parameters());
- if (!type_params.IsNull()) {
- auto& type_param = TypeParameter::Handle(Z);
- auto& bound = AbstractType::Handle(Z);
- for (intptr_t i = 0, n = type_params.Length(); i < n; ++i) {
- type_param ^= type_params.TypeAt(i);
- bound = type_param.bound();
- if (!bound.IsTopType() && !type_param.IsGenericCovariantImpl()) {
- name = type_param.name();
- ASSERT(type_param.IsFinalized());
- check = ParameterTypeCheck::New();
- check.set_param(type_param);
- check.set_type_or_bound(bound);
- check.set_name(name);
- checks.Add(check);
- }
- }
- }
-
- const intptr_t num_params = function.NumParameters();
- const intptr_t num_pos_params = function.HasOptionalNamedParameters()
- ? function.num_fixed_parameters()
- : num_params;
-
- BitVector is_covariant(Z, num_params);
- BitVector is_generic_covariant_impl(Z, num_params);
- ReadParameterCovariance(function, &is_covariant, &is_generic_covariant_impl);
-
- auto& type = AbstractType::Handle(Z);
- auto& cache = SubtypeTestCache::Handle(Z);
- const bool has_optional_parameters = function.HasOptionalParameters();
- for (intptr_t i = function.NumImplicitParameters(); i < num_params; ++i) {
- type = function.ParameterTypeAt(i);
- if (!type.IsTopType() && !is_generic_covariant_impl.Contains(i) &&
- !is_covariant.Contains(i)) {
- name = function.ParameterNameAt(i);
- intptr_t index;
- if (i >= num_pos_params) {
- // Named parameter.
- index = IndexFor(Z, function, name);
- } else if (has_optional_parameters) {
- // Fixed or optional parameter.
- index = i;
- } else {
- // Fixed parameter.
- index = -kKBCParamEndSlotFromFp - num_params + i;
- }
- check = ParameterTypeCheck::New();
- check.set_index(index);
- check.set_type_or_bound(type);
- check.set_name(name);
- cache = SubtypeTestCache::New();
- check.set_cache(cache);
- checks.Add(check);
- }
- }
-
- return Array::MakeFixedLength(checks);
-}
-
void BytecodeReaderHelper::ReadClosureDeclaration(const Function& function,
intptr_t closureIndex) {
// Closure flags, must be in sync with ClosureDeclaration constants in
@@ -2233,7 +2096,7 @@
VMTagScope tagScope(thread, VMTag::kLoadBytecodeTagId);
#if defined(SUPPORT_TIMELINE)
- TimelineDurationScope tds(thread, Timeline::GetCompilerStream(),
+ TimelineDurationScope tds(Thread::Current(), Timeline::GetCompilerStream(),
"BytecodeReader::ReadFunctionBytecode");
// This increases bytecode reading time by ~7%, so only keep it around for
// debugging.
@@ -2267,7 +2130,7 @@
bytecode = Object::method_extractor_bytecode().raw();
break;
case RawFunction::kInvokeFieldDispatcher:
- if (Class::Handle(zone, function.Owner()).id() == kClosureCid) {
+ if (Class::Handle(function.Owner()).id() == kClosureCid) {
bytecode = Object::invoke_closure_bytecode().raw();
} else {
bytecode = Object::invoke_field_bytecode().raw();
@@ -2276,36 +2139,6 @@
case RawFunction::kNoSuchMethodDispatcher:
bytecode = Object::nsm_dispatcher_bytecode().raw();
break;
- case RawFunction::kDynamicInvocationForwarder: {
- const Function& target =
- Function::Handle(zone, function.ForwardingTarget());
- if (!target.HasBytecode()) {
- // The forwarder will use the target's bytecode to handle optional
- // parameters.
- const Error& error =
- Error::Handle(zone, ReadFunctionBytecode(thread, target));
- if (!error.IsNull()) {
- return error.raw();
- }
- }
- {
- const Script& script = Script::Handle(zone, target.script());
- TranslationHelper translation_helper(thread);
- translation_helper.InitFromScript(script);
-
- ActiveClass active_class;
- BytecodeComponentData bytecode_component(
- Array::Handle(zone, translation_helper.GetBytecodeComponent()));
- ASSERT(!bytecode_component.IsNull());
- BytecodeReaderHelper bytecode_reader(
- &translation_helper, &active_class, &bytecode_component);
-
- const Array& checks = Array::Handle(
- zone, bytecode_reader.CreateForwarderChecks(target));
- function.SetForwardingChecks(checks);
- }
- bytecode = Object::dynamic_invocation_forwarder_bytecode().raw();
- } break;
default:
break;
}
diff --git a/runtime/vm/compiler/frontend/bytecode_reader.h b/runtime/vm/compiler/frontend/bytecode_reader.h
index 830bf95..753bff9 100644
--- a/runtime/vm/compiler/frontend/bytecode_reader.h
+++ b/runtime/vm/compiler/frontend/bytecode_reader.h
@@ -54,8 +54,6 @@
void ReadCode(const Function& function, intptr_t code_offset);
- RawArray* CreateForwarderChecks(const Function& function);
-
void ReadMembers(const Class& cls,
intptr_t members_offset,
bool discard_fields);
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 0306907..2668c17 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -2234,13 +2234,7 @@
function.IsImplicitSetterFunction();
const bool is_method = !function.IsStaticFunction();
- Field& field = Field::ZoneHandle(Z);
- if (function.IsDynamicInvocationForwarder()) {
- Function& target = Function::Handle(function.ForwardingTarget());
- field = target.accessor_field();
- } else {
- field = function.accessor_field();
- }
+ Field& field = Field::ZoneHandle(Z, function.accessor_field());
graph_entry_ =
new (Z) GraphEntryInstr(*parsed_function_, Compiler::kNoOSRDeoptId);
diff --git a/runtime/vm/interpreter.cc b/runtime/vm/interpreter.cc
index 2f823c5..e188c08 100644
--- a/runtime/vm/interpreter.cc
+++ b/runtime/vm/interpreter.cc
@@ -1186,120 +1186,6 @@
}
#endif // PRODUCT
-bool Interpreter::CopyParameters(Thread* thread,
- const KBCInstr** pc,
- RawObject*** FP,
- RawObject*** SP,
- const intptr_t num_fixed_params,
- const intptr_t num_opt_pos_params,
- const intptr_t num_opt_named_params) {
- const intptr_t min_num_pos_args = num_fixed_params;
- const intptr_t max_num_pos_args = num_fixed_params + num_opt_pos_params;
-
- // Decode arguments descriptor.
- const intptr_t arg_count = InterpreterHelpers::ArgDescArgCount(argdesc_);
- const intptr_t pos_count = InterpreterHelpers::ArgDescPosCount(argdesc_);
- const intptr_t named_count = (arg_count - pos_count);
-
- // Check that got the right number of positional parameters.
- if ((min_num_pos_args > pos_count) || (pos_count > max_num_pos_args)) {
- return false;
- }
-
- // Copy all passed position arguments.
- RawObject** first_arg = FrameArguments(*FP, arg_count);
- memmove(*FP, first_arg, pos_count * kWordSize);
-
- if (num_opt_named_params != 0) {
- // This is a function with named parameters.
- // Walk the list of named parameters and their
- // default values encoded as pairs of LoadConstant instructions that
- // follows the entry point and find matching values via arguments
- // descriptor.
- RawObject** argdesc_data = argdesc_->ptr()->data();
-
- intptr_t i = 0; // argument position
- intptr_t j = 0; // parameter position
- while ((j < num_opt_named_params) && (i < named_count)) {
- // Fetch formal parameter information: name, default value, target slot.
- const KBCInstr* load_name = *pc;
- const KBCInstr* load_value = KernelBytecode::Next(load_name);
- *pc = KernelBytecode::Next(load_value);
- ASSERT(KernelBytecode::IsLoadConstantOpcode(load_name));
- ASSERT(KernelBytecode::IsLoadConstantOpcode(load_value));
- const uint8_t reg = KernelBytecode::DecodeA(load_name);
- ASSERT(reg == KernelBytecode::DecodeA(load_value));
-
- RawString* name = static_cast<RawString*>(
- LOAD_CONSTANT(KernelBytecode::DecodeE(load_name)));
- if (name == argdesc_data[ArgumentsDescriptor::name_index(i)]) {
- // Parameter was passed. Fetch passed value.
- const intptr_t arg_index = Smi::Value(static_cast<RawSmi*>(
- argdesc_data[ArgumentsDescriptor::position_index(i)]));
- (*FP)[reg] = first_arg[arg_index];
- ++i; // Consume passed argument.
- } else {
- // Parameter was not passed. Fetch default value.
- (*FP)[reg] = LOAD_CONSTANT(KernelBytecode::DecodeE(load_value));
- }
- ++j; // Next formal parameter.
- }
-
- // If we have unprocessed formal parameters then initialize them all
- // using default values.
- while (j < num_opt_named_params) {
- const KBCInstr* load_name = *pc;
- const KBCInstr* load_value = KernelBytecode::Next(load_name);
- *pc = KernelBytecode::Next(load_value);
- ASSERT(KernelBytecode::IsLoadConstantOpcode(load_name));
- ASSERT(KernelBytecode::IsLoadConstantOpcode(load_value));
- const uint8_t reg = KernelBytecode::DecodeA(load_name);
- ASSERT(reg == KernelBytecode::DecodeA(load_value));
-
- (*FP)[reg] = LOAD_CONSTANT(KernelBytecode::DecodeE(load_value));
- ++j;
- }
-
- // If we have unprocessed passed arguments that means we have mismatch
- // between formal parameters and concrete arguments. This can only
- // occur if the current function is a closure.
- if (i < named_count) {
- return false;
- }
-
- // SP points past copied arguments.
- *SP = *FP + num_fixed_params + num_opt_named_params - 1;
- } else {
- ASSERT(num_opt_pos_params != 0);
- if (named_count != 0) {
- // Function can't have both named and optional positional parameters.
- // This kind of mismatch can only occur if the current function
- // is a closure.
- return false;
- }
-
- // Process the list of default values encoded as a sequence of
- // LoadConstant instructions after EntryOpt bytecode.
- // Execute only those that correspond to parameters that were not passed.
- for (intptr_t i = num_fixed_params; i < pos_count; ++i) {
- ASSERT(KernelBytecode::IsLoadConstantOpcode(*pc));
- *pc = KernelBytecode::Next(*pc);
- }
- for (intptr_t i = pos_count; i < max_num_pos_args; ++i) {
- const KBCInstr* load_value = *pc;
- *pc = KernelBytecode::Next(load_value);
- ASSERT(KernelBytecode::IsLoadConstantOpcode(load_value));
- ASSERT(KernelBytecode::DecodeA(load_value) == i);
- (*FP)[i] = LOAD_CONSTANT(KernelBytecode::DecodeE(load_value));
- }
-
- // SP points past the last copied parameter.
- *SP = *FP + max_num_pos_args - 1;
- }
-
- return true;
-}
-
bool Interpreter::AssertAssignable(Thread* thread,
const KBCInstr* pc,
RawObject** FP,
@@ -1765,11 +1651,114 @@
{
BYTECODE(EntryOptional, A_B_C);
- if (CopyParameters(thread, &pc, &FP, &SP, rA, rB, rC)) {
- DISPATCH();
- } else {
+ const intptr_t num_fixed_params = rA;
+ const intptr_t num_opt_pos_params = rB;
+ const intptr_t num_opt_named_params = rC;
+ const intptr_t min_num_pos_args = num_fixed_params;
+ const intptr_t max_num_pos_args = num_fixed_params + num_opt_pos_params;
+
+ // Decode arguments descriptor.
+ const intptr_t arg_count = InterpreterHelpers::ArgDescArgCount(argdesc_);
+ const intptr_t pos_count = InterpreterHelpers::ArgDescPosCount(argdesc_);
+ const intptr_t named_count = (arg_count - pos_count);
+
+ // Check that got the right number of positional parameters.
+ if ((min_num_pos_args > pos_count) || (pos_count > max_num_pos_args)) {
goto NoSuchMethodFromPrologue;
}
+
+ // Copy all passed position arguments.
+ RawObject** first_arg = FrameArguments(FP, arg_count);
+ memmove(FP, first_arg, pos_count * kWordSize);
+
+ if (num_opt_named_params != 0) {
+ // This is a function with named parameters.
+ // Walk the list of named parameters and their
+ // default values encoded as pairs of LoadConstant instructions that
+ // follows the entry point and find matching values via arguments
+ // descriptor.
+ RawObject** argdesc_data = argdesc_->ptr()->data();
+
+ intptr_t i = 0; // argument position
+ intptr_t j = 0; // parameter position
+ while ((j < num_opt_named_params) && (i < named_count)) {
+ // Fetch formal parameter information: name, default value, target slot.
+ const KBCInstr* load_name = pc;
+ const KBCInstr* load_value = KernelBytecode::Next(load_name);
+ pc = KernelBytecode::Next(load_value);
+ ASSERT(KernelBytecode::IsLoadConstantOpcode(load_name));
+ ASSERT(KernelBytecode::IsLoadConstantOpcode(load_value));
+ const uint8_t reg = KernelBytecode::DecodeA(load_name);
+ ASSERT(reg == KernelBytecode::DecodeA(load_value));
+
+ RawString* name = static_cast<RawString*>(
+ LOAD_CONSTANT(KernelBytecode::DecodeE(load_name)));
+ if (name == argdesc_data[ArgumentsDescriptor::name_index(i)]) {
+ // Parameter was passed. Fetch passed value.
+ const intptr_t arg_index = Smi::Value(static_cast<RawSmi*>(
+ argdesc_data[ArgumentsDescriptor::position_index(i)]));
+ FP[reg] = first_arg[arg_index];
+ ++i; // Consume passed argument.
+ } else {
+ // Parameter was not passed. Fetch default value.
+ FP[reg] = LOAD_CONSTANT(KernelBytecode::DecodeE(load_value));
+ }
+ ++j; // Next formal parameter.
+ }
+
+ // If we have unprocessed formal parameters then initialize them all
+ // using default values.
+ while (j < num_opt_named_params) {
+ const KBCInstr* load_name = pc;
+ const KBCInstr* load_value = KernelBytecode::Next(load_name);
+ pc = KernelBytecode::Next(load_value);
+ ASSERT(KernelBytecode::IsLoadConstantOpcode(load_name));
+ ASSERT(KernelBytecode::IsLoadConstantOpcode(load_value));
+ const uint8_t reg = KernelBytecode::DecodeA(load_name);
+ ASSERT(reg == KernelBytecode::DecodeA(load_value));
+
+ FP[reg] = LOAD_CONSTANT(KernelBytecode::DecodeE(load_value));
+ ++j;
+ }
+
+ // If we have unprocessed passed arguments that means we have mismatch
+ // between formal parameters and concrete arguments. This can only
+ // occur if the current function is a closure.
+ if (i < named_count) {
+ goto NoSuchMethodFromPrologue;
+ }
+
+ // SP points past copied arguments.
+ SP = FP + num_fixed_params + num_opt_named_params - 1;
+ } else {
+ ASSERT(num_opt_pos_params != 0);
+ if (named_count != 0) {
+ // Function can't have both named and optional positional parameters.
+ // This kind of mismatch can only occur if the current function
+ // is a closure.
+ goto NoSuchMethodFromPrologue;
+ }
+
+ // Process the list of default values encoded as a sequence of
+ // LoadConstant instructions after EntryOpt bytecode.
+ // Execute only those that correspond to parameters that were not passed.
+ for (intptr_t i = num_fixed_params; i < pos_count; ++i) {
+ ASSERT(KernelBytecode::IsLoadConstantOpcode(pc));
+ pc = KernelBytecode::Next(pc);
+ }
+ for (intptr_t i = pos_count; i < max_num_pos_args; ++i) {
+ const KBCInstr* load_value = pc;
+ pc = KernelBytecode::Next(load_value);
+ ASSERT(KernelBytecode::IsLoadConstantOpcode(load_value));
+ ASSERT(KernelBytecode::DecodeA(load_value) == i);
+ FP[i] = LOAD_CONSTANT(KernelBytecode::DecodeE(load_value));
+ }
+
+ // SP points past the last copied parameter.
+ SP = FP + max_num_pos_args - 1;
+ }
+
+ DISPATCH();
}
{
@@ -3480,101 +3469,8 @@
RawFunction* function = FrameFunction(FP);
ASSERT(Function::kind(function) ==
RawFunction::kDynamicInvocationForwarder);
-
- BUMP_USAGE_COUNTER_ON_ENTRY(function);
-
- RawArray* checks = Array::RawCast(function->ptr()->data_);
- RawFunction* target = Function::RawCast(checks->ptr()->data()[0]);
- ASSERT(Function::kind(target) != RawFunction::kDynamicInvocationForwarder);
- RawBytecode* target_bytecode = target->ptr()->bytecode_;
- ASSERT(target_bytecode != Bytecode::null());
- ASSERT(target_bytecode->IsBytecode());
-
- const KBCInstr* pc2 = reinterpret_cast<const KBCInstr*>(
- target_bytecode->ptr()->instructions_);
- if (KernelBytecode::IsEntryOptionalOpcode(pc2)) {
- pp_ = target_bytecode->ptr()->object_pool_;
- uint32_t rA, rB, rC;
- rA = KernelBytecode::DecodeA(pc2);
- rB = KernelBytecode::DecodeB(pc2);
- rC = KernelBytecode::DecodeC(pc2);
- pc2 = KernelBytecode::Next(pc2);
- if (!CopyParameters(thread, &pc2, &FP, &SP, rA, rB, rC)) {
- goto NoSuchMethodFromPrologue;
- }
- }
-
- intptr_t len = Smi::Value(checks->ptr()->length_);
- SP[1] = checks;
- SP[2] = argdesc_;
-
- const intptr_t type_args_len =
- InterpreterHelpers::ArgDescTypeArgsLen(argdesc_);
- const intptr_t receiver_idx = type_args_len > 0 ? 1 : 0;
- const intptr_t argc =
- InterpreterHelpers::ArgDescArgCount(argdesc_) + receiver_idx;
-
- RawInstance* receiver =
- Instance::RawCast(FrameArguments(FP, argc)[receiver_idx]);
- SP[5] = InterpreterHelpers::GetTypeArguments(thread, receiver);
-
- if (type_args_len > 0) {
- SP[6] = FrameArguments(FP, argc)[0];
- } else {
- SP[6] = TypeArguments::RawCast(checks->ptr()->data()[1]);
- if (SP[5] != null_value && SP[6] != null_value) {
- SP[7] = SP[6]; // type_arguments
- SP[8] = SP[5]; // instantiator_type_args
- SP[9] = null_value; // function_type_args
- Exit(thread, FP, SP + 10, pc);
- NativeArguments args(thread, 3, SP + 7, SP + 7);
- INVOKE_RUNTIME(DRT_InstantiateTypeArguments, args);
- SP[6] = SP[7];
- }
- }
-
- for (intptr_t i = 2; i < len; i++) {
- RawParameterTypeCheck* check =
- ParameterTypeCheck::RawCast(checks->ptr()->data()[i]);
-
- if (LIKELY(check->ptr()->index_ != 0)) {
- ASSERT(&FP[check->ptr()->index_] <= SP);
- SP[3] = Instance::RawCast(FP[check->ptr()->index_]);
- if (SP[3] == null_value) {
- continue; // Not handled by AssertAssignable for some reason...
- }
- SP[4] = check->ptr()->type_or_bound_;
- // SP[5]: Instantiator type args.
- // SP[6]: Function type args.
- SP[7] = check->ptr()->name_;
- if (!AssertAssignable(thread, pc, FP, SP, SP + 3,
- check->ptr()->cache_)) {
- HANDLE_EXCEPTION;
- }
- } else {
- SP[3] = 0;
- SP[4] = 0;
- // SP[5]: Instantiator type args.
- // SP[6]: Function type args.
- SP[7] = check->ptr()->param_;
- SP[8] = check->ptr()->type_or_bound_;
- SP[9] = check->ptr()->name_;
- SP[10] = 0;
- Exit(thread, FP, SP + 11, pc);
- NativeArguments native_args(thread, 5, SP + 5, SP + 10);
- INVOKE_RUNTIME(DRT_SubtypeCheck, native_args);
- }
-
- checks = Array::RawCast(SP[1]); // Reload after runtime call.
- }
-
- target = Function::RawCast(checks->ptr()->data()[0]);
- argdesc_ = Array::RawCast(SP[2]);
-
- SP = FP - 1; // Unmarshall optional parameters.
-
- SP[1] = target;
- goto TailCallSP1;
+ UNIMPLEMENTED();
+ DISPATCH();
}
{
diff --git a/runtime/vm/interpreter.h b/runtime/vm/interpreter.h
index a8e393f..a47eecc 100644
--- a/runtime/vm/interpreter.h
+++ b/runtime/vm/interpreter.h
@@ -209,14 +209,6 @@
RawObject*** SP,
bool optimized);
- bool CopyParameters(Thread* thread,
- const KBCInstr** pc,
- RawObject*** FP,
- RawObject*** SP,
- const intptr_t num_fixed_params,
- const intptr_t num_opt_pos_params,
- const intptr_t num_opt_named_params);
-
bool AssertAssignable(Thread* thread,
const KBCInstr* pc,
RawObject** FP,
diff --git a/runtime/vm/kernel.cc b/runtime/vm/kernel.cc
index b16d1b3..946135e 100644
--- a/runtime/vm/kernel.cc
+++ b/runtime/vm/kernel.cc
@@ -11,7 +11,6 @@
#include "vm/longjump.h"
#include "vm/object_store.h"
#include "vm/parser.h" // For Parser::kParameter* constants.
-#include "vm/stack_frame.h"
#if !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/kernel.h b/runtime/vm/kernel.h
index 32f975f..4e66b89 100644
--- a/runtime/vm/kernel.h
+++ b/runtime/vm/kernel.h
@@ -208,11 +208,6 @@
// as such function already checks all of its parameters.
bool NeedsDynamicInvocationForwarder(const Function& function);
-// Returns a list of ParameterTypeChecks needed by a dynamic invocation
-// forwarder that targets [function]. Indices in these checks correspond to
-// bytecode frame indices.
-RawArray* CollectDynamicInvocationChecks(const Function& function);
-
ProcedureAttributesMetadata ProcedureAttributesOf(const Function& function,
Zone* zone);
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 6066a17..f914e28 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -153,8 +153,6 @@
reinterpret_cast<RawClass*>(RAW_NULL);
RawClass* Object::context_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
RawClass* Object::context_scope_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
-RawClass* Object::dyncalltypecheck_class_ =
- reinterpret_cast<RawClass*>(RAW_NULL);
RawClass* Object::singletargetcache_class_ =
reinterpret_cast<RawClass*>(RAW_NULL);
RawClass* Object::unlinkedcall_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
@@ -650,9 +648,6 @@
cls = Class::New<ContextScope>();
context_scope_class_ = cls.raw();
- cls = Class::New<ParameterTypeCheck>();
- dyncalltypecheck_class_ = cls.raw();
-
cls = Class::New<SingleTargetCache>();
singletargetcache_class_ = cls.raw();
@@ -912,9 +907,6 @@
*nsm_dispatcher_bytecode_ = CreateVMInternalBytecode(
KernelBytecode::kVMInternal_NoSuchMethodDispatcher);
- *dynamic_invocation_forwarder_bytecode_ = CreateVMInternalBytecode(
- KernelBytecode::kVMInternal_ForwardDynamicInvocation);
-
// Some thread fields need to be reinitialized as null constants have not been
// initialized until now.
Thread* thr = Thread::Current();
@@ -986,8 +978,6 @@
ASSERT(invoke_field_bytecode_->IsBytecode());
ASSERT(!nsm_dispatcher_bytecode_->IsSmi());
ASSERT(nsm_dispatcher_bytecode_->IsBytecode());
- ASSERT(!dynamic_invocation_forwarder_bytecode_->IsSmi());
- ASSERT(dynamic_invocation_forwarder_bytecode_->IsBytecode());
}
void Object::FinishInit(Isolate* isolate) {
@@ -1031,7 +1021,6 @@
exception_handlers_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
context_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
context_scope_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
- dyncalltypecheck_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
singletargetcache_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
unlinkedcall_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
icdata_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
@@ -1131,7 +1120,6 @@
SET_CLASS_NAME(exception_handlers, ExceptionHandlers);
SET_CLASS_NAME(context, Context);
SET_CLASS_NAME(context_scope, ContextScope);
- SET_CLASS_NAME(dyncalltypecheck, ParameterTypeCheck);
SET_CLASS_NAME(singletargetcache, SingleTargetCache);
SET_CLASS_NAME(unlinkedcall, UnlinkedCall);
SET_CLASS_NAME(icdata, ICData);
@@ -3070,10 +3058,6 @@
forwarder.InheritBinaryDeclarationFrom(*this);
- const Array& checks = Array::Handle(zone, Array::New(1));
- checks.SetAt(0, *this);
- forwarder.SetForwardingChecks(checks);
-
return forwarder.raw();
}
@@ -3909,8 +3893,6 @@
return Symbols::Context().raw();
case kContextScopeCid:
return Symbols::ContextScope().raw();
- case kParameterTypeCheckCid:
- return Symbols::ParameterTypeCheck().raw();
case kSingleTargetCacheCid:
return Symbols::SingleTargetCache().raw();
case kICDataCid:
@@ -5673,7 +5655,6 @@
}
switch (kind()) {
case RawFunction::kDynamicInvocationForwarder:
- return is_declared_in_bytecode();
case RawFunction::kImplicitClosureFunction:
case RawFunction::kIrregexpFunction:
case RawFunction::kFfiTrampoline:
@@ -5896,7 +5877,8 @@
ASSERT(kind() == RawFunction::kImplicitGetter ||
kind() == RawFunction::kImplicitSetter ||
kind() == RawFunction::kImplicitStaticGetter ||
- kind() == RawFunction::kStaticFieldInitializer);
+ kind() == RawFunction::kStaticFieldInitializer ||
+ kind() == RawFunction::kDynamicInvocationForwarder);
return Field::RawCast(raw_ptr()->data_);
}
@@ -6235,20 +6217,6 @@
RedirectionData::Cast(obj).set_target(target);
}
-RawFunction* Function::ForwardingTarget() const {
- ASSERT(kind() == RawFunction::kDynamicInvocationForwarder);
- Array& checks = Array::Handle();
- checks ^= raw_ptr()->data_;
- return Function::RawCast(checks.At(0));
-}
-
-void Function::SetForwardingChecks(const Array& checks) const {
- ASSERT(kind() == RawFunction::kDynamicInvocationForwarder);
- ASSERT(checks.Length() >= 1);
- ASSERT(Object::Handle(checks.At(0)).IsFunction());
- set_data(checks);
-}
-
// This field is heavily overloaded:
// eval function: Script expression source
// kernel eval function: Array[0] = Script
@@ -6270,9 +6238,6 @@
// Array[1] = Function implicit closure function
// regular function: Function for implicit closure function
// ffi trampoline function: FfiTrampolineData (Dart->C)
-// dyn inv forwarder: Array[0] = Function target
-// Array[1] = TypeArguments default type args
-// Array[i] = ParameterTypeCheck
void Function::set_data(const Object& value) const {
StorePointer(&raw_ptr()->data_, value.raw());
}
@@ -13221,43 +13186,6 @@
#undef FORMAT2
}
-void ParameterTypeCheck::set_type_or_bound(const AbstractType& value) const {
- StorePointer(&raw_ptr()->type_or_bound_, value.raw());
-}
-
-void ParameterTypeCheck::set_param(const AbstractType& value) const {
- StorePointer(&raw_ptr()->param_, value.raw());
-}
-
-void ParameterTypeCheck::set_name(const String& value) const {
- StorePointer(&raw_ptr()->name_, value.raw());
-}
-
-void ParameterTypeCheck::set_cache(const SubtypeTestCache& value) const {
- StorePointer(&raw_ptr()->cache_, value.raw());
-}
-
-const char* ParameterTypeCheck::ToCString() const {
- Zone* zone = Thread::Current()->zone();
- return zone->PrintToString("ParameterTypeCheck(%" Pd " %s %s %s)", index(),
- Object::Handle(zone, param()).ToCString(),
- Object::Handle(zone, type_or_bound()).ToCString(),
- Object::Handle(zone, name()).ToCString());
-}
-
-RawParameterTypeCheck* ParameterTypeCheck::New() {
- ParameterTypeCheck& result = ParameterTypeCheck::Handle();
- {
- RawObject* raw =
- Object::Allocate(ParameterTypeCheck::kClassId,
- ParameterTypeCheck::InstanceSize(), Heap::kOld);
- NoSafepointScope no_safepoint;
- result ^= raw;
- }
- result.set_index(0);
- return result.raw();
-}
-
void SingleTargetCache::set_target(const Code& value) const {
StorePointer(&raw_ptr()->target_, value.raw());
}
@@ -13324,14 +13252,14 @@
}
const char* ICData::ToCString() const {
- Zone* zone = Thread::Current()->zone();
- const String& name = String::Handle(zone, target_name());
+ const String& name = String::Handle(target_name());
const intptr_t num_args = NumArgsTested();
const intptr_t num_checks = NumberOfChecks();
const intptr_t type_args_len = TypeArgsLen();
- return zone->PrintToString(
- "ICData(%s num-args: %" Pd " num-checks: %" Pd " type-args-len: %" Pd ")",
- name.ToCString(), num_args, num_checks, type_args_len);
+ return OS::SCreate(Thread::Current()->zone(),
+ "ICData target:'%s' num-args: %" Pd " num-checks: %" Pd
+ " type-args-len: %" Pd "",
+ name.ToCString(), num_args, num_checks, type_args_len);
}
RawFunction* ICData::Owner() const {
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 82b27a0..33261da 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -403,7 +403,6 @@
V(Bytecode, invoke_closure_bytecode) \
V(Bytecode, invoke_field_bytecode) \
V(Bytecode, nsm_dispatcher_bytecode) \
- V(Bytecode, dynamic_invocation_forwarder_bytecode) \
V(Instance, sentinel) \
V(Instance, transition_sentinel) \
V(Instance, unknown_constant) \
@@ -469,7 +468,6 @@
return unhandled_exception_class_;
}
static RawClass* unwind_error_class() { return unwind_error_class_; }
- static RawClass* dyncalltypecheck_class() { return dyncalltypecheck_class_; }
static RawClass* singletargetcache_class() {
return singletargetcache_class_;
}
@@ -707,7 +705,6 @@
static RawClass* deopt_info_class_; // Class of DeoptInfo.
static RawClass* context_class_; // Class of the Context vm object.
static RawClass* context_scope_class_; // Class of ContextScope vm object.
- static RawClass* dyncalltypecheck_class_; // Class of ParameterTypeCheck.
static RawClass* singletargetcache_class_; // Class of SingleTargetCache.
static RawClass* unlinkedcall_class_; // Class of UnlinkedCall.
static RawClass* icdata_class_; // Class of ICData.
@@ -1494,41 +1491,6 @@
friend class Class;
};
-class ParameterTypeCheck : public Object {
- public:
- // The FP-relative index of the parameter in a bytecode frame (after optional
- // parameter marshalling) whose assignability needs to be checked, or 0 if
- // this is a type parameter check.
- intptr_t index() const { return raw_ptr()->index_; }
- void set_index(intptr_t i) const { StoreNonPointer(&raw_ptr()->index_, i); }
-
- // The type parameter to whose bound needs to be checked, or null if this is
- // an ordinary parameter check.
- RawAbstractType* param() const { return raw_ptr()->param_; }
- void set_param(const AbstractType& t) const;
-
- // FP[index] assignable to type, OR param is subtype of bound.
- RawAbstractType* type_or_bound() const { return raw_ptr()->type_or_bound_; }
- void set_type_or_bound(const AbstractType& t) const;
-
- // The parameter or type parameter's name to use in an error message.
- RawString* name() const { return raw_ptr()->name_; }
- void set_name(const String& n) const;
-
- RawSubtypeTestCache* cache() const { return raw_ptr()->cache_; }
- void set_cache(const SubtypeTestCache& c) const;
-
- static intptr_t InstanceSize() {
- return RoundedAllocationSize(sizeof(RawParameterTypeCheck));
- }
-
- static RawParameterTypeCheck* New();
-
- private:
- FINAL_HEAP_OBJECT_IMPLEMENTATION(ParameterTypeCheck, Object);
- friend class Class;
-};
-
class SingleTargetCache : public Object {
public:
RawCode* target() const { return raw_ptr()->target_; }
@@ -2287,9 +2249,6 @@
RawFunction* RedirectionTarget() const;
void SetRedirectionTarget(const Function& target) const;
- RawFunction* ForwardingTarget() const;
- void SetForwardingChecks(const Array& checks) const;
-
RawFunction::Kind kind() const {
return KindBits::decode(raw_ptr()->kind_tag_);
}
@@ -3043,6 +3002,7 @@
void set_num_optional_parameters(intptr_t value) const; // Encoded value.
void set_kind_tag(uint32_t value) const;
void set_data(const Object& value) const;
+
static RawFunction* New(Heap::Space space = Heap::kOld);
RawString* QualifiedName(NameVisibility name_visibility) const;
diff --git a/runtime/vm/object_service.cc b/runtime/vm/object_service.cc
index e95e14e..3616d4e 100644
--- a/runtime/vm/object_service.cc
+++ b/runtime/vm/object_service.cc
@@ -729,10 +729,6 @@
Object::PrintJSONImpl(stream, ref);
}
-void ParameterTypeCheck::PrintJSONImpl(JSONStream* stream, bool ref) const {
- Object::PrintJSONImpl(stream, ref);
-}
-
void SingleTargetCache::PrintJSONImpl(JSONStream* stream, bool ref) const {
JSONObject jsobj(stream);
AddCommonObjectProperties(&jsobj, "Object", ref);
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index 24a79f8..0658a6d 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -438,7 +438,6 @@
REGULAR_VISITOR(Library)
REGULAR_VISITOR(LibraryPrefix)
REGULAR_VISITOR(Namespace)
-REGULAR_VISITOR(ParameterTypeCheck)
REGULAR_VISITOR(SingleTargetCache)
REGULAR_VISITOR(UnlinkedCall)
REGULAR_VISITOR(ICData)
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 91ff01e..1028af1 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -1705,18 +1705,6 @@
friend class SnapshotReader;
};
-class RawParameterTypeCheck : public RawObject {
- RAW_HEAP_OBJECT_IMPLEMENTATION(ParameterTypeCheck);
- intptr_t index_;
- VISIT_FROM(RawObject*, param_);
- RawAbstractType* param_;
- RawAbstractType* type_or_bound_;
- RawString* name_;
- RawSubtypeTestCache* cache_;
- VISIT_TO(RawObject*, cache_);
- RawObject** to_snapshot(Snapshot::Kind kind) { return to(); }
-};
-
class RawSingleTargetCache : public RawObject {
RAW_HEAP_OBJECT_IMPLEMENTATION(SingleTargetCache);
VISIT_FROM(RawObject*, target_);
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 22a7016..d734dbb 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -71,6 +71,22 @@
}
}
+RawAbstractType* AbstractType::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE(); // AbstractType is an abstract class.
+ return NULL;
+}
+
+void RawAbstractType::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE(); // AbstractType is an abstract class.
+}
+
RawType* Type::ReadFrom(SnapshotReader* reader,
intptr_t object_id,
intptr_t tags,
@@ -348,6 +364,22 @@
}
}
+RawPatchClass* PatchClass::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+ return PatchClass::null();
+}
+
+void RawPatchClass::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+}
+
RawClosure* Closure::ReadFrom(SnapshotReader* reader,
intptr_t object_id,
intptr_t tags,
@@ -375,6 +407,326 @@
UNREACHABLE();
}
+RawClosureData* ClosureData::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+ return ClosureData::null();
+}
+
+void RawClosureData::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+}
+
+RawSignatureData* SignatureData::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+ return SignatureData::null();
+}
+
+void RawSignatureData::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+}
+
+RawRedirectionData* RedirectionData::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+ return RedirectionData::null();
+}
+
+void RawRedirectionData::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+}
+
+RawFfiTrampolineData* FfiTrampolineData::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+ return FfiTrampolineData::null();
+}
+
+void RawFfiTrampolineData::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+}
+
+RawFunction* Function::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+ return Function::null();
+}
+
+void RawFunction::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+}
+
+RawField* Field::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+ return Field::null();
+}
+
+void RawField::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+}
+
+RawScript* Script::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+ return Script::null();
+}
+
+void RawScript::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+}
+
+RawLibrary* Library::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+ return Library::null();
+}
+
+void RawLibrary::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+}
+
+RawLibraryPrefix* LibraryPrefix::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+ return LibraryPrefix::null();
+}
+
+void RawLibraryPrefix::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+}
+
+RawNamespace* Namespace::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+ return Namespace::null();
+}
+
+void RawNamespace::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+}
+
+RawKernelProgramInfo* KernelProgramInfo::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+ return KernelProgramInfo::null();
+}
+
+void RawKernelProgramInfo::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+}
+
+RawCode* Code::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+ return Code::null();
+}
+
+void RawCode::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+}
+
+RawBytecode* Bytecode::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+ return Bytecode::null();
+}
+
+void RawBytecode::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+}
+
+RawInstructions* Instructions::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+ return Instructions::null();
+}
+
+void RawInstructions::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+}
+
+RawObjectPool* ObjectPool::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+ return ObjectPool::null();
+}
+
+void RawObjectPool::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+}
+
+RawPcDescriptors* PcDescriptors::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+ return PcDescriptors::null();
+}
+
+void RawPcDescriptors::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+}
+
+RawCodeSourceMap* CodeSourceMap::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+ return CodeSourceMap::null();
+}
+
+void RawCodeSourceMap::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+}
+
+RawStackMap* StackMap::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+ return StackMap::null();
+}
+
+void RawStackMap::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+}
+
+RawLocalVarDescriptors* LocalVarDescriptors::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+ return LocalVarDescriptors::null();
+}
+
+void RawLocalVarDescriptors::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+}
+
+RawExceptionHandlers* ExceptionHandlers::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+ return ExceptionHandlers::null();
+}
+
+void RawExceptionHandlers::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+}
+
RawContext* Context::ReadFrom(SnapshotReader* reader,
intptr_t object_id,
intptr_t tags,
@@ -484,72 +836,101 @@
UNREACHABLE();
}
-#define MESSAGE_SNAPSHOT_UNREACHABLE(type) \
- Raw##type* type::ReadFrom(SnapshotReader* reader, intptr_t object_id, \
- intptr_t tags, Snapshot::Kind kind, \
- bool as_reference) { \
- UNREACHABLE(); \
- return type::null(); \
- } \
- void Raw##type::WriteTo(SnapshotWriter* writer, intptr_t object_id, \
- Snapshot::Kind kind, bool as_reference) { \
- UNREACHABLE(); \
- }
+RawSingleTargetCache* SingleTargetCache::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+ return SingleTargetCache::null();
+}
-#define MESSAGE_SNAPSHOT_ILLEGAL(type) \
- Raw##type* type::ReadFrom(SnapshotReader* reader, intptr_t object_id, \
- intptr_t tags, Snapshot::Kind kind, \
- bool as_reference) { \
- UNREACHABLE(); \
- return type::null(); \
- } \
- void Raw##type::WriteTo(SnapshotWriter* writer, intptr_t object_id, \
- Snapshot::Kind kind, bool as_reference) { \
- writer->SetWriteException(Exceptions::kArgument, \
- "Illegal argument in isolate message" \
- " : (object is a " #type ")"); \
- }
+void RawSingleTargetCache::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+}
-MESSAGE_SNAPSHOT_UNREACHABLE(AbstractType);
-MESSAGE_SNAPSHOT_UNREACHABLE(Bool);
-MESSAGE_SNAPSHOT_UNREACHABLE(Bytecode);
-MESSAGE_SNAPSHOT_UNREACHABLE(ClosureData);
-MESSAGE_SNAPSHOT_UNREACHABLE(Code);
-MESSAGE_SNAPSHOT_UNREACHABLE(CodeSourceMap);
-MESSAGE_SNAPSHOT_UNREACHABLE(Error);
-MESSAGE_SNAPSHOT_UNREACHABLE(ExceptionHandlers);
-MESSAGE_SNAPSHOT_UNREACHABLE(FfiTrampolineData);
-MESSAGE_SNAPSHOT_UNREACHABLE(Field);
-MESSAGE_SNAPSHOT_UNREACHABLE(Function);
-MESSAGE_SNAPSHOT_UNREACHABLE(ICData);
-MESSAGE_SNAPSHOT_UNREACHABLE(Instructions);
-MESSAGE_SNAPSHOT_UNREACHABLE(KernelProgramInfo);
-MESSAGE_SNAPSHOT_UNREACHABLE(Library);
-MESSAGE_SNAPSHOT_UNREACHABLE(LibraryPrefix);
-MESSAGE_SNAPSHOT_UNREACHABLE(LocalVarDescriptors);
-MESSAGE_SNAPSHOT_UNREACHABLE(MegamorphicCache);
-MESSAGE_SNAPSHOT_UNREACHABLE(Namespace);
-MESSAGE_SNAPSHOT_UNREACHABLE(ObjectPool);
-MESSAGE_SNAPSHOT_UNREACHABLE(ParameterTypeCheck);
-MESSAGE_SNAPSHOT_UNREACHABLE(PatchClass);
-MESSAGE_SNAPSHOT_UNREACHABLE(PcDescriptors);
-MESSAGE_SNAPSHOT_UNREACHABLE(RedirectionData);
-MESSAGE_SNAPSHOT_UNREACHABLE(Script);
-MESSAGE_SNAPSHOT_UNREACHABLE(SignatureData);
-MESSAGE_SNAPSHOT_UNREACHABLE(SingleTargetCache);
-MESSAGE_SNAPSHOT_UNREACHABLE(StackMap);
-MESSAGE_SNAPSHOT_UNREACHABLE(String);
-MESSAGE_SNAPSHOT_UNREACHABLE(SubtypeTestCache);
-MESSAGE_SNAPSHOT_UNREACHABLE(TypedDataBase);
-MESSAGE_SNAPSHOT_UNREACHABLE(UnlinkedCall);
-MESSAGE_SNAPSHOT_UNREACHABLE(UnwindError);
+RawUnlinkedCall* UnlinkedCall::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+ return UnlinkedCall::null();
+}
-MESSAGE_SNAPSHOT_ILLEGAL(DynamicLibrary);
-MESSAGE_SNAPSHOT_ILLEGAL(MirrorReference);
-MESSAGE_SNAPSHOT_ILLEGAL(Pointer);
-MESSAGE_SNAPSHOT_ILLEGAL(ReceivePort);
-MESSAGE_SNAPSHOT_ILLEGAL(StackTrace);
-MESSAGE_SNAPSHOT_ILLEGAL(UserTag);
+void RawUnlinkedCall::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+}
+
+RawICData* ICData::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+ return ICData::null();
+}
+
+void RawICData::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+}
+
+RawMegamorphicCache* MegamorphicCache::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+ return MegamorphicCache::null();
+}
+
+void RawMegamorphicCache::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+}
+
+RawSubtypeTestCache* SubtypeTestCache::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+ return SubtypeTestCache::null();
+}
+
+void RawSubtypeTestCache::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+}
+
+RawError* Error::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_referenec) {
+ UNREACHABLE();
+ return Error::null(); // Error is an abstract class.
+}
+
+void RawError::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE(); // Error is an abstract class.
+}
RawApiError* ApiError::ReadFrom(SnapshotReader* reader,
intptr_t object_id,
@@ -666,6 +1047,22 @@
visitor.VisitPointers(from(), to());
}
+RawUnwindError* UnwindError::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+ return UnwindError::null();
+}
+
+void RawUnwindError::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+}
+
RawInstance* Instance::ReadFrom(SnapshotReader* reader,
intptr_t object_id,
intptr_t tags,
@@ -799,6 +1196,22 @@
writer->WriteDouble(ptr()->value_);
}
+RawString* String::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE(); // String is an abstract class.
+ return String::null();
+}
+
+void RawString::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE(); // String is an abstract class.
+}
+
template <typename StringType, typename CharacterType, typename CallbackType>
void String::ReadFromImpl(SnapshotReader* reader,
String* str_obj,
@@ -952,6 +1365,22 @@
ptr()->external_data_);
}
+RawBool* Bool::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+ return Bool::null();
+}
+
+void RawBool::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+}
+
RawArray* Array::ReadFrom(SnapshotReader* reader,
intptr_t object_id,
intptr_t tags,
@@ -1293,6 +1722,22 @@
writer->Write<double>(ptr()->value_[1]);
}
+RawTypedDataBase* TypedDataBase::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE(); // TypedDataBase is an abstract class.
+ return NULL;
+}
+
+void RawTypedDataBase::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE(); // TypedDataBase is an abstract class.
+}
+
RawTypedData* TypedData::ReadFrom(SnapshotReader* reader,
intptr_t object_id,
intptr_t tags,
@@ -1576,6 +2021,38 @@
return view.raw();
}
+RawPointer* Pointer::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ FATAL("Snapshotting Pointers is not supported");
+ UNREACHABLE();
+}
+
+void RawPointer::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ FATAL("Snapshotting Pointers is not supported");
+}
+
+RawDynamicLibrary* DynamicLibrary::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ FATAL("Snapshotting DynamicLibraries is not supported");
+ UNREACHABLE();
+}
+
+void RawDynamicLibrary::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ FATAL("Snapshotting DynamicLibraries is not supported");
+}
+
RawCapability* Capability::ReadFrom(SnapshotReader* reader,
intptr_t object_id,
intptr_t tags,
@@ -1603,6 +2080,29 @@
writer->Write<uint64_t>(ptr()->id_);
}
+RawReceivePort* ReceivePort::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+ return ReceivePort::null();
+}
+
+void RawReceivePort::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ if (kind == Snapshot::kMessage) {
+ // We do not allow objects with native fields in an isolate message.
+ writer->SetWriteException(Exceptions::kArgument,
+ "Illegal argument in isolate message"
+ " : (object is a RawReceivePort)");
+ } else {
+ UNREACHABLE();
+ }
+}
+
RawSendPort* SendPort::ReadFrom(SnapshotReader* reader,
intptr_t object_id,
intptr_t tags,
@@ -1696,6 +2196,25 @@
});
}
+RawStackTrace* StackTrace::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE(); // StackTraces are not sent in a snapshot.
+ return StackTrace::null();
+}
+
+void RawStackTrace::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ ASSERT(kind == Snapshot::kMessage);
+ writer->SetWriteException(Exceptions::kArgument,
+ "Illegal argument in isolate message"
+ " : (object is a stacktrace)");
+}
+
RawRegExp* RegExp::ReadFrom(SnapshotReader* reader,
intptr_t object_id,
intptr_t tags,
@@ -1790,4 +2309,50 @@
visitor.VisitPointers(from(), to());
}
+RawMirrorReference* MirrorReference::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_referenec) {
+ UNREACHABLE();
+ return MirrorReference::null();
+}
+
+void RawMirrorReference::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ if (kind == Snapshot::kMessage) {
+ // We do not allow objects with native fields in an isolate message.
+ writer->SetWriteException(Exceptions::kArgument,
+ "Illegal argument in isolate message"
+ " : (object is a MirrorReference)");
+ } else {
+ UNREACHABLE();
+ }
+}
+
+RawUserTag* UserTag::ReadFrom(SnapshotReader* reader,
+ intptr_t object_id,
+ intptr_t tags,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ UNREACHABLE();
+ return UserTag::null();
+}
+
+void RawUserTag::WriteTo(SnapshotWriter* writer,
+ intptr_t object_id,
+ Snapshot::Kind kind,
+ bool as_reference) {
+ if (kind == Snapshot::kMessage) {
+ // We do not allow objects with native fields in an isolate message.
+ writer->SetWriteException(Exceptions::kArgument,
+ "Illegal argument in isolate message"
+ " : (object is a UserTag)");
+ } else {
+ UNREACHABLE();
+ }
+}
+
} // namespace dart
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index e997516..674623b 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -356,7 +356,7 @@
TypeArguments::CheckedHandle(zone, arguments.ArgAt(1));
const TypeArguments& function_type_arguments =
TypeArguments::CheckedHandle(zone, arguments.ArgAt(2));
- ASSERT(!type.IsNull());
+ ASSERT(!type.IsNull() && !type.IsInstantiated());
ASSERT(instantiator_type_arguments.IsNull() ||
instantiator_type_arguments.IsInstantiated());
ASSERT(function_type_arguments.IsNull() ||
diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h
index 5f6c929..0939635e 100644
--- a/runtime/vm/snapshot.h
+++ b/runtime/vm/snapshot.h
@@ -5,9 +5,6 @@
#ifndef RUNTIME_VM_SNAPSHOT_H_
#define RUNTIME_VM_SNAPSHOT_H_
-#include <memory>
-#include <utility>
-
#include "platform/assert.h"
#include "vm/allocation.h"
#include "vm/bitfield.h"
@@ -703,7 +700,6 @@
friend class RawClosureData;
friend class RawCode;
friend class RawContextScope;
- friend class RawDynamicLibrary;
friend class RawExceptionHandlers;
friend class RawField;
friend class RawFunction;
@@ -715,7 +711,6 @@
friend class RawLocalVarDescriptors;
friend class RawMirrorReference;
friend class RawObjectPool;
- friend class RawPointer;
friend class RawReceivePort;
friend class RawRegExp;
friend class RawScript;
@@ -723,10 +718,10 @@
friend class RawSubtypeTestCache;
friend class RawTransferableTypedData;
friend class RawType;
+ friend class RawTypedDataView;
+ friend class RawTypeRef;
friend class RawTypeArguments;
friend class RawTypeParameter;
- friend class RawTypeRef;
- friend class RawTypedDataView;
friend class RawUserTag;
friend class SnapshotWriterVisitor;
friend class WriteInlinedObjectVisitor;
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index b17870e..5454049 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -18,6 +18,8 @@
// One-character symbols are added implicitly.
#define PREDEFINED_SYMBOLS_LIST(V) \
V(AbstractClassInstantiationError, "AbstractClassInstantiationError") \
+ V(AddError, "addError") \
+ V(AddStream, "addStream") \
V(AllocateInvocationMirror, "_allocateInvocationMirror") \
V(AllocateInvocationMirrorForClosure, "_allocateInvocationMirrorForClosure") \
V(AnonymousClosure, "<anonymous closure>") \
@@ -27,12 +29,26 @@
V(ArgumentError, "ArgumentError") \
V(AssertionError, "_AssertionError") \
V(AssignIndexToken, "[]=") \
+ V(Async, "async") \
+ V(AsyncAwaitHelper, "_awaitHelper") \
+ V(AsyncCatchErrorCallback, ":async_op_catch_error") \
+ V(AsyncCatchHelper, "_asyncCatchHelper") \
V(AsyncCompleter, ":async_completer") \
+ V(AsyncErrorWrapperHelper, "_asyncErrorWrapperHelper") \
V(AsyncOperation, ":async_op") \
+ V(AsyncOperationErrorParam, ":async_error_param") \
+ V(AsyncOperationParam, ":async_result") \
+ V(AsyncOperationStackTraceParam, ":async_stack_trace_param") \
+ V(AsyncSavedTryCtxVarPrefix, ":async_saved_try_ctx_var_") \
+ V(AsyncStackTraceHelper, "_asyncStackTraceHelper") \
V(AsyncStackTraceVar, ":async_stack_trace") \
V(AsyncStarMoveNextHelper, "_asyncStarMoveNextHelper") \
+ V(AsyncThenCallback, ":async_op_then") \
+ V(AsyncThenWrapperHelper, "_asyncThenWrapperHelper") \
+ V(Await, "await") \
V(AwaitContextVar, ":await_ctx_var") \
V(AwaitJumpVar, ":await_jump_var") \
+ V(AwaitTempVarPrefix, ":await_temp_var_") \
V(Bool, "bool") \
V(BooleanExpression, "boolean expression") \
V(BoundsCheckForPartialInstantiation, "_boundsCheckForPartialInstantiation") \
@@ -46,13 +62,18 @@
V(Class, "Class") \
V(ClassID, "ClassID") \
V(ClearAsyncThreadStackTrace, "_clearAsyncThreadStackTrace") \
+ V(Close, "close") \
V(ClosureData, "ClosureData") \
V(ClosureParameter, ":closure") \
V(Code, "Code") \
V(CodeSourceMap, "CodeSourceMap") \
+ V(ColonController, ":controller") \
V(ColonMatcher, ":matcher") \
+ V(ColonStream, ":stream") \
V(CommaSpace, ", ") \
V(Completer, "Completer") \
+ V(CompleterComplete, "complete") \
+ V(CompleterCompleteError, "completeError") \
V(CompleterFuture, "future") \
V(CompleterGetFuture, "get:future") \
V(CompleterSyncConstructor, "Completer.sync") \
@@ -73,6 +94,7 @@
V(DartFfiLibName, "ffi") \
V(DartIOLibName, "dart.io") \
V(DartInternal, "dart:_internal") \
+ V(DartInternalPackage, "package:dart_internal/") \
V(DartIsVM, "dart.isVM") \
V(DartIsolate, "dart:isolate") \
V(DartLibrary, "dart.library.") \
@@ -90,6 +112,7 @@
V(DebugProcedureName, ":Eval") \
V(Default, "Default") \
V(DefaultLabel, ":L") \
+ V(DeoptInfo, "DeoptInfo") \
V(DotCreate, "._create") \
V(DotRange, ".range") \
V(DotValue, ".value") \
@@ -136,6 +159,7 @@
V(Float64List, "Float64List") \
V(Float64x2, "Float64x2") \
V(Float64x2List, "Float64x2List") \
+ V(ForInIter, ":for-in-iter") \
V(FormatException, "FormatException") \
V(ForwardingCorpse, "ForwardingCorpse") \
V(FreeListElement, "FreeListElement") \
@@ -157,10 +181,12 @@
V(GrowRegExpStack, "_growRegExpStack") \
V(HandleExposedException, "_handleExposedException") \
V(HaveSameRuntimeType, "_haveSameRuntimeType") \
+ V(Hide, "hide") \
V(ICData, "ICData") \
V(Identical, "identical") \
V(ImmutableMap, "_ImmutableMap") \
V(ImmutableMapConstructor, "_ImmutableMap._create") \
+ V(ImplicitClosure, "<implicit closure>") \
V(InTypeCast, " in type cast") \
V(Index, "index") \
V(IndexToken, "[]") \
@@ -190,6 +216,7 @@
V(LibraryPrefix, "LibraryPrefix") \
V(List, "List") \
V(ListFactory, "List.") \
+ V(ListLiteralElement, "list literal element") \
V(ListLiteralFactory, "List._fromLiteral") \
V(LoadLibrary, "loadLibrary") \
V(LocalVarDescriptors, "LocalVarDescriptors") \
@@ -209,13 +236,14 @@
V(Number, "num") \
V(Object, "Object") \
V(ObjectPool, "ObjectPool") \
+ V(Of, "of") \
+ V(On, "on") \
V(OneByteString, "_OneByteString") \
V(OptimizedOut, "<optimized out>") \
V(OriginalParam, ":original:") \
V(Other, "other") \
V(OutOfMemoryError, "OutOfMemoryError") \
V(PackageScheme, "package:") \
- V(ParameterTypeCheck, "ParameterTypeCheck") \
V(Patch, "patch") \
V(PatchClass, "PatchClass") \
V(PcDescriptors, "PcDescriptors") \
@@ -227,11 +255,14 @@
V(RedirectionData, "RedirectionData") \
V(RegExp, "RegExp") \
V(RightShiftOperator, ">>") \
+ V(SavedExceptionVar, ":saved_exception_var") \
+ V(SavedStackTraceVar, ":saved_stack_trace_var") \
V(SavedTryContextVar, ":saved_try_context_var") \
V(Script, "Script") \
V(Set, "set") \
V(SetAsyncThreadStackTrace, "_setAsyncThreadStackTrace") \
V(SetterPrefix, "set:") \
+ V(Show, "show") \
V(SignatureData, "SignatureData") \
V(SingleTargetCache, "SingleTargetCache") \
V(SpaceExtendsSpace, " extends ") \
@@ -250,6 +281,8 @@
V(SwitchExpr, ":switch_expr") \
V(Symbol, "Symbol") \
V(SymbolCtor, "Symbol.") \
+ V(Sync, "sync") \
+ V(TempParam, ":temp_param") \
V(ThrowNew, "_throwNew") \
V(ThrowNewInvocation, "_throwNewInvocation") \
V(TopLevel, "::") \
@@ -257,6 +290,7 @@
V(TransferableTypedData, "TransferableTypedData") \
V(TryFinallyReturnValue, ":try_finally_return_value") \
V(TwoByteString, "_TwoByteString") \
+ V(TwoNewlines, "\n\n") \
V(TwoSpaces, " ") \
V(Type, "Type") \
V(TypeArguments, "TypeArguments") \
@@ -296,6 +330,8 @@
V(_DeletedEnumPrefix, "Deleted enum value from ") \
V(_DeletedEnumSentinel, "_deleted_enum_sentinel") \
V(_Double, "_Double") \
+ V(_EnumHelper, "_EnumHelper") \
+ V(_EnumNames, "_enum_names") \
V(_ExternalFloat32Array, "_ExternalFloat32Array") \
V(_ExternalFloat32x4Array, "_ExternalFloat32x4Array") \
V(_ExternalFloat64Array, "_ExternalFloat64Array") \
@@ -417,6 +453,7 @@
V(_stackTrace, "_stackTrace") \
V(_state, "_state") \
V(_wordCharacterMap, "_wordCharacterMap") \
+ V(_yieldEachIterable, "_yieldEachIterable") \
V(add, "add") \
V(capture_length, ":capture_length") \
V(capture_start_index, ":capture_start_index") \
@@ -449,7 +486,8 @@
V(vm_entry_point, "vm:entry-point") \
V(vm_exact_result_type, "vm:exact-result-type") \
V(vm_non_nullable_result_type, "vm:non-nullable-result-type") \
- V(vm_trace_entrypoints, "vm:testing.unsafe.trace-entrypoints-fn")
+ V(vm_trace_entrypoints, "vm:testing.unsafe.trace-entrypoints-fn") \
+ V(word_character_map, ":word_character_map")
// Contains a list of frequently used strings in a canonicalized form. This
// list is kept in the vm_isolate in order to share the copy across isolates