Merge git://github.com/Shyotl/SingularityViewer
This commit is contained in:
@@ -556,7 +556,7 @@ const U32 LSCRIPTRunTimePermissionBits[SCRIPT_PERMISSION_EOF] =
|
||||
// http_request string constants
|
||||
extern const char* URL_REQUEST_GRANTED;
|
||||
extern const char* URL_REQUEST_DENIED;
|
||||
extern const U64 LSL_HTTP_REQUEST_TIMEOUT;
|
||||
extern const U64 LSL_HTTP_REQUEST_TIMEOUT_USEC;
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -312,7 +312,7 @@ void LLScriptScriptCodeChunk::build(LLFILE *efp, LLFILE *bcfp)
|
||||
set_register(mCompleteCode, LREG_TM, mTotalSize);
|
||||
|
||||
|
||||
if (fwrite(mCompleteCode, 1, mTotalSize, bcfp) != mTotalSize)
|
||||
if (fwrite(mCompleteCode, 1, mTotalSize, bcfp) != (size_t)mTotalSize)
|
||||
{
|
||||
llwarns << "Short write" << llendl;
|
||||
}
|
||||
|
||||
@@ -631,8 +631,8 @@ static void print_cil_cast(LLFILE* fp, LSCRIPTType srcType, LSCRIPTType targetTy
|
||||
switch(targetType)
|
||||
{
|
||||
case LST_INTEGER:
|
||||
//fprintf(fp, "call int32 [LslLibrary]LindenLab.SecondLife.LslRunTime::ToInteger(float32)\n");
|
||||
fprintf(fp, "conv.i4\n"); // TODO replace this line with the above
|
||||
fprintf(fp, "call int32 [LslLibrary]LindenLab.SecondLife.LslRunTime::ToInteger(float32)\n");
|
||||
//fprintf(fp, "conv.i4\n"); // TODO replace this line with the above
|
||||
// we the entire grid is > 1.25.1
|
||||
break;
|
||||
case LST_STRING:
|
||||
@@ -8375,10 +8375,18 @@ void LLScriptStateChange::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTComp
|
||||
chunk->addInteger(mIdentifier->mScopeEntry->mCount);
|
||||
}
|
||||
break;
|
||||
case LSCP_TYPE:
|
||||
mReturnType = basetype;
|
||||
break;
|
||||
case LSCP_EMIT_CIL_ASSEMBLY:
|
||||
fprintf(fp, "ldarg.0\n");
|
||||
fprintf(fp, "ldstr \"%s\"\n", mIdentifier->mName);
|
||||
fprintf(fp, "call instance void class [LslUserScript]LindenLab.SecondLife.LslUserScript::ChangeState(string)\n");
|
||||
// We are doing a state change. In the LSL interpreter, this is basically a longjmp. We emulate it
|
||||
// here using a call to the ChangeState followed by a short cut return of the current method. To
|
||||
// maintain type safety we need to push an arbitrary variable of the current method's return type
|
||||
// onto the stack before returning. This will be ignored and discarded.
|
||||
print_cil_init_variable(fp, mReturnType);
|
||||
fprintf(fp, "ret\n");
|
||||
break;
|
||||
default:
|
||||
@@ -9799,6 +9807,9 @@ void LLScriptEventHandler::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCom
|
||||
break;
|
||||
case LSCP_EMIT_BYTE_CODE:
|
||||
{
|
||||
llassert(mEventp);
|
||||
if (!mEventp) return;
|
||||
|
||||
// order for event handler
|
||||
// set jump table value
|
||||
S32 jumpoffset;
|
||||
@@ -9812,13 +9823,11 @@ void LLScriptEventHandler::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCom
|
||||
chunk->addBytes(4);
|
||||
|
||||
// null terminated event name and null terminated parameters
|
||||
if (mEventp)
|
||||
{
|
||||
LLScriptByteCodeChunk *event = new LLScriptByteCodeChunk(FALSE);
|
||||
mEventp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, event, heap, stacksize, entry, entrycount, NULL);
|
||||
chunk->addBytes(event->mCodeChunk, event->mCurrentOffset);
|
||||
delete event;
|
||||
}
|
||||
LLScriptByteCodeChunk *event = new LLScriptByteCodeChunk(FALSE);
|
||||
mEventp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, event, heap, stacksize, entry, entrycount, NULL);
|
||||
chunk->addBytes(event->mCodeChunk, event->mCurrentOffset);
|
||||
delete event;
|
||||
|
||||
chunk->addBytes(1);
|
||||
|
||||
// now we're at the first opcode
|
||||
@@ -10620,6 +10629,8 @@ LLScriptScript::LLScriptScript(LLScritpGlobalStorage *globals,
|
||||
}
|
||||
temp = temp->mNextp;
|
||||
}
|
||||
|
||||
mClassName[0] = '\0';
|
||||
}
|
||||
|
||||
void LLScriptScript::setBytecodeDest(const char* dst_filename)
|
||||
|
||||
@@ -1876,7 +1876,7 @@ class LLScriptStateChange : public LLScriptStatement
|
||||
{
|
||||
public:
|
||||
LLScriptStateChange(S32 line, S32 col, LLScriptIdentifier *identifier)
|
||||
: LLScriptStatement(line, col, LSSMT_STATE_CHANGE), mIdentifier(identifier)
|
||||
: LLScriptStatement(line, col, LSSMT_STATE_CHANGE), mIdentifier(identifier), mReturnType(LST_NULL)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -1888,6 +1888,7 @@ public:
|
||||
S32 getSize();
|
||||
|
||||
LLScriptIdentifier *mIdentifier;
|
||||
LSCRIPTType mReturnType;
|
||||
};
|
||||
|
||||
class LLScriptJump : public LLScriptStatement
|
||||
@@ -2209,7 +2210,7 @@ class LLScriptState : public LLScriptFilePosition
|
||||
{
|
||||
public:
|
||||
LLScriptState(S32 line, S32 col, LSCRIPTStateType type, LLScriptIdentifier *identifier, LLScriptEventHandler *event)
|
||||
: LLScriptFilePosition(line, col), mType(type), mIdentifier(identifier), mEvent(event), mNextp(NULL)
|
||||
: LLScriptFilePosition(line, col), mType(type), mIdentifier(identifier), mEvent(event), mNextp(NULL), mStateScope(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -36,7 +36,8 @@
|
||||
#include "lscript_byteconvert.h"
|
||||
#include "linked_lists.h"
|
||||
#include "lscript_library.h"
|
||||
#include "lltimer.h"
|
||||
|
||||
class LLTimer;
|
||||
|
||||
// Return values for run() methods
|
||||
const U32 NO_DELETE_FLAG = 0x0000;
|
||||
@@ -370,8 +371,7 @@ class LLScriptExecute
|
||||
{
|
||||
public:
|
||||
LLScriptExecute();
|
||||
virtual ~LLScriptExecute() {;}
|
||||
|
||||
virtual ~LLScriptExecute() = 0;
|
||||
virtual S32 getVersion() const = 0;
|
||||
virtual void deleteAllEvents() = 0;
|
||||
virtual void addEvent(LLScriptDataCollection* event) = 0;
|
||||
|
||||
@@ -41,6 +41,8 @@
|
||||
#include "lscript_library.h"
|
||||
#include "lscript_heapruntime.h"
|
||||
#include "lscript_alloc.h"
|
||||
#include "llstat.h"
|
||||
|
||||
|
||||
// Static
|
||||
const S32 DEFAULT_SCRIPT_TIMER_CHECK_SKIP = 4;
|
||||
@@ -72,12 +74,12 @@ const char* URL_REQUEST_GRANTED = "URL_REQUEST_GRANTED";
|
||||
const char* URL_REQUEST_DENIED = "URL_REQUEST_DENIED";
|
||||
|
||||
// HTTP Requests to LSL scripts will time out after 25 seconds.
|
||||
const U64 LSL_HTTP_REQUEST_TIMEOUT = 25 * USEC_PER_SEC;
|
||||
const U64 LSL_HTTP_REQUEST_TIMEOUT_USEC = 25 * USEC_PER_SEC;
|
||||
|
||||
LLScriptExecuteLSL2::LLScriptExecuteLSL2(LLFILE *fp)
|
||||
{
|
||||
U8 sizearray[4];
|
||||
S32 filesize;
|
||||
size_t filesize;
|
||||
S32 pos = 0;
|
||||
if (fread(&sizearray, 1, 4, fp) != 4)
|
||||
{
|
||||
@@ -110,6 +112,7 @@ LLScriptExecuteLSL2::LLScriptExecuteLSL2(const U8* bytecode, U32 bytecode_size)
|
||||
init();
|
||||
}
|
||||
|
||||
LLScriptExecute::~LLScriptExecute() {}
|
||||
LLScriptExecuteLSL2::~LLScriptExecuteLSL2()
|
||||
{
|
||||
delete[] mBuffer;
|
||||
@@ -4234,19 +4237,16 @@ S32 lscript_push_variable(LLScriptLibData *data, U8 *buffer)
|
||||
return 4;
|
||||
}
|
||||
|
||||
BOOL run_calllib(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id)
|
||||
|
||||
// Shared code for run_calllib() and run_calllib_two_byte()
|
||||
BOOL run_calllib_common(U8 *buffer, S32 &offset, const LLUUID &id, U16 arg)
|
||||
{
|
||||
if (b_print)
|
||||
printf("[0x%X]\tCALLLIB ", offset);
|
||||
offset++;
|
||||
U8 arg = safe_instruction_bytestream2byte(buffer, offset);
|
||||
if (arg >= (U8)gScriptLibrary.mFunctions.size())
|
||||
if (arg >= gScriptLibrary.mFunctions.size())
|
||||
{
|
||||
set_fault(buffer, LSRF_BOUND_CHECK_ERROR);
|
||||
return FALSE;
|
||||
}
|
||||
if (b_print)
|
||||
printf("%d (%s)\n", (U32)arg, gScriptLibrary.mFunctions[arg].mName);
|
||||
LLScriptLibraryFunction const & function = gScriptLibrary.mFunctions[arg];
|
||||
|
||||
// pull out the arguments and the return values
|
||||
LLScriptLibData *arguments = NULL;
|
||||
@@ -4254,14 +4254,14 @@ BOOL run_calllib(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id)
|
||||
|
||||
S32 i, number;
|
||||
|
||||
if (gScriptLibrary.mFunctions[arg].mReturnType)
|
||||
if (function.mReturnType)
|
||||
{
|
||||
returnvalue = new LLScriptLibData;
|
||||
}
|
||||
|
||||
if (gScriptLibrary.mFunctions[arg].mArgs)
|
||||
if (function.mArgs)
|
||||
{
|
||||
number = (S32)strlen(gScriptLibrary.mFunctions[arg].mArgs); /*Flawfinder: ignore*/
|
||||
number = (S32)strlen(function.mArgs); //Flawfinder: ignore
|
||||
arguments = new LLScriptLibData[number];
|
||||
}
|
||||
else
|
||||
@@ -4271,24 +4271,18 @@ BOOL run_calllib(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id)
|
||||
|
||||
for (i = number - 1; i >= 0; i--)
|
||||
{
|
||||
lscript_pop_variable(&arguments[i], buffer, gScriptLibrary.mFunctions[arg].mArgs[i]);
|
||||
lscript_pop_variable(&arguments[i], buffer, function.mArgs[i]);
|
||||
}
|
||||
|
||||
if (b_print)
|
||||
{
|
||||
printf("See LSLTipText_%s in strings.xml for usage\n", gScriptLibrary.mFunctions[arg].mName);
|
||||
}
|
||||
// Actually execute the function call
|
||||
function.mExecFunc(returnvalue, arguments, id);
|
||||
|
||||
{
|
||||
// LLFastTimer time_in_libraries1(LLFastTimer::FTM_TEMP7);
|
||||
gScriptLibrary.mFunctions[arg].mExecFunc(returnvalue, arguments, id);
|
||||
}
|
||||
add_register_fp(buffer, LREG_ESR, -gScriptLibrary.mFunctions[arg].mEnergyUse);
|
||||
add_register_fp(buffer, LREG_SLR, gScriptLibrary.mFunctions[arg].mSleepTime);
|
||||
add_register_fp(buffer, LREG_ESR, -(function.mEnergyUse));
|
||||
add_register_fp(buffer, LREG_SLR, function.mSleepTime);
|
||||
|
||||
if (returnvalue)
|
||||
{
|
||||
returnvalue->mType = char2type(*gScriptLibrary.mFunctions[arg].mReturnType);
|
||||
returnvalue->mType = char2type(*function.mReturnType);
|
||||
lscript_push_return_variable(returnvalue, buffer);
|
||||
}
|
||||
|
||||
@@ -4305,72 +4299,32 @@ BOOL run_calllib(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id)
|
||||
}
|
||||
|
||||
|
||||
BOOL run_calllib(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id)
|
||||
{
|
||||
offset++;
|
||||
U16 arg = (U16) safe_instruction_bytestream2byte(buffer, offset);
|
||||
if (b_print &&
|
||||
arg < gScriptLibrary.mFunctions.size())
|
||||
{
|
||||
printf("[0x%X]\tCALLLIB ", offset);
|
||||
LLScriptLibraryFunction const & function = gScriptLibrary.mFunctions[arg];
|
||||
printf("%d (%s)\n", (U32)arg, function.mName);
|
||||
//printf("%s\n", function.mDesc);
|
||||
}
|
||||
return run_calllib_common(buffer, offset, id, arg);
|
||||
}
|
||||
|
||||
BOOL run_calllib_two_byte(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id)
|
||||
{
|
||||
if (b_print)
|
||||
printf("[0x%X]\tCALLLIB ", offset);
|
||||
offset++;
|
||||
U16 arg = safe_instruction_bytestream2u16(buffer, offset);
|
||||
if (arg >= (U16)gScriptLibrary.mFunctions.size())
|
||||
if (b_print &&
|
||||
arg < gScriptLibrary.mFunctions.size())
|
||||
{
|
||||
set_fault(buffer, LSRF_BOUND_CHECK_ERROR);
|
||||
return FALSE;
|
||||
printf("[0x%X]\tCALLLIB ", (offset-1));
|
||||
LLScriptLibraryFunction const & function = gScriptLibrary.mFunctions[arg];
|
||||
printf("%d (%s)\n", (U32)arg, function.mName);
|
||||
//printf("%s\n", function.mDesc);
|
||||
}
|
||||
if (b_print)
|
||||
printf("%d (%s)\n", (U32)arg, gScriptLibrary.mFunctions[arg].mName);
|
||||
|
||||
// pull out the arguments and the return values
|
||||
LLScriptLibData *arguments = NULL;
|
||||
LLScriptLibData *returnvalue = NULL;
|
||||
|
||||
S32 i, number;
|
||||
|
||||
if (gScriptLibrary.mFunctions[arg].mReturnType)
|
||||
{
|
||||
returnvalue = new LLScriptLibData;
|
||||
}
|
||||
|
||||
if (gScriptLibrary.mFunctions[arg].mArgs)
|
||||
{
|
||||
number = (S32)strlen(gScriptLibrary.mFunctions[arg].mArgs); /*Flawfinder: ignore*/
|
||||
arguments = new LLScriptLibData[number];
|
||||
}
|
||||
else
|
||||
{
|
||||
number = 0;
|
||||
}
|
||||
|
||||
for (i = number - 1; i >= 0; i--)
|
||||
{
|
||||
lscript_pop_variable(&arguments[i], buffer, gScriptLibrary.mFunctions[arg].mArgs[i]);
|
||||
}
|
||||
|
||||
if (b_print)
|
||||
{
|
||||
printf("See LSLTipText_%s in strings.xml for usage\n", gScriptLibrary.mFunctions[arg].mName);
|
||||
}
|
||||
|
||||
{
|
||||
// LLFastTimer time_in_libraries2(LLFastTimer::FTM_TEMP8);
|
||||
gScriptLibrary.mFunctions[arg].mExecFunc(returnvalue, arguments, id);
|
||||
}
|
||||
add_register_fp(buffer, LREG_ESR, -gScriptLibrary.mFunctions[arg].mEnergyUse);
|
||||
add_register_fp(buffer, LREG_SLR, gScriptLibrary.mFunctions[arg].mSleepTime);
|
||||
|
||||
if (returnvalue)
|
||||
{
|
||||
returnvalue->mType = char2type(*gScriptLibrary.mFunctions[arg].mReturnType);
|
||||
lscript_push_return_variable(returnvalue, buffer);
|
||||
}
|
||||
|
||||
delete [] arguments;
|
||||
delete returnvalue;
|
||||
|
||||
// reset the BP after calling the library files
|
||||
S32 bp = lscript_pop_int(buffer);
|
||||
set_bp(buffer, bp);
|
||||
|
||||
// pop off the spot for the instruction pointer
|
||||
lscript_poparg(buffer, 4);
|
||||
return FALSE;
|
||||
return run_calllib_common(buffer, offset, id, arg);
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
LLScriptLSOParse::LLScriptLSOParse(LLFILE *fp)
|
||||
{
|
||||
U8 sizearray[4];
|
||||
S32 filesize;
|
||||
size_t filesize;
|
||||
S32 pos = 0;
|
||||
if (fread(&sizearray, 1, 4, fp) != 4)
|
||||
{
|
||||
|
||||
@@ -35,6 +35,6 @@
|
||||
|
||||
#include "lscript_library.h"
|
||||
|
||||
extern LLScriptLibrary gScriptLibrary;
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -70,7 +70,7 @@ public:
|
||||
std::vector<LLScriptLibraryFunction> mFunctions;
|
||||
};
|
||||
|
||||
extern LLScriptLibrary gScriptLibrary;
|
||||
|
||||
|
||||
class LLScriptLibData
|
||||
{
|
||||
@@ -428,4 +428,6 @@ public:
|
||||
|
||||
};
|
||||
|
||||
extern LLScriptLibrary gScriptLibrary;
|
||||
|
||||
#endif
|
||||
|
||||
@@ -449,12 +449,13 @@ void LLScriptLibrary::init()
|
||||
addFunction(10.f, 0.f, dummy_func, "llReleaseURL", NULL, "s");
|
||||
addFunction(10.f, 0.f, dummy_func, "llHTTPResponse", NULL, "kis");
|
||||
addFunction(10.f, 0.f, dummy_func, "llGetHTTPHeader", "s", "ks");
|
||||
//Lesse if I can crash the sim! -HgB
|
||||
|
||||
// Prim media (see lscript_prim_media.h)
|
||||
addFunction(10.f, 1.0f, dummy_func, "llSetPrimMediaParams", "i", "il");
|
||||
addFunction(10.f, 1.0f, dummy_func, "llGetPrimMediaParams", "l", "il");
|
||||
addFunction(10.f, 1.0f, dummy_func, "llClearPrimMedia", "i", "i");
|
||||
addFunction(10.f, 0.f, dummy_func, "llSetLinkPrimitiveParamsFast", NULL, "il");
|
||||
addFunction(10.f, 0.f, dummy_func, "llGetLinkPrimitiveParams", NULL, "il");
|
||||
addFunction(10.f, 0.f, dummy_func, "llGetLinkPrimitiveParams", "l", "il");
|
||||
addFunction(10.f, 0.f, dummy_func, "llLinkParticleSystem", NULL, "il");
|
||||
addFunction(10.f, 0.f, dummy_func, "llSetLinkTextureAnim", NULL, "iiiiifff");
|
||||
|
||||
@@ -464,9 +465,12 @@ void LLScriptLibrary::init()
|
||||
addFunction(10.f, 0.f, dummy_func, "llGetUsername", "s", "k");
|
||||
addFunction(10.f, 0.f, dummy_func, "llRequestUsername", "k", "k");
|
||||
addFunction(10.f, 0.f, dummy_func, "llGetDisplayName", "s", "k");
|
||||
addFunction(10.f, 0.f, dummy_func, "llRequestDisplayName", "k", "k");
|
||||
addFunction(10.f, 0.f, dummy_func, "llRequestDisplayName", "k", "k");
|
||||
|
||||
// energy, sleep, dummy_func, name, return type, parameters, gods-only
|
||||
addFunction(10.f, 0.f, dummy_func, "llGetEnv", "s", "s");
|
||||
addFunction(10.f, 0.f, dummy_func, "llRegionSayTo", NULL, "kis");
|
||||
|
||||
// energy, sleep, dummy_func, name, return type, parameters, help text, gods-only
|
||||
|
||||
// IF YOU ADD NEW SCRIPT CALLS, YOU MUST PUT THEM AT THE END OF THIS LIST.
|
||||
// Otherwise the bytecode numbers for each call will be wrong, and all
|
||||
|
||||
Reference in New Issue
Block a user