JavaScriptCore:
authorggaren <ggaren@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 1 Jul 2005 18:56:38 +0000 (18:56 +0000)
committerggaren <ggaren@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 1 Jul 2005 18:56:38 +0000 (18:56 +0000)
        -landed patch by Eric Seidel <macdome@opendarwin.org>

        -for http://bugzilla.opendarwin.org/show_bug.cgi?id=3657
        GroundWork:  Moving some functions from khtml->jsc following kjs TOT

        - no layout test necessary yet - only groundwork

        Reviewed by darin.

        * kjs/lookup.h:
        (KJS::cacheGlobalObject):

WebCore:

        -landed patch by Eric Seidel <macdome@opendarwin.org>

        -for http://bugzilla.opendarwin.org/show_bug.cgi?id=3657
        GroundWork:  Moving some functions from khtml->jsc following kjs TOT

        - no layout test necessary yet - only groundwork

        Reviewed by darin.

        * ForwardingHeaders/qintdict.h:
        * khtml/ecma/kjs_binding.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@9560 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JavaScriptCore/ChangeLog
JavaScriptCore/kjs/lookup.h
WebCore/ChangeLog-2005-08-23
WebCore/ForwardingHeaders/qintdict.h
WebCore/khtml/ecma/kjs_binding.h

index f2ac14af51e687d3028c8af02815f7af6d049c8d..c2bf0ae2be34386229e2b101c0b1ece0f655845e 100644 (file)
@@ -1,3 +1,17 @@
+2005-07-01  Geoffrey Garen  <ggaren@apple.com>
+
+        -landed patch by Eric Seidel <macdome@opendarwin.org>
+        
+        -for http://bugzilla.opendarwin.org/show_bug.cgi?id=3657
+        GroundWork:  Moving some functions from khtml->jsc following kjs TOT
+        
+        - no layout test necessary yet - only groundwork
+
+        Reviewed by darin.
+
+        * kjs/lookup.h:
+        (KJS::cacheGlobalObject):
+
 2005-07-01  Geoffrey Garen  <ggaren@apple.com>
 
         -landed patch by Carsten Guenther <cguenther@gmail.com>
index 14800022867bf9f9535bfc1472fb5b814ad7b961..18aef6e8d65d3a8a5f75bf3ae605a89d6df4e09a 100644 (file)
@@ -23,6 +23,7 @@
 #ifndef _KJSLOOKUP_H_
 #define _KJSLOOKUP_H_
 
+#include "interpreter.h"
 #include "identifier.h"
 #include "object.h"
 #include <stdio.h>
@@ -239,6 +240,104 @@ namespace KJS {
     else
       thisObj->putValueProperty(exec, entry->value, value, attr);
   }
+  
+  /**
+   * This template method retrieves or create an object that is unique
+   * (for a given interpreter) The first time this is called (for a given
+   * property name), the Object will be constructed, and set as a property
+   * of the interpreter's global object. Later calls will simply retrieve
+   * that cached object. Note that the object constructor must take 1 argument, exec.
+   */
+  template <class ClassCtor>
+  inline ObjectImp *cacheGlobalObject(ExecState *exec, const Identifier &propertyName)
+  {
+    ObjectImp *globalObject = static_cast<ObjectImp *>(exec->lexicalInterpreter()->globalObject().imp());
+    ValueImp *obj = globalObject->getDirect(propertyName);
+    if (obj) {
+      assert(obj->isObject());
+      return static_cast<ObjectImp *>(obj);
+    }
+    ObjectImp *newObject = new ClassCtor(exec);
+    globalObject->put(exec, propertyName, Value(newObject), Internal);
+    return newObject;
+  }
+
+  /**
+   * Helpers to define prototype objects (each of which simply implements
+   * the functions for a type of objects).
+   * Sorry for this not being very readable, but it actually saves much copy-n-paste.
+   * ParentProto is not our base class, it's the object we use as fallback.
+   * The reason for this is that there should only be ONE DOMNode.hasAttributes (e.g.),
+   * not one in each derived class. So we link the (unique) prototypes between them.
+   *
+   * Using those macros is very simple: define the hashtable (e.g. "DOMNodeProtoTable"), then
+   * DEFINE_PROTOTYPE("DOMNode",DOMNodeProto)
+   * IMPLEMENT_PROTOFUNC(DOMNodeProtoFunc)
+   * IMPLEMENT_PROTOTYPE(DOMNodeProto,DOMNodeProtoFunc)
+   * and use DOMNodeProto::self(exec) as prototype in the DOMNode constructor.
+   * If the prototype has a "parent prototype", e.g. DOMElementProto falls back on DOMNodeProto,
+   * then the last line will use IMPLEMENT_PROTOTYPE_WITH_PARENT, with DOMNodeProto as last argument.
+   */
+#define DEFINE_PROTOTYPE(ClassName,ClassProto) \
+  class ClassProto : public ObjectImp { \
+    friend ObjectImp *cacheGlobalObject<ClassProto>(ExecState *exec, const Identifier &propertyName); \
+  public: \
+    static ObjectImp *self(ExecState *exec) \
+    { \
+      return cacheGlobalObject<ClassProto>( exec, "[[" ClassName ".prototype]]" ); \
+    } \
+  protected: \
+    ClassProto( ExecState *exec ) \
+      : ObjectImp( exec->lexicalInterpreter()->builtinObjectPrototype() ) {} \
+    \
+  public: \
+    virtual const ClassInfo *classInfo() const { return &info; } \
+    static const ClassInfo info; \
+    Value get(ExecState *exec, const Identifier &propertyName) const; \
+    bool hasProperty(ExecState *exec, const Identifier &propertyName) const; \
+  }; \
+  const ClassInfo ClassProto::info = { ClassName, 0, &ClassProto##Table, 0 };
+
+#define IMPLEMENT_PROTOTYPE(ClassProto,ClassFunc) \
+    Value ClassProto::get(ExecState *exec, const Identifier &propertyName) const \
+    { \
+      /*fprintf( stderr, "%sProto::get(%s) [in macro, no parent]\n", info.className, propertyName.ascii());*/ \
+      return lookupGetFunction<ClassFunc,ObjectImp>(exec, propertyName, &ClassProto##Table, this ); \
+    } \
+    bool ClassProto::hasProperty(ExecState *exec, const Identifier &propertyName) const \
+    { /*stupid but we need this to have a common macro for the declaration*/ \
+      return ObjectImp::hasProperty(exec, propertyName); \
+    }
+
+#define IMPLEMENT_PROTOTYPE_WITH_PARENT(ClassProto,ClassFunc,ParentProto)  \
+    Value ClassProto::get(ExecState *exec, const Identifier &propertyName) const \
+    { \
+      /*fprintf( stderr, "%sProto::get(%s) [in macro]\n", info.className, propertyName.ascii());*/ \
+      Value val = lookupGetFunction<ClassFunc,ObjectImp>(exec, propertyName, &ClassProto##Table, this ); \
+      if ( val.type() != UndefinedType ) return val; \
+      /* Not found -> forward request to "parent" prototype */ \
+      return ParentProto::self(exec)->get( exec, propertyName ); \
+    } \
+    bool ClassProto::hasProperty(ExecState *exec, const Identifier &propertyName) const \
+    { \
+      if (ObjectImp::hasProperty(exec, propertyName)) \
+        return true; \
+      return ParentProto::self(exec)->hasProperty(exec, propertyName); \
+    }
+
+#define IMPLEMENT_PROTOFUNC(ClassFunc) \
+  class ClassFunc : public DOMFunction { \
+  public: \
+    ClassFunc(ExecState *exec, int i, int len) \
+       : DOMFunction( /*proto? */ ), id(i) { \
+       Value protect(this); \
+       put(exec,lengthPropertyName,Number(len),DontDelete|ReadOnly|DontEnum); \
+    } \
+    /** You need to implement that one */ \
+    virtual Value tryCall(ExecState *exec, Object &thisObj, const List &args); \
+  private: \
+    int id; \
+  };
 
   /*
    * List of things to do when porting an objectimp to the 'static hashtable' mechanism:
index 35a3e0bcfc41ea67d10ce13a3223046868428c1e..d69f79eeff8949641a5ff40ada3338d68895d21f 100644 (file)
@@ -1,3 +1,17 @@
+2005-07-01  Geoffrey Garen  <ggaren@apple.com>
+
+        -landed patch by Eric Seidel <macdome@opendarwin.org>
+        
+        -for http://bugzilla.opendarwin.org/show_bug.cgi?id=3657
+        GroundWork:  Moving some functions from khtml->jsc following kjs TOT
+        
+        - no layout test necessary yet - only groundwork
+
+        Reviewed by darin.
+
+        * ForwardingHeaders/qintdict.h:
+        * khtml/ecma/kjs_binding.h:
+
 2005-07-01  Geoffrey Garen  <ggaren@apple.com>
 
         -landed patch by Carsten Guenther <cguenther@gmail.com>
index 3bd66e8a7bc64e0b6374dc68a6b3efab537b5334..0bf40f947a45054350b93224ac48be3604734703 100644 (file)
@@ -1 +1,3 @@
+#import <KWQIntDict.h>
+
 #import "KWQIntDict.h"
index 60157365774b1f23ecc8b8148bbc52b3cc879238..cb4292e1adf83e9cad275bf954db1598607fca02 100644 (file)
@@ -259,104 +259,6 @@ namespace KJS {
       thisObj->putValue(exec, entry->value, value, attr);
   }
 
-  /**
-   * This template method retrieves or create an object that is unique
-   * (for a given interpreter) The first time this is called (for a given
-   * property name), the Object will be constructed, and set as a property
-   * of the interpreter's global object. Later calls will simply retrieve
-   * that cached object. Note that the object constructor must take 1 argument, exec.
-   */
-  template <class ClassCtor>
-  inline ObjectImp *cacheGlobalObject(ExecState *exec, const Identifier &propertyName)
-  {
-    ObjectImp *globalObject = static_cast<ObjectImp *>(exec->lexicalInterpreter()->globalObject().imp());
-    ValueImp *obj = globalObject->getDirect(propertyName);
-    if (obj) {
-      assert(obj->isObject());
-      return static_cast<ObjectImp *>(obj);
-    }
-    ObjectImp *newObject = new ClassCtor(exec);
-    globalObject->put(exec, propertyName, Value(newObject), Internal);
-    return newObject;
-  }
-
-  /**
-   * Helpers to define prototype objects (each of which simply implements
-   * the functions for a type of objects).
-   * Sorry for this not being very readable, but it actually saves much copy-n-paste.
-   * ParentProto is not our base class, it's the object we use as fallback.
-   * The reason for this is that there should only be ONE DOMNode.hasAttributes (e.g.),
-   * not one in each derived class. So we link the (unique) prototypes between them.
-   *
-   * Using those macros is very simple: define the hashtable (e.g. "DOMNodeProtoTable"), then
-   * DEFINE_PROTOTYPE("DOMNode",DOMNodeProto)
-   * IMPLEMENT_PROTOFUNC(DOMNodeProtoFunc)
-   * IMPLEMENT_PROTOTYPE(DOMNodeProto,DOMNodeProtoFunc)
-   * and use DOMNodeProto::self(exec) as prototype in the DOMNode constructor.
-   * If the prototype has a "parent prototype", e.g. DOMElementProto falls back on DOMNodeProto,
-   * then the last line will use IMPLEMENT_PROTOTYPE_WITH_PARENT, with DOMNodeProto as last argument.
-   */
-#define DEFINE_PROTOTYPE(ClassName,ClassProto) \
-  class ClassProto : public ObjectImp { \
-    friend ObjectImp *cacheGlobalObject<ClassProto>(ExecState *exec, const Identifier &propertyName); \
-  public: \
-    static ObjectImp *self(ExecState *exec) \
-    { \
-      return cacheGlobalObject<ClassProto>( exec, "[[" ClassName ".prototype]]" ); \
-    } \
-  protected: \
-    ClassProto( ExecState *exec ) \
-      : ObjectImp( exec->lexicalInterpreter()->builtinObjectPrototype() ) {} \
-    \
-  public: \
-    virtual const ClassInfo *classInfo() const { return &info; } \
-    static const ClassInfo info; \
-    Value get(ExecState *exec, const Identifier &propertyName) const; \
-    bool hasProperty(ExecState *exec, const Identifier &propertyName) const; \
-  }; \
-  const ClassInfo ClassProto::info = { ClassName, 0, &ClassProto##Table, 0 };
-
-#define IMPLEMENT_PROTOTYPE(ClassProto,ClassFunc) \
-    Value ClassProto::get(ExecState *exec, const Identifier &propertyName) const \
-    { \
-      /*fprintf( stderr, "%sProto::get(%s) [in macro, no parent]\n", info.className, propertyName.ascii());*/ \
-      return lookupGetFunction<ClassFunc,ObjectImp>(exec, propertyName, &ClassProto##Table, this ); \
-    } \
-    bool ClassProto::hasProperty(ExecState *exec, const Identifier &propertyName) const \
-    { /*stupid but we need this to have a common macro for the declaration*/ \
-      return ObjectImp::hasProperty(exec, propertyName); \
-    }
-
-#define IMPLEMENT_PROTOTYPE_WITH_PARENT(ClassProto,ClassFunc,ParentProto)  \
-    Value ClassProto::get(ExecState *exec, const Identifier &propertyName) const \
-    { \
-      /*fprintf( stderr, "%sProto::get(%s) [in macro]\n", info.className, propertyName.ascii());*/ \
-      Value val = lookupGetFunction<ClassFunc,ObjectImp>(exec, propertyName, &ClassProto##Table, this ); \
-      if ( val.type() != UndefinedType ) return val; \
-      /* Not found -> forward request to "parent" prototype */ \
-      return ParentProto::self(exec)->get( exec, propertyName ); \
-    } \
-    bool ClassProto::hasProperty(ExecState *exec, const Identifier &propertyName) const \
-    { \
-      if (ObjectImp::hasProperty(exec, propertyName)) \
-        return true; \
-      return ParentProto::self(exec)->hasProperty(exec, propertyName); \
-    }
-
-#define IMPLEMENT_PROTOFUNC(ClassFunc) \
-  class ClassFunc : public DOMFunction { \
-  public: \
-    ClassFunc(ExecState *exec, int i, int len) \
-       : DOMFunction( /*proto? */ ), id(i) { \
-       Value protect(this); \
-       put(exec,lengthPropertyName,Number(len),DontDelete|ReadOnly|DontEnum); \
-    } \
-    /** You need to implement that one */ \
-    virtual Value tryCall(ExecState *exec, Object &thisObj, const List &args); \
-  private: \
-    int id; \
-  };
-
 } // namespace
 
 #endif