blob: 0dbb8b6f1589c200f30657bfdafe7cd74de444ae [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
Loganecf4cbd2011-01-06 05:34:11 +080086 if (mStatus != ScriptStatus::Unknown) {
Logancf3e5212010-12-29 01:44:55 +080087 mErrorCode = BCC_INVALID_OPERATION;
Logan474cbd22011-01-31 01:47:44 +080088 LOGE("Bad operation: Adding source after bccPrepareExecutable\n");
Logancf3e5212010-12-29 01:44:55 +080089 return 1;
90 }
91
Logan474cbd22011-01-31 01:47:44 +080092 if (!bitcode) {
93 mErrorCode = BCC_INVALID_VALUE;
94 LOGE("Invalid argument: bitcode = NULL\n");
95 return 1;
96 }
97
98 mSourceList[idx] = SourceInfo::createFromBuffer(resName,
99 bitcode, bitcodeSize,
100 flags);
101
102 if (!mSourceList[idx]) {
103 mErrorCode = BCC_OUT_OF_MEMORY;
104 LOGE("Out of memory while adding source bitcode\n");
105 return 1;
106 }
107
Loganecf4cbd2011-01-06 05:34:11 +0800108 return 0;
Logancf3e5212010-12-29 01:44:55 +0800109}
110
111
Logan474cbd22011-01-31 01:47:44 +0800112int Script::addSourceModule(size_t idx,
113 llvm::Module *module,
114 unsigned long flags) {
Logancf3e5212010-12-29 01:44:55 +0800115 if (mStatus != ScriptStatus::Unknown) {
116 mErrorCode = BCC_INVALID_OPERATION;
Logan474cbd22011-01-31 01:47:44 +0800117 LOGE("Bad operation: Adding source after bccPrepareExecutable\n");
Logancf3e5212010-12-29 01:44:55 +0800118 return 1;
119 }
120
Logan474cbd22011-01-31 01:47:44 +0800121 if (!module) {
122 mErrorCode = BCC_INVALID_VALUE;
123 LOGE("Invalid argument: module = NULL\n");
124 return 1;
125 }
126
127 mSourceList[idx] = SourceInfo::createFromModule(module, flags);
128
129 if (!mSourceList[idx]) {
130 mErrorCode = BCC_OUT_OF_MEMORY;
131 LOGE("Out of memory when add source module\n");
132 return 1;
133 }
134
Loganecf4cbd2011-01-06 05:34:11 +0800135 return 0;
Logancf3e5212010-12-29 01:44:55 +0800136}
137
138
Logan474cbd22011-01-31 01:47:44 +0800139int Script::addSourceFile(size_t idx,
140 char const *path,
141 unsigned long flags) {
Logan3133c412011-01-06 06:15:40 +0800142 if (mStatus != ScriptStatus::Unknown) {
Logancf3e5212010-12-29 01:44:55 +0800143 mErrorCode = BCC_INVALID_OPERATION;
Logan474cbd22011-01-31 01:47:44 +0800144 LOGE("Bad operation: Adding source after bccPrepareExecutable\n");
Logancf3e5212010-12-29 01:44:55 +0800145 return 1;
146 }
147
Logan474cbd22011-01-31 01:47:44 +0800148 if (!path) {
149 mErrorCode = BCC_INVALID_VALUE;
150 LOGE("Invalid argument: path = NULL\n");
151 return 1;
152 }
153
154 struct stat sb;
155 if (stat(path, &sb) != 0) {
156 mErrorCode = BCC_INVALID_VALUE;
157 LOGE("File not found: %s\n", path);
158 return 1;
159 }
160
161 mSourceList[idx] = SourceInfo::createFromFile(path, flags);
162
163 if (!mSourceList[idx]) {
164 mErrorCode = BCC_OUT_OF_MEMORY;
165 LOGE("Out of memory while adding source file\n");
166 return 1;
167 }
168
Logan3133c412011-01-06 06:15:40 +0800169 return 0;
Logancf3e5212010-12-29 01:44:55 +0800170}
171
172
Loganf340bf72011-01-14 17:51:40 +0800173int Script::prepareExecutable(char const *cachePath, unsigned long flags) {
Loganecf4cbd2011-01-06 05:34:11 +0800174 if (mStatus != ScriptStatus::Unknown) {
Logancf3e5212010-12-29 01:44:55 +0800175 mErrorCode = BCC_INVALID_OPERATION;
Loganecf4cbd2011-01-06 05:34:11 +0800176 LOGE("Invalid operation: %s\n", __func__);
Logancf3e5212010-12-29 01:44:55 +0800177 return 1;
178 }
179
Logan35849002011-01-15 07:30:43 +0800180#if USE_CACHE
Loganecf4cbd2011-01-06 05:34:11 +0800181 // Load Cache File
Loganf340bf72011-01-14 17:51:40 +0800182 mCachePath = cachePath;
183 if (cachePath && internalLoadCache() == 0) {
Logan033f46e2011-01-06 05:51:24 +0800184 return 0;
185 }
Logan35849002011-01-15 07:30:43 +0800186#endif
Loganecf4cbd2011-01-06 05:34:11 +0800187
Stephen Hines27b35102011-05-11 17:58:48 -0700188 int status = internalCompile();
189 if (status != 0) {
190 LOGE("LLVM error message: %s\n", getCompilerErrorMessage());
191 }
192 return status;
Logan033f46e2011-01-06 05:51:24 +0800193}
194
195
Logan35849002011-01-15 07:30:43 +0800196#if USE_CACHE
Logan033f46e2011-01-06 05:51:24 +0800197int Script::internalLoadCache() {
198 if (getBooleanProp("debug.bcc.nocache")) {
199 // Android system environment property disable the cache mechanism by
200 // setting "debug.bcc.nocache". So we will not load the cache file any
201 // way.
202 return 1;
203 }
204
Loganf340bf72011-01-14 17:51:40 +0800205 if (!mCachePath) {
206 // The application developer has not specify the cachePath, so
Logan04329712011-01-06 06:10:57 +0800207 // we don't know where to open the cache file.
208 return 1;
Logan033f46e2011-01-06 05:51:24 +0800209 }
Logan04329712011-01-06 06:10:57 +0800210
211 FileHandle file;
212
Loganf340bf72011-01-14 17:51:40 +0800213 if (file.open(mCachePath, OpenMode::Read) < 0) {
Logan04329712011-01-06 06:10:57 +0800214 // Unable to open the cache file in read mode.
215 return 1;
216 }
217
Logane7eb7732011-01-07 07:11:56 +0800218 CacheReader reader;
Logan04329712011-01-06 06:10:57 +0800219
Logan9a5f8682011-01-07 06:09:57 +0800220 // Dependencies
Logan35849002011-01-15 07:30:43 +0800221#if USE_LIBBCC_SHA1SUM
Logan9a5f8682011-01-07 06:09:57 +0800222 reader.addDependency(BCC_FILE_RESOURCE, pathLibBCC, sha1LibBCC);
Logane1323992011-01-12 04:47:13 +0800223#endif
224
Logan9a5f8682011-01-07 06:09:57 +0800225 reader.addDependency(BCC_FILE_RESOURCE, pathLibRS, sha1LibRS);
226
Logan474cbd22011-01-31 01:47:44 +0800227 for (size_t i = 0; i < 2; ++i) {
228 if (mSourceList[i]) {
229 mSourceList[i]->introDependency(reader);
230 }
Logan9a5f8682011-01-07 06:09:57 +0800231 }
232
233 // Read cache file
Logane7eb7732011-01-07 07:11:56 +0800234 ScriptCached *cached = reader.readCacheFile(&file, this);
Logan04329712011-01-06 06:10:57 +0800235 if (!cached) {
Logan42598052011-01-26 22:41:13 +0800236 mIsContextSlotNotAvail = reader.isContextSlotNotAvail();
Logan04329712011-01-06 06:10:57 +0800237 return 1;
238 }
239
240 mCached = cached;
241 mStatus = ScriptStatus::Cached;
Logan033f46e2011-01-06 05:51:24 +0800242
Loganf3c83ce2011-01-07 06:36:33 +0800243 // Dirty hack for libRS.
244 // TODO(all): This dirty hack should be removed in the future.
Shih-wei Liao8eb5fe92011-02-01 04:17:38 -0800245 if (!cached->isLibRSThreadable() && mpExtSymbolLookupFn) {
Loganf3c83ce2011-01-07 06:36:33 +0800246 mpExtSymbolLookupFn(mpExtSymbolLookupFnContext, "__clearThreadable");
247 }
248
Loganf7f0ac52011-01-07 03:53:43 +0800249 return 0;
Logan033f46e2011-01-06 05:51:24 +0800250}
Logan35849002011-01-15 07:30:43 +0800251#endif
Logan033f46e2011-01-06 05:51:24 +0800252
253
254int Script::internalCompile() {
255 // Create the ScriptCompiled object
Nowar Gu09b6c1c2011-05-24 23:49:07 +0800256 mCompiled = new (std::nothrow) ScriptCompiled(this);
Loganecf4cbd2011-01-06 05:34:11 +0800257
258 if (!mCompiled) {
259 mErrorCode = BCC_OUT_OF_MEMORY;
260 LOGE("Out of memory: %s %d\n", __FILE__, __LINE__);
261 return 1;
262 }
263
264 mStatus = ScriptStatus::Compiled;
265
Logan033f46e2011-01-06 05:51:24 +0800266 // Register symbol lookup function
Loganecf4cbd2011-01-06 05:34:11 +0800267 if (mpExtSymbolLookupFn) {
268 mCompiled->registerSymbolCallback(mpExtSymbolLookupFn,
269 mpExtSymbolLookupFnContext);
270 }
271
Logan474cbd22011-01-31 01:47:44 +0800272 // Parse Bitcode File (if necessary)
273 for (size_t i = 0; i < 2; ++i) {
274 if (mSourceList[i] && mSourceList[i]->prepareModule(mCompiled) != 0) {
275 LOGE("Unable to parse bitcode for source[%lu]\n", (unsigned long)i);
Logan033f46e2011-01-06 05:51:24 +0800276 return 1;
Loganecf4cbd2011-01-06 05:34:11 +0800277 }
Logan474cbd22011-01-31 01:47:44 +0800278 }
279
280 // Set the main source module
281 if (!mSourceList[0] || !mSourceList[0]->getModule()) {
282 LOGE("Source bitcode is not setted.\n");
283 return 1;
284 }
285
286 if (mCompiled->readModule(mSourceList[0]->takeModule()) != 0) {
287 LOGE("Unable to read source module\n");
288 return 1;
Loganecf4cbd2011-01-06 05:34:11 +0800289 }
290
Logan3133c412011-01-06 06:15:40 +0800291 // Link the source module with the library module
Logan474cbd22011-01-31 01:47:44 +0800292 if (mSourceList[1]) {
293 if (mCompiled->linkModule(mSourceList[1]->takeModule()) != 0) {
294 LOGE("Unable to link library module\n");
Logan04329712011-01-06 06:10:57 +0800295 return 1;
296 }
297 }
Loganecf4cbd2011-01-06 05:34:11 +0800298
Shih-wei Liao5c00f4f2011-05-20 04:14:54 -0700299 mCompiled->setCachePath(mCachePath);
Shih-wei Liao898c5a92011-05-18 07:02:39 -0700300
Logan3133c412011-01-06 06:15:40 +0800301 // Compile and JIT the code
Logan04329712011-01-06 06:10:57 +0800302 if (mCompiled->compile() != 0) {
Logan65719812011-01-07 11:17:14 +0800303 LOGE("Unable to compile.\n");
Logan04329712011-01-06 06:10:57 +0800304 return 1;
305 }
306
Logan35849002011-01-15 07:30:43 +0800307#if USE_CACHE
Logan42598052011-01-26 22:41:13 +0800308 // Note: If we re-compile the script because the cached context slot not
309 // available, then we don't have to write the cache.
310
311 // Note: If the address of the context is not in the context slot, then
312 // we don't have to cache it.
313
Logan42598052011-01-26 22:41:13 +0800314 if (mCachePath &&
Logan1dc63142011-02-25 17:14:51 +0800315 !mIsContextSlotNotAvail &&
316 ContextManager::get().isManagingContext(getContext()) &&
Logan42598052011-01-26 22:41:13 +0800317 !getBooleanProp("debug.bcc.nocache")) {
318
Logan89eb47f2011-01-07 10:45:16 +0800319 FileHandle file;
Logan04329712011-01-06 06:10:57 +0800320
Jeff Brown937a0bc2011-01-26 23:20:14 -0800321 // Remove the file if it already exists before writing the new file.
322 // The old file may still be mapped elsewhere in memory and we do not want
323 // to modify its contents. (The same script may be running concurrently in
324 // the same process or a different process!)
325 ::unlink(mCachePath);
326
Loganf340bf72011-01-14 17:51:40 +0800327 if (file.open(mCachePath, OpenMode::Write) >= 0) {
Logan04329712011-01-06 06:10:57 +0800328 CacheWriter writer;
Logana27a83f2011-01-07 10:25:48 +0800329
Logana2e15af2011-01-07 11:46:08 +0800330 // Dependencies
Logan35849002011-01-15 07:30:43 +0800331#if USE_LIBBCC_SHA1SUM
Logana2e15af2011-01-07 11:46:08 +0800332 writer.addDependency(BCC_FILE_RESOURCE, pathLibBCC, sha1LibBCC);
Logane1323992011-01-12 04:47:13 +0800333#endif
Logana2e15af2011-01-07 11:46:08 +0800334 writer.addDependency(BCC_FILE_RESOURCE, pathLibRS, sha1LibRS);
335
Logan474cbd22011-01-31 01:47:44 +0800336 for (size_t i = 0; i < 2; ++i) {
Logan825c3b22011-02-28 05:05:48 +0800337 if (mSourceList[i]) {
338 mSourceList[i]->introDependency(writer);
339 }
Logana2e15af2011-01-07 11:46:08 +0800340 }
341
Logana27a83f2011-01-07 10:25:48 +0800342 // libRS is threadable dirty hack
343 // TODO: This should be removed in the future
344 uint32_t libRS_threadable = 0;
345 if (mpExtSymbolLookupFn) {
Logan89eb47f2011-01-07 10:45:16 +0800346 libRS_threadable =
347 (uint32_t)mpExtSymbolLookupFn(mpExtSymbolLookupFnContext,
348 "__isThreadable");
Logana27a83f2011-01-07 10:25:48 +0800349 }
350
Logan89eb47f2011-01-07 10:45:16 +0800351 if (!writer.writeCacheFile(&file, this, libRS_threadable)) {
352 file.truncate();
353 file.close();
Logana27a83f2011-01-07 10:25:48 +0800354
Loganf340bf72011-01-14 17:51:40 +0800355 if (unlink(mCachePath) != 0) {
Logan89eb47f2011-01-07 10:45:16 +0800356 LOGE("Unable to remove the invalid cache file: %s. (reason: %s)\n",
Loganf340bf72011-01-14 17:51:40 +0800357 mCachePath, strerror(errno));
Logan89eb47f2011-01-07 10:45:16 +0800358 }
359 }
360 }
Logan04329712011-01-06 06:10:57 +0800361 }
Logan35849002011-01-15 07:30:43 +0800362#endif // USE_CACHE
Logan04329712011-01-06 06:10:57 +0800363
364 return 0;
Logancf3e5212010-12-29 01:44:55 +0800365}
366
367
368char const *Script::getCompilerErrorMessage() {
369 if (mStatus != ScriptStatus::Compiled) {
370 mErrorCode = BCC_INVALID_OPERATION;
371 return NULL;
372 }
373
374 return mCompiled->getCompilerErrorMessage();
375}
376
377
378void *Script::lookup(const char *name) {
Logan89eb47f2011-01-07 10:45:16 +0800379 switch (mStatus) {
Loganbe79ada2011-01-13 01:33:45 +0800380 case ScriptStatus::Compiled: return mCompiled->lookup(name);
Logan35849002011-01-15 07:30:43 +0800381#if USE_CACHE
Loganbe79ada2011-01-13 01:33:45 +0800382 case ScriptStatus::Cached: return mCached->lookup(name);
Logan35849002011-01-15 07:30:43 +0800383#endif
Logan89eb47f2011-01-07 10:45:16 +0800384
385 default:
Logancf3e5212010-12-29 01:44:55 +0800386 mErrorCode = BCC_INVALID_OPERATION;
387 return NULL;
388 }
Logancf3e5212010-12-29 01:44:55 +0800389}
390
391
Loganbe79ada2011-01-13 01:33:45 +0800392size_t Script::getExportVarCount() const {
Logan89eb47f2011-01-07 10:45:16 +0800393 switch (mStatus) {
Loganbe79ada2011-01-13 01:33:45 +0800394 case ScriptStatus::Compiled: return mCompiled->getExportVarCount();
Logan35849002011-01-15 07:30:43 +0800395#if USE_CACHE
Loganbe79ada2011-01-13 01:33:45 +0800396 case ScriptStatus::Cached: return mCached->getExportVarCount();
Logan35849002011-01-15 07:30:43 +0800397#endif
Loganbe79ada2011-01-13 01:33:45 +0800398 default: return 0;
399 }
400}
401
402
403size_t Script::getExportFuncCount() const {
404 switch (mStatus) {
405 case ScriptStatus::Compiled: return mCompiled->getExportFuncCount();
Logan35849002011-01-15 07:30:43 +0800406#if USE_CACHE
Loganbe79ada2011-01-13 01:33:45 +0800407 case ScriptStatus::Cached: return mCached->getExportFuncCount();
Logan35849002011-01-15 07:30:43 +0800408#endif
Loganbe79ada2011-01-13 01:33:45 +0800409 default: return 0;
410 }
411}
412
413
414size_t Script::getPragmaCount() const {
415 switch (mStatus) {
416 case ScriptStatus::Compiled: return mCompiled->getPragmaCount();
Logan35849002011-01-15 07:30:43 +0800417#if USE_CACHE
Loganbe79ada2011-01-13 01:33:45 +0800418 case ScriptStatus::Cached: return mCached->getPragmaCount();
Logan35849002011-01-15 07:30:43 +0800419#endif
Loganbe79ada2011-01-13 01:33:45 +0800420 default: return 0;
421 }
422}
423
424
425size_t Script::getFuncCount() const {
426 switch (mStatus) {
427 case ScriptStatus::Compiled: return mCompiled->getFuncCount();
Logan35849002011-01-15 07:30:43 +0800428#if USE_CACHE
Loganbe79ada2011-01-13 01:33:45 +0800429 case ScriptStatus::Cached: return mCached->getFuncCount();
Logan35849002011-01-15 07:30:43 +0800430#endif
Loganbe79ada2011-01-13 01:33:45 +0800431 default: return 0;
432 }
433}
434
435
Stephen Hines071288a2011-01-27 14:38:26 -0800436size_t Script::getObjectSlotCount() const {
437 switch (mStatus) {
438 case ScriptStatus::Compiled: return mCompiled->getObjectSlotCount();
439#if USE_CACHE
440 case ScriptStatus::Cached: return mCached->getObjectSlotCount();
441#endif
442 default: return 0;
443 }
444}
445
446
Loganbe79ada2011-01-13 01:33:45 +0800447void Script::getExportVarList(size_t varListSize, void **varList) {
448 switch (mStatus) {
449#define DELEGATE(STATUS) \
450 case ScriptStatus::STATUS: \
451 m##STATUS->getExportVarList(varListSize, varList); \
Logan89eb47f2011-01-07 10:45:16 +0800452 break;
Logancf3e5212010-12-29 01:44:55 +0800453
Logan35849002011-01-15 07:30:43 +0800454#if USE_CACHE
Loganbe79ada2011-01-13 01:33:45 +0800455 DELEGATE(Cached);
Logan35849002011-01-15 07:30:43 +0800456#endif
457
Loganbe79ada2011-01-13 01:33:45 +0800458 DELEGATE(Compiled);
459#undef DELEGATE
Logan89eb47f2011-01-07 10:45:16 +0800460
461 default:
462 mErrorCode = BCC_INVALID_OPERATION;
463 }
Logancf3e5212010-12-29 01:44:55 +0800464}
465
466
Loganbe79ada2011-01-13 01:33:45 +0800467void Script::getExportFuncList(size_t funcListSize, void **funcList) {
Logan89eb47f2011-01-07 10:45:16 +0800468 switch (mStatus) {
Loganbe79ada2011-01-13 01:33:45 +0800469#define DELEGATE(STATUS) \
470 case ScriptStatus::STATUS: \
471 m##STATUS->getExportFuncList(funcListSize, funcList); \
Logan89eb47f2011-01-07 10:45:16 +0800472 break;
Logancf3e5212010-12-29 01:44:55 +0800473
Logan35849002011-01-15 07:30:43 +0800474#if USE_CACHE
Loganbe79ada2011-01-13 01:33:45 +0800475 DELEGATE(Cached);
Logan35849002011-01-15 07:30:43 +0800476#endif
477
Loganbe79ada2011-01-13 01:33:45 +0800478 DELEGATE(Compiled);
479#undef DELEGATE
Logan89eb47f2011-01-07 10:45:16 +0800480
481 default:
482 mErrorCode = BCC_INVALID_OPERATION;
483 }
Logancf3e5212010-12-29 01:44:55 +0800484}
485
486
Loganbe79ada2011-01-13 01:33:45 +0800487void Script::getPragmaList(size_t pragmaListSize,
488 char const **keyList,
489 char const **valueList) {
Logan89eb47f2011-01-07 10:45:16 +0800490 switch (mStatus) {
Loganbe79ada2011-01-13 01:33:45 +0800491#define DELEGATE(STATUS) \
492 case ScriptStatus::STATUS: \
493 m##STATUS->getPragmaList(pragmaListSize, keyList, valueList); \
Logan89eb47f2011-01-07 10:45:16 +0800494 break;
Logancf3e5212010-12-29 01:44:55 +0800495
Logan35849002011-01-15 07:30:43 +0800496#if USE_CACHE
Loganbe79ada2011-01-13 01:33:45 +0800497 DELEGATE(Cached);
Logan35849002011-01-15 07:30:43 +0800498#endif
499
Loganbe79ada2011-01-13 01:33:45 +0800500 DELEGATE(Compiled);
501#undef DELEGATE
Logan89eb47f2011-01-07 10:45:16 +0800502
503 default:
504 mErrorCode = BCC_INVALID_OPERATION;
505 }
Logancf3e5212010-12-29 01:44:55 +0800506}
507
508
Loganf340bf72011-01-14 17:51:40 +0800509void Script::getFuncInfoList(size_t funcInfoListSize,
510 FuncInfo *funcInfoList) {
Logan89eb47f2011-01-07 10:45:16 +0800511 switch (mStatus) {
Loganbe79ada2011-01-13 01:33:45 +0800512#define DELEGATE(STATUS) \
513 case ScriptStatus::STATUS: \
Stephen Hines071288a2011-01-27 14:38:26 -0800514 m##STATUS->getFuncInfoList(funcInfoListSize, funcInfoList); \
Logan89eb47f2011-01-07 10:45:16 +0800515 break;
Logancf3e5212010-12-29 01:44:55 +0800516
Logan35849002011-01-15 07:30:43 +0800517#if USE_CACHE
Loganbe79ada2011-01-13 01:33:45 +0800518 DELEGATE(Cached);
Logan35849002011-01-15 07:30:43 +0800519#endif
520
Loganbe79ada2011-01-13 01:33:45 +0800521 DELEGATE(Compiled);
522#undef DELEGATE
Logan89eb47f2011-01-07 10:45:16 +0800523
524 default:
525 mErrorCode = BCC_INVALID_OPERATION;
526 }
Logancf3e5212010-12-29 01:44:55 +0800527}
528
Stephen Hines071288a2011-01-27 14:38:26 -0800529
530void Script::getObjectSlotList(size_t objectSlotListSize,
531 uint32_t *objectSlotList) {
532 switch (mStatus) {
533#define DELEGATE(STATUS) \
534 case ScriptStatus::STATUS: \
535 m##STATUS->getObjectSlotList(objectSlotListSize, objectSlotList); \
536 break;
537
538#if USE_CACHE
539 DELEGATE(Cached);
540#endif
541
542 DELEGATE(Compiled);
543#undef DELEGATE
544
545 default:
546 mErrorCode = BCC_INVALID_OPERATION;
547 }
548}
549
550
Logana27a83f2011-01-07 10:25:48 +0800551char *Script::getContext() {
552 switch (mStatus) {
Logan35849002011-01-15 07:30:43 +0800553#if USE_CACHE
Loganbe79ada2011-01-13 01:33:45 +0800554 case ScriptStatus::Cached: return mCached->getContext();
Logan35849002011-01-15 07:30:43 +0800555#endif
Loganbe79ada2011-01-13 01:33:45 +0800556 case ScriptStatus::Compiled: return mCompiled->getContext();
Logana27a83f2011-01-07 10:25:48 +0800557
558 default:
559 mErrorCode = BCC_INVALID_OPERATION;
Logan02286cb2011-01-07 00:30:47 +0800560 return NULL;
561 }
Logan02286cb2011-01-07 00:30:47 +0800562}
563
Logancf3e5212010-12-29 01:44:55 +0800564
Shih-wei Liaoce82d492011-01-20 12:34:03 -0800565int Script::registerSymbolCallback(BCCSymbolLookupFn pFn, void *pContext) {
Logancf3e5212010-12-29 01:44:55 +0800566 mpExtSymbolLookupFn = pFn;
567 mpExtSymbolLookupFnContext = pContext;
568
Logan7d2219f2011-01-06 06:19:25 +0800569 if (mStatus != ScriptStatus::Unknown) {
Logancf3e5212010-12-29 01:44:55 +0800570 mErrorCode = BCC_INVALID_OPERATION;
Logan7d2219f2011-01-06 06:19:25 +0800571 LOGE("Invalid operation: %s\n", __func__);
Shih-wei Liaoce82d492011-01-20 12:34:03 -0800572 return 1;
Logancf3e5212010-12-29 01:44:55 +0800573 }
Shih-wei Liaoce82d492011-01-20 12:34:03 -0800574 return 0;
Logancf3e5212010-12-29 01:44:55 +0800575}
576
577} // namespace bcc