Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(219)

Unified Diff: sdk/lib/_internal/js_runtime/lib/js_helper.dart

Issue 2711783006: Remove HRuntimeType scheme for function types. (Closed)
Patch Set: fix mock library Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/compiler/lib/src/ssa/type_builder.dart ('k') | sdk/lib/_internal/js_runtime/lib/js_rti.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sdk/lib/_internal/js_runtime/lib/js_helper.dart
diff --git a/sdk/lib/_internal/js_runtime/lib/js_helper.dart b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
index 86e80d81b6ddbed5229a0da8d4540ac24cdd27c3..96c200c557d4bedf9c97892d8c7cd14128e689cc 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
@@ -3361,6 +3361,51 @@ voidTypeCheck(value) {
throw new TypeErrorImplementation(value, 'void');
}
+functionTypeTest(value, functionTypeRti) {
+ if (value == null) return false;
+ var functionTypeObject = extractFunctionTypeObjectFrom(value);
+ return functionTypeObject == null
+ ? false
+ : isFunctionSubtype(functionTypeObject, functionTypeRti);
+}
+
+// Declared as 'var' to avoid assignment checks.
+var _inTypeAssertion = false;
+
+functionTypeCheck(value, functionTypeRti) {
+ if (value == null) return value;
+
+ // The function type test code contains type assertions for function
+ // types. This leads to unbounded recursion, so disable the type checking of
+ // function types while checking function types.
+
+ if (true == _inTypeAssertion) return value;
+
+ _inTypeAssertion = true;
+ try {
+ if (functionTypeTest(value, functionTypeRti)) return value;
+ var self = runtimeTypeToString(functionTypeRti);
+ throw new TypeErrorImplementation(value, self);
+ } finally {
+ _inTypeAssertion = false;
+ }
+}
+
+functionTypeCast(value, functionTypeRti) {
+ if (value == null) return value;
+ if (functionTypeTest(value, functionTypeRti)) return value;
+
+ var self = runtimeTypeToString(functionTypeRti);
+ var functionTypeObject = extractFunctionTypeObjectFrom(value);
+ var pretty;
+ if (functionTypeObject != null) {
+ pretty = runtimeTypeToString(functionTypeObject);
+ } else {
+ pretty = Primitives.objectTypeName(value);
+ }
+ throw new CastErrorImplementation(pretty, self);
+}
+
checkMalformedType(value, message) {
if (value == null) return value;
throw new TypeErrorImplementation.fromMessage(message);
@@ -3495,18 +3540,19 @@ abstract class RuntimeType {
toRti();
}
+
class RuntimeFunctionType extends RuntimeType {
final RuntimeType returnType;
final List<RuntimeType> parameterTypes;
final List<RuntimeType> optionalParameterTypes;
final namedParameters;
- static var /* bool */ inAssert = false;
-
RuntimeFunctionType(this.returnType,
this.parameterTypes,
this.optionalParameterTypes,
- this.namedParameters);
+ this.namedParameters) {
+ throw 123;
+ }
bool get isVoid => returnType is VoidRuntimeType;
@@ -3514,48 +3560,28 @@ class RuntimeFunctionType extends RuntimeType {
/// returns true if [this] is a supertype of [expression].
@NoInline() @NoSideEffects()
bool _isTest(expression) {
- var functionTypeObject = extractFunctionTypeObjectFrom(expression);
- return functionTypeObject == null
- ? false
- : isFunctionSubtype(functionTypeObject, toRti());
+ throw 123;
Emily Fortuna 2017/02/28 16:37:44 maybe just add a comment here to explain that thes
+ return functionTypeTest(expression, toRti());
}
@NoInline() @NoSideEffects()
_asCheck(expression) {
+ throw 123;
// Type inferrer doesn't think this is called with dynamic arguments.
return _check(JS('', '#', expression), true);
}
@NoInline() @NoSideEffects()
_assertCheck(expression) {
- if (inAssert) return null;
- inAssert = true; // Don't try to check this library itself.
- try {
- // Type inferrer don't think this is called with dynamic arguments.
- return _check(JS('', '#', expression), false);
- } finally {
- inAssert = false;
- }
+ throw 123;
+ // Type inferrer don't think this is called with dynamic arguments.
+ return _check(JS('', '#', expression), false);
}
_check(expression, bool isCast) {
- if (expression == null) return null;
- if (_isTest(expression)) return expression;
-
- var self = runtimeTypeToString(toRti());
- if (isCast) {
- var functionTypeObject = extractFunctionTypeObjectFrom(expression);
- var pretty;
- if (functionTypeObject != null) {
- pretty = runtimeTypeToString(functionTypeObject);
- } else {
- pretty = Primitives.objectTypeName(expression);
- }
- throw new CastErrorImplementation(pretty, self);
- } else {
- // TODO(ahe): Pass "pretty" function-type to TypeErrorImplementation?
- throw new TypeErrorImplementation(expression, self);
- }
+ return isCast
+ ? functionTypeCast(expression, toRti())
+ : functionTypeCheck(expression, toRti());
}
toRti() {
« no previous file with comments | « pkg/compiler/lib/src/ssa/type_builder.dart ('k') | sdk/lib/_internal/js_runtime/lib/js_rti.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698