Index: Source/bindings/dart/DartDebugHooks.js |
diff --git a/Source/bindings/dart/DartDebugHooks.js b/Source/bindings/dart/DartDebugHooks.js |
index 5dd0ef5f03b0da7240b9c68ac6602b2134ffb257..f964c48d1c2683fdfdc2ab7e3aab95078b2396a5 100644 |
--- a/Source/bindings/dart/DartDebugHooks.js |
+++ b/Source/bindings/dart/DartDebugHooks.js |
@@ -32,16 +32,6 @@ |
var DartDebug = {}; |
-function invokeDartCode(mirrorAPIFunction, proxy, memberName, args) |
-{ |
- var unwrappedArgs = []; |
- for (var i = 0; i < args.length; ++i) |
- unwrappedArgs.push(DartDebug.unwrapValue(args[i])); |
- var result = DartDebug.nativeCallbacks.invocationTrampoline( |
- mirrorAPIFunction, [proxy, memberName, unwrappedArgs]); |
- return DartDebug.wrapValue(result); |
-} |
- |
DartDebug.ExecutionState = function(callFrames) |
{ |
this._callFrames = []; |
@@ -118,22 +108,8 @@ DartDebug.FrameMirror = function(callFrame) |
this._functionName = callFrame.functionName; |
this._scriptId = DartDebug.scriptURLToScriptId[callFrame.scriptURL]; |
this._lineNumber = callFrame.lineNumber; |
- |
- var localScopeObject = {} |
- localScopeObject.__proto__ = null; |
- |
- for (var i = 0; i < callFrame.localVariables.length; i += 2) { |
- var name = callFrame.localVariables[i]; |
- var value = callFrame.localVariables[i + 1]; |
- var suffixIndex = name.indexOf('@'); |
- if (suffixIndex != -1) |
- name = name.substr(0, suffixIndex); |
- localScopeObject[name] = value; |
- } |
- this._localScope = new DartDebug.ScopeMirror(localScopeObject, ScopeType.Local); |
- |
- var libraryScopeObject = DartDebug.buildLibraryScopeObject(callFrame.libraryProxy); |
- this._globalScope = new DartDebug.ScopeMirror(libraryScopeObject, ScopeType.Global); |
+ this._localScope = new DartDebug.ScopeMirror(callFrame.localScopeProxy, ScopeType.Local); |
+ this._globalScope = new DartDebug.ScopeMirror(callFrame.libraryProxy, ScopeType.Global); |
this._scopes = [this._localScope, this._globalScope]; |
}; |
@@ -169,17 +145,6 @@ DartDebug.FrameMirror.prototype = { |
// FIXME: Dart VM doesn't currently support evaluations. Use |
// JavaScript eval and 'with' statement to emulate evaluation on Dart |
// call frame. |
- var propertyMap = {}; |
- var scopes = [this._globalScope, this._localScope]; |
- for (var i = 0; i < scopes.length; ++i) { |
- var scopeObject = scopes[i]._object; |
- var propertyNames = Object.getOwnPropertyNames(scopeObject); |
- for (var j = 0; j < propertyNames.length; ++j) { |
- var name = propertyNames[j]; |
- if (name !== 'this') |
- propertyMap[name] = scopeObject[name]; |
- } |
- } |
// FIXME: dartbug.com/10434 find a less fragile way to determine whether |
// we need to strip off console API support added by InjectedScript. |
@@ -189,7 +154,9 @@ DartDebug.FrameMirror.prototype = { |
expression = expression.substr(expression.indexOf('\n') + 1); |
expression = expression.substr(0, expression.lastIndexOf('\n')); |
} |
- var result = DartDebug.nativeCallbacks.evaluateInScope(expression, this._localScope.receiver(), propertyMap); |
+ |
+ var result = DartDebug.nativeCallbacks.evaluateInScope(expression, this._localScope.receiver(), |
+ this._globalScope._object, this._localScope._object); |
return { value: function() { return result; } }; |
}, |
@@ -275,7 +242,7 @@ DartDebug.unregisterIsolate = function(isolateHandle) |
// The page was destroyed. |
DartDebug.scripts = {}; |
DartDebug.scriptURLToScriptId = {}; |
- |
+ DartDebug.libraryScopeCache = {}; |
DartDebug.breakpoints = {}; |
}; |
@@ -328,311 +295,6 @@ DartDebug.updateExceptionPauseInfo = function() |
DartDebug.nativeCallbacks.setExceptionPauseInfo(isolateHandle, Debug.isBreakOnException(), Debug.isBreakOnUncaughtException()); |
} |
-DartDebug.wrapValue = function(value) |
-{ |
- if (!value || !value.isProxy) |
- return value; |
- var wrapper = DartDebug.mirrorAPI.isList(value) ? DartDebug.wrapList(value) : DartDebug.wrapObject(value); |
- DartDebug.nativeCallbacks.setHiddenValue(wrapper, 'proxy', value); |
- return wrapper; |
-} |
- |
-DartDebug.unwrapValue = function(value) |
-{ |
- var proxy = DartDebug.nativeCallbacks.getHiddenValue(value, 'proxy'); |
- return proxy || value; |
-} |
- |
-DartDebug.wrapList = function(arrayProxy) |
-{ |
- function getter(index) |
- { |
- return DartDebug.wrapValue(DartDebug.mirrorAPI.listGetAt(arrayProxy, index)); |
- } |
- |
- function setter(index, value) |
- { |
- DartDebug.mirrorAPI.listSetAt(arrayProxy, index, value); |
- } |
- |
- function enumerator() |
- { |
- var indices = []; |
- var length = DartDebug.mirrorAPI.getField(arrayProxy, 'length'); |
- for (var i = 0; i < length; ++i) |
- indices.push(i); |
- return indices; |
- } |
- |
- var array = DartDebug.nativeCallbacks.createArrayWithIndexedPropertyHandler(getter, setter, enumerator); |
- array.length = DartDebug.mirrorAPI.getField(arrayProxy, 'length'); |
- return array; |
-} |
- |
-DartDebug.installProxyFieldsAndFunctions = function(proxy, getContainer, getContainerProxy, |
- filter, isLibrary, isClassDefinition) |
-{ |
- |
- function shouldInstallProperty(container, name) |
- { |
- if (!container || name in container) |
- return false; |
- return filter ? filter(name) : true; |
- } |
- |
- function setAccessor(name, descriptor, hasGetter, hasSetter) |
- { |
- var container = getContainer(descriptor.isStatic); |
- if (!shouldInstallProperty(container, name)) |
- return; |
- var containerProxy = getContainerProxy(descriptor.isStatic); |
- var getter; |
- if (hasGetter) { |
- getter = function() |
- { |
- return invokeDartCode(DartDebug.mirrorAPI.getField, containerProxy, name, []); |
- }; |
- } |
- var setter; |
- if (hasSetter) { |
- setter = function(value) |
- { |
- return invokeDartCode(DartDebug.mirrorAPI.setField, containerProxy, name, [value]); |
- }; |
- } |
- DartDebug.nativeCallbacks.setAccessor(container, name, getter, setter); |
- } |
- |
- function setFunction(name, descriptor) |
- { |
- var container = getContainer(descriptor.isStatic); |
- if (!shouldInstallProperty(container, name)) |
- return; |
- var containerProxy = getContainerProxy(descriptor.isStatic); |
- function invoke() |
- { |
- if (arguments.length < descriptor.fixedParameterCount || |
- arguments.length > descriptor.fixedParameterCount + descriptor.optionalParamerterCount) |
- throw "NoSuchMethodException: incorrect number of arguments passed to function named '" + name + "'"; |
- return invokeDartCode(DartDebug.mirrorAPI.invoke, containerProxy, name, arguments); |
- } |
- Object.defineProperty(container, name, { value: invoke }); |
- } |
- |
- function setNamedConstructor(name, descriptor) |
- { |
- var container = getContainer(true); |
- var indexFirstDot = name.indexOf("."); |
- // Not a named constructor. |
- if (indexFirstDot == -1) |
- return; |
- |
- var nameWithoutDot = name.substr(indexFirstDot + 1); |
- if (!shouldInstallProperty(container, nameWithoutDot)) |
- return; |
- var containerProxy = getContainerProxy(descriptor.isStatic); |
- function invoke() |
- { |
- // FIXME: display the actual number of arguments and allowed range of number of arguments. |
- if (arguments.length < descriptor.fixedParameterCount || |
- arguments.length > descriptor.fixedParameterCount + descriptor.optionalParamerterCount) |
- throw "NoSuchMethodException: incorrect number of arguments passed to constructor '" + nameWithoutDot + "'"; |
- return invokeDartCode(DartDebug.mirrorAPI.dartNew, containerProxy, nameWithoutDot, arguments); |
- } |
- Object.defineProperty(container, nameWithoutDot, { value: invoke }); |
- } |
- |
- function setClass(name, descriptor) |
- { |
- var container = getContainer(true); |
- if (!shouldInstallProperty(container, name)) |
- return; |
- var classProxy = DartDebug.createClassProxy(null, descriptor, name, proxy); |
- Object.defineProperty(container, name, { value: classProxy }); |
- } |
- |
- var variableNames = DartDebug.mirrorAPI.getVariableNames(proxy); |
- for (var i = 0; i < variableNames.length; ++i) { |
- var variableName = variableNames[i]; |
- var variable = DartDebug.mirrorAPI.lookupVariable(proxy, variableName); |
- if (isClassDefinition && !variable.isStatic) continue; |
- setAccessor(variableName, variable, true, !variable.isFinal); |
- } |
- |
- var functionNames = DartDebug.mirrorAPI.getFunctionNames(proxy); |
- |
- var accessors = {}; |
- for (var i = 0; i < functionNames.length; ++i) { |
- var functionName = functionNames[i]; |
- var func = DartDebug.mirrorAPI.lookupFunction(proxy, functionName); |
- if (isClassDefinition && !func.isStatic && !func.isConstructor) |
- continue; |
- |
- if (func.isAbstract) |
- continue; |
- |
- if (func.isGetter) { |
- if (!accessors[functionName]) |
- accessors[functionName] = {}; |
- accessors[functionName].getter = func; |
- } else if (func.isSetter) { |
- // Remove trailing '='. |
- functionName = functionName.substr(0, functionName.length - 1); |
- if (!accessors[functionName]) |
- accessors[functionName] = {}; |
- accessors[functionName].setter = func; |
- } else if (!func.isConstructor) { |
- setFunction(functionName, func); |
- } else if (isClassDefinition && func.isConstructor){ |
- setNamedConstructor(functionName, func); |
- } |
- } |
- |
- if (isLibrary && !isClassDefinition) { |
- var classNames = DartDebug.mirrorAPI.getClassNames(proxy); |
- for (var i = 0; i < classNames.length; ++i) { |
- var className = classNames[i]; |
- var clazz = DartDebug.mirrorAPI.lookupClass(proxy, className); |
- setClass(className, clazz); |
- } |
- } |
- |
- for (var functionName in accessors) { |
- var accessor = accessors[functionName]; |
- var func = accessor.getter || accessor.setter; |
- setAccessor(functionName, func, !!accessor.getter, !!accessor.setter); |
- } |
-} |
- |
-DartDebug.wrapObject = function(objectProxy) |
-{ |
- var classProxy = DartDebug.mirrorAPI.instanceGetClass(objectProxy); |
- var className = DartDebug.mirrorAPI.className(classProxy); |
- return DartDebug.createClassProxy(objectProxy, classProxy, className); |
-} |
- |
-DartDebug.createClassProxy = function(objectProxy, classProxy, className, opt_libraryProxy) |
-{ |
- // Create a fake constructor to set wrapper's class name. |
- var object; |
- if (objectProxy) { |
- // This is a class instance not a class definition object. |
- try { |
- fakeConstructor = eval('(function ' + className + '() {})'); |
- object = new fakeConstructor(); |
- } catch(e) { |
- object = {}; |
- } |
- object.__proto__ = null; |
- } else { |
- // This is a class definition object. |
- // We need to wire up a default constructor if one exists. |
- // TODO(jacobr): there is some duplicated code here and for the named constructor case. |
- var myConstructor = null; |
- var functionNames = DartDebug.mirrorAPI.getFunctionNames(classProxy); |
- for (var i = 0; i < functionNames.length; ++i) { |
- var functionName = functionNames[i]; |
- if (functionName != className) |
- continue; |
- |
- var func = DartDebug.mirrorAPI.lookupFunction(classProxy, functionName); |
- |
- if (func.isConstructor) { |
- myConstructor = func; |
- break; |
- } |
- } |
- |
- var constructorStatement; |
- if (myConstructor != null) { |
- // FIXME: reduce duplicate code handling constructor invocation. |
- constructorStatement = '(function(invokeDartCode, DartDebug, classProxy, myConstructor) {' + |
- 'return (function ' + className + '() {' + |
- 'if (arguments.length < myConstructor.fixedParameterCount || ' + |
- 'arguments.length > (myConstructor.fixedParameterCount + myConstructor.optionalParamerterCount)) ' + |
- 'throw "NoSuchMethodException: incorrect number of arguments passed to default constructor";' + |
- 'return invokeDartCode(DartDebug.mirrorAPI.dartNew, classProxy, "", arguments);' + |
- '})})'; |
- } else { |
- // FIXME: throw a better error message. |
- constructorStatement = '(function() { return (function ' + className + '() { throw "' + className + ' does not have a constructor"})})'; |
- } |
- try { |
- // FIXME: avoid using eval. |
- object = (eval(constructorStatement))(invokeDartCode, DartDebug, classProxy, myConstructor); |
- } catch(e) { |
- object = {}; |
- object['@ERROR'] = e; |
- object['@SOURCE'] = constructorStatement; |
- object.__proto__ = null; |
- } |
- object.toString = function() { return className + " [Dart Class]"; }; |
- } |
- |
- var classInfo = {}; |
- classInfo.__proto__ = null; |
- classInfo['class'] = className; |
- var libraryProxy = opt_libraryProxy || DartDebug.mirrorAPI.classGetLibrary(classProxy); |
- classInfo['library'] = DartDebug.mirrorAPI.libraryUrl(libraryProxy); |
- Object.defineProperty(object, '@classInfo', { value: classInfo }); |
- |
- var staticFields = objectProxy != null ? {} : object; |
- staticFields.__proto__ = null; |
- |
- function getContainer(isStatic) { return isStatic ? staticFields : object; } |
- function getContainerProxy(isStatic) { return isStatic ? classProxy : objectProxy || classProxy; } |
- |
- while (classProxy) { |
- DartDebug.installProxyFieldsAndFunctions( |
- classProxy, getContainer, getContainerProxy, null, false, !objectProxy); |
- if (!objectProxy) |
- break; // Static methods from parent classes should not be wired up to subclasses. |
- classProxy = DartDebug.mirrorAPI.getSuperclass(classProxy); |
- } |
- |
- if (objectProxy != null) { |
- Object.defineProperty(object, '@staticFields', { value: staticFields }); |
- } |
- |
- return object; |
-} |
- |
-DartDebug.buildLibraryScopeObject = function(libraryProxy) |
-{ |
- var libraryScopeObject = {}; |
- libraryScopeObject.__proto__ = null; |
- |
- DartDebug.installProxyFieldsAndFunctions( |
- libraryProxy, |
- function() { return libraryScopeObject; }, |
- function() { return libraryProxy; }, |
- null, |
- true); |
- |
- var imports = DartDebug.mirrorAPI.libraryImports(libraryProxy); |
- for (var i = 0; i < imports.length; i += 2) { |
- var prefix = imports[i]; |
- var importedLibraryProxy = imports[i + 1]; |
- var scopeObject = libraryScopeObject; |
- if (prefix) { |
- // Remove trailing '.'. |
- prefix = prefix.substr(0, prefix.length - 1); |
- // FIXME: remove the check below once dartbug.com/6131 is fixed. |
- if (!(prefix in libraryScopeObject)) { |
- scopeObject = {}; |
- scopeObject.__proto__ = null; |
- Object.defineProperty(libraryScopeObject, prefix, { value: scopeObject }); |
- } |
- } |
- var filter = function(name) { return name[0] != '_'; }; |
- var getContainer = function() { return scopeObject}; |
- var getContainerProxy = function() { return importedLibraryProxy}; |
- DartDebug.installProxyFieldsAndFunctions(importedLibraryProxy, getContainer, getContainerProxy, filter, true); |
- } |
- |
- return libraryScopeObject; |
-} |
- |
var originals = {}; |
originals.scripts = Debug.scripts; |