コード例 #1
0
bool SQClass::NewSlot(SQSharedState *ss,const SQObjectPtr &key,const SQObjectPtr &val,bool bstatic)
{
	SQObjectPtr temp;
	if(_locked) 
		return false; //the class already has an instance so cannot be modified
	if(_members->Get(key,temp) && _isfield(temp)) //overrides the default value
	{
		_defaultvalues[_member_idx(temp)].val = val;
		return true;
	}
	if(type(val) == OT_CLOSURE || type(val) == OT_NATIVECLOSURE || bstatic) {
		SQInteger mmidx;
		if((type(val) == OT_CLOSURE || type(val) == OT_NATIVECLOSURE) && 
			(mmidx = ss->GetMetaMethodIdxByName(key)) != -1) {
			_metamethods[mmidx] = val;
		} 
		else {
			if(type(temp) == OT_NULL) {
				SQClassMember m;
				m.val = val;
				_members->NewSlot(key,SQObjectPtr(_make_method_idx(_methods.size())));
				_methods.push_back(m);
			}
			else {
				_methods[_member_idx(temp)].val = val;
			}
		}
		return true;
	}
	SQClassMember m;
	m.val = val;
	_members->NewSlot(key,SQObjectPtr(_make_field_idx(_defaultvalues.size())));
	_defaultvalues.push_back(m);
	return true;
}
コード例 #2
0
ファイル: sqclass.cpp プロジェクト: q4a/scourge
bool SQClass::GetAttributes( const SQObjectPtr &key, SQObjectPtr &outval ) {
	SQObjectPtr idx;
	if ( _members->Get( key, idx ) ) {
		outval = ( _isfield( idx ) ? _defaultvalues[_member_idx( idx )].attrs : _methods[_member_idx( idx )].attrs );
		return true;
	}
	return false;
}
コード例 #3
0
ファイル: sqclass.cpp プロジェクト: q4a/scourge
bool SQClass::SetAttributes( const SQObjectPtr &key, const SQObjectPtr &val ) {
	SQObjectPtr idx;
	if ( _members->Get( key, idx ) ) {
		if ( _isfield( idx ) )
			_defaultvalues[_member_idx( idx )].attrs = val;
		else
			_methods[_member_idx( idx )].attrs = val;
		return true;
	}
	return false;
}
コード例 #4
0
ファイル: sqclass.cpp プロジェクト: q4a/scourge
SQInteger SQClass::Next( const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval ) {
	SQObjectPtr oval;
	SQInteger idx = _members->Next( false, refpos, outkey, oval );
	if ( idx != -1 ) {
		if ( _ismethod( oval ) ) {
			outval = _methods[_member_idx( oval )].val;
		} else {
			SQObjectPtr &o = _defaultvalues[_member_idx( oval )].val;
			outval = _realval( o );
		}
	}
	return idx;
}
コード例 #5
0
ファイル: sqclass.cpp プロジェクト: Disinterpreter/IV-Network
bool SQClass::NewSlot(SQSharedState *ss,const SQObjectPtr &key,const SQObjectPtr &val,bool bstatic)
{
	SQObjectPtr temp;
	bool belongs_to_static_table = type(val) == OT_CLOSURE || type(val) == OT_NATIVECLOSURE || bstatic;
	if(_locked && !belongs_to_static_table) 
		return false; //the class already has an instance so cannot be modified
	if(_members->Get(key,temp) && _isfield(temp)) //overrides the default value
	{
		_defaultvalues[_member_idx(temp)].val = val;
		return true;
	}
	if(belongs_to_static_table) {
		SQInteger mmidx;
		if((type(val) == OT_CLOSURE || type(val) == OT_NATIVECLOSURE) && 
			(mmidx = ss->GetMetaMethodIdxByName(key)) != -1) {
			_metamethods[mmidx] = val;
		} 
		else {
			SQObjectPtr theval = val;
			if(_base && type(val) == OT_CLOSURE) {
				theval = _closure(val)->Clone();
				_closure(theval)->_base = _base;
				__ObjAddRef(_base); //ref for the closure
			}
			if(type(temp) == OT_NULL) {
				bool isconstructor;
				SQVM::IsEqual(ss->_constructoridx, key, isconstructor);
				if(isconstructor) {
					_constructoridx = (SQInteger)_methods.size();
				}
				SQClassMember m;
				m.val = theval;
				_members->NewSlot(key,SQObjectPtr(_make_method_idx(_methods.size())));
				_methods.push_back(m);
			}
			else {
				_methods[_member_idx(temp)].val = theval;
			}
		}
		return true;
	}
	SQClassMember m;
	m.val = val;
	_members->NewSlot(key,SQObjectPtr(_make_field_idx(_defaultvalues.size())));
	_defaultvalues.push_back(m);
	return true;
}