@@ -4277,11 +4277,28 @@ _ALWAYSINLINE JsErrorCode CompileRun(
42774277{
42784278 PARAM_NOT_NULL (scriptVal);
42794279 VALIDATE_JSREF (scriptVal);
4280+ PARAM_NOT_NULL (sourceUrl);
42804281
42814282 bool isExternalArray = Js::ExternalArrayBuffer::Is (scriptVal),
42824283 isString = false ;
42834284 bool isUtf8 = !(parseAttributes & JsParseScriptAttributeArrayBufferIsUtf16Encoded);
4284- if (!isExternalArray)
4285+
4286+ LoadScriptFlag scriptFlag = LoadScriptFlag_None;
4287+ const byte* script;
4288+ size_t cb;
4289+ const wchar_t *url;
4290+
4291+ if (isExternalArray)
4292+ {
4293+ script = ((Js::ExternalArrayBuffer*)(scriptVal))->GetBuffer ();
4294+
4295+ cb = ((Js::ExternalArrayBuffer*)(scriptVal))->GetByteLength ();
4296+
4297+ scriptFlag = (LoadScriptFlag)(isUtf8 ?
4298+ LoadScriptFlag_ExternalArrayBuffer | LoadScriptFlag_Utf8Source :
4299+ LoadScriptFlag_ExternalArrayBuffer);
4300+ }
4301+ else
42854302 {
42864303 isString = Js::JavascriptString::Is (scriptVal);
42874304 if (!isString)
@@ -4290,36 +4307,30 @@ _ALWAYSINLINE JsErrorCode CompileRun(
42904307 }
42914308 }
42924309
4293- LoadScriptFlag scriptFlag;
4294- const byte* script = isExternalArray ?
4295- ((Js::ExternalArrayBuffer*)(scriptVal))->GetBuffer () :
4296- (const byte*)((Js::JavascriptString*)(scriptVal))->GetSz ();
4297- const size_t cb = isExternalArray ?
4298- ((Js::ExternalArrayBuffer*)(scriptVal))->GetByteLength () :
4299- ((Js::JavascriptString*)(scriptVal))->GetLength ();
4310+ JsErrorCode error = GlobalAPIWrapper_NoRecord ([&]() -> JsErrorCode {
4311+ if (isString)
4312+ {
4313+ Js::JavascriptString* jsString = Js::JavascriptString::FromVar (scriptVal);
4314+ script = (const byte*)jsString->GetSz ();
43004315
4301- if (isExternalArray && isUtf8)
4302- {
4303- scriptFlag = (LoadScriptFlag) (LoadScriptFlag_ExternalArrayBuffer | LoadScriptFlag_Utf8Source);
4304- }
4305- else if (isUtf8)
4306- {
4307- scriptFlag = (LoadScriptFlag) (LoadScriptFlag_Utf8Source);
4308- }
4309- else
4310- {
4311- scriptFlag = LoadScriptFlag_None;
4312- }
4316+ // JavascriptString is 2 bytes (wchar_t/char16)
4317+ cb = jsString->GetLength () * sizeof (wchar_t );
4318+ }
43134319
4314- const wchar_t *url;
4320+ if (!Js::JavascriptString::Is (sourceUrl))
4321+ {
4322+ return JsErrorInvalidArgument;
4323+ }
43154324
4316- if (sourceUrl && Js::JavascriptString::Is (sourceUrl))
4317- {
4318- url = ((Js::JavascriptString*)(sourceUrl))->GetSz ();
4319- }
4320- else
4325+ url = Js::JavascriptString::FromVar (sourceUrl)->GetSz ();
4326+
4327+ return JsNoError;
4328+
4329+ });
4330+
4331+ if (error != JsNoError)
43214332 {
4322- return JsErrorInvalidArgument ;
4333+ return error ;
43234334 }
43244335
43254336 return RunScriptCore (scriptVal, script, cb, scriptFlag,
0 commit comments