File: dynobj_manager.cpp

package info (click to toggle)
scummvm 2.9.1%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 450,580 kB
  • sloc: cpp: 4,299,825; asm: 28,322; python: 12,901; sh: 11,302; java: 9,289; xml: 7,895; perl: 2,639; ansic: 2,465; yacc: 1,670; javascript: 1,020; makefile: 933; lex: 578; awk: 275; objc: 82; sed: 11; php: 1
file content (154 lines) | stat: -rw-r--r-- 4,811 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/* ScummVM - Graphic Adventure Engine
 *
 * ScummVM is the legal property of its developers, whose names
 * are too numerous to list here. Please refer to the COPYRIGHT
 * file distributed with this source distribution.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

//=============================================================================
//
// C-Script run-time interpreter (c) 2001 Chris Jones
//
// You must DISABLE OPTIMIZATIONS AND REGISTER VARIABLES in your compiler
// when compiling this, or strange results can happen.
//
// There is a problem with importing functions on 16-bit compilers: the
// script system assumes that all parameters are passed as 4 bytes, which
// ints are not on 16-bit systems. Be sure to define all parameters as longs,
// or join the 21st century and switch to DJGPP or Visual C++.
//
//=============================================================================

#include "ags/engine/ac/dynobj/dynobj_manager.h"
#include "ags/shared/core/platform.h"
#include "ags/engine/ac/dynobj/managed_object_pool.h"
#include "ags/shared/debugging/out.h"
#include "ags/shared/script/cc_common.h"
#include "ags/shared/script/cc_internal.h"
#include "ags/shared/util/stream.h"
#include "ags/globals.h"

namespace AGS3 {

using namespace AGS::Shared;

// register a memory handle for the object and allow script
// pointers to point to it
int32_t ccRegisterManagedObject(void *object, IScriptObject *callback, ScriptValueType obj_type) {
	int32_t handl = _GP(pool).AddObject(object, callback, obj_type);

	ManagedObjectLog("Register managed object type '%s' handle=%d addr=%08X",
	                 ((callback == NULL) ? "(unknown)" : callback->GetType()), handl, object);

	return handl;
}

// register a de-serialized object
int32_t ccRegisterUnserializedObject(int index, void *object, IScriptObject *callback, ScriptValueType obj_type) {
	return _GP(pool).AddUnserializedObject(object, callback, obj_type, index);
}

// unregister a particular object
int ccUnRegisterManagedObject(void *object) {
	return _GP(pool).RemoveObject(object);
}

// remove all registered objects
void ccUnregisterAllObjects() {
	_GP(pool).reset();
}

// serialize all objects to disk
void ccSerializeAllObjects(Stream *out) {
	_GP(pool).WriteToDisk(out);
}

// un-serialise all objects (will remove all currently registered ones)
int ccUnserializeAllObjects(Stream *in, ICCObjectCollectionReader *callback) {
	return _GP(pool).ReadFromDisk(in, callback);
}

// dispose the object if RefCount==0
void ccAttemptDisposeObject(int32_t handle) {
	_GP(pool).CheckDispose(handle);
}

// translate between object handles and memory addresses
int32_t ccGetObjectHandleFromAddress(void *address) {
	// set to null
	if (address == nullptr)
		return 0;

	int32_t handl = _GP(pool).AddressToHandle(address);

	ManagedObjectLog("Line %d WritePtr: %08X to %d", _G(currentline), address, handl);

	if (handl == 0) {
		cc_error("Pointer cast failure: the object being pointed to is not in the managed object pool");
		return -1;
	}
	return handl;
}

void *ccGetObjectAddressFromHandle(int32_t handle) {
	if (handle == 0) {
		return nullptr;
	}
	void *addr = _GP(pool).HandleToAddress(handle);

	ManagedObjectLog("Line %d ReadPtr: %d to %08X", _G(currentline), handle, addr);

	if (addr == nullptr) {
		cc_error("Error retrieving pointer: invalid handle %d", handle);
		return nullptr;
	}
	return addr;
}

ScriptValueType ccGetObjectAddressAndManagerFromHandle(int32_t handle, void *&object, IScriptObject *&manager) {
	if (handle == 0) {
		object = nullptr;
		manager = nullptr;
		return kScValUndefined;
	}
	ScriptValueType obj_type = _GP(pool).HandleToAddressAndManager(handle, object, manager);
	if (obj_type == kScValUndefined) {
		cc_error("Error retrieving pointer: invalid handle %d", handle);
	}
	return obj_type;
}

int ccAddObjectReference(int32_t handle) {
	if (handle == 0)
		return 0;

	return _GP(pool).AddRef(handle);
}

int ccReleaseObjectReference(int32_t handle) {
	if (handle == 0)
		return 0;

	if (_GP(pool).HandleToAddress(handle) == nullptr) {
		cc_error("Error releasing pointer: invalid handle %d", handle);
		return -1;
	}

	return _GP(pool).SubRef(handle);
}

} // namespace AGS3