2011-10-23 17:48:10 -07:00
|
|
|
#include "pyc_object.h"
|
|
|
|
#include "pyc_module.h"
|
|
|
|
#include "pyc_numeric.h"
|
|
|
|
#include "pyc_code.h"
|
2009-07-24 08:35:21 +00:00
|
|
|
#include "data.h"
|
2011-10-23 17:48:10 -07:00
|
|
|
#include <cstdio>
|
2009-07-24 08:35:21 +00:00
|
|
|
|
2009-07-24 21:15:51 +00:00
|
|
|
PycRef<PycObject> Pyc_NULL = (PycObject*)0;
|
|
|
|
PycRef<PycObject> Pyc_None = new PycObject(PycObject::TYPE_NONE);
|
|
|
|
PycRef<PycObject> Pyc_Ellipsis = new PycObject(PycObject::TYPE_ELLIPSIS);
|
|
|
|
PycRef<PycObject> Pyc_StopIteration = new PycObject(PycObject::TYPE_STOPITER);
|
|
|
|
PycRef<PycObject> Pyc_False = new PycObject(PycObject::TYPE_FALSE);
|
|
|
|
PycRef<PycObject> Pyc_True = new PycObject(PycObject::TYPE_TRUE);
|
2009-07-24 08:35:21 +00:00
|
|
|
|
2009-07-24 21:15:51 +00:00
|
|
|
PycRef<PycObject> CreateObject(int type)
|
2009-07-24 08:35:21 +00:00
|
|
|
{
|
|
|
|
switch (type) {
|
|
|
|
case PycObject::TYPE_NULL:
|
2009-07-25 00:43:46 +00:00
|
|
|
return Pyc_NULL;
|
2009-07-24 08:35:21 +00:00
|
|
|
case PycObject::TYPE_NONE:
|
|
|
|
return Pyc_None;
|
|
|
|
case PycObject::TYPE_FALSE:
|
2009-07-25 00:43:46 +00:00
|
|
|
return Pyc_False;
|
2009-07-24 08:35:21 +00:00
|
|
|
case PycObject::TYPE_TRUE:
|
2009-07-25 00:43:46 +00:00
|
|
|
return Pyc_True;
|
2009-07-24 08:35:21 +00:00
|
|
|
case PycObject::TYPE_STOPITER:
|
|
|
|
return Pyc_StopIteration;
|
|
|
|
case PycObject::TYPE_ELLIPSIS:
|
|
|
|
return Pyc_Ellipsis;
|
|
|
|
case PycObject::TYPE_INT:
|
|
|
|
return new PycInt();
|
2009-07-25 02:41:15 +00:00
|
|
|
case PycObject::TYPE_INT64:
|
2014-01-21 00:07:34 -08:00
|
|
|
return new PycLong(type);
|
2009-07-24 08:35:21 +00:00
|
|
|
case PycObject::TYPE_FLOAT:
|
|
|
|
return new PycFloat();
|
2009-07-25 02:41:15 +00:00
|
|
|
case PycObject::TYPE_BINARY_FLOAT:
|
|
|
|
return new PycCFloat();
|
|
|
|
case PycObject::TYPE_COMPLEX:
|
|
|
|
return new PycComplex();
|
|
|
|
case PycObject::TYPE_BINARY_COMPLEX:
|
|
|
|
return new PycCComplex();
|
2009-07-24 08:35:21 +00:00
|
|
|
case PycObject::TYPE_LONG:
|
|
|
|
return new PycLong();
|
|
|
|
case PycObject::TYPE_STRING:
|
|
|
|
case PycObject::TYPE_INTERNED:
|
|
|
|
case PycObject::TYPE_STRINGREF:
|
2014-01-21 00:07:34 -08:00
|
|
|
case PycObject::TYPE_UNICODE:
|
|
|
|
case PycObject::TYPE_ASCII:
|
|
|
|
case PycObject::TYPE_ASCII_INTERNED:
|
|
|
|
case PycObject::TYPE_SHORT_ASCII:
|
|
|
|
case PycObject::TYPE_SHORT_ASCII_INTERNED:
|
|
|
|
return new PycString(type);
|
2009-07-24 08:35:21 +00:00
|
|
|
case PycObject::TYPE_TUPLE:
|
2014-01-21 00:07:34 -08:00
|
|
|
case PycObject::TYPE_SMALL_TUPLE:
|
|
|
|
return new PycTuple(type);
|
2009-07-24 08:35:21 +00:00
|
|
|
case PycObject::TYPE_LIST:
|
|
|
|
return new PycList();
|
2009-07-24 21:15:51 +00:00
|
|
|
case PycObject::TYPE_DICT:
|
|
|
|
return new PycDict();
|
2009-07-24 08:35:21 +00:00
|
|
|
case PycObject::TYPE_CODE:
|
|
|
|
case PycObject::TYPE_CODE2:
|
|
|
|
return new PycCode();
|
2009-07-25 02:41:15 +00:00
|
|
|
case PycObject::TYPE_SET:
|
|
|
|
case PycObject::TYPE_FROZENSET:
|
2014-01-21 00:07:34 -08:00
|
|
|
return new PycSet(type);
|
2009-07-24 08:35:21 +00:00
|
|
|
default:
|
|
|
|
fprintf(stderr, "CreateObject: Got unsupported type 0x%X\n", type);
|
2012-05-26 13:50:23 -07:00
|
|
|
return Pyc_NULL;
|
2009-07-24 08:35:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-07-24 21:15:51 +00:00
|
|
|
PycRef<PycObject> LoadObject(PycData* stream, PycModule* mod)
|
2009-07-24 08:35:21 +00:00
|
|
|
{
|
2014-01-21 00:07:34 -08:00
|
|
|
int type = stream->getByte();
|
|
|
|
PycRef<PycObject> obj;
|
|
|
|
|
|
|
|
if (type == PycObject::TYPE_OBREF) {
|
|
|
|
int index = stream->get32();
|
|
|
|
obj = mod->getRef(index);
|
|
|
|
} else {
|
|
|
|
obj = CreateObject(type & 0x7F);
|
|
|
|
if (obj != Pyc_NULL) {
|
|
|
|
if (type & 0x80)
|
|
|
|
mod->refObject(obj);
|
|
|
|
obj->load(stream, mod);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-07-24 08:35:21 +00:00
|
|
|
return obj;
|
|
|
|
}
|