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

Unified Diff: lib/dartdoc/frog/corejs.dart

Issue 10696191: Frog removed from dartdoc. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 5 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
Index: lib/dartdoc/frog/corejs.dart
diff --git a/lib/dartdoc/frog/corejs.dart b/lib/dartdoc/frog/corejs.dart
deleted file mode 100644
index a0cf8c1eee41a25c1cd12100b32a8a2360ea8bd2..0000000000000000000000000000000000000000
--- a/lib/dartdoc/frog/corejs.dart
+++ /dev/null
@@ -1,642 +0,0 @@
-// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
-// 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.
-
-/**
- * Generates JS helpers for dart:core. This used to be in a file "core.js".
- * Having them in Dart code means we can easily control which are generated.
- */
-// TODO(jmesserly): one idea to make this cleaner: put these as private "native"
-// methods somewhere in a library that we import. This would be rather elegant
-// because they'd get the right name collision behavior, conversions,
-// include-if-used, etc for free. Not sure if it's worth doing that.
-class CoreJs {
- // These values track if the helper is actually used. If it is we generate it.
- bool useThrow = false;
- bool useNotNullBool = false;
- bool useIndex = false;
- bool useSetIndex = false;
-
- bool useWrap0 = false;
- bool useWrap1 = false;
- bool useWrap2 = false;
- bool useIsolates = false;
-
- // These helpers had to switch to a new pattern, because they can be generated
- // after everything else.
- bool _generatedTypeNameOf = false;
- bool _generatedDynamicProto = false;
- bool _generatedDynamicSetMetadata = false;
- bool _generatedInherits = false;
- bool _generatedDefProp = false;
- bool _generatedBind = false;
-
-
- Map<String, String> _usedOperators;
-
- CodeWriter writer;
-
- CoreJs(): _usedOperators = {}, writer = new CodeWriter();
-
- void markCorelibTypeUsed(String typeName) {
- world.gen.markTypeUsed(world.corelib.types[typeName]);
- }
-
- _emit(String code) => writer.writeln(code);
-
- /**
- * Generates the special operator method, e.g. $add.
- * We want to do $add(x, y) instead of x.$add(y) so it doesn't box.
- * Same idea for the other methods.
- */
- void useOperator(String name) {
- if (_usedOperators[name] != null) return;
-
- if (name != ':ne' && name != ':eq') {
- // TODO(jimhug): Only do this once!
- markCorelibTypeUsed('NoSuchMethodException');
- }
- if (name != ':bit_not' && name != ':negate') {
- // TODO(jimhug): Only do this once!
- markCorelibTypeUsed('IllegalArgumentException');
- }
-
- var code;
- switch (name) {
- case ':ne':
- code = _NE_FUNCTION;
- break;
-
- case ':eq':
- ensureDefProp();
- code = _EQ_FUNCTION;
- break;
-
- case ':bit_not':
- code = _BIT_NOT_FUNCTION;
- break;
-
- case ':negate':
- code = _NEGATE_FUNCTION;
- break;
-
- case ':add':
- code = _ADD_FUNCTION;
- break;
-
- case ':truncdiv':
- useThrow = true;
- // TODO(jimhug): Only do this once!
- markCorelibTypeUsed('IntegerDivisionByZeroException');
- code = _TRUNCDIV_FUNCTION;
- break;
-
- case ':mod':
- code = _MOD_FUNCTION;
- break;
-
- default:
- // All of the other helpers are generated the same way
- var op = TokenKind.rawOperatorFromMethod(name);
- var jsname = world.toJsIdentifier(name);
- code = _otherOperator(jsname, op);
- break;
- }
-
- _usedOperators[name] = code;
- }
-
- // NOTE: some helpers can't be generated when we generate corelib,
- // because we don't discover that we need them until later.
- // Generate on-demand instead
- void ensureDynamicProto() {
- if (_generatedDynamicProto) return;
- _generatedDynamicProto = true;
- ensureTypeNameOf();
- ensureDefProp();
- _emit(_DYNAMIC_FUNCTION);
- }
-
- void ensureDynamicSetMetadata() {
- if (_generatedDynamicSetMetadata) return;
- _generatedDynamicSetMetadata = true;
- _emit(_DYNAMIC_SET_METADATA_FUNCTION);
- }
-
- void ensureTypeNameOf() {
- if (_generatedTypeNameOf) return;
- _generatedTypeNameOf = true;
- ensureDefProp();
- _emit(_TYPE_NAME_OF_FUNCTION);
- }
-
- /** Generates the $inherits function when it's first used. */
- void ensureInheritsHelper() {
- if (_generatedInherits) return;
- _generatedInherits = true;
- _emit(_INHERITS_FUNCTION);
- }
-
- /** Generates the $defProp function when it's first used. */
- void ensureDefProp() {
- if (_generatedDefProp) return;
- _generatedDefProp = true;
- _emit(_DEF_PROP_FUNCTION);
- }
-
- void ensureBind() {
- if (_generatedBind) return;
- _generatedBind = true;
- _emit(_BIND_CODE);
- }
-
- void generate(CodeWriter w) {
- // Write any stuff we had queued up, then replace our writer with a
- // subwriter into the one in WorldGenerator so anything we discover that we
- // need later on will be generated on-demand.
- w.write(writer.text);
- writer = w.subWriter();
-
- if (useNotNullBool) {
- useThrow = true;
- _emit(_NOTNULL_BOOL_FUNCTION);
- }
-
- if (useThrow) {
- _emit(_THROW_FUNCTION);
- }
-
- if (useIndex) {
- markCorelibTypeUsed('NoSuchMethodException');
- ensureDefProp();
- _emit(options.disableBoundsChecks ?
- _INDEX_OPERATORS : _CHECKED_INDEX_OPERATORS);
- }
-
- if (useSetIndex) {
- markCorelibTypeUsed('NoSuchMethodException');
- ensureDefProp();
- _emit(options.disableBoundsChecks ?
- _SETINDEX_OPERATORS : _CHECKED_SETINDEX_OPERATORS);
- }
-
- if (!useIsolates) {
- if (useWrap0) _emit(_EMPTY_WRAP_CALL0_FUNCTION);
- if (useWrap1) _emit(_EMPTY_WRAP_CALL1_FUNCTION);
- if (useWrap2) _emit(_EMPTY_WRAP_CALL2_FUNCTION);
- }
-
- // Write operator helpers
- for (var opImpl in orderValuesByKeys(_usedOperators)) {
- _emit(opImpl);
- }
-
- if (world.dom != null || world.html != null) {
- ensureTypeNameOf();
- ensureDefProp();
- // TODO(jmesserly): we need to find a way to avoid conflicts with other
- // generated "typeName" fields. Ideally we wouldn't be patching 'Object'
- // here.
- _emit('\$defProp(Object.prototype, "get\$typeName", '
- 'Object.prototype.\$typeNameOf);');
- }
- }
-}
-
-
-/** Snippet for `$ne`. */
-final String _NE_FUNCTION = @"""
-function $ne$(x, y) {
- if (x == null) return y != null;
- return (typeof(x) != 'object') ? x !== y : !x.$eq(y);
-}
-""";
-
-/** Snippet for `$eq`. */
-final String _EQ_FUNCTION = @"""
-function $eq$(x, y) {
- if (x == null) return y == null;
- return (typeof(x) != 'object') ? x === y : x.$eq(y);
-}
-// TODO(jimhug): Should this or should it not match equals?
-$defProp(Object.prototype, '$eq', function(other) {
- return this === other;
-});
-""";
-
-/** Snippet for `$bit_not`. */
-final String _BIT_NOT_FUNCTION = @"""
-function $bit_not$(x) {
- if (typeof(x) == 'number') return ~x;
- if (typeof(x) == 'object') return x.$bit_not();
- $throw(new NoSuchMethodException(x, "operator ~", []));
-}
-""";
-
-/** Snippet for `$negate`. */
-final String _NEGATE_FUNCTION = @"""
-function $negate$(x) {
- if (typeof(x) == 'number') return -x;
- if (typeof(x) == 'object') return x.$negate();
- $throw(new NoSuchMethodException(x, "operator negate", []));
-}
-""";
-
-/** Snippet for `$add`. This relies on JS's string "+" to match Dart's. */
-final String _ADD_FUNCTION = @"""
-function $add$complex$(x, y) {
- if (typeof(x) == 'number') {
- $throw(new IllegalArgumentException(y));
- } else if (typeof(x) == 'string') {
- var str = (y == null) ? 'null' : y.toString();
- if (typeof(str) != 'string') {
- throw new Error("calling toString() on right hand operand of operator " +
- "+ did not return a String");
- }
- return x + str;
- } else if (typeof(x) == 'object') {
- return x.$add(y);
- } else {
- $throw(new NoSuchMethodException(x, "operator +", [y]));
- }
-}
-
-function $add$(x, y) {
- if (typeof(x) == 'number' && typeof(y) == 'number') return x + y;
- return $add$complex$(x, y);
-}
-""";
-
-/** Snippet for `$truncdiv`. This uses `$throw`. */
-final String _TRUNCDIV_FUNCTION = @"""
-function $truncdiv$(x, y) {
- if (typeof(x) == 'number') {
- if (typeof(y) == 'number') {
- if (y == 0) $throw(new IntegerDivisionByZeroException());
- var tmp = x / y;
- return (tmp < 0) ? Math.ceil(tmp) : Math.floor(tmp);
- } else {
- $throw(new IllegalArgumentException(y));
- }
- } else if (typeof(x) == 'object') {
- return x.$truncdiv(y);
- } else {
- $throw(new NoSuchMethodException(x, "operator ~/", [y]));
- }
-}
-""";
-
-/** Snippet for `$mod`. */
-final String _MOD_FUNCTION = @"""
-function $mod$(x, y) {
- if (typeof(x) == 'number') {
- if (typeof(y) == 'number') {
- var result = x % y;
- if (result == 0) {
- return 0; // Make sure we don't return -0.0.
- } else if (result < 0) {
- if (y < 0) {
- return result - y;
- } else {
- return result + y;
- }
- }
- return result;
- } else {
- $throw(new IllegalArgumentException(y));
- }
- } else if (typeof(x) == 'object') {
- return x.$mod(y);
- } else {
- $throw(new NoSuchMethodException(x, "operator %", [y]));
- }
-}
-""";
-
-/** Code snippet for all other operators. */
-String _otherOperator(String jsname, String op) {
- return """
-function $jsname\$complex\$(x, y) {
- if (typeof(x) == 'number') {
- \$throw(new IllegalArgumentException(y));
- } else if (typeof(x) == 'object') {
- return x.$jsname(y);
- } else {
- \$throw(new NoSuchMethodException(x, "operator $op", [y]));
- }
-}
-function $jsname\$(x, y) {
- if (typeof(x) == 'number' && typeof(y) == 'number') return x $op y;
- return $jsname\$complex\$(x, y);
-}
-""";
-}
-
-/**
- * Snippet for `$dynamic`. Usage:
- * $dynamic(name).SomeTypeName = ... method ...;
- * $dynamic(name).Object = ... noSuchMethod ...;
- */
-final String _DYNAMIC_FUNCTION = @"""
-function $dynamic(name) {
- var f = Object.prototype[name];
- if (f && f.methods) return f.methods;
-
- var methods = {};
- if (f) methods.Object = f;
- function $dynamicBind() {
- // Find the target method
- var obj = this;
- var tag = obj.$typeNameOf();
- var method = methods[tag];
- if (!method) {
- var table = $dynamicMetadata;
- for (var i = 0; i < table.length; i++) {
- var entry = table[i];
- if (entry.map.hasOwnProperty(tag)) {
- method = methods[entry.tag];
- if (method) break;
- }
- }
- }
- method = method || methods.Object;
-
- var proto = Object.getPrototypeOf(obj);
-
- if (method == null) {
- // Trampoline to throw NoSuchMethodException (TODO: call noSuchMethod).
- method = function(){
- // Exact type check to prevent this code shadowing the dispatcher from a
- // subclass.
- if (Object.getPrototypeOf(this) === proto) {
- // TODO(sra): 'name' is the jsname, should be the Dart name.
- $throw(new NoSuchMethodException(
- obj, name, Array.prototype.slice.call(arguments)));
- }
- return Object.prototype[name].apply(this, arguments);
- };
- }
-
- if (!proto.hasOwnProperty(name)) {
- $defProp(proto, name, method);
- }
-
- return method.apply(this, Array.prototype.slice.call(arguments));
- };
- $dynamicBind.methods = methods;
- $defProp(Object.prototype, name, $dynamicBind);
- return methods;
-}
-if (typeof $dynamicMetadata == 'undefined') $dynamicMetadata = [];
-""";
-
-/**
- * Snippet for `$dynamicSetMetadata`.
- */
-final String _DYNAMIC_SET_METADATA_FUNCTION = @"""
-function $dynamicSetMetadata(inputTable) {
- // TODO: Deal with light isolates.
- var table = [];
- for (var i = 0; i < inputTable.length; i++) {
- var tag = inputTable[i][0];
- var tags = inputTable[i][1];
- var map = {};
- var tagNames = tags.split('|');
- for (var j = 0; j < tagNames.length; j++) {
- map[tagNames[j]] = true;
- }
- table.push({tag: tag, tags: tags, map: map});
- }
- $dynamicMetadata = table;
-}
-""";
-
-/** Snippet for `$typeNameOf`. */
-final String _TYPE_NAME_OF_FUNCTION = @"""
-$defProp(Object.prototype, '$typeNameOf', (function() {
- function constructorNameWithFallback(obj) {
- var constructor = obj.constructor;
- if (typeof(constructor) == 'function') {
- // The constructor isn't null or undefined at this point. Try
- // to grab hold of its name.
- var name = constructor.name;
- // If the name is a non-empty string, we use that as the type
- // name of this object. On Firefox, we often get 'Object' as
- // the constructor name even for more specialized objects so
- // we have to fall through to the toString() based implementation
- // below in that case.
- if (typeof(name) == 'string' && name && name != 'Object') return name;
- }
- var string = Object.prototype.toString.call(obj);
- return string.substring(8, string.length - 1);
- }
-
- function chrome$typeNameOf() {
- var name = this.constructor.name;
- if (name == 'Window') return 'DOMWindow';
- if (name == 'CanvasPixelArray') return 'Uint8ClampedArray';
- return name;
- }
-
- function firefox$typeNameOf() {
- var name = constructorNameWithFallback(this);
- if (name == 'Window') return 'DOMWindow';
- if (name == 'Document') return 'HTMLDocument';
- if (name == 'XMLDocument') return 'Document';
- if (name == 'WorkerMessageEvent') return 'MessageEvent';
- return name;
- }
-
- function ie$typeNameOf() {
- var name = constructorNameWithFallback(this);
- if (name == 'Window') return 'DOMWindow';
- // IE calls both HTML and XML documents 'Document', so we check for the
- // xmlVersion property, which is the empty string on HTML documents.
- if (name == 'Document' && this.xmlVersion) return 'Document';
- if (name == 'Document') return 'HTMLDocument';
- if (name == 'HTMLTableDataCellElement') return 'HTMLTableCellElement';
- if (name == 'HTMLTableHeaderCellElement') return 'HTMLTableCellElement';
- if (name == 'MSStyleCSSProperties') return 'CSSStyleDeclaration';
- if (name == 'CanvasPixelArray') return 'Uint8ClampedArray';
- if (name == 'HTMLPhraseElement') return 'HTMLElement';
- if (name == 'MouseWheelEvent') return 'WheelEvent';
- return name;
- }
-
- // If we're not in the browser, we're almost certainly running on v8.
- if (typeof(navigator) != 'object') return chrome$typeNameOf;
-
- var userAgent = navigator.userAgent;
- if (/Chrome|DumpRenderTree/.test(userAgent)) return chrome$typeNameOf;
- if (/Firefox/.test(userAgent)) return firefox$typeNameOf;
- if (/MSIE/.test(userAgent)) return ie$typeNameOf;
- return function() { return constructorNameWithFallback(this); };
-})());
-""";
-
-/** Snippet for `$inherits`. */
-final String _INHERITS_FUNCTION = @"""
-/** Implements extends for Dart classes on JavaScript prototypes. */
-function $inherits(child, parent) {
- if (child.prototype.__proto__) {
- child.prototype.__proto__ = parent.prototype;
- } else {
- function tmp() {};
- tmp.prototype = parent.prototype;
- child.prototype = new tmp();
- child.prototype.constructor = child;
- }
-}
-""";
-
-/** Snippet for `$defProp`. */
-final String _DEF_PROP_FUNCTION = @"""
-function $defProp(obj, prop, value) {
- Object.defineProperty(obj, prop,
- {value: value, enumerable: false, writable: true, configurable: true});
-}
-""";
-
-/** Snippet for `$stackTraceOf`. */
-final String _STACKTRACEOF_FUNCTION = @"""
-function $stackTraceOf(e) {
- // TODO(jmesserly): we shouldn't be relying on the e.stack property.
- // Need to mangle it.
- return (e && e.stack) ? e.stack : null;
-}
-""";
-
-/**
- * Snippet for `$notnull_bool`. This pattern chosen because IE9 does really
- * badly with typeof, and it's still decent on other browsers.
- */
-final String _NOTNULL_BOOL_FUNCTION = @"""
-function $notnull_bool(test) {
- if (test === true || test === false) return test;
- $throw(new TypeError(test, 'bool'));
-}
-""";
-
-/** Snippet for `$throw`. */
-final String _THROW_FUNCTION = @"""
-function $throw(e) {
- // If e is not a value, we can use V8's captureStackTrace utility method.
- // TODO(jmesserly): capture the stack trace on other JS engines.
- if (e && (typeof e == 'object') && Error.captureStackTrace) {
- // TODO(jmesserly): this will clobber the e.stack property
- Error.captureStackTrace(e, $throw);
- }
- throw e;
-}
-""";
-
-/**
- * Snippet for `$index` in Object, Array, and String. If not overridden,
- * `$index` and `$setindex` fall back to JS [] and []= accessors.
- */
-// TODO(jimhug): This fallback could be very confusing in a few cases -
-// because of the bizare default [] rules in JS. We need to revisit this
-// to get the right errors - at least in checked mode (once we have that).
-// TODO(jmesserly): do perf analysis, figure out if this is worth it and
-// what the cost of $index $setindex is on all browsers
-
-// Performance of Object.prototype methods can go down because there are
-// so many of them. Instead, first time we hit it, put it on the derived
-// prototype. TODO(jmesserly): make this go away by handling index more
-// like a normal method.
-final String _INDEX_OPERATORS = @"""
-$defProp(Object.prototype, '$index', function(i) {
- $throw(new NoSuchMethodException(this, "operator []", [i]));
-});
-$defProp(Array.prototype, '$index', function(i) {
- return this[i];
-});
-$defProp(String.prototype, '$index', function(i) {
- return this[i];
-});
-""";
-
-final String _CHECKED_INDEX_OPERATORS = @"""
-$defProp(Object.prototype, '$index', function(i) {
- $throw(new NoSuchMethodException(this, "operator []", [i]));
-});
-$defProp(Array.prototype, '$index', function(index) {
- var i = index | 0;
- if (i !== index) {
- throw new IllegalArgumentException('index is not int');
- } else if (i < 0 || i >= this.length) {
- throw new IndexOutOfRangeException(index);
- }
- return this[i];
-});
-$defProp(String.prototype, '$index', function(i) {
- return this[i];
-});
-""";
-
-
-
-/** Snippet for `$setindex` in Object, Array, and String. */
-final String _SETINDEX_OPERATORS = @"""
-$defProp(Object.prototype, '$setindex', function(i, value) {
- $throw(new NoSuchMethodException(this, "operator []=", [i, value]));
-});
-$defProp(Array.prototype, '$setindex',
- function(i, value) { return this[i] = value; });""";
-
-final String _CHECKED_SETINDEX_OPERATORS = @"""
-$defProp(Object.prototype, '$setindex', function(i, value) {
- $throw(new NoSuchMethodException(this, "operator []=", [i, value]));
-});
-$defProp(Array.prototype, '$setindex', function(index, value) {
- var i = index | 0;
- if (i !== index) {
- throw new IllegalArgumentException('index is not int');
- } else if (i < 0 || i >= this.length) {
- throw new IndexOutOfRangeException(index);
- }
- return this[i] = value;
-});
-""";
-
-/** Snippet for `$wrap_call$0`, in case it was not necessary. */
-final String _EMPTY_WRAP_CALL0_FUNCTION = @"""
-function $wrap_call$0(fn) { return fn; }
-""";
-
-/** Snippet for `$wrap_call$1`, in case it was not necessary. */
-final String _EMPTY_WRAP_CALL1_FUNCTION = @"""
-function $wrap_call$1(fn) { return fn; };
-""";
-
-/** Snippet for `$wrap_call$2`, in case it was not necessary. */
-final String _EMPTY_WRAP_CALL2_FUNCTION = @"""
-function $wrap_call$2(fn) { return fn; };
-""";
-
-/** Snippet that initializes Function.prototype.bind. */
-final String _BIND_CODE = @"""
-Function.prototype.bind = Function.prototype.bind ||
- function(thisObj) {
- var func = this;
- var funcLength = func.$length || func.length;
- var argsLength = arguments.length;
- if (argsLength > 1) {
- var boundArgs = Array.prototype.slice.call(arguments, 1);
- var bound = function() {
- // Prepend the bound arguments to the current arguments.
- var newArgs = Array.prototype.slice.call(arguments);
- Array.prototype.unshift.apply(newArgs, boundArgs);
- return func.apply(thisObj, newArgs);
- };
- bound.$length = Math.max(0, funcLength - (argsLength - 1));
- return bound;
- } else {
- var bound = function() {
- return func.apply(thisObj, arguments);
- };
- bound.$length = funcLength;
- return bound;
- }
- };
-""";

Powered by Google App Engine
This is Rietveld 408576698