mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-05 15:28:39 +09:00
Bug 755821: Function() should use the parser's argument parsing code
This commit is contained in:
parent
e7fdd26fde
commit
0e7a16c088
24 changed files with 321 additions and 469 deletions
|
|
@ -21,6 +21,7 @@
|
|||
#include "mozilla/Attributes.h"
|
||||
#include "mozilla/Compression.h"
|
||||
#include "mozilla/MathAlgorithms.h"
|
||||
#include "mozilla/Maybe.h"
|
||||
|
||||
#include "jsmath.h"
|
||||
#include "jsprf.h"
|
||||
|
|
@ -8033,21 +8034,6 @@ TryInstantiate(JSContext* cx, CallArgs args, Module& module, const AsmJSMetadata
|
|||
return true;
|
||||
}
|
||||
|
||||
static MOZ_MUST_USE bool
|
||||
MaybeAppendUTF8Name(JSContext* cx, const char* utf8Chars, MutableHandle<PropertyNameVector> names)
|
||||
{
|
||||
if (!utf8Chars)
|
||||
return true;
|
||||
|
||||
UTF8Chars utf8(utf8Chars, strlen(utf8Chars));
|
||||
|
||||
JSAtom* atom = AtomizeUTF8Chars(cx, utf8Chars, strlen(utf8Chars));
|
||||
if (!atom)
|
||||
return false;
|
||||
|
||||
return names.append(atom->asPropertyName());
|
||||
}
|
||||
|
||||
static bool
|
||||
HandleInstantiationFailure(JSContext* cx, CallArgs args, const AsmJSMetadata& metadata)
|
||||
{
|
||||
|
|
@ -8068,8 +8054,8 @@ HandleInstantiationFailure(JSContext* cx, CallArgs args, const AsmJSMetadata& me
|
|||
return false;
|
||||
}
|
||||
|
||||
uint32_t begin = metadata.srcBodyStart; // starts right after 'use asm'
|
||||
uint32_t end = metadata.srcEndBeforeCurly();
|
||||
uint32_t begin = metadata.srcStart;
|
||||
uint32_t end = metadata.srcEndAfterCurly();
|
||||
Rooted<JSFlatString*> src(cx, source->substringDontDeflate(cx, begin, end));
|
||||
if (!src)
|
||||
return false;
|
||||
|
|
@ -8080,18 +8066,11 @@ HandleInstantiationFailure(JSContext* cx, CallArgs args, const AsmJSMetadata& me
|
|||
if (!fun)
|
||||
return false;
|
||||
|
||||
Rooted<PropertyNameVector> formals(cx, PropertyNameVector(cx));
|
||||
if (!MaybeAppendUTF8Name(cx, metadata.globalArgumentName.get(), &formals))
|
||||
return false;
|
||||
if (!MaybeAppendUTF8Name(cx, metadata.importArgumentName.get(), &formals))
|
||||
return false;
|
||||
if (!MaybeAppendUTF8Name(cx, metadata.bufferArgumentName.get(), &formals))
|
||||
return false;
|
||||
|
||||
CompileOptions options(cx);
|
||||
options.setMutedErrors(source->mutedErrors())
|
||||
.setFile(source->filename())
|
||||
.setNoScriptRval(false);
|
||||
options.asmJSOption = AsmJSOption::Disabled;
|
||||
|
||||
// The exported function inherits an implicit strict context if the module
|
||||
// also inherited it somehow.
|
||||
|
|
@ -8106,8 +8085,8 @@ HandleInstantiationFailure(JSContext* cx, CallArgs args, const AsmJSMetadata& me
|
|||
SourceBufferHolder::Ownership ownership = stableChars.maybeGiveOwnershipToCaller()
|
||||
? SourceBufferHolder::GiveOwnership
|
||||
: SourceBufferHolder::NoOwnership;
|
||||
SourceBufferHolder srcBuf(chars, end - begin, ownership);
|
||||
if (!frontend::CompileFunctionBody(cx, &fun, options, formals, srcBuf))
|
||||
SourceBufferHolder srcBuf(chars, stableChars.twoByteRange().length(), ownership);
|
||||
if (!frontend::CompileStandaloneFunction(cx, &fun, options, srcBuf, Nothing()))
|
||||
return false;
|
||||
|
||||
// Call the function we just recompiled.
|
||||
|
|
@ -8849,23 +8828,6 @@ js::IsAsmJSModuleLoadedFromCache(JSContext* cx, unsigned argc, Value* vp)
|
|||
/*****************************************************************************/
|
||||
// asm.js toString/toSource support
|
||||
|
||||
static MOZ_MUST_USE bool
|
||||
MaybeAppendUTF8Chars(JSContext* cx, const char* sep, const char* utf8Chars, StringBuffer* sb)
|
||||
{
|
||||
if (!utf8Chars)
|
||||
return true;
|
||||
|
||||
UTF8Chars utf8(utf8Chars, strlen(utf8Chars));
|
||||
|
||||
size_t length;
|
||||
UniqueTwoByteChars twoByteChars(UTF8CharsToNewTwoByteCharsZ(cx, utf8, &length).get());
|
||||
if (!twoByteChars)
|
||||
return false;
|
||||
|
||||
return sb->append(sep, strlen(sep)) &&
|
||||
sb->append(twoByteChars.get(), length);
|
||||
}
|
||||
|
||||
JSString*
|
||||
js::AsmJSModuleToString(JSContext* cx, HandleFunction fun, bool addParenToLambda)
|
||||
{
|
||||
|
|
@ -8895,33 +8857,12 @@ js::AsmJSModuleToString(JSContext* cx, HandleFunction fun, bool addParenToLambda
|
|||
if (!out.append("() {\n [sourceless code]\n}"))
|
||||
return nullptr;
|
||||
} else {
|
||||
// Whether the function has been created with a Function ctor
|
||||
bool funCtor = begin == 0 && end == source->length() && source->argumentsNotIncluded();
|
||||
if (funCtor) {
|
||||
// Functions created with the function constructor don't have arguments in their source.
|
||||
if (!out.append("("))
|
||||
return nullptr;
|
||||
|
||||
if (!MaybeAppendUTF8Chars(cx, "", metadata.globalArgumentName.get(), &out))
|
||||
return nullptr;
|
||||
if (!MaybeAppendUTF8Chars(cx, ", ", metadata.importArgumentName.get(), &out))
|
||||
return nullptr;
|
||||
if (!MaybeAppendUTF8Chars(cx, ", ", metadata.bufferArgumentName.get(), &out))
|
||||
return nullptr;
|
||||
|
||||
if (!out.append(") {\n"))
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Rooted<JSFlatString*> src(cx, source->substring(cx, begin, end));
|
||||
if (!src)
|
||||
return nullptr;
|
||||
|
||||
if (!out.append(src))
|
||||
return nullptr;
|
||||
|
||||
if (funCtor && !out.append("\n}"))
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (addParenToLambda && fun->isLambda() && !out.append(")"))
|
||||
|
|
@ -8959,10 +8900,6 @@ js::AsmJSFunctionToString(JSContext* cx, HandleFunction fun)
|
|||
if (!out.append("() {\n [sourceless code]\n}"))
|
||||
return nullptr;
|
||||
} else {
|
||||
// asm.js functions cannot have been created with a Function constructor
|
||||
// as they belong within a module.
|
||||
MOZ_ASSERT(!(begin == 0 && end == source->length() && source->argumentsNotIncluded()));
|
||||
|
||||
Rooted<JSFlatString*> src(cx, source->substring(cx, begin, end));
|
||||
if (!src)
|
||||
return nullptr;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue