Version 2.12.0-14.0.dev
Merge commit '6cfd46e177c1d62ed77e598d1468896919d3403f' into 'dev'
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9774dfa..abe1134 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -39,6 +39,11 @@
`--enable-assert-initializers` command line options. These options haven't
been supported in a while and were no-ops.
+#### dartfmt
+
+* Don't duplicate comments on chained if elements.
+* Preserve `?` in initializing formal function-typed parameters.
+
#### Linter
Updated the Linter to `0.1.122`, which includes:
diff --git a/DEPS b/DEPS
index e84535c..519ade5d 100644
--- a/DEPS
+++ b/DEPS
@@ -98,7 +98,7 @@
# and land the review.
#
# For more details, see https://github.com/dart-lang/sdk/issues/30164
-"dart_style_tag": "1.3.8+1", # Please see the note above before updating.
+"dart_style_tag": "1.3.9", # Please see the note above before updating.
"chromedriver_tag": "83.0.4103.39",
"dartdoc_rev" : "72c69f8659ce8823ce2dde9a4f758b0fa617ab5e",
diff --git a/pkg/dart_internal/CHANGELOG.md b/pkg/dart_internal/CHANGELOG.md
index d84bdda..8b39127 100644
--- a/pkg/dart_internal/CHANGELOG.md
+++ b/pkg/dart_internal/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.1.12-nullsafety.1
+
+- Support the latest Dart SDK.
+
## 0.1.10
- Support the latest Dart SDK.
diff --git a/pkg/dart_internal/pubspec.yaml b/pkg/dart_internal/pubspec.yaml
index 191de63..64adb7f 100644
--- a/pkg/dart_internal/pubspec.yaml
+++ b/pkg/dart_internal/pubspec.yaml
@@ -1,7 +1,5 @@
name: dart_internal
-version: 0.1.12-nullsafety
-author: "Dart Team <misc@dartlang.org>"
-homepage: http://www.dartlang.org
+version: 0.1.12-nullsafety.1
repository: https://github.com/dart-lang/sdk/tree/master/pkg/dart_internal
description: >
This package is not intended for wide use. It provides a temporary API to
@@ -18,4 +16,4 @@
environment:
# Restrict the upper bound so that we can remove support for this in a later
# version of the SDK without it being a breaking change.
- sdk: ">=2.10.0-0 <2.11.0"
+ sdk: ">=2.10.0-0 <2.12.0"
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index a10bff9..8a5f5b2 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -581,11 +581,8 @@
var finishGenericTypeTest = _emitClassTypeTests(c, className, body);
- // Attach caches on all canonicalized types not in our runtime.
- // Types in the runtime will have caches attached in their constructors.
- if (!isSdkInternalRuntime(_currentLibrary)) {
- body.add(runtimeStatement('addTypeCaches(#)', [className]));
- }
+ // Attach caches on all canonicalized types.
+ body.add(runtimeStatement('addTypeCaches(#)', [className]));
_emitVirtualFieldSymbols(c, body);
_emitClassSignature(c, className, body);
@@ -1082,29 +1079,8 @@
}
if (c == _coreTypes.deprecatedFutureOrClass) {
- // These methods are difficult to place in the runtime or patch files.
- // * They need to be callable from the class but they can't be static
- // methods on the FutureOr class in Dart because they reference the
- // generic type parameter.
- // * There isn't an obvious place in dart:_runtime were we could place a
- // method that adds these type tests (similar to addTypeTests()) because
- // in the bootstrap ordering the Future class hasn't been defined yet.
- var typeParam =
- TypeParameterType(c.typeParameters[0], Nullability.undetermined);
- var typeT = visitTypeParameterType(typeParam);
- var futureOfT = visitInterfaceType(InterfaceType(
- _coreTypes.futureClass, currentLibrary.nonNullable, [typeParam]));
- body.add(js.statement('''
- #.is = function is_FutureOr(o) {
- return #.is(o) || #.is(o);
- }
- ''', [className, typeT, futureOfT]));
- body.add(js.statement('''
- #.as = function as_FutureOr(o) {
- if (#.is(o) || #.is(o)) return o;
- return #.as(o, this);
- }
- ''', [className, typeT, futureOfT, runtimeModule]));
+ // Custom type tests for FutureOr types are attached when the type is
+ // constructed in the runtime normalizeFutureOr method.
return null;
}
diff --git a/pkg/nnbd_migration/lib/src/edit_plan.dart b/pkg/nnbd_migration/lib/src/edit_plan.dart
index 621a6e8a..c603225 100644
--- a/pkg/nnbd_migration/lib/src/edit_plan.dart
+++ b/pkg/nnbd_migration/lib/src/edit_plan.dart
@@ -495,11 +495,11 @@
}
}
- /// Creates a new edit plan that removes [node] from the AST.
+ /// Creates a new edit plan that removes [sourceNode] from the AST.
///
- /// [node] must be one element of a variable length sequence maintained by
- /// [node]'s parent (for example, a statement in a block, an element in a
- /// list, a declaration in a class, etc.). If it is not, an exception is
+ /// [sourceNode] must be one element of a variable length sequence maintained
+ /// by [sourceNode]'s parent (for example, a statement in a block, an element
+ /// in a list, a declaration in a class, etc.). If it is not, an exception is
/// thrown.
///
/// Optional argument [info] contains information about why the change was
@@ -674,9 +674,10 @@
///
/// Optional argument [info] contains information about why the change was
/// made.
- EditPlan tryRemoveNode(AstNode sourceNode, {AtomicEditInfo info}) {
+ EditPlan tryRemoveNode(AstNode sourceNode,
+ {List<AstNode> sequenceNodes, AtomicEditInfo info}) {
var parent = sourceNode.parent;
- var sequenceNodes = _computeSequenceNodes(parent);
+ sequenceNodes ??= _computeSequenceNodes(parent);
if (sequenceNodes == null) {
return null;
}
@@ -809,6 +810,8 @@
return node.elements;
} else if (node is ArgumentList) {
return node.arguments;
+ } else if (node is FormalParameter) {
+ return node.metadata;
} else if (node is FormalParameterList) {
return node.parameters;
} else if (node is VariableDeclarationList) {
@@ -1525,7 +1528,8 @@
AstNode parent, List<AstNode> childNodes) {
if (parent is Block ||
parent is ClassDeclaration ||
- parent is CompilationUnit) {
+ parent is CompilationUnit ||
+ parent is FormalParameter) {
// These parent types don't use separators.
return null;
} else {
diff --git a/pkg/nnbd_migration/lib/src/fix_aggregator.dart b/pkg/nnbd_migration/lib/src/fix_aggregator.dart
index b006ba4..2105912 100644
--- a/pkg/nnbd_migration/lib/src/fix_aggregator.dart
+++ b/pkg/nnbd_migration/lib/src/fix_aggregator.dart
@@ -666,6 +666,14 @@
/// contained in the edit.
AtomicEditInfo addRequiredKeywordInfo;
+ /// If non-null, indicates a `@required` annotation which should be removed
+ /// from this node.
+ Annotation annotationToRemove;
+
+ /// If [annotationToRemove] is non-null, the information that should be
+ /// contained in the edit.
+ AtomicEditInfo removeAnnotationInfo;
+
NodeChangeForDefaultFormalParameter() : super._();
@override
@@ -676,8 +684,17 @@
EditPlan _apply(DefaultFormalParameter node, FixAggregator aggregator) {
var innerPlan = aggregator.innerPlanForNode(node);
if (!addRequiredKeyword) return innerPlan;
- return aggregator.planner.surround(innerPlan,
- prefix: [AtomicEdit.insert('required ', info: addRequiredKeywordInfo)]);
+
+ var offset = node.firstTokenAfterCommentAndMetadata.offset;
+ return aggregator.planner.passThrough(node, innerPlans: [
+ aggregator.planner.insertText(node, offset, [
+ AtomicEdit.insert('required ', info: addRequiredKeywordInfo),
+ ]),
+ if (annotationToRemove != null)
+ aggregator.planner
+ .removeNode(annotationToRemove, info: removeAnnotationInfo),
+ ...aggregator.innerPlansForNode(node),
+ ]);
}
}
diff --git a/pkg/nnbd_migration/lib/src/fix_builder.dart b/pkg/nnbd_migration/lib/src/fix_builder.dart
index 3699d66..32b2777 100644
--- a/pkg/nnbd_migration/lib/src/fix_builder.dart
+++ b/pkg/nnbd_migration/lib/src/fix_builder.dart
@@ -1145,20 +1145,33 @@
cls.name, method.name, element.name),
{FixReasonTarget.root: node});
var metadata = parameter.metadata;
- for (var annotation in metadata) {
- if (annotation.elementAnnotation.isRequired) {
- // TODO(paulberry): what if `@required` isn't the first annotation?
- // Will we produce something that isn't grammatical?
- (_fixBuilder._getChange(annotation) as NodeChangeForAnnotation)
+ if (metadata != null && metadata.isNotEmpty) {
+ // Only the last annotation can be changed into a `required` keyword;
+ // changing an earlier annotation into a keyword would be illegal.
+ var lastAnnotation = metadata.last;
+ if (lastAnnotation.elementAnnotation.isRequired) {
+ (_fixBuilder._getChange(lastAnnotation) as NodeChangeForAnnotation)
..changeToRequiredKeyword = true
..changeToRequiredKeywordInfo = info;
return;
}
}
// Otherwise create a new `required` keyword.
- (_fixBuilder._getChange(parameter) as NodeChangeForDefaultFormalParameter)
+ var nodeChange = (_fixBuilder._getChange(parameter)
+ as NodeChangeForDefaultFormalParameter)
..addRequiredKeyword = true
..addRequiredKeywordInfo = info;
+ var requiredAnnotation = metadata?.firstWhere(
+ (annotation) => annotation.elementAnnotation.isRequired,
+ orElse: () => null);
+ if (requiredAnnotation != null) {
+ // If the parameter was annotated with `@required`, but it was not the
+ // last annotation, we remove the annotation in addition to adding the
+ // `required` keyword.
+ nodeChange
+ ..annotationToRemove = requiredAnnotation
+ ..removeAnnotationInfo = info;
+ }
}
void _makeTypeNameNullable(TypeAnnotation node, DecoratedType decoratedType) {
diff --git a/pkg/nnbd_migration/lib/src/node_builder.dart b/pkg/nnbd_migration/lib/src/node_builder.dart
index ad52876..25a697c 100644
--- a/pkg/nnbd_migration/lib/src/node_builder.dart
+++ b/pkg/nnbd_migration/lib/src/node_builder.dart
@@ -2,7 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-import 'package:_fe_analyzer_shared/src/scanner/token.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/visitor.dart';
import 'package:analyzer/dart/element/element.dart';
@@ -894,40 +893,3 @@
throw UnimplementedError(buffer.toString());
}
}
-
-extension on FormalParameter {
- // TODO(srawlins): Add this to FormalParameter interface.
- Token get firstTokenAfterCommentAndMetadata {
- var parameter = this is DefaultFormalParameter
- ? (this as DefaultFormalParameter).parameter
- : this as NormalFormalParameter;
- if (parameter is FieldFormalParameter) {
- if (parameter.keyword != null) {
- return parameter.keyword;
- } else if (parameter.type != null) {
- return parameter.type.beginToken;
- } else {
- return parameter.thisKeyword;
- }
- } else if (parameter is FunctionTypedFormalParameter) {
- if (parameter.covariantKeyword != null) {
- return parameter.covariantKeyword;
- } else if (parameter.returnType != null) {
- return parameter.returnType.beginToken;
- } else {
- return parameter.identifier.token;
- }
- } else if (parameter is SimpleFormalParameter) {
- if (parameter.covariantKeyword != null) {
- return parameter.covariantKeyword;
- } else if (parameter.keyword != null) {
- return parameter.keyword;
- } else if (parameter.type != null) {
- return parameter.type.beginToken;
- } else {
- return parameter.identifier.token;
- }
- }
- return null;
- }
-}
diff --git a/pkg/nnbd_migration/lib/src/utilities/hint_utils.dart b/pkg/nnbd_migration/lib/src/utilities/hint_utils.dart
index 28177af..9f9a8c7 100644
--- a/pkg/nnbd_migration/lib/src/utilities/hint_utils.dart
+++ b/pkg/nnbd_migration/lib/src/utilities/hint_utils.dart
@@ -3,6 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:_fe_analyzer_shared/src/scanner/token.dart';
+import 'package:analyzer/dart/ast/ast.dart';
import 'package:nnbd_migration/src/edit_plan.dart';
/// Determines if the given [token] is followed by a nullability hint, and if
@@ -226,3 +227,40 @@
/// required.
required,
}
+
+extension FormalParameterExtensions on FormalParameter {
+ // TODO(srawlins): Add this to FormalParameter interface.
+ Token get firstTokenAfterCommentAndMetadata {
+ var parameter = this is DefaultFormalParameter
+ ? (this as DefaultFormalParameter).parameter
+ : this as NormalFormalParameter;
+ if (parameter is FieldFormalParameter) {
+ if (parameter.keyword != null) {
+ return parameter.keyword;
+ } else if (parameter.type != null) {
+ return parameter.type.beginToken;
+ } else {
+ return parameter.thisKeyword;
+ }
+ } else if (parameter is FunctionTypedFormalParameter) {
+ if (parameter.covariantKeyword != null) {
+ return parameter.covariantKeyword;
+ } else if (parameter.returnType != null) {
+ return parameter.returnType.beginToken;
+ } else {
+ return parameter.identifier.token;
+ }
+ } else if (parameter is SimpleFormalParameter) {
+ if (parameter.covariantKeyword != null) {
+ return parameter.covariantKeyword;
+ } else if (parameter.keyword != null) {
+ return parameter.keyword;
+ } else if (parameter.type != null) {
+ return parameter.type.beginToken;
+ } else {
+ return parameter.identifier.token;
+ }
+ }
+ return null;
+ }
+}
diff --git a/pkg/nnbd_migration/test/fix_aggregator_test.dart b/pkg/nnbd_migration/test/fix_aggregator_test.dart
index 123de0a..c3eb5f2 100644
--- a/pkg/nnbd_migration/test/fix_aggregator_test.dart
+++ b/pkg/nnbd_migration/test/fix_aggregator_test.dart
@@ -244,6 +244,60 @@
expect(previewInfo.applyTo(code), 'f({required int x}) => 0;');
}
+ Future<void> test_addRequired_afterMetadata() async {
+ await analyze('f({@deprecated int x}) => 0;');
+ var previewInfo = run({
+ findNode.defaultParameter('int x'): NodeChangeForDefaultFormalParameter()
+ ..addRequiredKeyword = true
+ });
+ expect(previewInfo.applyTo(code), 'f({@deprecated required int x}) => 0;');
+ }
+
+ Future<void> test_addRequired_afterMetadata_andRequiredAnnotation() async {
+ addMetaPackage();
+ var content = '''
+import 'package:meta/meta.dart';
+f({@required @deprecated int x}) {}
+''';
+ await analyze(content);
+ var annotation = findNode.annotation('required');
+ var previewInfo = run({
+ findNode.defaultParameter('int x'): NodeChangeForDefaultFormalParameter()
+ ..addRequiredKeyword = true
+ ..annotationToRemove = annotation
+ });
+ expect(previewInfo.applyTo(code), '''
+import 'package:meta/meta.dart';
+f({@deprecated required int x}) {}
+''');
+ expect(previewInfo.values, hasLength(2));
+
+ expect(previewInfo[content.indexOf('int ')], hasLength(1));
+ expect(previewInfo[content.indexOf('int ')].single.isInsertion, true);
+ expect(previewInfo[content.indexOf('@required')], isNotNull);
+ expect(previewInfo[content.indexOf('@required')].single.isDeletion, true);
+ }
+
+ Future<void> test_addRequired_afterMetadata_beforeFinal() async {
+ await analyze('f({@deprecated final int x}) => 0;');
+ var previewInfo = run({
+ findNode.defaultParameter('int x'): NodeChangeForDefaultFormalParameter()
+ ..addRequiredKeyword = true
+ });
+ expect(previewInfo.applyTo(code),
+ 'f({@deprecated required final int x}) => 0;');
+ }
+
+ Future<void> test_addRequired_afterMetadata_beforeFunctionTyped() async {
+ await analyze('f({@deprecated int x()}) => 0;');
+ var previewInfo = run({
+ findNode.defaultParameter('int x'): NodeChangeForDefaultFormalParameter()
+ ..addRequiredKeyword = true
+ });
+ expect(
+ previewInfo.applyTo(code), 'f({@deprecated required int x()}) => 0;');
+ }
+
Future<void> test_addShownName_atEnd_multiple() async {
await analyze("import 'dart:math' show cos;");
var previewInfo = run({
@@ -1728,6 +1782,24 @@
expect(previewInfo.applyTo(code), 'f(x) => x.y;');
}
+ Future<void>
+ test_requiredAnnotationToRequiredKeyword_leadingAnnotations() async {
+ addMetaPackage();
+ await analyze('''
+import 'package:meta/meta.dart';
+f({@deprecated @required int x}) {}
+''');
+ var annotation = findNode.annotation('required');
+ var previewInfo = run({
+ annotation: NodeChangeForAnnotation()..changeToRequiredKeyword = true
+ });
+ expect(previewInfo.applyTo(code), '''
+import 'package:meta/meta.dart';
+f({@deprecated required int x}) {}
+''');
+ expect(previewInfo.values.single.single.isDeletion, true);
+ }
+
Future<void> test_requiredAnnotationToRequiredKeyword_prefixed() async {
addMetaPackage();
await analyze('''
diff --git a/pkg/wasm/lib/src/function.dart b/pkg/wasm/lib/src/function.dart
index 8cc2c32..82f07b8 100644
--- a/pkg/wasm/lib/src/function.dart
+++ b/pkg/wasm/lib/src/function.dart
@@ -13,17 +13,19 @@
Pointer<WasmerFunc> _func;
List<int> _argTypes;
int _returnType;
- Pointer<WasmerVal> _args;
- Pointer<WasmerVal> _results;
+ Pointer<WasmerValVec> _args = allocate<WasmerValVec>();
+ Pointer<WasmerValVec> _results = allocate<WasmerValVec>();
- WasmFunction(this._name, this._func, this._argTypes, this._returnType)
- : _args = _argTypes.length == 0
- ? nullptr
- : allocate<WasmerVal>(count: _argTypes.length),
- _results =
- _returnType == WasmerValKindVoid ? nullptr : allocate<WasmerVal>() {
+ WasmFunction(this._name, this._func, this._argTypes, this._returnType) {
+ _args.ref.length = _argTypes.length;
+ _args.ref.data = _argTypes.length == 0
+ ? nullptr
+ : allocate<WasmerVal>(count: _argTypes.length);
+ _results.ref.length = _returnType == WasmerValKindVoid ? 0 : 1;
+ _results.ref.data =
+ _returnType == WasmerValKindVoid ? nullptr : allocate<WasmerVal>();
for (var i = 0; i < _argTypes.length; ++i) {
- _args[i].kind = _argTypes[i];
+ _args.ref.data[i].kind = _argTypes[i];
}
}
@@ -35,19 +37,19 @@
switch (_argTypes[i]) {
case WasmerValKindI32:
if (arg is! int) return false;
- _args[i].i32 = arg;
+ _args.ref.data[i].i32 = arg;
return true;
case WasmerValKindI64:
if (arg is! int) return false;
- _args[i].i64 = arg;
+ _args.ref.data[i].i64 = arg;
return true;
case WasmerValKindF32:
if (arg is! num) return false;
- _args[i].f32 = arg;
+ _args.ref.data[i].f32 = arg;
return true;
case WasmerValKindF64:
if (arg is! num) return false;
- _args[i].f64 = arg;
+ _args.ref.data[i].f64 = arg;
return true;
}
return false;
@@ -62,12 +64,12 @@
throw ArgumentError("Bad argument type for WASM function: $this");
}
}
- WasmRuntime().call(_func, _args, _results);
+ WasmRuntime().call(_func, _args, _results, toString());
if (_returnType == WasmerValKindVoid) {
return null;
}
- var result = _results[0];
+ var result = _results.ref.data[0];
assert(_returnType == result.kind);
switch (_returnType) {
case WasmerValKindI32:
diff --git a/pkg/wasm/lib/src/module.dart b/pkg/wasm/lib/src/module.dart
index 6de1399..d60f9e8 100644
--- a/pkg/wasm/lib/src/module.dart
+++ b/pkg/wasm/lib/src/module.dart
@@ -49,13 +49,11 @@
}
Pointer<WasmerTrap> _wasmFnImportTrampoline(Pointer<_WasmFnImport> imp,
- Pointer<WasmerVal> args, Pointer<WasmerVal> results) {
+ Pointer<WasmerValVec> args, Pointer<WasmerValVec> results) {
try {
_WasmFnImport._call(imp, args, results);
- } catch (e) {
- // TODO: Use WasmerTrap to handle this case. For now just print the
- // exception (if we ignore it, FFI will silently return a default result).
- print(e);
+ } catch (exception) {
+ return WasmRuntime().newTrap(imp.ref.store, exception);
}
return nullptr;
}
@@ -66,8 +64,8 @@
}
final _wasmFnImportTrampolineNative = Pointer.fromFunction<
- Pointer<WasmerTrap> Function(Pointer<_WasmFnImport>, Pointer<WasmerVal>,
- Pointer<WasmerVal>)>(_wasmFnImportTrampoline);
+ Pointer<WasmerTrap> Function(Pointer<_WasmFnImport>, Pointer<WasmerValVec>,
+ Pointer<WasmerValVec>)>(_wasmFnImportTrampoline);
final _wasmFnImportToFn = <int, Function>{};
final _wasmFnImportFinalizerNative =
Pointer.fromFunction<Void Function(Pointer<_WasmFnImport>)>(
@@ -75,34 +73,36 @@
class _WasmFnImport extends Struct {
@Int32()
- external int numArgs;
-
- @Int32()
external int returnType;
- static void _call(Pointer<_WasmFnImport> imp, Pointer<WasmerVal> rawArgs,
- Pointer<WasmerVal> rawResult) {
+ external Pointer<WasmerStore> store;
+
+ static void _call(Pointer<_WasmFnImport> imp, Pointer<WasmerValVec> rawArgs,
+ Pointer<WasmerValVec> rawResult) {
Function fn = _wasmFnImportToFn[imp.address] as Function;
var args = [];
- for (var i = 0; i < imp.ref.numArgs; ++i) {
- args.add(rawArgs[i].toDynamic);
+ for (var i = 0; i < rawArgs.ref.length; ++i) {
+ args.add(rawArgs.ref.data[i].toDynamic);
}
+ assert(
+ rawResult.ref.length == 1 || imp.ref.returnType == WasmerValKindVoid);
var result = Function.apply(fn, args);
- switch (imp.ref.returnType) {
- case WasmerValKindI32:
- rawResult.ref.i32 = result;
- break;
- case WasmerValKindI64:
- rawResult.ref.i64 = result;
- break;
- case WasmerValKindF32:
- rawResult.ref.f32 = result;
- break;
- case WasmerValKindF64:
- rawResult.ref.f64 = result;
- break;
- case WasmerValKindVoid:
- // Do nothing.
+ if (imp.ref.returnType != WasmerValKindVoid) {
+ rawResult.ref.data[0].kind = imp.ref.returnType;
+ switch (imp.ref.returnType) {
+ case WasmerValKindI32:
+ rawResult.ref.data[0].i32 = result;
+ break;
+ case WasmerValKindI64:
+ rawResult.ref.data[0].i64 = result;
+ break;
+ case WasmerValKindF32:
+ rawResult.ref.data[0].f32 = result;
+ break;
+ case WasmerValKindF64:
+ rawResult.ref.data[0].f64 = result;
+ break;
+ }
}
}
}
@@ -113,16 +113,18 @@
WasmModule _module;
late List<WasmImportDescriptor> _importDescs;
Map<String, int> _importIndex;
- late Pointer<Pointer<WasmerExtern>> _imports;
+ Pointer<WasmerExternVec> _imports = allocate<WasmerExternVec>();
Pointer<WasmerWasiEnv> _wasiEnv = nullptr;
WasmInstanceBuilder(this._module) : _importIndex = {} {
_importDescs = WasmRuntime().importDescriptors(_module._module);
- _imports = allocate<Pointer<WasmerExtern>>(count: _importDescs.length);
+ _imports.ref.length = _importDescs.length;
+ _imports.ref.data =
+ allocate<Pointer<WasmerExtern>>(count: _importDescs.length);
for (var i = 0; i < _importDescs.length; ++i) {
var imp = _importDescs[i];
_importIndex["${imp.moduleName}::${imp.name}"] = i;
- _imports[i] = nullptr;
+ _imports.ref.data[i] = nullptr;
}
}
@@ -130,7 +132,7 @@
var index = _importIndex["${moduleName}::${name}"];
if (index == null) {
throw Exception("Import not found: ${moduleName}::${name}");
- } else if (_imports[index] != nullptr) {
+ } else if (_imports.ref.data[index] != nullptr) {
throw Exception("Import already filled: ${moduleName}::${name}");
} else {
return index;
@@ -145,7 +147,7 @@
if (imp.kind != WasmerExternKindMemory) {
throw Exception("Import is not a memory: $imp");
}
- _imports[index] = WasmRuntime().memoryToExtern(memory._mem);
+ _imports.ref.data[index] = WasmRuntime().memoryToExtern(memory._mem);
return this;
}
@@ -162,8 +164,8 @@
var argTypes = runtime.getArgTypes(imp.funcType);
var returnType = runtime.getReturnType(imp.funcType);
var wasmFnImport = allocate<_WasmFnImport>();
- wasmFnImport.ref.numArgs = argTypes.length;
wasmFnImport.ref.returnType = returnType;
+ wasmFnImport.ref.store = _module._store;
_wasmFnImportToFn[wasmFnImport.address] = fn;
var fnImp = runtime.newFunc(
_module._store,
@@ -171,7 +173,7 @@
_wasmFnImportTrampolineNative,
wasmFnImport,
_wasmFnImportFinalizerNative);
- _imports[index] = runtime.functionToExtern(fnImp);
+ _imports.ref.data[index] = runtime.functionToExtern(fnImp);
return this;
}
@@ -193,7 +195,7 @@
/// Build the module instance.
WasmInstance build() {
for (var i = 0; i < _importDescs.length; ++i) {
- if (_imports[i] == nullptr) {
+ if (_imports.ref.data[i] == nullptr) {
throw Exception("Missing import: ${_importDescs[i]}");
}
}
@@ -211,8 +213,7 @@
Stream<List<int>>? _stderr;
Map<String, WasmFunction> _functions = {};
- WasmInstance(
- this._module, Pointer<Pointer<WasmerExtern>> imports, this._wasiEnv)
+ WasmInstance(this._module, Pointer<WasmerExternVec> imports, this._wasiEnv)
: _instance = WasmRuntime()
.instantiate(_module._store, _module._module, imports) {
var runtime = WasmRuntime();
diff --git a/pkg/wasm/lib/src/runtime.dart b/pkg/wasm/lib/src/runtime.dart
index e14bda0..ee83580 100644
--- a/pkg/wasm/lib/src/runtime.dart
+++ b/pkg/wasm/lib/src/runtime.dart
@@ -59,6 +59,7 @@
DynamicLibrary _lib;
late Pointer<WasmerEngine> _engine;
+ Map<int, dynamic> traps = {};
late WasmerWasiConfigInheritStderrFn _wasi_config_inherit_stderr;
late WasmerWasiConfigInheritStdoutFn _wasi_config_inherit_stdout;
late WasmerWasiConfigNewFn _wasi_config_new;
@@ -124,6 +125,8 @@
late WasmerStoreDeleteFn _store_delete;
late WasmerStoreNewFn _store_new;
late WasmerTrapDeleteFn _trap_delete;
+ late WasmerTrapMessageFn _trap_message;
+ late WasmerTrapNewFn _trap_new;
late WasmerValtypeDeleteFn _valtype_delete;
late WasmerValtypeKindFn _valtype_kind;
late WasmerValtypeVecDeleteFn _valtype_vec_delete;
@@ -344,6 +347,11 @@
_trap_delete =
_lib.lookupFunction<NativeWasmerTrapDeleteFn, WasmerTrapDeleteFn>(
'wasm_trap_delete');
+ _trap_message =
+ _lib.lookupFunction<NativeWasmerTrapMessageFn, WasmerTrapMessageFn>(
+ 'wasm_trap_message');
+ _trap_new = _lib.lookupFunction<NativeWasmerTrapNewFn, WasmerTrapNewFn>(
+ 'wasm_trap_new');
_valtype_delete =
_lib.lookupFunction<NativeWasmerValtypeDeleteFn, WasmerValtypeDeleteFn>(
'wasm_valtype_delete');
@@ -432,10 +440,31 @@
return imps;
}
+ void maybeThrowTrap(Pointer<WasmerTrap> trap, String source) {
+ if (trap != nullptr) {
+ var stashedException = traps[trap.address];
+ if (stashedException != null) {
+ traps.remove(stashedException);
+ throw stashedException;
+ } else {
+ var trapMessage = allocate<WasmerByteVec>();
+ _trap_message(trap, trapMessage);
+ var message = "Wasm trap when calling $source: ${trapMessage.ref}";
+ free(trapMessage.ref.data);
+ free(trapMessage);
+ throw Exception(message);
+ }
+ }
+ }
+
Pointer<WasmerInstance> instantiate(Pointer<WasmerStore> store,
- Pointer<WasmerModule> module, Pointer<Pointer<WasmerExtern>> imports) {
- return _checkNotEqual(_instance_new(store, module, imports, nullptr),
- nullptr, "Wasm module instantiation failed.");
+ Pointer<WasmerModule> module, Pointer<WasmerExternVec> imports) {
+ var trap = allocate<Pointer<WasmerTrap>>();
+ trap.value = nullptr;
+ var inst = _instance_new(store, module, imports, trap);
+ maybeThrowTrap(trap.value, "module initialization function");
+ free(trap);
+ return _checkNotEqual(inst, nullptr, "Wasm module instantiation failed.");
}
Pointer<WasmerExternVec> exports(Pointer<WasmerInstance> instancePtr) {
@@ -475,9 +504,9 @@
return _valtype_kind(rets.ref.data[0]);
}
- void call(Pointer<WasmerFunc> func, Pointer<WasmerVal> args,
- Pointer<WasmerVal> results) {
- _func_call(func, args, results);
+ void call(Pointer<WasmerFunc> func, Pointer<WasmerValVec> args,
+ Pointer<WasmerValVec> results, String source) {
+ maybeThrowTrap(_func_call(func, args, results), source);
}
Pointer<WasmerMemory> externToMemory(Pointer<WasmerExtern> extern) {
@@ -522,6 +551,18 @@
store, funcType, func.cast(), env.cast(), finalizer.cast());
}
+ Pointer<WasmerTrap> newTrap(Pointer<WasmerStore> store, dynamic exception) {
+ var msg = allocate<WasmerByteVec>();
+ msg.ref.data = allocate<Uint8>();
+ msg.ref.data[0] = 0;
+ msg.ref.length = 0;
+ var trap = _trap_new(store, msg);
+ traps[trap.address] = exception;
+ free(msg.ref.data);
+ free(msg);
+ return _checkNotEqual(trap, nullptr, "Failed to create trap.");
+ }
+
Pointer<WasmerWasiConfig> newWasiConfig() {
var name = allocate<Uint8>();
name[0] = 0;
@@ -549,7 +590,7 @@
}
void getWasiImports(Pointer<WasmerStore> store, Pointer<WasmerModule> mod,
- Pointer<WasmerWasiEnv> env, Pointer<Pointer<WasmerExtern>> imports) {
+ Pointer<WasmerWasiEnv> env, Pointer<WasmerExternVec> imports) {
_checkNotEqual(_wasi_get_imports(store, mod, env, imports), 0,
"Failed to fill WASI imports.");
}
diff --git a/pkg/wasm/lib/src/tools/generate_ffi_boilerplate.py b/pkg/wasm/lib/src/tools/generate_ffi_boilerplate.py
index 906cea5..6251ee9 100755
--- a/pkg/wasm/lib/src/tools/generate_ffi_boilerplate.py
+++ b/pkg/wasm/lib/src/tools/generate_ffi_boilerplate.py
@@ -155,6 +155,7 @@
('own', ''),
('WASM_API_EXTERN', ''),
('wasm_name_t', 'wasm_byte_vec_t'),
+ ('wasm_message_t', 'wasm_byte_vec_t'),
('wasm_memory_pages_t', 'uint32_t'),
('wasm_externkind_t', 'uint8_t'),
('wasm_valkind_t', 'uint8_t'),
@@ -290,7 +291,7 @@
WASM_API_EXTERN const wasm_name_t* wasm_exporttype_name(const wasm_exporttype_t*);
WASM_API_EXTERN const wasm_externtype_t* wasm_exporttype_type(const wasm_exporttype_t*);
WASM_API_EXTERN wasm_externkind_t wasm_externtype_kind(const wasm_externtype_t*);
-WASM_API_EXTERN own wasm_instance_t* wasm_instance_new(wasm_store_t*, const wasm_module_t*, const wasm_extern_t* const imports[], own wasm_trap_t**);
+WASM_API_EXTERN own wasm_instance_t* wasm_instance_new(wasm_store_t*, const wasm_module_t*, const wasm_extern_vec_t* imports, own wasm_trap_t**);
WASM_API_EXTERN void wasm_instance_exports(const wasm_instance_t*, own wasm_extern_vec_t* out);
WASM_API_EXTERN own wasm_memory_t* wasm_memory_new(wasm_store_t*, const wasm_memorytype_t*);
WASM_API_EXTERN byte_t* wasm_memory_data(wasm_memory_t*);
@@ -305,11 +306,13 @@
WASM_API_EXTERN const wasm_valtype_vec_t* wasm_functype_params(const wasm_functype_t*);
WASM_API_EXTERN const wasm_valtype_vec_t* wasm_functype_results(const wasm_functype_t*);
WASM_API_EXTERN own wasm_func_t* wasm_func_new_with_env( wasm_store_t*, const wasm_functype_t* type, void* fn, void* env, void *finalizer);
-WASM_API_EXTERN own wasm_trap_t* wasm_func_call(const wasm_func_t*, const wasm_val_t args[], wasm_val_t results[]);
+WASM_API_EXTERN own wasm_trap_t* wasm_func_call(const wasm_func_t*, const wasm_val_vec_t* args, wasm_val_vec_t* results);
+WASM_API_EXTERN own wasm_trap_t* wasm_trap_new(wasm_store_t* store, const wasm_message_t*);
+WASM_API_EXTERN void wasm_trap_message(const wasm_trap_t*, own wasm_message_t* out);
WASM_API_EXTERN wasm_valkind_t wasm_valtype_kind(const wasm_valtype_t*);
wasi_config_t* wasi_config_new(const uint8_t* program_name);
wasi_env_t* wasi_env_new(wasi_config_t* config);
-bool wasi_get_imports(const wasm_store_t* store, const wasm_module_t* module, const wasi_env_t* wasi_env, wasm_extern_t** imports);
+bool wasi_get_imports(const wasm_store_t* store, const wasm_module_t* module, const wasi_env_t* wasi_env, wasm_extern_vec_t* imports);
int wasmer_last_error_message(uint8_t* buffer, int length);
int wasmer_last_error_length();
void wasi_env_set_memory(wasi_env_t* env, const wasm_memory_t* memory);
diff --git a/pkg/wasm/lib/src/tools/runtime_template.dart b/pkg/wasm/lib/src/tools/runtime_template.dart
index 981da8d..1f53a43 100644
--- a/pkg/wasm/lib/src/tools/runtime_template.dart
+++ b/pkg/wasm/lib/src/tools/runtime_template.dart
@@ -57,6 +57,7 @@
DynamicLibrary _lib;
late Pointer<WasmerEngine> _engine;
+ Map<int, dynamic> traps = {};
/* <RUNTIME_MEMB> */
factory WasmRuntime() {
@@ -166,10 +167,31 @@
return imps;
}
+ void maybeThrowTrap(Pointer<WasmerTrap> trap, String source) {
+ if (trap != nullptr) {
+ var stashedException = traps[trap.address];
+ if (stashedException != null) {
+ traps.remove(stashedException);
+ throw stashedException;
+ } else {
+ var trapMessage = allocate<WasmerByteVec>();
+ _trap_message(trap, trapMessage);
+ var message = "Wasm trap when calling $source: ${trapMessage.ref}";
+ free(trapMessage.ref.data);
+ free(trapMessage);
+ throw Exception(message);
+ }
+ }
+ }
+
Pointer<WasmerInstance> instantiate(Pointer<WasmerStore> store,
- Pointer<WasmerModule> module, Pointer<Pointer<WasmerExtern>> imports) {
- return _checkNotEqual(_instance_new(store, module, imports, nullptr),
- nullptr, "Wasm module instantiation failed.");
+ Pointer<WasmerModule> module, Pointer<WasmerExternVec> imports) {
+ var trap = allocate<Pointer<WasmerTrap>>();
+ trap.value = nullptr;
+ var inst = _instance_new(store, module, imports, trap);
+ maybeThrowTrap(trap.value, "module initialization function");
+ free(trap);
+ return _checkNotEqual(inst, nullptr, "Wasm module instantiation failed.");
}
Pointer<WasmerExternVec> exports(Pointer<WasmerInstance> instancePtr) {
@@ -209,9 +231,9 @@
return _valtype_kind(rets.ref.data[0]);
}
- void call(Pointer<WasmerFunc> func, Pointer<WasmerVal> args,
- Pointer<WasmerVal> results) {
- _func_call(func, args, results);
+ void call(Pointer<WasmerFunc> func, Pointer<WasmerValVec> args,
+ Pointer<WasmerValVec> results, String source) {
+ maybeThrowTrap(_func_call(func, args, results), source);
}
Pointer<WasmerMemory> externToMemory(Pointer<WasmerExtern> extern) {
@@ -256,6 +278,18 @@
store, funcType, func.cast(), env.cast(), finalizer.cast());
}
+ Pointer<WasmerTrap> newTrap(Pointer<WasmerStore> store, dynamic exception) {
+ var msg = allocate<WasmerByteVec>();
+ msg.ref.data = allocate<Uint8>();
+ msg.ref.data[0] = 0;
+ msg.ref.length = 0;
+ var trap = _trap_new(store, msg);
+ traps[trap.address] = exception;
+ free(msg.ref.data);
+ free(msg);
+ return _checkNotEqual(trap, nullptr, "Failed to create trap.");
+ }
+
Pointer<WasmerWasiConfig> newWasiConfig() {
var name = allocate<Uint8>();
name[0] = 0;
@@ -283,7 +317,7 @@
}
void getWasiImports(Pointer<WasmerStore> store, Pointer<WasmerModule> mod,
- Pointer<WasmerWasiEnv> env, Pointer<Pointer<WasmerExtern>> imports) {
+ Pointer<WasmerWasiEnv> env, Pointer<WasmerExternVec> imports) {
_checkNotEqual(_wasi_get_imports(store, mod, env, imports), 0,
"Failed to fill WASI imports.");
}
diff --git a/pkg/wasm/lib/src/wasmer_api.dart b/pkg/wasm/lib/src/wasmer_api.dart
index c8e55c7..ce9057e 100644
--- a/pkg/wasm/lib/src/wasmer_api.dart
+++ b/pkg/wasm/lib/src/wasmer_api.dart
@@ -261,16 +261,10 @@
Pointer<WasmerWasiEnv>, Pointer<WasmerMemory>);
// wasi_get_imports
-typedef NativeWasmerWasiGetImportsFn = Uint8 Function(
- Pointer<WasmerStore>,
- Pointer<WasmerModule>,
- Pointer<WasmerWasiEnv>,
- Pointer<Pointer<WasmerExtern>>);
-typedef WasmerWasiGetImportsFn = int Function(
- Pointer<WasmerStore>,
- Pointer<WasmerModule>,
- Pointer<WasmerWasiEnv>,
- Pointer<Pointer<WasmerExtern>>);
+typedef NativeWasmerWasiGetImportsFn = Uint8 Function(Pointer<WasmerStore>,
+ Pointer<WasmerModule>, Pointer<WasmerWasiEnv>, Pointer<WasmerExternVec>);
+typedef WasmerWasiGetImportsFn = int Function(Pointer<WasmerStore>,
+ Pointer<WasmerModule>, Pointer<WasmerWasiEnv>, Pointer<WasmerExternVec>);
// wasm_byte_vec_delete
typedef NativeWasmerByteVecDeleteFn = Void Function(Pointer<WasmerByteVec>);
@@ -401,9 +395,9 @@
// wasm_func_call
typedef NativeWasmerFuncCallFn = Pointer<WasmerTrap> Function(
- Pointer<WasmerFunc>, Pointer<WasmerVal>, Pointer<WasmerVal>);
+ Pointer<WasmerFunc>, Pointer<WasmerValVec>, Pointer<WasmerValVec>);
typedef WasmerFuncCallFn = Pointer<WasmerTrap> Function(
- Pointer<WasmerFunc>, Pointer<WasmerVal>, Pointer<WasmerVal>);
+ Pointer<WasmerFunc>, Pointer<WasmerValVec>, Pointer<WasmerValVec>);
// wasm_func_delete
typedef NativeWasmerFuncDeleteFn = Void Function(Pointer<WasmerFunc>);
@@ -495,12 +489,12 @@
typedef NativeWasmerInstanceNewFn = Pointer<WasmerInstance> Function(
Pointer<WasmerStore>,
Pointer<WasmerModule>,
- Pointer<Pointer<WasmerExtern>>,
+ Pointer<WasmerExternVec>,
Pointer<Pointer<WasmerTrap>>);
typedef WasmerInstanceNewFn = Pointer<WasmerInstance> Function(
Pointer<WasmerStore>,
Pointer<WasmerModule>,
- Pointer<Pointer<WasmerExtern>>,
+ Pointer<WasmerExternVec>,
Pointer<Pointer<WasmerTrap>>);
// wasm_memory_as_extern
@@ -583,6 +577,18 @@
typedef NativeWasmerTrapDeleteFn = Void Function(Pointer<WasmerTrap>);
typedef WasmerTrapDeleteFn = void Function(Pointer<WasmerTrap>);
+// wasm_trap_message
+typedef NativeWasmerTrapMessageFn = Void Function(
+ Pointer<WasmerTrap>, Pointer<WasmerByteVec>);
+typedef WasmerTrapMessageFn = void Function(
+ Pointer<WasmerTrap>, Pointer<WasmerByteVec>);
+
+// wasm_trap_new
+typedef NativeWasmerTrapNewFn = Pointer<WasmerTrap> Function(
+ Pointer<WasmerStore>, Pointer<WasmerByteVec>);
+typedef WasmerTrapNewFn = Pointer<WasmerTrap> Function(
+ Pointer<WasmerStore>, Pointer<WasmerByteVec>);
+
// wasm_valtype_delete
typedef NativeWasmerValtypeDeleteFn = Void Function(Pointer<WasmerValtype>);
typedef WasmerValtypeDeleteFn = void Function(Pointer<WasmerValtype>);
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index 16fca32..7913553 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -2380,21 +2380,43 @@
class RODataDeserializationCluster : public DeserializationCluster {
public:
- RODataDeserializationCluster() : DeserializationCluster("ROData") {}
+ explicit RODataDeserializationCluster(intptr_t cid)
+ : DeserializationCluster("ROData"), cid_(cid) {}
~RODataDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
+ start_index_ = d->next_index();
intptr_t count = d->ReadUnsigned();
uint32_t running_offset = 0;
for (intptr_t i = 0; i < count; i++) {
running_offset += d->ReadUnsigned() << kObjectAlignmentLog2;
d->AssignRef(d->GetObjectAt(running_offset));
}
+ stop_index_ = d->next_index();
}
void ReadFill(Deserializer* d, bool is_canonical) {
// No-op.
}
+
+ void PostLoad(Deserializer* d, const Array& refs, bool is_canonical) {
+ if (is_canonical && IsStringClassId(cid_) &&
+ (d->isolate() != Dart::vm_isolate())) {
+ CanonicalStringSet table(d->zone(),
+ d->isolate()->object_store()->symbol_table());
+ String& str = String::Handle(d->zone());
+ for (intptr_t i = start_index_; i < stop_index_; i++) {
+ str ^= refs.At(i);
+ ASSERT(str.IsCanonical());
+ bool present = table.Insert(str);
+ ASSERT(!present);
+ }
+ d->isolate()->object_store()->set_symbol_table(table.Release());
+ }
+ }
+
+ private:
+ const intptr_t cid_;
};
#if !defined(DART_PRECOMPILED_RUNTIME)
@@ -5499,6 +5521,14 @@
return "CodeSourceMap";
case kCompressedStackMapsCid:
return "CompressedStackMaps";
+ case kOneByteStringCid:
+ return current_loading_unit_id_ <= LoadingUnit::kRootId
+ ? "OneByteStringCid"
+ : nullptr;
+ case kTwoByteStringCid:
+ return current_loading_unit_id_ <= LoadingUnit::kRootId
+ ? "TwoByteStringCid"
+ : nullptr;
default:
return nullptr;
}
@@ -5771,19 +5801,15 @@
is_canonical = object->ptr()->IsCanonical();
}
- SerializationCluster* cluster =
- is_canonical ? canonical_clusters_by_cid_[cid] : clusters_by_cid_[cid];
- if (cluster == nullptr) {
- cluster = NewClusterForClass(cid);
- if (cluster == nullptr) {
+ SerializationCluster** cluster_ref =
+ is_canonical ? &canonical_clusters_by_cid_[cid] : &clusters_by_cid_[cid];
+ if (*cluster_ref == nullptr) {
+ *cluster_ref = NewClusterForClass(cid);
+ if (*cluster_ref == nullptr) {
UnexpectedObject(object, "No serialization cluster defined");
}
- if (is_canonical) {
- canonical_clusters_by_cid_[cid] = cluster;
- } else {
- clusters_by_cid_[cid] = cluster;
- }
}
+ SerializationCluster* cluster = *cluster_ref;
ASSERT(cluster != nullptr);
#if defined(SNAPSHOT_BACKTRACE)
@@ -6171,6 +6197,7 @@
intptr_t size,
const uint8_t* data_buffer,
const uint8_t* instructions_buffer,
+ bool is_non_root_unit,
intptr_t offset)
: ThreadStackResource(thread),
heap_(thread->isolate()->heap()),
@@ -6183,7 +6210,8 @@
previous_text_offset_(0),
canonical_clusters_(nullptr),
clusters_(nullptr),
- field_table_(thread->isolate()->field_table()) {
+ field_table_(thread->isolate()->field_table()),
+ is_non_root_unit_(is_non_root_unit) {
if (Snapshot::IncludesCode(kind)) {
ASSERT(instructions_buffer != nullptr);
ASSERT(data_buffer != nullptr);
@@ -6218,7 +6246,13 @@
case kPcDescriptorsCid:
case kCodeSourceMapCid:
case kCompressedStackMapsCid:
- return new (Z) RODataDeserializationCluster();
+ return new (Z) RODataDeserializationCluster(cid);
+ case kOneByteStringCid:
+ case kTwoByteStringCid:
+ if (!is_non_root_unit_) {
+ return new (Z) RODataDeserializationCluster(cid);
+ }
+ break;
}
}
@@ -7076,7 +7110,8 @@
}
Deserializer deserializer(thread_, kind_, buffer_, size_, data_image_,
- instructions_image_, offset);
+ instructions_image_, /*is_non_root_unit=*/false,
+ offset);
ApiErrorPtr api_error = deserializer.VerifyImageAlignment();
if (api_error != ApiError::null()) {
return api_error;
@@ -7116,7 +7151,8 @@
}
Deserializer deserializer(thread_, kind_, buffer_, size_, data_image_,
- instructions_image_, offset);
+ instructions_image_, /*is_non_root_unit=*/false,
+ offset);
ApiErrorPtr api_error = deserializer.VerifyImageAlignment();
if (api_error != ApiError::null()) {
return api_error;
@@ -7149,8 +7185,9 @@
return ConvertToApiError(error);
}
- Deserializer deserializer(thread_, kind_, buffer_, size_, data_image_,
- instructions_image_, offset);
+ Deserializer deserializer(
+ thread_, kind_, buffer_, size_, data_image_, instructions_image_,
+ /*is_non_root_unit=*/unit.id() != LoadingUnit::kRootId, offset);
ApiErrorPtr api_error = deserializer.VerifyImageAlignment();
if (api_error != ApiError::null()) {
return api_error;
diff --git a/runtime/vm/clustered_snapshot.h b/runtime/vm/clustered_snapshot.h
index dbfa8d8..2632693 100644
--- a/runtime/vm/clustered_snapshot.h
+++ b/runtime/vm/clustered_snapshot.h
@@ -417,7 +417,7 @@
}
private:
- static const char* ReadOnlyObjectType(intptr_t cid);
+ const char* ReadOnlyObjectType(intptr_t cid);
Heap* heap_;
Zone* zone_;
@@ -548,6 +548,7 @@
intptr_t size,
const uint8_t* data_buffer,
const uint8_t* instructions_buffer,
+ bool is_non_root_unit,
intptr_t offset = 0);
~Deserializer();
@@ -658,6 +659,7 @@
DeserializationCluster** canonical_clusters_;
DeserializationCluster** clusters_;
FieldTable* field_table_;
+ const bool is_non_root_unit_;
};
#define ReadFromTo(obj, ...) d->ReadFromTo(obj, ##__VA_ARGS__);
diff --git a/runtime/vm/compiler/asm_intrinsifier_arm64.cc b/runtime/vm/compiler/asm_intrinsifier_arm64.cc
index bf0eb6a..a54be20 100644
--- a/runtime/vm/compiler/asm_intrinsifier_arm64.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_arm64.cc
@@ -1986,17 +1986,11 @@
__ mov(R6, length_reg); // Save the length register.
if (cid == kOneByteStringCid) {
// Untag length.
- __ adds(length_reg, ZR, Operand(length_reg, ASR, kSmiTagSize));
+ __ SmiUntag(length_reg, length_reg);
} else {
// Untag length and multiply by element size -> no-op.
- __ adds(length_reg, ZR, Operand(length_reg));
+ ASSERT(kSmiTagSize == 1);
}
- // If the length is 0 then we have to make the allocated size a bit bigger,
- // otherwise the string takes up less space than an ExternalOneByteString,
- // and cannot be externalized. TODO(erikcorry): We should probably just
- // return a static zero length string here instead.
- // length <- (length != 0) ? length : (ZR + 1).
- __ csinc(length_reg, length_reg, ZR, NE);
const intptr_t fixed_size_plus_alignment_padding =
target::String::InstanceSize() +
target::ObjectAlignment::kObjectAlignment - 1;
diff --git a/runtime/vm/compiler/asm_intrinsifier_x64.cc b/runtime/vm/compiler/asm_intrinsifier_x64.cc
index 9ee661c..816f2fc 100644
--- a/runtime/vm/compiler/asm_intrinsifier_x64.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_x64.cc
@@ -1943,18 +1943,11 @@
__ pushq(RDI); // Preserve length.
if (cid == kOneByteStringCid) {
// Untag length.
- __ sarq(RDI, Immediate(kSmiTagShift));
+ __ SmiUntag(RDI);
} else {
// Untag length and multiply by element size -> no-op.
- __ testq(RDI, RDI);
+ ASSERT(kSmiTagSize == 1);
}
- // If the length is 0 then we have to make the allocated size a bit bigger,
- // otherwise the string takes up less space than an ExternalOneByteString,
- // and cannot be externalized. TODO(erikcorry): We should probably just
- // return a static zero length string here instead.
- __ j(NOT_ZERO, ¬_zero_length);
- __ addq(RDI, Immediate(1));
- __ Bind(¬_zero_length);
const intptr_t fixed_size_plus_alignment_padding =
target::String::InstanceSize() +
target::ObjectAlignment::kObjectAlignment - 1;
diff --git a/runtime/vm/compiler/runtime_api.cc b/runtime/vm/compiler/runtime_api.cc
index 223c76d..24bfa59 100644
--- a/runtime/vm/compiler/runtime_api.cc
+++ b/runtime/vm/compiler/runtime_api.cc
@@ -934,6 +934,10 @@
return -kWordSize;
}
+word String::InstanceSize(word payload_size) {
+ return RoundedAllocationSize(String::InstanceSize() + payload_size);
+}
+
word OneByteString::NextFieldOffset() {
return -kWordSize;
}
diff --git a/runtime/vm/compiler/runtime_api.h b/runtime/vm/compiler/runtime_api.h
index 4f53eda..7611669 100644
--- a/runtime/vm/compiler/runtime_api.h
+++ b/runtime/vm/compiler/runtime_api.h
@@ -702,6 +702,7 @@
static word length_offset();
static word InstanceSize();
static word NextFieldOffset();
+ static word InstanceSize(word payload_size);
};
class OneByteString : public AllStatic {
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index 5e640c3..d67906f 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -753,7 +753,10 @@
const Instance& incoming_exception,
const Instance& existing_stacktrace,
const bool is_rethrow) {
- DEBUG_ASSERT(thread->TopErrorHandlerIsExitFrame());
+ // SuspendLongJumpScope during Dart entry ensures that if a longjmp base is
+ // available, it is the innermost error handler. If one is available, so
+ // should jump there instead.
+ RELEASE_ASSERT(thread->long_jump_base() == nullptr);
Zone* zone = thread->zone();
Isolate* isolate = thread->isolate();
#if !defined(PRODUCT)
@@ -995,7 +998,10 @@
void Exceptions::PropagateError(const Error& error) {
ASSERT(!error.IsNull());
Thread* thread = Thread::Current();
- DEBUG_ASSERT(thread->TopErrorHandlerIsExitFrame());
+ // SuspendLongJumpScope during Dart entry ensures that if a longjmp base is
+ // available, it is the innermost error handler. If one is available, so
+ // should jump there instead.
+ RELEASE_ASSERT(thread->long_jump_base() == nullptr);
Zone* zone = thread->zone();
if (error.IsUnhandledException()) {
// If the error object represents an unhandled exception, then
diff --git a/runtime/vm/image_snapshot.cc b/runtime/vm/image_snapshot.cc
index 4e53de4..197e24f 100644
--- a/runtime/vm/image_snapshot.cc
+++ b/runtime/vm/image_snapshot.cc
@@ -271,6 +271,16 @@
return compiler::target::Instructions::InstanceSize(
Instructions::Size(raw_insns));
}
+ case kOneByteStringCid: {
+ auto raw_str = String::RawCast(raw_object);
+ return compiler::target::String::InstanceSize(
+ String::LengthOf(raw_str) * OneByteString::kBytesPerElement);
+ }
+ case kTwoByteStringCid: {
+ auto raw_str = String::RawCast(raw_object);
+ return compiler::target::String::InstanceSize(
+ String::LengthOf(raw_str) * TwoByteString::kBytesPerElement);
+ }
default: {
const Class& clazz = Class::Handle(Object::Handle(raw_object).clazz());
FATAL("Unsupported class %s in rodata section.\n", clazz.ToCString());
@@ -520,6 +530,24 @@
ASSERT_EQUAL(stream->Position() - object_start,
compiler::target::PcDescriptors::HeaderSize());
stream->WriteBytes(desc.raw()->ptr()->data(), desc.Length());
+ } else if (obj.IsString()) {
+ const String& str = String::Cast(obj);
+ RELEASE_ASSERT(String::GetCachedHash(str.raw()) != 0);
+ RELEASE_ASSERT(str.IsOneByteString() || str.IsTwoByteString());
+
+ stream->WriteTargetWord(static_cast<uword>(str.raw()->ptr()->length_));
+#if !defined(HASH_IN_OBJECT_HEADER)
+ stream->WriteTargetWord(static_cast<uword>(str.raw()->ptr()->hash_));
+#endif
+ ASSERT_EQUAL(stream->Position() - object_start,
+ compiler::target::String::InstanceSize());
+ stream->WriteBytes(
+ str.IsOneByteString()
+ ? static_cast<const void*>(OneByteString::DataStart(str))
+ : static_cast<const void*>(TwoByteString::DataStart(str)),
+ str.Length() * (str.IsOneByteString()
+ ? OneByteString::kBytesPerElement
+ : TwoByteString::kBytesPerElement));
} else {
const Class& clazz = Class::Handle(obj.clazz());
FATAL("Unsupported class %s in rodata section.\n", clazz.ToCString());
@@ -535,7 +563,9 @@
ObjectLayout::OldAndNotRememberedBit::encode(true) |
ObjectLayout::NewBit::encode(false);
-uword ImageWriter::GetMarkedTags(classid_t cid, intptr_t size) {
+uword ImageWriter::GetMarkedTags(classid_t cid,
+ intptr_t size,
+ bool is_canonical /* = false */) {
// ObjectLayout::SizeTag expects a size divisible by kObjectAlignment and
// checks this in debug mode, but the size on the target machine may not be
// divisible by the host machine's object alignment if they differ.
@@ -554,7 +584,8 @@
compiler::target::ObjectAlignment::kObjectAlignmentLog2);
return kReadOnlyGCBits | ObjectLayout::ClassIdTag::encode(cid) |
- ObjectLayout::SizeTag::encode(adjusted_size);
+ ObjectLayout::SizeTag::encode(adjusted_size) |
+ ObjectLayout::CanonicalBit::encode(is_canonical);
}
uword ImageWriter::GetMarkedTags(const Object& obj) {
@@ -562,7 +593,8 @@
#if defined(HASH_IN_OBJECT_HEADER)
static_cast<uword>(obj.raw()->ptr()->hash_) << kBitsPerInt32 |
#endif
- GetMarkedTags(obj.raw()->GetClassId(), SizeInSnapshot(obj));
+ GetMarkedTags(obj.raw()->GetClassId(), SizeInSnapshot(obj),
+ obj.IsCanonical());
}
const char* ImageWriter::SectionSymbol(ProgramSection section, bool vm) const {
diff --git a/runtime/vm/image_snapshot.h b/runtime/vm/image_snapshot.h
index 060f3a9..cc5ac6d 100644
--- a/runtime/vm/image_snapshot.h
+++ b/runtime/vm/image_snapshot.h
@@ -319,7 +319,9 @@
// shared by both.
const char* SectionSymbol(ProgramSection section, bool vm) const;
- static uword GetMarkedTags(classid_t cid, intptr_t size);
+ static uword GetMarkedTags(classid_t cid,
+ intptr_t size,
+ bool is_canonical = false);
static uword GetMarkedTags(const Object& obj);
void DumpInstructionStats();
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index bc6666b..6a2bed1 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -2600,16 +2600,19 @@
uword address = heap->Allocate(size, space);
if (UNLIKELY(address == 0)) {
- if (thread->top_exit_frame_info() != 0) {
+ // SuspendLongJumpScope during Dart entry ensures that if a longjmp base is
+ // available, it is the innermost error handler, so check for a longjmp base
+ // before checking for an exit frame.
+ if (thread->long_jump_base() != nullptr) {
+ Report::LongJump(Object::out_of_memory_error());
+ UNREACHABLE();
+ } else if (thread->top_exit_frame_info() != 0) {
// Use the preallocated out of memory exception to avoid calling
// into dart code or allocating any code.
const Instance& exception =
Instance::Handle(thread->isolate()->object_store()->out_of_memory());
Exceptions::Throw(thread, exception);
UNREACHABLE();
- } else if (thread->long_jump_base() != nullptr) {
- Report::LongJump(Object::out_of_memory_error());
- UNREACHABLE();
} else {
// Nowhere to propagate an exception to.
OUT_OF_MEMORY();
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 1bd2be8..c489355 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -8578,6 +8578,8 @@
#endif
static const intptr_t kMaxElements = kSmiMax / kTwoByteChar;
+ static intptr_t HeaderSize() { return String::kSizeofRawString; }
+
class CodePointIterator : public ValueObject {
public:
explicit CodePointIterator(const String& str)
@@ -8967,12 +8969,6 @@
static intptr_t InstanceSize(intptr_t len) {
ASSERT(sizeof(OneByteStringLayout) == String::kSizeofRawString);
ASSERT(0 <= len && len <= kMaxElements);
-#if defined(HASH_IN_OBJECT_HEADER)
- // We have to pad zero-length raw strings so that they can be externalized.
- // If we don't pad, then the external string object does not fit in the
- // memory allocated for the raw string.
- if (len == 0) return InstanceSize(1);
-#endif
return String::RoundedAllocationSize(UnroundedSize(len));
}
@@ -9061,11 +9057,12 @@
bool as_reference);
friend class Class;
- friend class String;
- friend class Symbols;
friend class ExternalOneByteString;
+ friend class ImageWriter;
friend class SnapshotReader;
+ friend class String;
friend class StringHasher;
+ friend class Symbols;
friend class Utf8;
};
@@ -9097,7 +9094,6 @@
static intptr_t data_offset() {
return OFFSET_OF_RETURNED_VALUE(TwoByteStringLayout, data);
}
-
static intptr_t UnroundedSize(TwoByteStringPtr str) {
return UnroundedSize(Smi::Value(str->ptr()->length_));
}
@@ -9112,10 +9108,6 @@
static intptr_t InstanceSize(intptr_t len) {
ASSERT(sizeof(TwoByteStringLayout) == String::kSizeofRawString);
ASSERT(0 <= len && len <= kMaxElements);
- // We have to pad zero-length raw strings so that they can be externalized.
- // If we don't pad, then the external string object does not fit in the
- // memory allocated for the raw string.
- if (len == 0) return InstanceSize(1);
return String::RoundedAllocationSize(UnroundedSize(len));
}
@@ -9187,9 +9179,10 @@
bool as_reference);
friend class Class;
+ friend class ImageWriter;
+ friend class SnapshotReader;
friend class String;
friend class StringHasher;
- friend class SnapshotReader;
friend class Symbols;
};
diff --git a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart
index 03b8132..d862534 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart
@@ -107,7 +107,11 @@
@JSExportName('implements')
final implements_ = JS('', 'Symbol("implements")');
-List? Function() getImplements(clazz) => JS(
+/// Either `null` if `clazz` doesn't directly implement any interfaces or a
+/// list of type objects if it does. Note, indirectly (e.g., via superclass)
+/// implemented interfaces aren't included here.
+/// See compiler.dart for when/how it is emitted.
+List Function()? getImplements(clazz) => JS(
'',
'Object.hasOwnProperty.call(#, #) ? #[#] : null',
clazz,
@@ -164,6 +168,29 @@
// as a FutureOr because it is equal to 'async.FutureOr` (in the JS).
JS('!', '#[#] = #', genericType, _originalDeclaration, normalize);
JS('!', '#(#)', addTypeCaches, genericType);
+ // Add FutureOr specific is and as methods.
+ is_FutureOr(obj) =>
+ JS<bool>('!', '#.is(#)', typeArg, obj) ||
+ JS<bool>('!', '#(#).is(#)', getGenericClass(Future), typeArg, obj);
+ JS('!', '#.is = #', genericType, is_FutureOr);
+
+ as_FutureOr(obj) {
+ // Special test to handle case for mixed mode non-nullable FutureOr of a
+ // legacy type. This allows casts like `null as FutureOr<int*>` to work
+ // in weak and sound mode.
+ if (obj == null && _jsInstanceOf(typeArg, LegacyType)) {
+ return obj;
+ }
+
+ if (JS<bool>('!', '#.is(#)', typeArg, obj) ||
+ JS<bool>('!', '#(#).is(#)', getGenericClass(Future), typeArg, obj)) {
+ return obj;
+ }
+ return cast(obj, JS('!', '#(#)', getGenericClass(FutureOr), typeArg));
+ }
+
+ JS('!', '#.as = #', genericType, as_FutureOr);
+
return genericType;
}
diff --git a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart
index b6a0325..bac9226 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/types.dart
@@ -2045,7 +2045,7 @@
// Check interfaces.
var getInterfaces = getImplements(subtype);
if (getInterfaces != null) {
- for (var iface in getInterfaces()!) {
+ for (var iface in getInterfaces()) {
result = _getMatchingSupertype(iface, supertype);
if (result != null) return result;
}
diff --git a/sdk/lib/_internal/js_dev_runtime/private/debugger.dart b/sdk/lib/_internal/js_dev_runtime/private/debugger.dart
index f77d5c3..1f9e933 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/debugger.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/debugger.dart
@@ -264,7 +264,7 @@
final List types;
}
-Object safeGetProperty(Object protoChain, Object name) {
+Object? safeGetProperty(Object protoChain, Object name) {
try {
return JSNative.getProperty(protoChain, name);
} catch (e) {
@@ -609,7 +609,7 @@
for (var name in getOwnPropertyNames(object)) {
var value = safeGetProperty(object, name);
children.add(NameValuePair(
- name: name, value: Library(name, value), hideName: true));
+ name: name, value: Library(name, value!), hideName: true));
}
return children.toList();
}
@@ -907,10 +907,10 @@
bool accept(object, config) => config == JsonMLConfig.asClass;
String preview(type) {
- var implements = dart.getImplements(type)();
+ var implements = dart.getImplements(type);
var typeName = getTypeName(type);
if (implements != null) {
- var typeNames = implements.map(getTypeName);
+ var typeNames = implements().map(getTypeName);
return '${typeName} implements ${typeNames.join(", ")}';
} else {
return typeName;
diff --git a/tests/dartdevc/debugger/debugger_test.dart b/tests/dartdevc/debugger/debugger_test.dart
index 3765d6b..79b12a1 100644
--- a/tests/dartdevc/debugger/debugger_test.dart
+++ b/tests/dartdevc/debugger/debugger_test.dart
@@ -81,7 +81,7 @@
return value;
}
-String format(value) {
+String? format(value) {
// Avoid double-escaping strings.
if (value is String) return value;
return stringify(value, allowInterop(replacer), 4);
@@ -90,8 +90,8 @@
class FormattedObject {
FormattedObject(this.object, this.config);
- Object object;
- Object config;
+ Object? object;
+ Object? config;
}
/// Extract all object tags from a json ml expression to enable
@@ -130,14 +130,14 @@
var goldenUrl = '/root_dart/tests/dartdevc_2/debugger/'
'debugger_test_golden.txt?cacheBlock=$cacheBlocker';
- String golden;
+ String? golden;
try {
golden = (await HttpRequest.getString(goldenUrl)).trim();
} catch (e) {
print("Warning: couldn't load golden file from $goldenUrl");
}
- document.body.append(new ScriptElement()
+ document.body!.append(new ScriptElement()
..type = 'text/javascript'
..innerHtml = r"""
window.ExampleJSClass = function ExampleJSClass(x) {
@@ -333,16 +333,16 @@
print(helpMessage);
// Copy text to clipboard on page click. We can't copy to the clipboard
// without a click due to Chrome security.
- TextAreaElement textField = new Element.tag('textarea');
+ var textField = new Element.tag('textarea') as TextAreaElement;
textField.maxLength = 100000000;
textField.text = actualStr;
textField.style
..width = '800px'
..height = '400px';
- document.body.append(new Element.tag('h3')
+ document.body!.append(new Element.tag('h3')
..innerHtml = helpMessage.replaceAll('\n', '<br>'));
- document.body.append(textField);
- document.body.onClick.listen((_) {
+ document.body!.append(textField);
+ document.body!.onClick.listen((_) {
textField.select();
var result = document.execCommand('copy');
if (result) {
@@ -352,6 +352,12 @@
}
});
}
- expect(actualStr == golden, isTrue);
+ // TODO(vsm): This comparison appears to be badly broken for several
+ // reasons:
+ // (1) The golden file isn't properly read on the bots or locally (see try
+ // / catch above).
+ // (2) The actual string appears to vary locally vs on the bots.
+ // (3) Because of (2), visualizing the diff is difficult.
+ // expect(actualStr == golden, isTrue);
});
}
diff --git a/tests/dartdevc_2/debugger/debugger_test.dart b/tests/dartdevc_2/debugger/debugger_test.dart
index 94d4a63..062088f 100644
--- a/tests/dartdevc_2/debugger/debugger_test.dart
+++ b/tests/dartdevc_2/debugger/debugger_test.dart
@@ -354,6 +354,12 @@
}
});
}
- expect(actualStr == golden, isTrue);
+ // TODO(vsm): This comparison appears to be badly broken for several
+ // reasons:
+ // (1) The golden file isn't properly read on the bots or locally (see try
+ // / catch above).
+ // (2) The actual string appears to vary locally vs on the bots.
+ // (3) Because of (2), visualizing the diff is difficult.
+ // expect(actualStr == golden, isTrue);
});
}
diff --git a/tests/dartdevc_2/debugger/debugger_test_golden.txt b/tests/dartdevc_2/debugger/debugger_test_golden.txt
index 0b12aa0..80f211d 100644
--- a/tests/dartdevc_2/debugger/debugger_test_golden.txt
+++ b/tests/dartdevc_2/debugger/debugger_test_golden.txt
@@ -108,9 +108,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "asClass"
- }
+ "config": {}
}
]
]
@@ -227,9 +225,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "asClass"
- }
+ "config": {}
}
]
]
@@ -291,9 +287,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -319,9 +313,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -347,9 +339,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -375,9 +365,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -403,9 +391,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -431,9 +417,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -459,9 +443,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -487,9 +469,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -515,9 +495,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -543,9 +521,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -571,9 +547,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -599,9 +573,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -627,9 +599,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -655,9 +625,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -683,9 +651,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -711,9 +677,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -739,9 +703,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -767,9 +729,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -795,9 +755,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -823,9 +781,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -851,9 +807,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -879,9 +833,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -907,9 +859,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -935,9 +885,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -963,9 +911,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -991,9 +937,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -1019,9 +963,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -1047,9 +989,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -1075,9 +1015,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -1103,9 +1041,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -1131,9 +1067,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -1159,9 +1093,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -1187,9 +1119,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -1215,9 +1145,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -1243,9 +1171,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -1271,9 +1197,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -1299,9 +1223,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -1327,9 +1249,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -1355,9 +1275,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -1383,9 +1301,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -1411,9 +1327,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -1439,9 +1353,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -1467,9 +1379,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -1495,9 +1405,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -1523,9 +1431,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -1551,9 +1457,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -1579,9 +1483,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -1607,9 +1509,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -1635,9 +1535,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -1663,9 +1561,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -1691,9 +1587,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -1719,9 +1613,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -1747,9 +1639,33 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "_setLengthUnsafe: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
}
]
]
@@ -1775,9 +1691,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "asClass"
- }
+ "config": {}
}
]
]
@@ -1815,9 +1729,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -1836,9 +1748,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -1864,9 +1774,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "asClass"
- }
+ "config": {}
}
]
]
@@ -1928,9 +1836,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -1956,9 +1862,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -1984,9 +1888,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2012,9 +1914,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2040,9 +1940,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2068,9 +1966,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2096,9 +1992,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2124,9 +2018,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2152,9 +2044,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2180,9 +2070,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2208,9 +2096,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2236,9 +2122,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2264,9 +2148,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2292,9 +2174,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2320,9 +2200,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2348,9 +2226,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2376,9 +2252,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2404,9 +2278,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2432,9 +2304,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2460,9 +2330,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2488,9 +2356,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2516,9 +2382,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2544,9 +2408,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2572,9 +2434,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2600,9 +2460,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2628,9 +2486,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2656,9 +2512,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2684,9 +2538,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2712,9 +2564,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2740,9 +2590,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2768,9 +2616,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2796,9 +2642,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2824,9 +2668,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2852,9 +2694,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2880,9 +2720,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2908,9 +2746,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2936,9 +2772,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2964,9 +2798,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -2992,9 +2824,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -3020,9 +2850,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -3048,9 +2876,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -3076,9 +2902,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -3104,9 +2928,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -3132,9 +2954,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -3160,9 +2980,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -3188,9 +3006,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -3216,9 +3032,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -3244,9 +3058,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -3272,9 +3084,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -3300,9 +3110,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -3328,9 +3136,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -3356,9 +3162,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -3384,9 +3188,33 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "_setLengthUnsafe: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
}
]
]
@@ -3412,9 +3240,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "asClass"
- }
+ "config": {}
}
]
]
@@ -3531,9 +3357,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "asClass"
- }
+ "config": {}
}
]
]
@@ -3584,7 +3408,7 @@
{
"style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
},
- "elementAt: "
+ "fold: "
],
[
"span",
@@ -3595,9 +3419,33 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "map: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
}
]
]
@@ -3623,9 +3471,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "asClass"
- }
+ "config": {}
}
]
]
@@ -3742,9 +3588,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "asClass"
- }
+ "config": {}
}
]
]
@@ -3806,37 +3650,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
- }
- ]
- ]
- ],
- [
- "li",
- {
- "style": "padding-left: 13px;"
- },
- [
- "span",
- {
- "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
- },
- "addAll: "
- ],
- [
- "span",
- {
- "style": "margin-left: 13px"
- },
- [
- "object",
- {
- "object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -3862,9 +3676,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -3890,9 +3702,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -3918,9 +3728,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -3946,9 +3754,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -3974,9 +3780,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -4002,9 +3806,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "asClass"
- }
+ "config": {}
}
]
]
@@ -4049,9 +3851,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -4077,9 +3877,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -4105,9 +3903,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -4133,9 +3929,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "asClass"
- }
+ "config": {}
}
]
]
@@ -4180,9 +3974,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -4208,9 +4000,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -4236,9 +4026,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -4264,9 +4052,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "asClass"
- }
+ "config": {}
}
]
]
@@ -4317,34 +4103,6 @@
{
"style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
},
- "addAll: "
- ],
- [
- "span",
- {
- "style": "margin-left: 13px"
- },
- [
- "object",
- {
- "object": "<OBJECT>",
- "config": {
- "name": "none"
- }
- }
- ]
- ]
- ],
- [
- "li",
- {
- "style": "padding-left: 13px;"
- },
- [
- "span",
- {
- "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
- },
"clear: "
],
[
@@ -4356,37 +4114,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
- }
- ]
- ]
- ],
- [
- "li",
- {
- "style": "padding-left: 13px;"
- },
- [
- "span",
- {
- "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
- },
- "putIfAbsent: "
- ],
- [
- "span",
- {
- "style": "margin-left: 13px"
- },
- [
- "object",
- {
- "object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -4412,9 +4140,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -4440,9 +4166,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -4468,9 +4192,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -4496,9 +4218,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "asClass"
- }
+ "config": {}
}
]
]
@@ -4567,9 +4287,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "skipDart"
- }
+ "config": {}
}
]
]
@@ -4638,9 +4356,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "skipDart"
- }
+ "config": {}
}
]
]
@@ -4708,9 +4424,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -4736,9 +4450,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "asClass"
- }
+ "config": {}
}
]
]
@@ -4814,9 +4526,121 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": ""
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": ""
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": ""
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": ""
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": ""
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": ""
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
}
]
]
@@ -4861,9 +4685,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "asClass"
- }
+ "config": {}
}
]
]
@@ -4889,93 +4711,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "asClass"
- }
- }
- ]
- ]
- ],
- [
- "li",
- {
- "style": "padding-left: 13px;"
- },
- [
- "span",
- {
- "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
- },
- "devtoolsFormatters: "
- ],
- [
- "span",
- {
- "style": "margin-left: 13px"
- },
- [
- "object",
- {
- "object": "<OBJECT>",
- "config": {
- "name": "none"
- }
- }
- ]
- ]
- ],
- [
- "li",
- {
- "style": "padding-left: 13px;"
- },
- [
- "span",
- {
- "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
- },
- "replacer: "
- ],
- [
- "span",
- {
- "style": "margin-left: 13px"
- },
- [
- "object",
- {
- "object": "<OBJECT>",
- "config": {
- "name": "none"
- }
- }
- ]
- ]
- ],
- [
- "li",
- {
- "style": "padding-left: 13px;"
- },
- [
- "span",
- {
- "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
- },
- "format: "
- ],
- [
- "span",
- {
- "style": "margin-left: 13px"
- },
- [
- "object",
- {
- "object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -5001,9 +4737,59 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "asClass"
- }
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "replacer: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "format: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
}
]
]
@@ -5029,9 +4815,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -5057,9 +4841,2269 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "devtoolsFormatters: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ]
+]
+-----------------------------------
+Test: Test library Module child 1 formatting header
+Value:
+[
+ "span",
+ {
+ "style": "background-color: #d9edf7;color: black"
+ },
+ "<FILE>"
+]
+-----------------------------------
+Test: Test library Module child 1 formatting body
+Value:
+[
+ "ol",
+ {
+ "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+ },
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "JS: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "_Anonymous: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "anonymous: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ]
+]
+-----------------------------------
+Test: Test library Module child 2 formatting header
+Value:
+[
+ "span",
+ {
+ "style": "background-color: #d9edf7;color: black"
+ },
+ "<FILE>"
+]
+-----------------------------------
+Test: Test library Module child 2 formatting body
+Value:
+[
+ "ol",
+ {
+ "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+ }
+]
+-----------------------------------
+Test: Test library Module child 3 formatting header
+Value:
+[
+ "span",
+ {
+ "style": "background-color: #d9edf7;color: black"
+ },
+ "<FILE>"
+]
+-----------------------------------
+Test: Test library Module child 3 formatting body
+Value:
+[
+ "ol",
+ {
+ "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+ },
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "_Group: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "_Expectation: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "finishTests: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "group: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "test: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "setUp: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "tearDown: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "expect: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "fail: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "equals: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "notEquals: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "unorderedEquals: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "predicate: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "inInclusiveRange: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "greaterThan: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "same: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "closeTo: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "anyOf: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "_defaultAction: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "_groups: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "isFalse: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "isNotNull: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "isNull: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "isTrue: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "returnsNormally: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "throws: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "throwsArgumentError: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "throwsNoSuchMethodError: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "throwsRangeError: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "throwsStateError: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "throwsUnsupportedError: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ]
+]
+-----------------------------------
+Test: Test library Module child 4 formatting header
+Value:
+[
+ "span",
+ {
+ "style": "background-color: #d9edf7;color: black"
+ },
+ "<FILE>"
+]
+-----------------------------------
+Test: Test library Module child 4 formatting body
+Value:
+[
+ "ol",
+ {
+ "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+ },
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "Expect: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "ExpectException: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "_identical: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {},
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "isWeakMode: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ "true"
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {},
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "isStrongMode: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ "false"
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {},
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "typeAssertionsEnabled: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ "true"
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {},
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "assertStatementsEnabled: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ "true"
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {},
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "checkedModeEnabled: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ "true"
+ ]
+ ]
+ ]
+]
+-----------------------------------
+Test: Test library Module child 5 formatting header
+Value:
+[
+ "span",
+ {
+ "style": "background-color: #d9edf7;color: black"
+ },
+ "<FILE>"
+]
+-----------------------------------
+Test: Test library Module child 5 formatting body
+Value:
+[
+ "ol",
+ {
+ "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+ },
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "Immutable: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "Required: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "_AlwaysThrows: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "_Checked: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "_DoNotStore: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "_Experimental: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "_Factory: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "_Internal: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "_IsTest: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "_IsTestGroup: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "_Literal: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "_MustCallSuper: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "_NonVirtual: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "_OptionalTypeArgs: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "_Protected: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "_Sealed: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "_Virtual: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "_VisibleForOverriding: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "_VisibleForTesting: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "alwaysThrows: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "checked: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "doNotStore: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "experimental: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "factory: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "immutable: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "internal: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "isTest: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "isTestGroup: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "literal: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "mustCallSuper: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "nonVirtual: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "optionalTypeArgs: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "protected: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "required: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "sealed: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "virtual: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "visibleForOverriding: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "visibleForTesting: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ]
+]
+-----------------------------------
+Test: Test library Module child 6 formatting header
+Value:
+[
+ "span",
+ {
+ "style": "background-color: #d9edf7;color: black"
+ },
+ "<FILE>"
+]
+-----------------------------------
+Test: Test library Module child 6 formatting body
+Value:
+[
+ "ol",
+ {
+ "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+ },
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "Target: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "TargetKind: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
}
]
]
@@ -5443,9 +7487,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -5495,9 +7537,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -5547,9 +7587,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "asClass"
- }
+ "config": {}
}
]
]
@@ -5611,9 +7649,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -5639,9 +7675,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -5667,9 +7701,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -5695,9 +7727,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -5723,9 +7753,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "asClass"
- }
+ "config": {}
}
]
]
@@ -5756,6 +7784,240 @@
},
[
"span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "on: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "onAbort: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "onError: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "onLoad: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "onLoadEnd: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "onLoadStart: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "onProgress: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "onReadyStateChange: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "onTimeout: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
{},
[
"span",
@@ -5786,6 +8048,56 @@
{
"style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
},
+ "response: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ ""
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "responseHeaders: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {},
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
"responseText: "
],
[
@@ -5866,9 +8178,33 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
+ }
+ ]
+ ]
+ ],
+ [
+ "li",
+ {
+ "style": "padding-left: 13px;"
+ },
+ [
+ "span",
+ {
+ "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
+ },
+ "runtimeType: "
+ ],
+ [
+ "span",
+ {
+ "style": "margin-left: 13px"
+ },
+ [
+ "object",
+ {
+ "object": "<OBJECT>",
+ "config": {}
}
]
]
@@ -5966,9 +8302,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -6031,338 +8365,6 @@
{
"style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
},
- "on: "
- ],
- [
- "span",
- {
- "style": "margin-left: 13px"
- },
- [
- "object",
- {
- "object": "<OBJECT>",
- "config": {
- "name": "none"
- }
- }
- ]
- ]
- ],
- [
- "li",
- {
- "style": "padding-left: 13px;"
- },
- [
- "span",
- {
- "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
- },
- "onAbort: "
- ],
- [
- "span",
- {
- "style": "margin-left: 13px"
- },
- [
- "object",
- {
- "object": "<OBJECT>",
- "config": {
- "name": "none"
- }
- }
- ]
- ]
- ],
- [
- "li",
- {
- "style": "padding-left: 13px;"
- },
- [
- "span",
- {
- "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
- },
- "onError: "
- ],
- [
- "span",
- {
- "style": "margin-left: 13px"
- },
- [
- "object",
- {
- "object": "<OBJECT>",
- "config": {
- "name": "none"
- }
- }
- ]
- ]
- ],
- [
- "li",
- {
- "style": "padding-left: 13px;"
- },
- [
- "span",
- {
- "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
- },
- "onLoad: "
- ],
- [
- "span",
- {
- "style": "margin-left: 13px"
- },
- [
- "object",
- {
- "object": "<OBJECT>",
- "config": {
- "name": "none"
- }
- }
- ]
- ]
- ],
- [
- "li",
- {
- "style": "padding-left: 13px;"
- },
- [
- "span",
- {
- "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
- },
- "onLoadEnd: "
- ],
- [
- "span",
- {
- "style": "margin-left: 13px"
- },
- [
- "object",
- {
- "object": "<OBJECT>",
- "config": {
- "name": "none"
- }
- }
- ]
- ]
- ],
- [
- "li",
- {
- "style": "padding-left: 13px;"
- },
- [
- "span",
- {
- "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
- },
- "onLoadStart: "
- ],
- [
- "span",
- {
- "style": "margin-left: 13px"
- },
- [
- "object",
- {
- "object": "<OBJECT>",
- "config": {
- "name": "none"
- }
- }
- ]
- ]
- ],
- [
- "li",
- {
- "style": "padding-left: 13px;"
- },
- [
- "span",
- {
- "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
- },
- "onProgress: "
- ],
- [
- "span",
- {
- "style": "margin-left: 13px"
- },
- [
- "object",
- {
- "object": "<OBJECT>",
- "config": {
- "name": "none"
- }
- }
- ]
- ]
- ],
- [
- "li",
- {
- "style": "padding-left: 13px;"
- },
- [
- "span",
- {
- "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
- },
- "onReadyStateChange: "
- ],
- [
- "span",
- {
- "style": "margin-left: 13px"
- },
- [
- "object",
- {
- "object": "<OBJECT>",
- "config": {
- "name": "none"
- }
- }
- ]
- ]
- ],
- [
- "li",
- {
- "style": "padding-left: 13px;"
- },
- [
- "span",
- {
- "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
- },
- "onTimeout: "
- ],
- [
- "span",
- {
- "style": "margin-left: 13px"
- },
- [
- "object",
- {
- "object": "<OBJECT>",
- "config": {
- "name": "none"
- }
- }
- ]
- ]
- ],
- [
- "li",
- {
- "style": "padding-left: 13px;"
- },
- [
- "span",
- {},
- [
- "span",
- {
- "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
- },
- "response: "
- ],
- [
- "span",
- {
- "style": "margin-left: 13px"
- },
- ""
- ]
- ]
- ],
- [
- "li",
- {
- "style": "padding-left: 13px;"
- },
- [
- "span",
- {
- "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
- },
- "responseHeaders: "
- ],
- [
- "span",
- {
- "style": "margin-left: 13px"
- },
- [
- "object",
- {
- "object": "<OBJECT>",
- "config": {
- "name": "none"
- }
- }
- ]
- ]
- ],
- [
- "li",
- {
- "style": "padding-left: 13px;"
- },
- [
- "span",
- {
- "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
- },
- "runtimeType: "
- ],
- [
- "span",
- {
- "style": "margin-left: 13px"
- },
- [
- "object",
- {
- "object": "<OBJECT>",
- "config": {
- "name": "none"
- }
- }
- ]
- ]
- ],
- [
- "li",
- {
- "style": "padding-left: 13px;"
- },
- [
- "span",
- {
- "style": "background-color: thistle; color: rgb(136, 19, 145); margin-right: -13px"
- },
"[[class]]: "
],
[
@@ -6374,9 +8376,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "asClass"
- }
+ "config": {}
}
]
]
@@ -6438,9 +8438,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -6466,9 +8464,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -6494,9 +8490,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -6522,9 +8516,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -6550,9 +8542,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -6578,9 +8568,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -6606,9 +8594,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -6634,9 +8620,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "asClass"
- }
+ "config": {}
}
]
]
@@ -6705,9 +8689,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -6733,9 +8715,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "asClass"
- }
+ "config": {}
}
]
]
@@ -6797,9 +8777,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -6825,9 +8803,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -6853,9 +8829,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -6881,9 +8855,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "asClass"
- }
+ "config": {}
}
]
]
@@ -6928,9 +8900,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -6956,9 +8926,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -6984,9 +8952,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "asClass"
- }
+ "config": {}
}
]
]
@@ -7048,9 +9014,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -7076,9 +9040,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -7104,9 +9066,7 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "none"
- }
+ "config": {}
}
]
]
@@ -7132,12 +9092,10 @@
"object",
{
"object": "<OBJECT>",
- "config": {
- "name": "asClass"
- }
+ "config": {}
}
]
]
]
]
------------------------------------
+-----------------------------------
\ No newline at end of file
diff --git a/tests/lib/wasm/fn_import_exception_test.dart b/tests/lib/wasm/fn_import_exception_test.dart
index 73298d9..c97a68a 100644
--- a/tests/lib/wasm/fn_import_exception_test.dart
+++ b/tests/lib/wasm/fn_import_exception_test.dart
@@ -5,43 +5,44 @@
// Test throwing exceptions from an imported function.
import "package:expect/expect.dart";
-import "dart:wasm";
+import "package:wasm/wasm.dart";
import "dart:typed_data";
void main() {
- // int64_t fn(int64_t x) { return throwIfNegative(x); }
+ // void fn() {
+ // a();
+ // b();
+ // }
var data = Uint8List.fromList([
- 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x06, 0x01, 0x60,
- 0x01, 0x7e, 0x01, 0x7e, 0x02, 0x17, 0x01, 0x03, 0x65, 0x6e, 0x76, 0x0f,
- 0x74, 0x68, 0x72, 0x6f, 0x77, 0x49, 0x66, 0x4e, 0x65, 0x67, 0x61, 0x74,
- 0x69, 0x76, 0x65, 0x00, 0x00, 0x03, 0x02, 0x01, 0x00, 0x04, 0x05, 0x01,
- 0x70, 0x01, 0x01, 0x01, 0x05, 0x03, 0x01, 0x00, 0x02, 0x06, 0x08, 0x01,
- 0x7f, 0x01, 0x41, 0x80, 0x88, 0x04, 0x0b, 0x07, 0x0f, 0x02, 0x06, 0x6d,
- 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x02, 0x00, 0x02, 0x66, 0x6e, 0x00, 0x01,
- 0x0a, 0x0c, 0x01, 0x0a, 0x00, 0x20, 0x00, 0x10, 0x80, 0x80, 0x80, 0x80,
- 0x00, 0x0b,
+ 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0x60,
+ 0x00, 0x00, 0x02, 0x11, 0x02, 0x03, 0x65, 0x6e, 0x76, 0x01, 0x61, 0x00,
+ 0x00, 0x03, 0x65, 0x6e, 0x76, 0x01, 0x62, 0x00, 0x00, 0x03, 0x02, 0x01,
+ 0x00, 0x04, 0x05, 0x01, 0x70, 0x01, 0x01, 0x01, 0x05, 0x03, 0x01, 0x00,
+ 0x02, 0x06, 0x08, 0x01, 0x7f, 0x01, 0x41, 0x80, 0x88, 0x04, 0x0b, 0x07,
+ 0x0f, 0x02, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x02, 0x00, 0x02,
+ 0x66, 0x6e, 0x00, 0x02, 0x0a, 0x10, 0x01, 0x0e, 0x00, 0x10, 0x80, 0x80,
+ 0x80, 0x80, 0x00, 0x10, 0x81, 0x80, 0x80, 0x80, 0x00, 0x0b,
]);
- dynamic override = null;
- var inst = WasmModule(data).instantiate(WasmImports()
- ..addMemory("env", "memory", WasmMemory(256, 1024))
- ..addGlobal<Int32>("env", "__memory_base", 1024, false)
- ..addFunction<Int64 Function(Int64)>("env", "throwIfNegative", (int x) {
- if (x < 0) {
- throw Exception(x);
- }
- if (override != null) {
- return override;
- }
- return x;
- }));
- var fn = inst.lookupFunction<Int64 Function(Int64)>("fn");
+ bool called_b = false;
+ var thrownException = Exception("Hello exception!");
+ var inst = WasmModule(data).instantiate().addFunction("env", "a", () {
+ throw thrownException;
+ }).addFunction("env", "b", () {
+ called_b = true;
+ }).build();
+ var fn = inst.lookupFunction("fn");
+ Expect.throws(() => fn(), (Exception e) => e == thrownException);
+ Expect.isFalse(called_b);
- Expect.equals(123, fn.call([123]));
- Expect.throws(() => fn.call([-456]), (Exception e) => "$e".contains("-456"));
-
- override = "Not an integer";
- Expect.throwsArgumentError(() => fn.call([789]));
- override = 0.123;
- Expect.throwsArgumentError(() => fn.call([789]));
+ bool called_a = false;
+ inst = WasmModule(data).instantiate().addFunction("env", "a", () {
+ called_a = true;
+ }).addFunction("env", "b", () {
+ called_b = true;
+ }).build();
+ fn = inst.lookupFunction("fn");
+ fn();
+ Expect.isTrue(called_a);
+ Expect.isTrue(called_b);
}
diff --git a/tests/lib_2/wasm/fn_import_exception_test.dart b/tests/lib_2/wasm/fn_import_exception_test.dart
index 73298d9..c97a68a 100644
--- a/tests/lib_2/wasm/fn_import_exception_test.dart
+++ b/tests/lib_2/wasm/fn_import_exception_test.dart
@@ -5,43 +5,44 @@
// Test throwing exceptions from an imported function.
import "package:expect/expect.dart";
-import "dart:wasm";
+import "package:wasm/wasm.dart";
import "dart:typed_data";
void main() {
- // int64_t fn(int64_t x) { return throwIfNegative(x); }
+ // void fn() {
+ // a();
+ // b();
+ // }
var data = Uint8List.fromList([
- 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x06, 0x01, 0x60,
- 0x01, 0x7e, 0x01, 0x7e, 0x02, 0x17, 0x01, 0x03, 0x65, 0x6e, 0x76, 0x0f,
- 0x74, 0x68, 0x72, 0x6f, 0x77, 0x49, 0x66, 0x4e, 0x65, 0x67, 0x61, 0x74,
- 0x69, 0x76, 0x65, 0x00, 0x00, 0x03, 0x02, 0x01, 0x00, 0x04, 0x05, 0x01,
- 0x70, 0x01, 0x01, 0x01, 0x05, 0x03, 0x01, 0x00, 0x02, 0x06, 0x08, 0x01,
- 0x7f, 0x01, 0x41, 0x80, 0x88, 0x04, 0x0b, 0x07, 0x0f, 0x02, 0x06, 0x6d,
- 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x02, 0x00, 0x02, 0x66, 0x6e, 0x00, 0x01,
- 0x0a, 0x0c, 0x01, 0x0a, 0x00, 0x20, 0x00, 0x10, 0x80, 0x80, 0x80, 0x80,
- 0x00, 0x0b,
+ 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0x60,
+ 0x00, 0x00, 0x02, 0x11, 0x02, 0x03, 0x65, 0x6e, 0x76, 0x01, 0x61, 0x00,
+ 0x00, 0x03, 0x65, 0x6e, 0x76, 0x01, 0x62, 0x00, 0x00, 0x03, 0x02, 0x01,
+ 0x00, 0x04, 0x05, 0x01, 0x70, 0x01, 0x01, 0x01, 0x05, 0x03, 0x01, 0x00,
+ 0x02, 0x06, 0x08, 0x01, 0x7f, 0x01, 0x41, 0x80, 0x88, 0x04, 0x0b, 0x07,
+ 0x0f, 0x02, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x02, 0x00, 0x02,
+ 0x66, 0x6e, 0x00, 0x02, 0x0a, 0x10, 0x01, 0x0e, 0x00, 0x10, 0x80, 0x80,
+ 0x80, 0x80, 0x00, 0x10, 0x81, 0x80, 0x80, 0x80, 0x00, 0x0b,
]);
- dynamic override = null;
- var inst = WasmModule(data).instantiate(WasmImports()
- ..addMemory("env", "memory", WasmMemory(256, 1024))
- ..addGlobal<Int32>("env", "__memory_base", 1024, false)
- ..addFunction<Int64 Function(Int64)>("env", "throwIfNegative", (int x) {
- if (x < 0) {
- throw Exception(x);
- }
- if (override != null) {
- return override;
- }
- return x;
- }));
- var fn = inst.lookupFunction<Int64 Function(Int64)>("fn");
+ bool called_b = false;
+ var thrownException = Exception("Hello exception!");
+ var inst = WasmModule(data).instantiate().addFunction("env", "a", () {
+ throw thrownException;
+ }).addFunction("env", "b", () {
+ called_b = true;
+ }).build();
+ var fn = inst.lookupFunction("fn");
+ Expect.throws(() => fn(), (Exception e) => e == thrownException);
+ Expect.isFalse(called_b);
- Expect.equals(123, fn.call([123]));
- Expect.throws(() => fn.call([-456]), (Exception e) => "$e".contains("-456"));
-
- override = "Not an integer";
- Expect.throwsArgumentError(() => fn.call([789]));
- override = 0.123;
- Expect.throwsArgumentError(() => fn.call([789]));
+ bool called_a = false;
+ inst = WasmModule(data).instantiate().addFunction("env", "a", () {
+ called_a = true;
+ }).addFunction("env", "b", () {
+ called_b = true;
+ }).build();
+ fn = inst.lookupFunction("fn");
+ fn();
+ Expect.isTrue(called_a);
+ Expect.isTrue(called_b);
}
diff --git a/tools/VERSION b/tools/VERSION
index de6f628..f971f7f 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 12
PATCH 0
-PRERELEASE 13
+PRERELEASE 14
PRERELEASE_PATCH 0
\ No newline at end of file