Initial subversion import.

The following lines are to recognize contributions made before the switch
to Subversion.

Patch by: bruce, jgw, scottb, mmendez, ecc, hcc, knorton, haeberling, samgross, mat.gessel


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@1 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/jni/mac/FunctionObject.cpp b/jni/mac/FunctionObject.cpp
new file mode 100644
index 0000000..8e013cd
--- /dev/null
+++ b/jni/mac/FunctionObject.cpp
@@ -0,0 +1,132 @@
+// Copyright 2005 Google Inc.
+// All Rights Reserved.
+
+#include "FunctionObject.h"
+#include <kjs/array_object.h>
+
+using namespace KJS;
+
+const ClassInfo FunctionObject::info = {"Function", 0, 0, 0};
+
+class CallFunction : public FunctionObject {
+public:
+	CallFunction(): FunctionObject("call") {
+	}
+
+    virtual JSValue *callAsFunction(ExecState *exec, JSObject *thisObj, const List &args) {
+		// Copied from FunctionProtoFunc::callAsFunction()
+		JSValue *thisArg = args[0];
+		JSObject *func = thisObj;
+
+		if (!func->implementsCall())
+			return throwError(exec, TypeError);
+
+		JSObject *callThis;
+		if (thisArg->isUndefinedOrNull())
+			callThis = exec->dynamicInterpreter()->globalObject();
+		else
+			callThis = thisArg->toObject(exec);
+
+		return func->call(exec, callThis, args.copyTail());
+	}
+};
+
+class ApplyFunction  : public FunctionObject {
+public:
+	ApplyFunction(): FunctionObject("apply") {
+	}
+
+    virtual JSValue *callAsFunction(ExecState *exec, JSObject *thisObj, const List &args) {
+		// Copied from FunctionProtoFunc::callAsFunction()
+		JSObject *func = thisObj;
+		if (!func->implementsCall())
+			return throwError(exec, TypeError);
+
+		JSValue *thisArg = args[0];
+		JSObject *applyThis;
+		if (thisArg->isUndefinedOrNull())
+			applyThis = exec->dynamicInterpreter()->globalObject();
+		else
+			applyThis = thisArg->toObject(exec);
+
+		JSValue *argArray = args[1];
+		List applyArgs;
+		if (!argArray->isUndefinedOrNull()) {
+			if (!argArray->isObject(&ArrayInstance::info))
+				return throwError(exec, TypeError);
+
+			JSObject *argArrayObj = static_cast<JSObject *>(argArray);
+			unsigned int length = argArrayObj->get(exec, lengthPropertyName)->toUInt32(exec);
+			for (unsigned int i = 0; i < length; ++i) {
+				applyArgs.append(argArrayObj->get(exec,i));
+			}
+		}
+		return func->call(exec, applyThis, applyArgs);
+	}
+};
+
+
+static UString makeFunctionString(const UString& name) {
+	return "\nfunction " + name + "() {\n    [native code]\n}\n";
+}
+
+JSValue *FunctionObject::getter(ExecState* exec, JSObject* obj, const Identifier& propertyName, const PropertySlot& slot) {
+	if (propertyName.ustring() == "toString") {
+		return new ToStringFunction();
+	} else if (propertyName.ustring() == "call") {
+		return new CallFunction();
+	} else if (propertyName.ustring() == "apply") {
+		return new ApplyFunction();
+	}
+	return jsUndefined();
+}
+
+FunctionObject::FunctionObject(const UString& name): name(name) {
+}
+
+bool FunctionObject::getOwnPropertySlot(ExecState *exec, const Identifier& propertyName, PropertySlot& slot) {
+	if (propertyName.ustring() == "toString") {
+		slot.setCustom(this, getter);
+		return true;
+	}
+	if (propertyName.ustring() == "call") {
+		slot.setCustom(this, getter);
+		return true;
+	}
+	if (propertyName.ustring() == "apply") {
+		slot.setCustom(this, getter);
+		return true;
+	}
+	return false;
+}
+
+bool FunctionObject::canPut(ExecState *exec, const Identifier &propertyName) const {
+	return false;
+}
+
+void FunctionObject::put(ExecState *exec, const Identifier &propertyName, JSValue *value, int attr) {
+}
+
+bool FunctionObject::deleteProperty(ExecState *exec, const Identifier &propertyName) {
+	return false;
+}
+
+JSValue *FunctionObject::defaultValue(ExecState *exec, JSType hint) const {
+	return jsString(makeFunctionString(name));
+}
+
+bool FunctionObject::implementsCall() const {
+	return true;
+}
+
+// ToStringFunction
+
+ToStringFunction::ToStringFunction(): FunctionObject("toString") {
+}
+
+JSValue *ToStringFunction::callAsFunction(ExecState *exec, JSObject *thisObj, const List &args) {
+	if (!thisObj) {
+		return throwError(exec, TypeError);
+	}
+	return jsString(thisObj->toString(exec));
+}