Skip to content

Commit 401ee1f

Browse files
Merge pull request livecode#7231 from runrevmark/script-parse-tweak
[[ Engine ]] Tweak passing of script text for parsing purposes
2 parents 3435327 + 22ae2f0 commit 401ee1f

File tree

12 files changed

+146
-26
lines changed

12 files changed

+146
-26
lines changed

engine/src/hndlrlst.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,7 @@ void MCHandlerlist::newglobal(MCNameRef p_name)
416416
globals[nglobals++] = gptr;
417417
}
418418

419-
Parse_stat MCHandlerlist::parse(MCObject *objptr, MCStringRef script)
419+
Parse_stat MCHandlerlist::parse(MCObject *objptr, MCDataRef script_utf8)
420420
{
421421
Parse_stat status = PS_NORMAL;
422422

@@ -425,7 +425,7 @@ Parse_stat MCHandlerlist::parse(MCObject *objptr, MCStringRef script)
425425
if (!MCperror -> isempty())
426426
MCperror -> clear();
427427

428-
MCScriptPoint sp(objptr, this, script);
428+
MCScriptPoint sp(objptr, this, script_utf8);
429429

430430
// MW-2008-11-02: Its possible for the objptr to be NULL if this is inert execution
431431
// (for example 'getdefaultprinter()' on Linux) so don't indirect in this case.
@@ -612,6 +612,16 @@ Parse_stat MCHandlerlist::parse(MCObject *objptr, MCStringRef script)
612612
return status;
613613
}
614614

615+
Parse_stat MCHandlerlist::parse(MCObject *objptr, MCStringRef p_script)
616+
{
617+
MCAutoDataRef t_utf16_script;
618+
unichar_t *t_unicode_string;
619+
uint32_t t_length;
620+
/* UNCHECKED */ MCStringConvertToUnicode(p_script, t_unicode_string, t_length);
621+
/* UNCHECKED */ MCDataCreateWithBytesAndRelease((byte_t *)t_unicode_string, (t_length + 1) * 2, &t_utf16_script);
622+
return parse(objptr, *t_utf16_script);
623+
}
624+
615625
Exec_stat MCHandlerlist::findhandler(Handler_type type, MCNameRef name, MCHandler *&handret)
616626
{
617627
assert(type > 0 && type <= 6);

engine/src/hndlrlst.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,8 @@ class MCHandlerlist
127127
void appendglobalnames(MCStringRef& r_string, bool first);
128128
void newglobal(MCNameRef name);
129129

130-
Parse_stat parse(MCObject *, MCStringRef);
130+
Parse_stat parse(MCObject *, MCDataRef);
131+
Parse_stat parse(MCObject *, MCStringRef);
131132

132133
Exec_stat findhandler(Handler_type, MCNameRef name, MCHandler *&);
133134
bool hashandler(Handler_type type, MCNameRef name);

engine/src/mcio.cpp

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -621,16 +621,8 @@ IO_stat IO_read_stringref_new(MCStringRef& r_string, IO_handle p_stream, bool p_
621621
if (IO_read_uint2or4(&t_length, p_stream) != IO_NORMAL)
622622
return IO_ERROR;
623623

624-
MCAutoArray<byte_t> t_utf8_string;
625-
if (!t_utf8_string.New(t_length))
626-
return IO_ERROR;
627-
628-
if (MCStackSecurityRead(reinterpret_cast<char *>(t_utf8_string.Ptr()),
629-
t_length, p_stream) != IO_NORMAL)
630-
return IO_ERROR;
631-
632-
if (!MCStringCreateWithBytes(t_utf8_string.Ptr(), t_length, kMCStringEncodingUTF8, false, r_string))
633-
return IO_ERROR;
624+
if (MCStackSecurityReadUTF8StringRef(r_string, t_length, p_stream) != IO_NORMAL)
625+
return IO_ERROR;
634626

635627
return IO_NORMAL;
636628
}

engine/src/object.cpp

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2507,14 +2507,22 @@ Boolean MCObject::parsescript(Boolean report, Boolean force)
25072507
hashandlers = 0;
25082508
if (hlist == NULL)
25092509
hlist = new (nothrow) MCHandlerlist;
2510-
2511-
getstack() -> unsecurescript(this);
2512-
2513-
Parse_stat t_stat;
2514-
t_stat = hlist -> parse(this, _script);
2515-
2516-
getstack() -> securescript(this);
2517-
2510+
2511+
Parse_stat t_stat;
2512+
if (_getscript() != nullptr)
2513+
{
2514+
MCDataRef t_utf8_script;
2515+
getstack()->startparsingscript(this, t_utf8_script);
2516+
2517+
t_stat = hlist->parse(this, t_utf8_script);
2518+
2519+
getstack()->stopparsingscript(this, t_utf8_script);
2520+
}
2521+
else
2522+
{
2523+
t_stat = hlist->parse(this, kMCEmptyString);
2524+
}
2525+
25182526
if (t_stat != PS_NORMAL)
25192527
{
25202528
hashandlers |= HH_DEAD_SCRIPT;

engine/src/scriptpt.cpp

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,10 @@ static const unichar_t close_comment[] = {'-', '-', '>'};
109109
static const unichar_t rev_tag[] = {'r','e','v'};
110110
static const unichar_t livecode_tag[] = {'l','i','v', 'e', 'c', 'o', 'd', 'e'};
111111

112-
MCScriptPoint::MCScriptPoint(MCObject *o, MCHandlerlist *hl, MCStringRef s)
112+
MCScriptPoint::MCScriptPoint(MCObject *o, MCHandlerlist *hl, MCDataRef s)
113113
{
114-
unichar_t *t_unicode_string;
115-
/* UNCHECKED */ MCStringConvertToUnicode(s, t_unicode_string, length);
116-
/* UNCHECKED */ MCDataCreateWithBytesAndRelease((byte_t *)t_unicode_string, (length + 1) * 2, utf16_script);
114+
utf16_script = MCValueRetain(s);
115+
length = MCDataGetLength(s) / 2 - 1;
117116

118117
curobj = o;
119118
curhlist = hl;
@@ -133,6 +132,30 @@ MCScriptPoint::MCScriptPoint(MCObject *o, MCHandlerlist *hl, MCStringRef s)
133132
token_nameref = MCValueRetain(kMCEmptyName);
134133
}
135134

135+
MCScriptPoint::MCScriptPoint(MCObject *o, MCHandlerlist *hl, MCStringRef s)
136+
{
137+
unichar_t *t_unicode_string;
138+
/* UNCHECKED */ MCStringConvertToUnicode(s, t_unicode_string, length);
139+
/* UNCHECKED */ MCDataCreateWithBytesAndRelease((byte_t *)t_unicode_string, (length + 1) * 2, utf16_script);
140+
141+
curobj = o;
142+
curhlist = hl;
143+
curhandler = NULL;
144+
curptr = tokenptr = backupptr = (const unichar_t *)MCDataGetBytePtr(utf16_script);
145+
endptr = curptr + length;
146+
147+
uindex_t t_index = 0;
148+
codepoint = MCUnicodeCodepointAdvance(curptr, length, t_index);
149+
curlength = t_index;
150+
151+
line = pos = 1;
152+
escapes = False;
153+
tagged = False;
154+
in_tag = False;
155+
was_in_tag = False;
156+
token_nameref = MCValueRetain(kMCEmptyName);
157+
}
158+
136159
MCScriptPoint::MCScriptPoint(MCScriptPoint &sp)
137160
{
138161
utf16_script = MCValueRetain(sp . utf16_script);

engine/src/scriptpt.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,8 @@ class MCScriptPoint
120120

121121
public:
122122
MCScriptPoint(MCScriptPoint &sp);
123-
MCScriptPoint(MCObject *, MCHandlerlist *, MCStringRef script);
123+
MCScriptPoint(MCObject *, MCHandlerlist *, MCDataRef utf8_script);
124+
MCScriptPoint(MCObject *, MCHandlerlist *, MCStringRef utf8_script);
124125
MCScriptPoint(MCExecContext &ctxt);
125126
MCScriptPoint(MCExecContext &ctxt, MCStringRef p_string);
126127
MCScriptPoint(MCStringRef p_string);

engine/src/stack.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2160,3 +2160,16 @@ bool MCStack::geteffectiveshowinvisibleobjects()
21602160
return false;
21612161
}
21622162
}
2163+
2164+
void MCStack::startparsingscript(MCObject *p_object, MCDataRef& r_data)
2165+
{
2166+
unichar_t *t_unicode_string;
2167+
uint32_t t_length;
2168+
/* UNCHECKED */ MCStringConvertToUnicode(p_object->_getscript(), t_unicode_string, t_length);
2169+
/* UNCHECKED */ MCDataCreateWithBytesAndRelease((byte_t *)t_unicode_string, (t_length + 1) * 2, r_data);
2170+
}
2171+
2172+
void MCStack::stopparsingscript(MCObject *p_object, MCDataRef p_data)
2173+
{
2174+
MCValueRelease(p_data);
2175+
}

engine/src/stack.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -637,6 +637,8 @@ class MCStack : public MCObject, public MCMixinObjectHandle<MCStack>
637637
virtual bool iskeyed() { return true; }
638638
virtual void securescript(MCObject *) { }
639639
virtual void unsecurescript(MCObject *) { }
640+
virtual void startparsingscript(MCObject*, MCDataRef&);
641+
virtual void stopparsingscript(MCObject*, MCDataRef);
640642

641643
Boolean islocked();
642644
Boolean isiconic();

engine/src/stacksecurity.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,27 @@ IO_stat MCStackSecurityRead(char *r_string, uint32_t p_length, IO_handle p_strea
103103
return t_stat;
104104
}
105105

106+
IO_stat MCStackSecurityReadUTF8StringRef(MCStringRef& r_string, uint32_t p_length, IO_handle p_stream)
107+
{
108+
MCAutoArray<byte_t> t_utf8_string;
109+
if (!t_utf8_string.New(p_length))
110+
return IO_ERROR;
111+
112+
if (MCStackSecurityRead(reinterpret_cast<char *>(t_utf8_string.Ptr()),
113+
p_length,
114+
p_stream) != IO_NORMAL)
115+
return IO_ERROR;
116+
117+
if (!MCStringCreateWithBytes(t_utf8_string.Ptr(),
118+
p_length,
119+
kMCStringEncodingUTF8,
120+
false,
121+
r_string))
122+
return IO_ERROR;
123+
124+
return IO_NORMAL;
125+
}
126+
106127
///////////
107128

108129
void MCStackSecurityProcessCapsule(void *p_start, void *p_finish)

engine/src/stacksecurity.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ void MCStackSecuritySetIOEncryptionEnabled(bool p_encrypted);
4545

4646
IO_stat MCStackSecurityWrite(const char *p_string, uint32_t p_length, IO_handle p_stream);
4747
IO_stat MCStackSecurityRead(char *r_string, uint32_t p_length, IO_handle p_stream);
48+
IO_stat MCStackSecurityReadUTF8StringRef(MCStringRef& r_string, uint32_t p_length, IO_handle p_stream);
4849

4950
//////////
5051

0 commit comments

Comments
 (0)