09c916e585
I know this is bad form, but we need this for performance. Right now, o_toBoolean() isn't even being called. When D825610 lands it will be and will be a small perf regression. If this situation gets bad, then we should revisit it, but since only one class is overriding it for now, this should be ok. (I don't understand C++, did I do the virtual thing right? I had to declare them to make the linker work)
78 linhas
2.6 KiB
C++
78 linhas
2.6 KiB
C++
/*
|
|
+----------------------------------------------------------------------+
|
|
| HipHop for PHP |
|
|
+----------------------------------------------------------------------+
|
|
| Copyright (c) 2010-2013 Facebook, Inc. (http://www.facebook.com) |
|
|
+----------------------------------------------------------------------+
|
|
| This source file is subject to version 3.01 of the PHP license, |
|
|
| that is bundled with this package in the file LICENSE, and is |
|
|
| available through the world-wide-web at the following url: |
|
|
| http://www.php.net/license/3_01.txt |
|
|
| If you did not receive a copy of the PHP license and are unable to |
|
|
| obtain it through the world-wide-web, please send a note to |
|
|
| license@php.net so we can mail you a copy immediately. |
|
|
+----------------------------------------------------------------------+
|
|
*/
|
|
|
|
#include "hphp/runtime/base/resource_data.h"
|
|
#include "hphp/runtime/base/complex_types.h"
|
|
#include "hphp/runtime/base/variable_serializer.h"
|
|
|
|
#include "hphp/system/systemlib.h"
|
|
|
|
namespace HPHP {
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
// resources have a separate id space
|
|
static IMPLEMENT_THREAD_LOCAL_NO_CHECK_HOT(int, os_max_resource_id);
|
|
|
|
int ResourceData::GetMaxResourceId() {
|
|
return *(os_max_resource_id.getCheck());
|
|
}
|
|
|
|
ResourceData::ResourceData()
|
|
: Instance(SystemLib::s_resourceClass, true) {
|
|
assert(!m_cls->callsCustomInstanceInit());
|
|
ObjectData::setAttributes(ObjectData::CallToImpl);
|
|
int &pmax = *os_max_resource_id;
|
|
if (pmax < 3) pmax = 3; // reserving 1, 2, 3 for STDIN, STDOUT, STDERR
|
|
o_id = ++pmax;
|
|
}
|
|
|
|
void ResourceData::o_setId(int id) {
|
|
assert(id >= 1 && id <= 3); // only for STDIN, STDOUT, STDERR
|
|
int &pmax = *os_max_resource_id;
|
|
if (o_id != id) {
|
|
if (o_id == pmax) --pmax;
|
|
o_id = id;
|
|
}
|
|
}
|
|
|
|
ResourceData::~ResourceData() {
|
|
int &pmax = *os_max_resource_id;
|
|
if (o_id && o_id == pmax) {
|
|
--pmax;
|
|
}
|
|
o_id = -1;
|
|
}
|
|
|
|
String ResourceData::t___tostring() {
|
|
return String("Resource id #") + String(o_getId());
|
|
}
|
|
|
|
void ResourceData::serializeImpl(VariableSerializer *serializer) const {
|
|
String saveName;
|
|
int saveId;
|
|
serializer->getResourceInfo(saveName, saveId);
|
|
serializer->setResourceInfo(o_getResourceName(), o_getResourceId());
|
|
o_toArray().serialize(serializer);
|
|
serializer->setResourceInfo(saveName, saveId);
|
|
}
|
|
|
|
CStrRef ResourceData::o_getResourceName() const {
|
|
return o_getClassName();
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
}
|