blob: d43d9cf603162f3d20e22c298a38dd8ecedce379 [file] [log] [blame]
Logancf3e5212010-12-29 01:44:55 +08001/*
2 * copyright 2010, the android open source project
3 *
4 * licensed under the apache license, version 2.0 (the "license");
5 * you may not use this file except in compliance with the license.
6 * you may obtain a copy of the license at
7 *
8 * http://www.apache.org/licenses/license-2.0
9 *
10 * unless required by applicable law or agreed to in writing, software
11 * distributed under the license is distributed on an "as is" basis,
12 * without warranties or conditions of any kind, either express or implied.
13 * see the license for the specific language governing permissions and
14 * limitations under the license.
15 */
16
Logancf3e5212010-12-29 01:44:55 +080017#include "Script.h"
18
Logan35849002011-01-15 07:30:43 +080019#include "Config.h"
20
Loganf7f0ac52011-01-07 03:53:43 +080021#include "CacheReader.h"
Logan89eb47f2011-01-07 10:45:16 +080022#include "CacheWriter.h"
Logan42598052011-01-26 22:41:13 +080023#include "ContextManager.h"
Logan4dcd6792011-02-28 05:12:00 +080024#include "DebugHelper.h"
Logan04329712011-01-06 06:10:57 +080025#include "FileHandle.h"
Logancf3e5212010-12-29 01:44:55 +080026#include "ScriptCompiled.h"
Logan9a5f8682011-01-07 06:09:57 +080027#include "ScriptCached.h"
28#include "Sha1Helper.h"
Logan474cbd22011-01-31 01:47:44 +080029#include "SourceInfo.h"
Logancf3e5212010-12-29 01:44:55 +080030
Logan89eb47f2011-01-07 10:45:16 +080031#include <errno.h>
Logan474cbd22011-01-31 01:47:44 +080032#include <sys/stat.h>
33#include <sys/types.h>
Logancf3e5212010-12-29 01:44:55 +080034
Logan89eb47f2011-01-07 10:45:16 +080035#include <new>
36#include <string.h>
Logan033f46e2011-01-06 05:51:24 +080037#include <cutils/properties.h>
38
Logan89eb47f2011-01-07 10:45:16 +080039
Loganecf4cbd2011-01-06 05:34:11 +080040namespace {
41
Logan033f46e2011-01-06 05:51:24 +080042bool getBooleanProp(const char *str) {
Loganf340bf72011-01-14 17:51:40 +080043 char buf[PROPERTY_VALUE_MAX];
44 property_get(str, buf, "0");
45 return strcmp(buf, "0") != 0;
Logan033f46e2011-01-06 05:51:24 +080046}
47
Loganecf4cbd2011-01-06 05:34:11 +080048} // namespace anonymous
49
Logancf3e5212010-12-29 01:44:55 +080050namespace bcc {
51
52Script::~Script() {
Logan35849002011-01-15 07:30:43 +080053 switch (mStatus) {
54 case ScriptStatus::Compiled:
Logancf3e5212010-12-29 01:44:55 +080055 delete mCompiled;
Logan35849002011-01-15 07:30:43 +080056 break;
57
58#if USE_CACHE
59 case ScriptStatus::Cached:
Shih-wei Liaoc4cf6542011-01-13 01:43:01 -080060 delete mCached;
Logan35849002011-01-15 07:30:43 +080061 break;
62#endif
63
64 default:
65 break;
Logancf3e5212010-12-29 01:44:55 +080066 }
Logan474cbd22011-01-31 01:47:44 +080067
68 for (size_t i = 0; i < 2; ++i) {
69 delete mSourceList[i];
70 }
Logancf3e5212010-12-29 01:44:55 +080071}
72
73
Logan474cbd22011-01-31 01:47:44 +080074int Script::addSourceBC(size_t idx,
75 char const *resName,
76 const char *bitcode,
77 size_t bitcodeSize,
78 unsigned long flags) {
Shih-wei Liao898c5a92011-05-18 07:02:39 -070079
80 if (!resName) {
81 mErrorCode = BCC_INVALID_VALUE;
82 LOGE("Invalid argument: resName = NULL\n");
83 return 1;
84 }
85
86 mResName = resName;
87
Loganecf4cbd2011-01-06 05:34:11 +080088 if (mStatus != ScriptStatus::Unknown) {
Logancf3e5212010-12-29 01:44:55 +080089 mErrorCode = BCC_INVALID_OPERATION;
Logan474cbd22011-01-31 01:47:44 +080090 LOGE("Bad operation: Adding source after bccPrepareExecutable\n");
Logancf3e5212010-12-29 01:44:55 +080091 return 1;
92 }
93
Logan474cbd22011-01-31 01:47:44 +080094 if (!bitcode) {
95 mErrorCode = BCC_INVALID_VALUE;
96 LOGE("Invalid argument: bitcode = NULL\n");
97 return 1;
98 }
99
100 mSourceList[idx] = SourceInfo::createFromBuffer(resName,
101 bitcode, bitcodeSize,
102 flags);
103
104 if (!mSourceList[idx]) {
105 mErrorCode = BCC_OUT_OF_MEMORY;
106 LOGE("Out of memory while adding source bitcode\n");
107 return 1;
108 }
109
Loganecf4cbd2011-01-06 05:34:11 +0800110 return 0;
Logancf3e5212010-12-29 01:44:55 +0800111}
112
113
Logan474cbd22011-01-31 01:47:44 +0800114int Script::addSourceModule(size_t idx,
115 llvm::Module *module,
116 unsigned long flags) {
Logancf3e5212010-12-29 01:44:55 +0800117 if (mStatus != ScriptStatus::Unknown) {
118 mErrorCode = BCC_INVALID_OPERATION;
Logan474cbd22011-01-31 01:47:44 +0800119 LOGE("Bad operation: Adding source after bccPrepareExecutable\n");
Logancf3e5212010-12-29 01:44:55 +0800120 return 1;
121 }
122
Logan474cbd22011-01-31 01:47:44 +0800123 if (!module) {
124 mErrorCode = BCC_INVALID_VALUE;
125 LOGE("Invalid argument: module = NULL\n");
126 return 1;
127 }
128
129 mSourceList[idx] = SourceInfo::createFromModule(module, flags);
130
131 if (!mSourceList[idx]) {
132 mErrorCode = BCC_OUT_OF_MEMORY;
133 LOGE("Out of memory when add source module\n");
134 return 1;
135 }
136
Loganecf4cbd2011-01-06 05:34:11 +0800137 return 0;
Logancf3e5212010-12-29 01:44:55 +0800138}
139
140
Logan474cbd22011-01-31 01:47:44 +0800141int Script::addSourceFile(size_t idx,
142 char const *path,
143 unsigned long flags) {
Logan3133c412011-01-06 06:15:40 +0800144 if (mStatus != ScriptStatus::Unknown) {
Logancf3e5212010-12-29 01:44:55 +0800145 mErrorCode = BCC_INVALID_OPERATION;
Logan474cbd22011-01-31 01:47:44 +0800146 LOGE("Bad operation: Adding source after bccPrepareExecutable\n");
Logancf3e5212010-12-29 01:44:55 +0800147 return 1;
148 }
149
Logan474cbd22011-01-31 01:47:44 +0800150 if (!path) {
151 mErrorCode = BCC_INVALID_VALUE;
152 LOGE("Invalid argument: path = NULL\n");
153 return 1;
154 }
155
156 struct stat sb;
157 if (stat(path, &sb) != 0) {
158 mErrorCode = BCC_INVALID_VALUE;
159 LOGE("File not found: %s\n", path);
160 return 1;
161 }
162
163 mSourceList[idx] = SourceInfo::createFromFile(path, flags);
164
165 if (!mSourceList[idx]) {
166 mErrorCode = BCC_OUT_OF_MEMORY;
167 LOGE("Out of memory while adding source file\n");
168 return 1;
169 }
170
Logan3133c412011-01-06 06:15:40 +0800171 return 0;
Logancf3e5212010-12-29 01:44:55 +0800172}
173
174
Loganf340bf72011-01-14 17:51:40 +0800175int Script::prepareExecutable(char const *cachePath, unsigned long flags) {
Loganecf4cbd2011-01-06 05:34:11 +0800176 if (mStatus != ScriptStatus::Unknown) {
Logancf3e5212010-12-29 01:44:55 +0800177 mErrorCode = BCC_INVALID_OPERATION;
Loganecf4cbd2011-01-06 05:34:11 +0800178 LOGE("Invalid operation: %s\n", __func__);
Logancf3e5212010-12-29 01:44:55 +0800179 return 1;
180 }
181
Logan35849002011-01-15 07:30:43 +0800182#if USE_CACHE
Loganecf4cbd2011-01-06 05:34:11 +0800183 // Load Cache File
Loganf340bf72011-01-14 17:51:40 +0800184 mCachePath = cachePath;
185 if (cachePath && internalLoadCache() == 0) {
Logan033f46e2011-01-06 05:51:24 +0800186 return 0;
187 }
Logan35849002011-01-15 07:30:43 +0800188#endif
Loganecf4cbd2011-01-06 05:34:11 +0800189
Stephen Hines27b35102011-05-11 17:58:48 -0700190 int status = internalCompile();
191 if (status != 0) {
192 LOGE("LLVM error message: %s\n", getCompilerErrorMessage());
193 }
194 return status;
Logan033f46e2011-01-06 05:51:24 +0800195}
196
197
Logan35849002011-01-15 07:30:43 +0800198#if USE_CACHE
Logan033f46e2011-01-06 05:51:24 +0800199int Script::internalLoadCache() {
200 if (getBooleanProp("debug.bcc.nocache")) {
201 // Android system environment property disable the cache mechanism by
202 // setting "debug.bcc.nocache". So we will not load the cache file any
203 // way.
204 return 1;
205 }
206
Loganf340bf72011-01-14 17:51:40 +0800207 if (!mCachePath) {
208 // The application developer has not specify the cachePath, so
Logan04329712011-01-06 06:10:57 +0800209 // we don't know where to open the cache file.
210 return 1;
Logan033f46e2011-01-06 05:51:24 +0800211 }
Logan04329712011-01-06 06:10:57 +0800212
213 FileHandle file;
214
Loganf340bf72011-01-14 17:51:40 +0800215 if (file.open(mCachePath, OpenMode::Read) < 0) {
Logan04329712011-01-06 06:10:57 +0800216 // Unable to open the cache file in read mode.
217 return 1;
218 }
219
Logane7eb7732011-01-07 07:11:56 +0800220 CacheReader reader;
Logan04329712011-01-06 06:10:57 +0800221
Logan9a5f8682011-01-07 06:09:57 +0800222 // Dependencies
Logan35849002011-01-15 07:30:43 +0800223#if USE_LIBBCC_SHA1SUM
Logan9a5f8682011-01-07 06:09:57 +0800224 reader.addDependency(BCC_FILE_RESOURCE, pathLibBCC, sha1LibBCC);
Logane1323992011-01-12 04:47:13 +0800225#endif
226
Logan9a5f8682011-01-07 06:09:57 +0800227 reader.addDependency(BCC_FILE_RESOURCE, pathLibRS, sha1LibRS);
228
Logan474cbd22011-01-31 01:47:44 +0800229 for (size_t i = 0; i < 2; ++i) {
230 if (mSourceList[i]) {
231 mSourceList[i]->introDependency(reader);
232 }
Logan9a5f8682011-01-07 06:09:57 +0800233 }
234
235 // Read cache file
Logane7eb7732011-01-07 07:11:56 +0800236 ScriptCached *cached = reader.readCacheFile(&file, this);
Logan04329712011-01-06 06:10:57 +0800237 if (!cached) {
Logan42598052011-01-26 22:41:13 +0800238 mIsContextSlotNotAvail = reader.isContextSlotNotAvail();
Logan04329712011-01-06 06:10:57 +0800239 return 1;
240 }
241
242 mCached = cached;
243 mStatus = ScriptStatus::Cached;
Logan033f46e2011-01-06 05:51:24 +0800244
Loganf3c83ce2011-01-07 06:36:33 +0800245 // Dirty hack for libRS.
246 // TODO(all): This dirty hack should be removed in the future.
Shih-wei Liao8eb5fe92011-02-01 04:17:38 -0800247 if (!cached->isLibRSThreadable() && mpExtSymbolLookupFn) {
Loganf3c83ce2011-01-07 06:36:33 +0800248 mpExtSymbolLookupFn(mpExtSymbolLookupFnContext, "__clearThreadable");
249 }
250
Loganf7f0ac52011-01-07 03:53:43 +0800251 return 0;
Logan033f46e2011-01-06 05:51:24 +0800252}
Logan35849002011-01-15 07:30:43 +0800253#endif
Logan033f46e2011-01-06 05:51:24 +0800254
255
256int Script::internalCompile() {
257 // Create the ScriptCompiled object
Loganecf4cbd2011-01-06 05:34:11 +0800258 mCompiled = new (nothrow) ScriptCompiled(this);
259
260 if (!mCompiled) {
261 mErrorCode = BCC_OUT_OF_MEMORY;
262 LOGE("Out of memory: %s %d\n", __FILE__, __LINE__);
263 return 1;
264 }
265
266 mStatus = ScriptStatus::Compiled;
267
Logan033f46e2011-01-06 05:51:24 +0800268 // Register symbol lookup function
Loganecf4cbd2011-01-06 05:34:11 +0800269 if (mpExtSymbolLookupFn) {
270 mCompiled->registerSymbolCallback(mpExtSymbolLookupFn,
271 mpExtSymbolLookupFnContext);
272 }
273
Logan474cbd22011-01-31 01:47:44 +0800274 // Parse Bitcode File (if necessary)
275 for (size_t i = 0; i < 2; ++i) {
276 if (mSourceList[i] && mSourceList[i]->prepareModule(mCompiled) != 0) {
277 LOGE("Unable to parse bitcode for source[%lu]\n", (unsigned long)i);
Logan033f46e2011-01-06 05:51:24 +0800278 return 1;
Loganecf4cbd2011-01-06 05:34:11 +0800279 }
Logan474cbd22011-01-31 01:47:44 +0800280 }
281
282 // Set the main source module
283 if (!mSourceList[0] || !mSourceList[0]->getModule()) {
284 LOGE("Source bitcode is not setted.\n");
285 return 1;
286 }
287
288 if (mCompiled->readModule(mSourceList[0]->takeModule()) != 0) {
289 LOGE("Unable to read source module\n");
290 return 1;
Loganecf4cbd2011-01-06 05:34:11 +0800291 }
292
Logan3133c412011-01-06 06:15:40 +0800293 // Link the source module with the library module
Logan474cbd22011-01-31 01:47:44 +0800294 if (mSourceList[1]) {
295 if (mCompiled->linkModule(mSourceList[1]->takeModule()) != 0) {
296 LOGE("Unable to link library module\n");
Logan04329712011-01-06 06:10:57 +0800297 return 1;
298 }
299 }
Loganecf4cbd2011-01-06 05:34:11 +0800300
Shih-wei Liao898c5a92011-05-18 07:02:39 -0700301 mCompiled->setResName(mResName);
302
Logan3133c412011-01-06 06:15:40 +0800303 // Compile and JIT the code
Logan04329712011-01-06 06:10:57 +0800304 if (mCompiled->compile() != 0) {
Logan65719812011-01-07 11:17:14 +0800305 LOGE("Unable to compile.\n");
Logan04329712011-01-06 06:10:57 +0800306 return 1;
307 }
308
Logan35849002011-01-15 07:30:43 +0800309#if USE_CACHE
Logan42598052011-01-26 22:41:13 +0800310 // Note: If we re-compile the script because the cached context slot not
311 // available, then we don't have to write the cache.
312
313 // Note: If the address of the context is not in the context slot, then
314 // we don't have to cache it.
315
Logan42598052011-01-26 22:41:13 +0800316 if (mCachePath &&
Logan1dc63142011-02-25 17:14:51 +0800317 !mIsContextSlotNotAvail &&
318 ContextManager::get().isManagingContext(getContext()) &&
Logan42598052011-01-26 22:41:13 +0800319 !getBooleanProp("debug.bcc.nocache")) {
320
Logan89eb47f2011-01-07 10:45:16 +0800321 FileHandle file;
Logan04329712011-01-06 06:10:57 +0800322
Jeff Brown937a0bc2011-01-26 23:20:14 -0800323 // Remove the file if it already exists before writing the new file.
324 // The old file may still be mapped elsewhere in memory and we do not want
325 // to modify its contents. (The same script may be running concurrently in
326 // the same process or a different process!)
327 ::unlink(mCachePath);
328
Loganf340bf72011-01-14 17:51:40 +0800329 if (file.open(mCachePath, OpenMode::Write) >= 0) {
Logan04329712011-01-06 06:10:57 +0800330 CacheWriter writer;
Logana27a83f2011-01-07 10:25:48 +0800331
Logana2e15af2011-01-07 11:46:08 +0800332 // Dependencies
Logan35849002011-01-15 07:30:43 +0800333#if USE_LIBBCC_SHA1SUM
Logana2e15af2011-01-07 11:46:08 +0800334 writer.addDependency(BCC_FILE_RESOURCE, pathLibBCC, sha1LibBCC);
Logane1323992011-01-12 04:47:13 +0800335#endif
Logana2e15af2011-01-07 11:46:08 +0800336 writer.addDependency(BCC_FILE_RESOURCE, pathLibRS, sha1LibRS);
337
Logan474cbd22011-01-31 01:47:44 +0800338 for (size_t i = 0; i < 2; ++i) {
Logan825c3b22011-02-28 05:05:48 +0800339 if (mSourceList[i]) {
340 mSourceList[i]->introDependency(writer);
341 }
Logana2e15af2011-01-07 11:46:08 +0800342 }
343
Logana27a83f2011-01-07 10:25:48 +0800344 // libRS is threadable dirty hack
345 // TODO: This should be removed in the future
346 uint32_t libRS_threadable = 0;
347 if (mpExtSymbolLookupFn) {
Logan89eb47f2011-01-07 10:45:16 +0800348 libRS_threadable =
349 (uint32_t)mpExtSymbolLookupFn(mpExtSymbolLookupFnContext,
350 "__isThreadable");
Logana27a83f2011-01-07 10:25:48 +0800351 }
352
Logan89eb47f2011-01-07 10:45:16 +0800353 if (!writer.writeCacheFile(&file, this, libRS_threadable)) {
354 file.truncate();
355 file.close();
Logana27a83f2011-01-07 10:25:48 +0800356
Loganf340bf72011-01-14 17:51:40 +0800357 if (unlink(mCachePath) != 0) {
Logan89eb47f2011-01-07 10:45:16 +0800358 LOGE("Unable to remove the invalid cache file: %s. (reason: %s)\n",
Loganf340bf72011-01-14 17:51:40 +0800359 mCachePath, strerror(errno));
Logan89eb47f2011-01-07 10:45:16 +0800360 }
361 }
362 }
Logan04329712011-01-06 06:10:57 +0800363 }
Logan35849002011-01-15 07:30:43 +0800364#endif // USE_CACHE
Logan04329712011-01-06 06:10:57 +0800365
366 return 0;
Logancf3e5212010-12-29 01:44:55 +0800367}
368
369
370char const *Script::getCompilerErrorMessage() {
371 if (mStatus != ScriptStatus::Compiled) {
372 mErrorCode = BCC_INVALID_OPERATION;
373 return NULL;
374 }
375
376 return mCompiled->getCompilerErrorMessage();
377}
378
379
380void *Script::lookup(const char *name) {
Logan89eb47f2011-01-07 10:45:16 +0800381 switch (mStatus) {
Loganbe79ada2011-01-13 01:33:45 +0800382 case ScriptStatus::Compiled: return mCompiled->lookup(name);
Logan35849002011-01-15 07:30:43 +0800383#if USE_CACHE
Loganbe79ada2011-01-13 01:33:45 +0800384 case ScriptStatus::Cached: return mCached->lookup(name);
Logan35849002011-01-15 07:30:43 +0800385#endif
Logan89eb47f2011-01-07 10:45:16 +0800386
387 default:
Logancf3e5212010-12-29 01:44:55 +0800388 mErrorCode = BCC_INVALID_OPERATION;
389 return NULL;
390 }
Logancf3e5212010-12-29 01:44:55 +0800391}
392
393
Loganbe79ada2011-01-13 01:33:45 +0800394size_t Script::getExportVarCount() const {
Logan89eb47f2011-01-07 10:45:16 +0800395 switch (mStatus) {
Loganbe79ada2011-01-13 01:33:45 +0800396 case ScriptStatus::Compiled: return mCompiled->getExportVarCount();
Logan35849002011-01-15 07:30:43 +0800397#if USE_CACHE
Loganbe79ada2011-01-13 01:33:45 +0800398 case ScriptStatus::Cached: return mCached->getExportVarCount();
Logan35849002011-01-15 07:30:43 +0800399#endif
Loganbe79ada2011-01-13 01:33:45 +0800400 default: return 0;
401 }
402}
403
404
405size_t Script::getExportFuncCount() const {
406 switch (mStatus) {
407 case ScriptStatus::Compiled: return mCompiled->getExportFuncCount();
Logan35849002011-01-15 07:30:43 +0800408#if USE_CACHE
Loganbe79ada2011-01-13 01:33:45 +0800409 case ScriptStatus::Cached: return mCached->getExportFuncCount();
Logan35849002011-01-15 07:30:43 +0800410#endif
Loganbe79ada2011-01-13 01:33:45 +0800411 default: return 0;
412 }
413}
414
415
416size_t Script::getPragmaCount() const {
417 switch (mStatus) {
418 case ScriptStatus::Compiled: return mCompiled->getPragmaCount();
Logan35849002011-01-15 07:30:43 +0800419#if USE_CACHE
Loganbe79ada2011-01-13 01:33:45 +0800420 case ScriptStatus::Cached: return mCached->getPragmaCount();
Logan35849002011-01-15 07:30:43 +0800421#endif
Loganbe79ada2011-01-13 01:33:45 +0800422 default: return 0;
423 }
424}
425
426
427size_t Script::getFuncCount() const {
428 switch (mStatus) {
429 case ScriptStatus::Compiled: return mCompiled->getFuncCount();
Logan35849002011-01-15 07:30:43 +0800430#if USE_CACHE
Loganbe79ada2011-01-13 01:33:45 +0800431 case ScriptStatus::Cached: return mCached->getFuncCount();
Logan35849002011-01-15 07:30:43 +0800432#endif
Loganbe79ada2011-01-13 01:33:45 +0800433 default: return 0;
434 }
435}
436
437
Stephen Hines071288a2011-01-27 14:38:26 -0800438size_t Script::getObjectSlotCount() const {
439 switch (mStatus) {
440 case ScriptStatus::Compiled: return mCompiled->getObjectSlotCount();
441#if USE_CACHE
442 case ScriptStatus::Cached: return mCached->getObjectSlotCount();
443#endif
444 default: return 0;
445 }
446}
447
448
Loganbe79ada2011-01-13 01:33:45 +0800449void Script::getExportVarList(size_t varListSize, void **varList) {
450 switch (mStatus) {
451#define DELEGATE(STATUS) \
452 case ScriptStatus::STATUS: \
453 m##STATUS->getExportVarList(varListSize, varList); \
Logan89eb47f2011-01-07 10:45:16 +0800454 break;
Logancf3e5212010-12-29 01:44:55 +0800455
Logan35849002011-01-15 07:30:43 +0800456#if USE_CACHE
Loganbe79ada2011-01-13 01:33:45 +0800457 DELEGATE(Cached);
Logan35849002011-01-15 07:30:43 +0800458#endif
459
Loganbe79ada2011-01-13 01:33:45 +0800460 DELEGATE(Compiled);
461#undef DELEGATE
Logan89eb47f2011-01-07 10:45:16 +0800462
463 default:
464 mErrorCode = BCC_INVALID_OPERATION;
465 }
Logancf3e5212010-12-29 01:44:55 +0800466}
467
468
Loganbe79ada2011-01-13 01:33:45 +0800469void Script::getExportFuncList(size_t funcListSize, void **funcList) {
Logan89eb47f2011-01-07 10:45:16 +0800470 switch (mStatus) {
Loganbe79ada2011-01-13 01:33:45 +0800471#define DELEGATE(STATUS) \
472 case ScriptStatus::STATUS: \
473 m##STATUS->getExportFuncList(funcListSize, funcList); \
Logan89eb47f2011-01-07 10:45:16 +0800474 break;
Logancf3e5212010-12-29 01:44:55 +0800475
Logan35849002011-01-15 07:30:43 +0800476#if USE_CACHE
Loganbe79ada2011-01-13 01:33:45 +0800477 DELEGATE(Cached);
Logan35849002011-01-15 07:30:43 +0800478#endif
479
Loganbe79ada2011-01-13 01:33:45 +0800480 DELEGATE(Compiled);
481#undef DELEGATE
Logan89eb47f2011-01-07 10:45:16 +0800482
483 default:
484 mErrorCode = BCC_INVALID_OPERATION;
485 }
Logancf3e5212010-12-29 01:44:55 +0800486}
487
488
Loganbe79ada2011-01-13 01:33:45 +0800489void Script::getPragmaList(size_t pragmaListSize,
490 char const **keyList,
491 char const **valueList) {
Logan89eb47f2011-01-07 10:45:16 +0800492 switch (mStatus) {
Loganbe79ada2011-01-13 01:33:45 +0800493#define DELEGATE(STATUS) \
494 case ScriptStatus::STATUS: \
495 m##STATUS->getPragmaList(pragmaListSize, keyList, valueList); \
Logan89eb47f2011-01-07 10:45:16 +0800496 break;
Logancf3e5212010-12-29 01:44:55 +0800497
Logan35849002011-01-15 07:30:43 +0800498#if USE_CACHE
Loganbe79ada2011-01-13 01:33:45 +0800499 DELEGATE(Cached);
Logan35849002011-01-15 07:30:43 +0800500#endif
501
Loganbe79ada2011-01-13 01:33:45 +0800502 DELEGATE(Compiled);
503#undef DELEGATE
Logan89eb47f2011-01-07 10:45:16 +0800504
505 default:
506 mErrorCode = BCC_INVALID_OPERATION;
507 }
Logancf3e5212010-12-29 01:44:55 +0800508}
509
510
Loganf340bf72011-01-14 17:51:40 +0800511void Script::getFuncInfoList(size_t funcInfoListSize,
512 FuncInfo *funcInfoList) {
Logan89eb47f2011-01-07 10:45:16 +0800513 switch (mStatus) {
Loganbe79ada2011-01-13 01:33:45 +0800514#define DELEGATE(STATUS) \
515 case ScriptStatus::STATUS: \
Stephen Hines071288a2011-01-27 14:38:26 -0800516 m##STATUS->getFuncInfoList(funcInfoListSize, funcInfoList); \
Logan89eb47f2011-01-07 10:45:16 +0800517 break;
Logancf3e5212010-12-29 01:44:55 +0800518
Logan35849002011-01-15 07:30:43 +0800519#if USE_CACHE
Loganbe79ada2011-01-13 01:33:45 +0800520 DELEGATE(Cached);
Logan35849002011-01-15 07:30:43 +0800521#endif
522
Loganbe79ada2011-01-13 01:33:45 +0800523 DELEGATE(Compiled);
524#undef DELEGATE
Logan89eb47f2011-01-07 10:45:16 +0800525
526 default:
527 mErrorCode = BCC_INVALID_OPERATION;
528 }
Logancf3e5212010-12-29 01:44:55 +0800529}
530
Stephen Hines071288a2011-01-27 14:38:26 -0800531
532void Script::getObjectSlotList(size_t objectSlotListSize,
533 uint32_t *objectSlotList) {
534 switch (mStatus) {
535#define DELEGATE(STATUS) \
536 case ScriptStatus::STATUS: \
537 m##STATUS->getObjectSlotList(objectSlotListSize, objectSlotList); \
538 break;
539
540#if USE_CACHE
541 DELEGATE(Cached);
542#endif
543
544 DELEGATE(Compiled);
545#undef DELEGATE
546
547 default:
548 mErrorCode = BCC_INVALID_OPERATION;
549 }
550}
551
552
Logana27a83f2011-01-07 10:25:48 +0800553char *Script::getContext() {
554 switch (mStatus) {
Logan35849002011-01-15 07:30:43 +0800555#if USE_CACHE
Loganbe79ada2011-01-13 01:33:45 +0800556 case ScriptStatus::Cached: return mCached->getContext();
Logan35849002011-01-15 07:30:43 +0800557#endif
Loganbe79ada2011-01-13 01:33:45 +0800558 case ScriptStatus::Compiled: return mCompiled->getContext();
Logana27a83f2011-01-07 10:25:48 +0800559
560 default:
561 mErrorCode = BCC_INVALID_OPERATION;
Logan02286cb2011-01-07 00:30:47 +0800562 return NULL;
563 }
Logan02286cb2011-01-07 00:30:47 +0800564}
565
Logancf3e5212010-12-29 01:44:55 +0800566
Shih-wei Liaoce82d492011-01-20 12:34:03 -0800567int Script::registerSymbolCallback(BCCSymbolLookupFn pFn, void *pContext) {
Logancf3e5212010-12-29 01:44:55 +0800568 mpExtSymbolLookupFn = pFn;
569 mpExtSymbolLookupFnContext = pContext;
570
Logan7d2219f2011-01-06 06:19:25 +0800571 if (mStatus != ScriptStatus::Unknown) {
Logancf3e5212010-12-29 01:44:55 +0800572 mErrorCode = BCC_INVALID_OPERATION;
Logan7d2219f2011-01-06 06:19:25 +0800573 LOGE("Invalid operation: %s\n", __func__);
Shih-wei Liaoce82d492011-01-20 12:34:03 -0800574 return 1;
Logancf3e5212010-12-29 01:44:55 +0800575 }
Shih-wei Liaoce82d492011-01-20 12:34:03 -0800576 return 0;
Logancf3e5212010-12-29 01:44:55 +0800577}
578
579} // namespace bcc