Changes of Revision 112

lightspark.spec Changed
x
 
1
@@ -20,7 +20,7 @@
2
 %bcond_without librtmp
3
 
4
 Name:           lightspark
5
-Version:        0.7.2.99+git20160710.1738
6
+Version:        0.7.2.99+git20160814.1809
7
 Release:        0
8
 Summary:        Modern, free, open-source flash player implementation
9
 License:        LGPL-3.0+
10
lightspark.tar.xz/CMakeLists.txt Changed
23
 
1
@@ -323,6 +323,8 @@
2
   CHECK_FUNCTION_EXISTS(av_frame_alloc HAVE_AV_FRAME_ALLOC)
3
   CHECK_FUNCTION_EXISTS(av_frame_unref HAVE_AV_FRAME_UNREF)
4
   CHECK_FUNCTION_EXISTS(av_packet_unref HAVE_AV_PACKET_UNREF)
5
+  CHECK_FUNCTION_EXISTS(avcodec_send_packet HAVE_AVCODEC_SEND_PACKET)
6
+  CHECK_FUNCTION_EXISTS(avcodec_receive_frame HAVE_AVCODEC_RECEIVE_FRAME)
7
   
8
   CHECK_C_SOURCE_COMPILES("#include <libavcodec/avcodec.h>\nint main() { enum AVCodecID c; return 0; }" HAVE_AVCODECID)
9
 
10
@@ -368,6 +370,12 @@
11
   IF(HAVE_AV_PACKET_UNREF)
12
     ADD_DEFINITIONS(-DHAVE_AV_PACKET_UNREF)
13
   ENDIF(HAVE_AV_PACKET_UNREF)
14
+  IF(HAVE_AVCODEC_SEND_PACKET)
15
+    ADD_DEFINITIONS(-DHAVE_AVCODEC_SEND_PACKET)
16
+  ENDIF(HAVE_AVCODEC_SEND_PACKET)
17
+  IF(HAVE_AVCODEC_RECEIVE_FRAME)
18
+    ADD_DEFINITIONS(-DHAVE_AVCODEC_RECEIVE_FRAME)
19
+  ENDIF(HAVE_AVCODEC_RECEIVE_FRAME)
20
   ADD_DEFINITIONS(-DENABLE_LIBAVCODEC)
21
 ENDIF(ENABLE_LIBAVCODEC)
22
 
23
lightspark.tar.xz/src/asobject.cpp Changed
21
 
1
@@ -1344,8 +1344,8 @@
2
    }
3
 }
4
 
5
-ASObject::ASObject(Class_base* c,SWFOBJECT_TYPE t):objfreelist(c && c->isReusable ? c->freelist : NULL),Variables((c)?c->memoryAccount:NULL),varcount(0),classdef(c),proxyMultiName(NULL),sys(c?c->sys:NULL),
6
-   type(t),traitsInitialized(false),constructIndicator(false),constructorCallComplete(false),implEnable(true)
7
+ASObject::ASObject(Class_base* c,SWFOBJECT_TYPE t,CLASS_SUBTYPE st):objfreelist(c && c->isReusable ? c->freelist : NULL),Variables((c)?c->memoryAccount:NULL),varcount(0),classdef(c),proxyMultiName(NULL),sys(c?c->sys:NULL),
8
+   type(t),subtype(st),traitsInitialized(false),constructIndicator(false),constructorCallComplete(false),implEnable(true)
9
 {
10
 #ifndef NDEBUG
11
    //Stuff only used in debugging
12
@@ -1354,7 +1354,7 @@
13
 }
14
 
15
 ASObject::ASObject(const ASObject& o):objfreelist(o.classdef && o.classdef->isReusable ? o.classdef->freelist : NULL),Variables((o.classdef)?o.classdef->memoryAccount:NULL),varcount(0),classdef(NULL),proxyMultiName(NULL),sys(o.classdef? o.classdef->sys : NULL),
16
-   type(o.type),traitsInitialized(false),constructIndicator(false),constructorCallComplete(false),implEnable(true)
17
+   type(o.type),subtype(o.subtype),traitsInitialized(false),constructIndicator(false),constructorCallComplete(false),implEnable(true)
18
 {
19
 #ifndef NDEBUG
20
    //Stuff only used in debugging
21
lightspark.tar.xz/src/asobject.h Changed
80
 
1
@@ -217,7 +217,7 @@
2
    uint32_t nameId;
3
    nsNameAndKind ns;
4
    varName(uint32_t name, const nsNameAndKind& _ns):nameId(name),ns(_ns){}
5
-   bool operator<(const varName& r) const
6
+   inline bool operator<(const varName& r) const
7
    {
8
        //Sort by name first
9
        if(nameId==r.nameId)
10
@@ -228,6 +228,10 @@
11
        else
12
            return nameId<r.nameId;
13
    }
14
+   inline bool operator==(const varName& r) const
15
+   {
16
+       return nameId==r.nameId && ns == r.ns;
17
+   }
18
 };
19
 
20
 class variables_map
21
@@ -362,7 +366,7 @@
22
    SystemState* sys;
23
 protected:
24
    ASObject(MemoryAccount* m):objfreelist(NULL),Variables(m),varcount(0),classdef(NULL),proxyMultiName(NULL),sys(NULL),
25
-       type(T_OBJECT),traitsInitialized(false),constructIndicator(false),constructorCallComplete(false),implEnable(true)
26
+       type(T_OBJECT),subtype(SUBTYPE_NOT_SET),traitsInitialized(false),constructIndicator(false),constructorCallComplete(false),implEnable(true)
27
    {
28
 #ifndef NDEBUG
29
        //Stuff only used in debugging
30
@@ -376,6 +380,8 @@
31
        destroy();
32
    }
33
    SWFOBJECT_TYPE type;
34
+   CLASS_SUBTYPE subtype;
35
+   
36
    bool traitsInitialized:1;
37
    bool constructIndicator:1;
38
    bool constructorCallComplete:1; // indicates that the constructor including all super constructors has been called
39
@@ -410,7 +416,7 @@
40
    // called when object is really destroyed
41
    virtual void destroy(){}
42
 public:
43
-   ASObject(Class_base* c,SWFOBJECT_TYPE t = T_OBJECT);
44
+   ASObject(Class_base* c,SWFOBJECT_TYPE t = T_OBJECT,CLASS_SUBTYPE subtype = SUBTYPE_NOT_SET);
45
    
46
 #ifndef NDEBUG
47
    //Stuff only used in debugging
48
@@ -658,6 +664,15 @@
49
 class Type;
50
 class ASQName;
51
 class Namespace;
52
+class Proxy;
53
+class RegExp;
54
+class XML;
55
+class XMLList;
56
+class Class_inherit;
57
+class ObjectConstructor;
58
+class Function_object;
59
+class Date;
60
+
61
 template<> inline bool ASObject::is<Number>() const { return type==T_NUMBER; }
62
 template<> inline bool ASObject::is<Integer>() const { return type==T_INTEGER; }
63
 template<> inline bool ASObject::is<UInteger>() const { return type==T_UINTEGER; }
64
@@ -673,5 +688,15 @@
65
 template<> inline bool ASObject::is<Type>() const { return type==T_CLASS; }
66
 template<> inline bool ASObject::is<ASQName>() const { return type==T_QNAME; }
67
 template<> inline bool ASObject::is<Namespace>() const { return type==T_NAMESPACE; }
68
+template<> inline bool ASObject::is<Proxy>() const { return subtype==SUBTYPE_PROXY; }
69
+template<> inline bool ASObject::is<RegExp>() const { return subtype==SUBTYPE_REGEXP; }
70
+template<> inline bool ASObject::is<XML>() const { return subtype==SUBTYPE_XML; }
71
+template<> inline bool ASObject::is<XMLList>() const { return subtype==SUBTYPE_XMLLIST; }
72
+template<> inline bool ASObject::is<Date>() const { return subtype==SUBTYPE_DATE; }
73
+template<> inline bool ASObject::is<Class_inherit>() const { return subtype==SUBTYPE_INHERIT; }
74
+template<> inline bool ASObject::is<ObjectConstructor>() const { return subtype==SUBTYPE_OBJECTCONSTRUCTOR; }
75
+template<> inline bool ASObject::is<Function_object>() const { return subtype==SUBTYPE_FUNCTIONOBJECT; }
76
+
77
+
78
 }
79
 #endif /* ASOBJECT_H */
80
lightspark.tar.xz/src/backends/decoder.cpp Changed
201
 
1
@@ -181,7 +181,47 @@
2
    else
3
        status=INIT;
4
 }
5
+#if LIBAVFORMAT_VERSION_MAJOR > 56
6
+FFMpegVideoDecoder::FFMpegVideoDecoder(AVCodecID codecID, double frameRateHint):
7
+   ownedContext(true),curBuffer(0),codecContext(NULL),curBufferOffset(0)
8
+{
9
+   status=INIT;
10
+#ifdef HAVE_AVCODEC_ALLOC_CONTEXT3
11
+   codecContext=avcodec_alloc_context3(NULL);
12
+#else
13
+   codecContext=avcodec_alloc_context();
14
+#endif //HAVE_AVCODEC_ALLOC_CONTEXT3
15
+   //The tag is the header, initialize decoding
16
+   switch(codecID)
17
+   {
18
+       case CODEC_ID_H264:
19
+           videoCodec=H264;
20
+           break;
21
+       case CODEC_ID_FLV1:
22
+           videoCodec=H263;
23
+           break;
24
+       case CODEC_ID_VP6F:
25
+           videoCodec=VP6;
26
+           break;
27
+       default:
28
+           return;
29
+   }
30
+   AVCodec* codec=avcodec_find_decoder(codecID);
31
+#ifdef HAVE_AVCODEC_OPEN2
32
+   if(avcodec_open2(codecContext, codec, NULL)<0)
33
+#else
34
+   if(avcodec_open(codecContext, codec)<0)
35
+#endif //HAVE_AVCODEC_ALLOC_CONTEXT3
36
+       return;
37
+
38
+   frameRate=frameRateHint;
39
 
40
+   if(fillDataAndCheckValidity())
41
+       status=VALID;
42
+
43
+   frameIn=av_frame_alloc();
44
+}
45
+#else
46
 FFMpegVideoDecoder::FFMpegVideoDecoder(AVCodecContext* _c, double frameRateHint):
47
    ownedContext(false),curBuffer(0),codecContext(_c),curBufferOffset(0)
48
 {
49
@@ -216,6 +256,8 @@
50
 
51
    frameIn=av_frame_alloc();
52
 }
53
+#endif
54
+
55
 
56
 FFMpegVideoDecoder::~FFMpegVideoDecoder()
57
 {
58
@@ -277,7 +319,16 @@
59
    if(datalen==0)
60
        return false;
61
    int frameOk=0;
62
-#if HAVE_AVCODEC_DECODE_VIDEO2
63
+#if HAVE_AVCODEC_SEND_PACKET && HAVE_AVCODEC_RECEIVE_FRAME
64
+   AVPacket pkt;
65
+   av_init_packet(&pkt);
66
+   pkt.data=data;
67
+   pkt.size=datalen;
68
+   int ret = avcodec_send_packet(codecContext, &pkt);
69
+   if (ret == 0)
70
+       ret = avcodec_receive_frame(codecContext,frameIn);
71
+   frameOk=1;
72
+#elif HAVE_AVCODEC_DECODE_VIDEO2
73
    AVPacket pkt;
74
    av_init_packet(&pkt);
75
    pkt.data=data;
76
@@ -309,7 +360,12 @@
77
 {
78
    int frameOk=0;
79
 
80
-#if HAVE_AVCODEC_DECODE_VIDEO2
81
+#if HAVE_AVCODEC_SEND_PACKET && HAVE_AVCODEC_RECEIVE_FRAME
82
+   int ret = avcodec_send_packet(codecContext, pkt);
83
+   if (ret == 0)
84
+       ret = avcodec_receive_frame(codecContext,frameIn);
85
+   frameOk=1;
86
+#elif HAVE_AVCODEC_DECODE_VIDEO2
87
    int ret=avcodec_decode_video2(codecContext, frameIn, &frameOk, pkt);
88
 #else
89
    int ret=avcodec_decode_video(codecContext, frameIn, &frameOk, pkt->data, pkt->size);
90
@@ -538,6 +594,32 @@
91
 #endif
92
 }
93
 
94
+#if LIBAVFORMAT_VERSION_MAJOR > 56
95
+FFMpegAudioDecoder::FFMpegAudioDecoder(AVCodecID codecID):ownedContext(true),codecContext(NULL)
96
+{
97
+   status=INIT;
98
+   AVCodec* codec=avcodec_find_decoder(codecID);
99
+   assert(codec);
100
+#ifdef HAVE_AVCODEC_ALLOC_CONTEXT3
101
+   codecContext=avcodec_alloc_context3(NULL);
102
+#else
103
+   codecContext=avcodec_alloc_context();
104
+#endif //HAVE_AVCODEC_ALLOC_CONTEXT3
105
+
106
+#ifdef HAVE_AVCODEC_OPEN2
107
+   if(avcodec_open2(codecContext, codec, NULL)<0)
108
+#else
109
+   if(avcodec_open(codecContext, codec)<0)
110
+#endif //HAVE_AVCODEC_ALLOC_CONTEXT3
111
+       return;
112
+
113
+   if(fillDataAndCheckValidity())
114
+       status=VALID;
115
+#if HAVE_AVCODEC_DECODE_AUDIO4
116
+   frameIn=av_frame_alloc();
117
+#endif
118
+}
119
+#else
120
 FFMpegAudioDecoder::FFMpegAudioDecoder(AVCodecContext* _c):ownedContext(false),codecContext(_c)
121
 {
122
    status=INIT;
123
@@ -557,6 +639,7 @@
124
    frameIn=av_frame_alloc();
125
 #endif
126
 }
127
+#endif
128
 
129
 FFMpegAudioDecoder::~FFMpegAudioDecoder()
130
 {
131
@@ -616,7 +699,7 @@
132
 {
133
    FrameSamples& curTail=samplesBuffer.acquireLast();
134
    int maxLen=AVCODEC_MAX_AUDIO_FRAME_SIZE;
135
-#if HAVE_AVCODEC_DECODE_AUDIO3 || HAVE_AVCODEC_DECODE_AUDIO4
136
+#if HAVE_AVCODEC_DECODE_AUDIO3 || HAVE_AVCODEC_DECODE_AUDIO4 || (HAVE_AVCODEC_SEND_PACKET && HAVE_AVCODEC_RECEIVE_FRAME)
137
    AVPacket pkt;
138
    av_init_packet(&pkt);
139
 
140
@@ -637,8 +720,20 @@
141
        pkt.size = combinedBuffer.size();
142
        overflowBuffer.clear();
143
    }
144
-
145
-#if HAVE_AVCODEC_DECODE_AUDIO4
146
+#if HAVE_AVCODEC_SEND_PACKET && HAVE_AVCODEC_RECEIVE_FRAME
147
+   av_frame_unref(frameIn);
148
+   int ret = avcodec_send_packet(codecContext, &pkt);
149
+   if (ret == 0)
150
+       ret = avcodec_receive_frame(codecContext,frameIn);
151
+   if(ret<0)
152
+   {
153
+       LOG(LOG_ERROR,"not decoded audio:"<<ret);
154
+   }
155
+   else
156
+   {
157
+       maxLen = resampleFrameToS16(curTail);
158
+   }
159
+#elif HAVE_AVCODEC_DECODE_AUDIO4
160
    av_frame_unref(frameIn);
161
    int frameOk=0;
162
    int32_t ret=avcodec_decode_audio4(codecContext, frameIn, &frameOk, &pkt);
163
@@ -687,7 +782,20 @@
164
    FrameSamples& curTail=samplesBuffer.acquireLast();
165
    int maxLen=AVCODEC_MAX_AUDIO_FRAME_SIZE;
166
 
167
-#if HAVE_AVCODEC_DECODE_AUDIO4
168
+#if HAVE_AVCODEC_SEND_PACKET && HAVE_AVCODEC_RECEIVE_FRAME
169
+   av_frame_unref(frameIn);
170
+   int ret = avcodec_send_packet(codecContext, pkt);
171
+   if (ret == 0)
172
+       ret = avcodec_receive_frame(codecContext,frameIn);
173
+   if(ret<0)
174
+   {
175
+       LOG(LOG_ERROR,"not decoded audio:"<<ret);
176
+   }
177
+   else
178
+   {
179
+       maxLen = resampleFrameToS16(curTail);
180
+   }
181
+#elif HAVE_AVCODEC_DECODE_AUDIO4
182
    av_frame_unref(frameIn);
183
    int frameOk=0;
184
    int ret=avcodec_decode_audio4(codecContext, frameIn, &frameOk, pkt);
185
@@ -872,12 +980,20 @@
186
    LOG_CALL(_("FFMpeg found ") << formatCtx->nb_streams << _(" streams"));
187
    for(uint32_t i=0;i<formatCtx->nb_streams;i++)
188
    {
189
+#if LIBAVFORMAT_VERSION_MAJOR > 56
190
+       if(formatCtx->streams[i]->codecpar->codec_type==AVMEDIA_TYPE_VIDEO && videoFound==false)
191
+#else
192
        if(formatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO && videoFound==false)
193
+#endif
194
        {
195
            videoFound=true;
196
            videoIndex=(int32_t)i;
197
        }
198
+#if LIBAVFORMAT_VERSION_MAJOR > 56
199
+       else if(formatCtx->streams[i]->codecpar->codec_type==AVMEDIA_TYPE_AUDIO && formatCtx->streams[i]->codecpar->codec_id!=CODEC_ID_NONE && audioFound==false)
200
+#else
201
lightspark.tar.xz/src/backends/decoder.h Changed
25
 
1
@@ -190,7 +190,11 @@
2
    /*
3
       Specialized constructor used by FFMpegStreamDecoder
4
    */
5
+#if LIBAVFORMAT_VERSION_MAJOR > 56
6
+   FFMpegVideoDecoder(AVCodecID codecID, double frameRateHint);
7
+#else
8
    FFMpegVideoDecoder(AVCodecContext* codecContext, double frameRateHint);
9
+#endif
10
    ~FFMpegVideoDecoder();
11
    /*
12
       Specialized decoding used by FFMpegStreamDecoder
13
@@ -314,7 +318,11 @@
14
    /*
15
       Specialized constructor used by FFMpegStreamDecoder
16
    */
17
+#if LIBAVFORMAT_VERSION_MAJOR > 56
18
+   FFMpegAudioDecoder(AVCodecID codecID);
19
+#else
20
    FFMpegAudioDecoder(AVCodecContext* codecContext);
21
+#endif
22
    ~FFMpegAudioDecoder();
23
    /*
24
       Specialized decoding used by FFMpegStreamDecoder
25
lightspark.tar.xz/src/parsing/tags.cpp Changed
13
 
1
@@ -261,7 +261,10 @@
2
        LOG(LOG_ERROR,_("Error while reading tag ") << h.getTagType() << _(". Size=") << actualLen << _(" expected: ") << expectedLen);
3
        throw ParseException("Malformed SWF file");
4
    }
5
-   root->loaderInfo->setBytesLoaded(f.tellg());
6
+   
7
+   // don't set loaded bytes if we are at the end of the file (this is done in RootMovieClip::initFrame() )
8
+   if (root->loaderInfo->getBytesTotal() != f.tellg())
9
+       root->loaderInfo->setBytesLoaded(f.tellg());
10
    
11
    return ret;
12
 }
13
lightspark.tar.xz/src/scripting/abc_opcodes.cpp Changed
40
 
1
@@ -342,7 +342,7 @@
2
            tmpcls = tmpcls->super;
3
        }   
4
    }
5
-   if(!o.isNull() && !(obj->classdef && obj->classdef->isProxy))
6
+   if(!o.isNull() && !obj->is<Proxy>())
7
    {
8
        o->incRef();
9
        callImpl(th, o.getPtr(), obj, args, m, called_mi, keepReturn);
10
@@ -350,7 +350,7 @@
11
    else
12
    {
13
        //If the object is a Proxy subclass, try to invoke callProperty
14
-       if(obj->classdef && obj->classdef->isProxy)
15
+       if(obj->is<Proxy>())
16
        {
17
            //Check if there is a custom caller defined, skipping implementation to avoid recursive calls
18
            multiname callPropertyName(NULL);
19
@@ -2157,7 +2157,7 @@
20
        targetobject = xmlObj;
21
        xmlObj->getDescendantsByQName(name->normalizedName(th->context->root->getSystemState()), ns_uri,name->isAttribute, ret);
22
    }
23
-   else if(obj->getClass()->isProxy)
24
+   else if(obj->is<Proxy>())
25
    {
26
        multiname callPropertyName(NULL);
27
        callPropertyName.name_type=multiname::NAME_STRING;
28
@@ -2591,9 +2591,9 @@
29
 
30
 void ABCVm::callImpl(call_context* th, ASObject* f, ASObject* obj, ASObject** args, int m, method_info** called_mi, bool keepReturn)
31
 {
32
-   if(f->is<Function>())
33
+   if(f->is<IFunction>())
34
    {
35
-       IFunction* func=f->as<Function>();
36
+       IFunction* func=f->as<IFunction>();
37
        ASObject* ret=func->call(obj,args,m);
38
        //call getMethodInfo only after the call, so it's updated
39
        if(called_mi)
40
lightspark.tar.xz/src/scripting/class.cpp Changed
9
 
1
@@ -64,6 +64,7 @@
2
    this->getSystemState()->customClasses.insert(this).second;
3
    assert(ret);
4
    isReusable = true;
5
+   subtype = SUBTYPE_INHERIT;
6
 }
7
 
8
 ASObject* Class_inherit::getInstance(bool construct, ASObject* const* args, const unsigned int argslen, Class_base* realClass)
9
lightspark.tar.xz/src/scripting/flash/utils/Proxy.cpp Changed
9
 
1
@@ -38,7 +38,6 @@
2
 void Proxy::sinit(Class_base* c)
3
 {
4
    CLASS_SETUP_NO_CONSTRUCTOR(c, ASObject,CLASS_DYNAMIC_NOT_FINAL);
5
-   c->isProxy = true;
6
    c->setDeclaredMethodByQName("isAttribute","",Class<IFunction>::getFunction(c->getSystemState(),_isAttribute),NORMAL_METHOD,true);
7
 }
8
 
9
lightspark.tar.xz/src/scripting/flash/utils/Proxy.h Changed
10
 
1
@@ -32,7 +32,7 @@
2
 private:
3
    bool proxyconstructionCompleted;
4
 public:
5
-   Proxy(Class_base* c):ASObject(c),proxyconstructionCompleted(false){}
6
+   Proxy(Class_base* c):ASObject(c,T_OBJECT,SUBTYPE_PROXY),proxyconstructionCompleted(false){}
7
    static void sinit(Class_base*);
8
    static void buildTraits(ASObject* o);
9
 // ASFUNCTION(_constructor);
10
lightspark.tar.xz/src/scripting/toplevel/Date.cpp Changed
10
 
1
@@ -27,7 +27,7 @@
2
 using namespace std;
3
 using namespace lightspark;
4
 
5
-Date::Date(Class_base* c):ASObject(c),extrayears(0), nan(false), datetime(NULL),datetimeUTC(NULL)
6
+Date::Date(Class_base* c):ASObject(c,T_OBJECT,SUBTYPE_DATE),extrayears(0), nan(false), datetime(NULL),datetimeUTC(NULL)
7
 {
8
 }
9
 
10
lightspark.tar.xz/src/scripting/toplevel/RegExp.cpp Changed
16
 
1
@@ -23,12 +23,12 @@
2
 using namespace std;
3
 using namespace lightspark;
4
 
5
-RegExp::RegExp(Class_base* c):ASObject(c),dotall(false),global(false),ignoreCase(false),
6
+RegExp::RegExp(Class_base* c):ASObject(c,T_OBJECT,SUBTYPE_REGEXP),dotall(false),global(false),ignoreCase(false),
7
    extended(false),multiline(false),lastIndex(0)
8
 {
9
 }
10
 
11
-RegExp::RegExp(Class_base* c, const tiny_string& _re):ASObject(c),dotall(false),global(false),ignoreCase(false),
12
+RegExp::RegExp(Class_base* c, const tiny_string& _re):ASObject(c,T_OBJECT,SUBTYPE_REGEXP),dotall(false),global(false),ignoreCase(false),
13
    extended(false),multiline(false),lastIndex(0),source(_re)
14
 {
15
 }
16
lightspark.tar.xz/src/scripting/toplevel/XML.cpp Changed
21
 
1
@@ -44,16 +44,16 @@
2
    prettyPrinting = true;
3
 }
4
 
5
-XML::XML(Class_base* c):ASObject(c),parentNode(0),nodetype((pugi::xml_node_type)0),isAttribute(false),constructed(false)
6
+XML::XML(Class_base* c):ASObject(c,T_OBJECT,SUBTYPE_XML),parentNode(0),nodetype((pugi::xml_node_type)0),isAttribute(false),constructed(false)
7
 {
8
 }
9
 
10
-XML::XML(Class_base* c, const std::string &str):ASObject(c),parentNode(0),nodetype((pugi::xml_node_type)0),isAttribute(false),constructed(false)
11
+XML::XML(Class_base* c, const std::string &str):ASObject(c,T_OBJECT,SUBTYPE_XML),parentNode(0),nodetype((pugi::xml_node_type)0),isAttribute(false),constructed(false)
12
 {
13
    createTree(buildFromString(str, getParseMode()),false);
14
 }
15
 
16
-XML::XML(Class_base* c, const pugi::xml_node& _n, XML* parent, bool fromXMLList):ASObject(c),parentNode(0),nodetype((pugi::xml_node_type)0),isAttribute(false),constructed(false)
17
+XML::XML(Class_base* c, const pugi::xml_node& _n, XML* parent, bool fromXMLList):ASObject(c,T_OBJECT,SUBTYPE_XML),parentNode(0),nodetype((pugi::xml_node_type)0),isAttribute(false),constructed(false)
18
 {
19
    if (parent)
20
    {
21
lightspark.tar.xz/src/scripting/toplevel/XMLList.cpp Changed
33
 
1
@@ -48,26 +48,26 @@
2
        return NULL; \
3
    }
4
 
5
-XMLList::XMLList(Class_base* c):ASObject(c),nodes(c->memoryAccount),constructed(false),targetobject(NULL),targetproperty(c->memoryAccount)
6
+XMLList::XMLList(Class_base* c):ASObject(c,T_OBJECT,SUBTYPE_XMLLIST),nodes(c->memoryAccount),constructed(false),targetobject(NULL),targetproperty(c->memoryAccount)
7
 {
8
 }
9
 
10
-XMLList::XMLList(Class_base* cb,bool c):ASObject(cb),nodes(cb->memoryAccount),constructed(c),targetobject(NULL),targetproperty(cb->memoryAccount)
11
+XMLList::XMLList(Class_base* cb,bool c):ASObject(cb,T_OBJECT,SUBTYPE_XMLLIST),nodes(cb->memoryAccount),constructed(c),targetobject(NULL),targetproperty(cb->memoryAccount)
12
 {
13
    assert(c);
14
 }
15
 
16
-XMLList::XMLList(Class_base* c, const std::string& str):ASObject(c),nodes(c->memoryAccount),constructed(true),targetobject(NULL),targetproperty(c->memoryAccount)
17
+XMLList::XMLList(Class_base* c, const std::string& str):ASObject(c,T_OBJECT,SUBTYPE_XMLLIST),nodes(c->memoryAccount),constructed(true),targetobject(NULL),targetproperty(c->memoryAccount)
18
 {
19
    buildFromString(str);
20
 }
21
 
22
 XMLList::XMLList(Class_base* c, const XML::XMLVector& r):
23
-   ASObject(c),nodes(r.begin(),r.end(),c->memoryAccount),constructed(true),targetobject(NULL),targetproperty(c->memoryAccount)
24
+   ASObject(c,T_OBJECT,SUBTYPE_XMLLIST),nodes(r.begin(),r.end(),c->memoryAccount),constructed(true),targetobject(NULL),targetproperty(c->memoryAccount)
25
 {
26
 }
27
 XMLList::XMLList(Class_base* c, const XML::XMLVector& r, XMLList *targetobject, const multiname &targetproperty):
28
-   ASObject(c),nodes(r.begin(),r.end(),c->memoryAccount),constructed(true),targetobject(targetobject),targetproperty(c->memoryAccount)
29
+   ASObject(c,T_OBJECT,SUBTYPE_XMLLIST),nodes(r.begin(),r.end(),c->memoryAccount),constructed(true),targetobject(targetobject),targetproperty(c->memoryAccount)
30
 {
31
    if (targetobject)
32
        targetobject->incRef();
33
lightspark.tar.xz/src/scripting/toplevel/toplevel.cpp Changed
52
 
1
@@ -781,14 +781,14 @@
2
 
3
 Class_base::Class_base(const QName& name, MemoryAccount* m):ASObject(Class_object::getClass(getSys()),T_CLASS),protected_ns(getSys(),"",NAMESPACE),constructor(NULL),
4
    borrowedVariables(m),
5
-   context(NULL),class_name(name),memoryAccount(m),length(1),class_index(-1),isFinal(false),isSealed(false),isInterface(false),isReusable(false),isProxy(false),use_protected(false)
6
+   context(NULL),class_name(name),memoryAccount(m),length(1),class_index(-1),isFinal(false),isSealed(false),isInterface(false),isReusable(false),use_protected(false)
7
 {
8
    setConstant();
9
 }
10
 
11
 Class_base::Class_base(const Class_object*):ASObject((MemoryAccount*)NULL),protected_ns(getSys(),BUILTIN_STRINGS::EMPTY,NAMESPACE),constructor(NULL),
12
    borrowedVariables(NULL),
13
-   context(NULL),class_name(BUILTIN_STRINGS::STRING_CLASS,BUILTIN_STRINGS::EMPTY),memoryAccount(NULL),length(1),class_index(-1),isFinal(false),isSealed(false),isInterface(false),isReusable(false),isProxy(false),use_protected(false)
14
+   context(NULL),class_name(BUILTIN_STRINGS::STRING_CLASS,BUILTIN_STRINGS::EMPTY),memoryAccount(NULL),length(1),class_index(-1),isFinal(false),isSealed(false),isInterface(false),isReusable(false),use_protected(false)
15
 {
16
    setConstant();
17
    type=T_CLASS;
18
@@ -876,7 +876,6 @@
19
 void Class_base::setSuper(Ref<Class_base> super_)
20
 {
21
    assert(!super);
22
-   isProxy = super_->isProxy;
23
    super = super_;
24
    copyBorrowedTraitsFromSuper();
25
 }
26
@@ -1020,7 +1019,6 @@
27
    isFinal = false;
28
    isSealed = false;
29
    isInterface = false;
30
-   isProxy = false;
31
    use_protected = false;
32
 }
33
 
34
@@ -2519,7 +2517,7 @@
35
 }
36
 
37
 
38
-ObjectConstructor::ObjectConstructor(Class_base* c,uint32_t length) : ASObject(c),_length(length)
39
+ObjectConstructor::ObjectConstructor(Class_base* c,uint32_t length) : ASObject(c,T_OBJECT,SUBTYPE_OBJECTCONSTRUCTOR),_length(length)
40
 {
41
    Class<ASObject>::getRef(c->getSystemState())->prototype->incRef();
42
    this->prototype = Class<ASObject>::getRef(c->getSystemState())->prototype.getPtr();
43
@@ -2560,7 +2558,7 @@
44
    return prevPrototype->getObj()->getVariableByMultiname(name, opt);
45
 }
46
 
47
-Function_object::Function_object(Class_base* c, _R<ASObject> p) : ASObject(c), functionPrototype(p)
48
+Function_object::Function_object(Class_base* c, _R<ASObject> p) : ASObject(c,T_OBJECT,SUBTYPE_FUNCTIONOBJECT), functionPrototype(p)
49
 {
50
    traitsInitialized = true;
51
    constructIndicator = true;
52
lightspark.tar.xz/src/scripting/toplevel/toplevel.h Changed
10
 
1
@@ -213,8 +213,6 @@
2
    
3
    // indicates if objects can be reused after they have lost their last reference
4
    bool isReusable:1;
5
-   // this is only set to true for Proxy and Proxy-derived classes
6
-   bool isProxy:1;
7
 private:
8
    //TODO: move in Class_inherit
9
    bool use_protected:1;
10
lightspark.tar.xz/src/swf.cpp Changed
19
 
1
@@ -1519,7 +1519,6 @@
2
    if (root->loaderInfo->getBytesLoaded() != root->loaderInfo->getBytesTotal())
3
    {
4
        LOG(LOG_NOT_IMPLEMENTED,"End of parsing, bytesLoaded != bytesTotal:"<< root->loaderInfo->getBytesLoaded()<<"/"<<root->loaderInfo->getBytesTotal());
5
-       root->loaderInfo->setBytesLoaded(root->loaderInfo->getBytesTotal());
6
    }
7
    LOG(LOG_TRACE,_("End of parsing"));
8
 }
9
@@ -2010,6 +2009,9 @@
10
        vm->buildClassAndBindTag(it->first.raw_buf(), it->second);
11
 
12
    MovieClip::initFrame();
13
+   
14
+   if (finishedLoading && (loaderInfo->getBytesTotal() != loaderInfo->getBytesLoaded()))
15
+       loaderInfo->setBytesLoaded(loaderInfo->getBytesTotal());
16
 }
17
 
18
 /* This is run in vm's thread context */
19
lightspark.tar.xz/src/swftypes.h Changed
10
 
1
@@ -46,6 +46,8 @@
2
 
3
 enum SWFOBJECT_TYPE { T_OBJECT=0, T_INTEGER=1, T_NUMBER=2, T_FUNCTION=3, T_UNDEFINED=4, T_NULL=5, T_STRING=6, 
4
    /*UNUSED=7,*/ T_BOOLEAN=8, T_ARRAY=9, T_CLASS=10, T_QNAME=11, T_NAMESPACE=12, T_UINTEGER=13, T_PROXY=14, T_TEMPLATE=15};
5
+// this is used to avoid calls to dynamic_cast when testing for some classes
6
+enum CLASS_SUBTYPE { SUBTYPE_NOT_SET, SUBTYPE_PROXY, SUBTYPE_REGEXP, SUBTYPE_XML, SUBTYPE_XMLLIST,SUBTYPE_DATE, SUBTYPE_INHERIT, SUBTYPE_OBJECTCONSTRUCTOR,SUBTYPE_FUNCTIONOBJECT };
7
 
8
 enum STACK_TYPE{STACK_NONE=0,STACK_OBJECT,STACK_INT,STACK_UINT,STACK_NUMBER,STACK_BOOLEAN};
9
 inline std::ostream& operator<<(std::ostream& s, const STACK_TYPE& st)
10