/[jscoverage]/trunk/js/jsiter.cpp
ViewVC logotype

Diff of /trunk/js/jsiter.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 459 by siliconforks, Tue Dec 9 03:37:47 2008 UTC revision 460 by siliconforks, Sat Sep 26 23:15:22 2009 UTC
# Line 64  Line 64 
64  #include "jsscan.h"  #include "jsscan.h"
65  #include "jsscope.h"  #include "jsscope.h"
66  #include "jsscript.h"  #include "jsscript.h"
67    #include "jsstaticcheck.h"
68    #include "jstracer.h"
69    
70  #if JS_HAS_XML_SUPPORT  #if JS_HAS_XML_SUPPORT
71  #include "jsxml.h"  #include "jsxml.h"
# Line 75  Line 77 
77    
78  #if JS_HAS_GENERATORS  #if JS_HAS_GENERATORS
79    
80  static JSBool  static JS_REQUIRES_STACK JSBool
81  CloseGenerator(JSContext *cx, JSObject *genobj);  CloseGenerator(JSContext *cx, JSObject *genobj);
82    
83  #endif  #endif
# Line 103  Line 105 
105  #if JS_HAS_XML_SUPPORT  #if JS_HAS_XML_SUPPORT
106          uintN flags = JSVAL_TO_INT(STOBJ_GET_SLOT(iterobj, JSSLOT_ITER_FLAGS));          uintN flags = JSVAL_TO_INT(STOBJ_GET_SLOT(iterobj, JSSLOT_ITER_FLAGS));
107          if ((flags & JSITER_FOREACH) && OBJECT_IS_XML(cx, iterable)) {          if ((flags & JSITER_FOREACH) && OBJECT_IS_XML(cx, iterable)) {
108              ((JSXMLObjectOps *) iterable->map->ops)->              js_EnumerateXMLValues(cx, iterable, JSENUMERATE_DESTROY, &state,
109                  enumerateValues(cx, iterable, JSENUMERATE_DESTROY, &state,                                    NULL, NULL);
                                 NULL, NULL);  
110          } else          } else
111  #endif  #endif
112              OBJ_ENUMERATE(cx, iterable, JSENUMERATE_DESTROY, &state, NULL);              OBJ_ENUMERATE(cx, iterable, JSENUMERATE_DESTROY, &state, NULL);
# Line 142  Line 143 
143      ok =      ok =
144  #if JS_HAS_XML_SUPPORT  #if JS_HAS_XML_SUPPORT
145           ((flags & JSITER_FOREACH) && OBJECT_IS_XML(cx, obj))           ((flags & JSITER_FOREACH) && OBJECT_IS_XML(cx, obj))
146           ? ((JSXMLObjectOps *) obj->map->ops)->           ? js_EnumerateXMLValues(cx, obj, JSENUMERATE_INIT, &state, NULL, NULL)
                enumerateValues(cx, obj, JSENUMERATE_INIT, &state, NULL, NULL)  
147           :           :
148  #endif  #endif
149             OBJ_ENUMERATE(cx, obj, JSENUMERATE_INIT, &state, NULL);             OBJ_ENUMERATE(cx, obj, JSENUMERATE_INIT, &state, NULL);
# Line 174  Line 174 
174      keyonly = js_ValueToBoolean(argv[1]);      keyonly = js_ValueToBoolean(argv[1]);
175      flags = keyonly ? 0 : JSITER_FOREACH;      flags = keyonly ? 0 : JSITER_FOREACH;
176    
177      if (cx->fp->flags & JSFRAME_CONSTRUCTING) {      if (JS_IsConstructing(cx)) {
178          /* XXX work around old valueOf call hidden beneath js_ValueToObject */          /* XXX work around old valueOf call hidden beneath js_ValueToObject */
179          if (!JSVAL_IS_PRIMITIVE(argv[0])) {          if (!JSVAL_IS_PRIMITIVE(argv[0])) {
180              obj = JSVAL_TO_OBJECT(argv[0]);              obj = JSVAL_TO_OBJECT(argv[0]);
# Line 232  Line 232 
232      ok =      ok =
233  #if JS_HAS_XML_SUPPORT  #if JS_HAS_XML_SUPPORT
234           (foreach && OBJECT_IS_XML(cx, iterable))           (foreach && OBJECT_IS_XML(cx, iterable))
235           ? ((JSXMLObjectOps *) iterable->map->ops)->           ? js_EnumerateXMLValues(cx, iterable, JSENUMERATE_NEXT, &state,
236                 enumerateValues(cx, iterable, JSENUMERATE_NEXT, &state,                                   &id, rval)
                                &id, rval)  
237           :           :
238  #endif  #endif
239             OBJ_ENUMERATE(cx, iterable, JSENUMERATE_NEXT, &state, &id);             OBJ_ENUMERATE(cx, iterable, JSENUMERATE_NEXT, &state, &id);
# Line 376  Line 375 
375          *vp = OBJECT_TO_JSVAL(iterobj);          *vp = OBJECT_TO_JSVAL(iterobj);
376      } else {      } else {
377          atom = cx->runtime->atomState.iteratorAtom;          atom = cx->runtime->atomState.iteratorAtom;
378  #if JS_HAS_XML_SUPPORT          if (!js_GetMethod(cx, obj, ATOM_TO_JSID(atom), false, vp))
379          if (OBJECT_IS_XML(cx, obj)) {              goto bad;
             if (!js_GetXMLFunction(cx, obj, ATOM_TO_JSID(atom), vp))  
                 goto bad;  
         } else  
 #endif  
         {  
             if (!OBJ_GET_PROPERTY(cx, obj, ATOM_TO_JSID(atom), vp))  
                 goto bad;  
         }  
   
380          if (JSVAL_IS_VOID(*vp)) {          if (JSVAL_IS_VOID(*vp)) {
381            default_iter:            default_iter:
382              /*              /*
# Line 407  Line 397 
397              if (!InitNativeIterator(cx, iterobj, obj, flags))              if (!InitNativeIterator(cx, iterobj, obj, flags))
398                  goto bad;                  goto bad;
399          } else {          } else {
400                js_LeaveTrace(cx);
401              arg = BOOLEAN_TO_JSVAL((flags & JSITER_FOREACH) == 0);              arg = BOOLEAN_TO_JSVAL((flags & JSITER_FOREACH) == 0);
402              if (!js_InternalInvoke(cx, obj, *vp, JSINVOKE_ITERATOR, 1, &arg,              if (!js_InternalInvoke(cx, obj, *vp, JSINVOKE_ITERATOR, 1, &arg,
403                                     vp)) {                                     vp)) {
404                  goto bad;                  goto bad;
405              }              }
406              if (JSVAL_IS_PRIMITIVE(*vp)) {              if (JSVAL_IS_PRIMITIVE(*vp)) {
407                  const char *printable = js_AtomToPrintableString(cx, atom);                  js_ReportValueError(cx, JSMSG_BAD_ITERATOR_RETURN,
408                  if (printable) {                                      JSDVG_SEARCH_STACK, *vp, NULL);
                     js_ReportValueError2(cx, JSMSG_BAD_ITERATOR_RETURN,  
                                          JSDVG_SEARCH_STACK, *vp, NULL,  
                                          printable);  
                 }  
409                  goto bad;                  goto bad;
410              }              }
411          }          }
# Line 449  Line 436 
436      }      }
437  #if JS_HAS_GENERATORS  #if JS_HAS_GENERATORS
438      else if (clasp == &js_GeneratorClass) {      else if (clasp == &js_GeneratorClass) {
439            JS_ASSERT_NOT_ON_TRACE(cx);
440          if (!CloseGenerator(cx, obj))          if (!CloseGenerator(cx, obj))
441              return JS_FALSE;              return JS_FALSE;
442      }      }
# Line 487  Line 475 
475       */       */
476      if (obj == origobj && OBJECT_IS_XML(cx, obj)) {      if (obj == origobj && OBJECT_IS_XML(cx, obj)) {
477          if (foreach) {          if (foreach) {
478              JSXMLObjectOps *xmlops = (JSXMLObjectOps *) obj->map->ops;              if (!js_EnumerateXMLValues(cx, obj, JSENUMERATE_NEXT, &state,
479                                           &id, rval)) {
             if (!xmlops->enumerateValues(cx, obj, JSENUMERATE_NEXT, &state,  
                                          &id, rval)) {  
480                  return JS_FALSE;                  return JS_FALSE;
481              }              }
482          } else {          } else {
# Line 690  Line 676 
676      js_TraceStackFrame(trc, &gen->frame);      js_TraceStackFrame(trc, &gen->frame);
677  }  }
678    
679  JSClass js_GeneratorClass = {  JS_FRIEND_DATA(JSClass) js_GeneratorClass = {
680      js_Generator_str,      js_Generator_str,
681      JSCLASS_HAS_PRIVATE | JSCLASS_IS_ANONYMOUS |      JSCLASS_HAS_PRIVATE | JSCLASS_IS_ANONYMOUS |
682      JSCLASS_MARK_IS_TRACE | JSCLASS_HAS_CACHED_PROTO(JSProto_Generator),      JSCLASS_MARK_IS_TRACE | JSCLASS_HAS_CACHED_PROTO(JSProto_Generator),
# Line 787  Line 773 
773      gen->frame.flags = (fp->flags & ~JSFRAME_ROOTED_ARGV) | JSFRAME_GENERATOR;      gen->frame.flags = (fp->flags & ~JSFRAME_ROOTED_ARGV) | JSFRAME_GENERATOR;
774      gen->frame.dormantNext = NULL;      gen->frame.dormantNext = NULL;
775      gen->frame.xmlNamespace = NULL;      gen->frame.xmlNamespace = NULL;
776        /* JSOP_GENERATOR appears in the prologue, outside all blocks.  */
777        JS_ASSERT(!fp->blockChain);
778      gen->frame.blockChain = NULL;      gen->frame.blockChain = NULL;
779    
780      /* Note that gen is newborn. */      /* Note that gen is newborn. */
# Line 814  Line 802 
802   * Start newborn or restart yielding generator and perform the requested   * Start newborn or restart yielding generator and perform the requested
803   * operation inside its frame.   * operation inside its frame.
804   */   */
805  static JSBool  static JS_REQUIRES_STACK JSBool
806  SendToGenerator(JSContext *cx, JSGeneratorOp op, JSObject *obj,  SendToGenerator(JSContext *cx, JSGeneratorOp op, JSObject *obj,
807                  JSGenerator *gen, jsval arg)                  JSGenerator *gen, jsval arg)
808  {  {
# Line 863  Line 851 
851      cx->stackPool.current = arena->next = &gen->arena;      cx->stackPool.current = arena->next = &gen->arena;
852    
853      /* Push gen->frame around the interpreter activation. */      /* Push gen->frame around the interpreter activation. */
854      fp = cx->fp;      fp = js_GetTopStackFrame(cx);
855      cx->fp = &gen->frame;      cx->fp = &gen->frame;
856      gen->frame.down = fp;      gen->frame.down = fp;
857      ok = js_Interpret(cx);      ok = js_Interpret(cx);
# Line 904  Line 892 
892      return JS_FALSE;      return JS_FALSE;
893  }  }
894    
895  static JSBool  static JS_REQUIRES_STACK JSBool
896  CloseGenerator(JSContext *cx, JSObject *obj)  CloseGenerator(JSContext *cx, JSObject *obj)
897  {  {
898      JSGenerator *gen;      JSGenerator *gen;
# Line 932  Line 920 
920      JSGenerator *gen;      JSGenerator *gen;
921      jsval arg;      jsval arg;
922    
923        js_LeaveTrace(cx);
924    
925      obj = JS_THIS_OBJECT(cx, vp);      obj = JS_THIS_OBJECT(cx, vp);
926      if (!JS_InstanceOf(cx, obj, &js_GeneratorClass, vp + 2))      if (!JS_InstanceOf(cx, obj, &js_GeneratorClass, vp + 2))
927          return JS_FALSE;          return JS_FALSE;

Legend:
Removed from v.459  
changed lines
  Added in v.460

  ViewVC Help
Powered by ViewVC 1.1.24