webengine/osswebengine/JavaScriptCore/kjs/internal.h
changeset 0 dd21522fd290
child 26 63ded8f94800
child 74 91031d3aab7d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webengine/osswebengine/JavaScriptCore/kjs/internal.h	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,172 @@
+// -*- c-basic-offset: 2 -*-
+/*
+ *  This file is part of the KDE libraries
+ *  Copyright (C) 1999-2001 Harri Porten (porten@kde.org)
+ *  Copyright (C) 2001 Peter Kelly (pmk@post.com)
+ *  Copyright (C) 2003, 2004, 2005, 2006 Apple Computer, Inc.
+ *
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Library General Public License
+ *  along with this library; see the file COPYING.LIB.  If not, write to
+ *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef INTERNAL_H
+#define INTERNAL_H
+
+#include "JSType.h"
+#include "interpreter.h"
+#include "object.h"
+#include "protect.h"
+#include "scope_chain.h"
+#include "types.h"
+#include "ustring.h"
+
+#include <wtf/Noncopyable.h>
+
+#define I18N_NOOP(s) s
+
+namespace KJS {
+
+  class FunctionPrototype;
+
+  // ---------------------------------------------------------------------------
+  //                            Primitive impls
+  // ---------------------------------------------------------------------------
+
+  class StringImp : public JSCell {
+  public:
+    StringImp(const UString& v) : val(v) { Collector::reportExtraMemoryCost(v.cost()); }
+    enum HasOtherOwnerType { HasOtherOwner };
+    StringImp(const UString& value, HasOtherOwnerType) : val(value) { }
+    UString value() const { return val; }
+
+    JSType type() const { return StringType; }
+
+    JSValue *toPrimitive(ExecState *exec, JSType preferred = UnspecifiedType) const;
+    bool toBoolean(ExecState *exec) const;
+    double toNumber(ExecState *exec) const;
+    UString toString(ExecState *exec) const;
+    JSObject *toObject(ExecState *exec) const;
+
+  private:
+    UString val;
+  };
+
+  class NumberImp : public JSCell {
+    friend class ConstantValues;
+    friend JSValue *jsNumberCell(double);
+  public:
+    double value() const { return val; }
+
+    JSType type() const { return NumberType; }
+
+    JSValue *toPrimitive(ExecState *exec, JSType preferred = UnspecifiedType) const;
+    bool toBoolean(ExecState *exec) const;
+    double toNumber(ExecState *exec) const;
+    UString toString(ExecState *exec) const;
+    JSObject *toObject(ExecState *exec) const;
+
+  private:
+    NumberImp(double v) : val(v) { }
+
+    virtual bool getUInt32(uint32_t&) const;
+
+    double val;
+  };
+
+
+  /**
+   * @short The "label set" in Ecma-262 spec
+   */
+  class LabelStack : Noncopyable {
+  public:
+    LabelStack()
+      : tos(0)
+    {
+    }
+    ~LabelStack();
+
+    /**
+     * If id is not empty and is not in the stack already, puts it on top of
+     * the stack and returns true, otherwise returns false
+     */
+    bool push(const Identifier &id);
+    /**
+     * Is the id in the stack?
+     */
+    bool contains(const Identifier &id) const;
+    /**
+     * Removes from the stack the last pushed id (what else?)
+     */
+    void pop();
+
+  private:
+    struct StackElem {
+      Identifier id;
+      StackElem *prev;
+    };
+
+    StackElem *tos;
+  };
+
+
+  // ---------------------------------------------------------------------------
+  //                            Evaluation
+  // ---------------------------------------------------------------------------
+
+  struct AttachedInterpreter;
+  class DebuggerImp {
+  public:
+
+    DebuggerImp() {
+      interps = 0;
+      isAborted = false;
+    }
+
+    void abort() { isAborted = true; }
+    bool aborted() const { return isAborted; }
+
+    AttachedInterpreter *interps;
+    bool isAborted;
+  };
+
+  // helper function for toInteger, toInt32, toUInt32 and toUInt16
+  IMPORT
+  double roundValue(ExecState *, JSValue *);
+
+#ifndef NDEBUG
+  void printInfo(ExecState *exec, const char *s, JSValue *, int lineno = -1);
+#endif
+
+inline LabelStack::~LabelStack()
+{
+    StackElem *prev;
+    for (StackElem *e = tos; e; e = prev) {
+        prev = e->prev;
+        delete e;
+    }
+}
+
+inline void LabelStack::pop()
+{
+    if (StackElem *e = tos) {
+        tos = e->prev;
+        delete e;
+    }
+}
+
+} // namespace
+
+#endif //  INTERNAL_H