Create NSDataBigString
Reviewed By: bnham Differential Revision: D4559734 fbshipit-source-id: 6766093524ae79ed2a41285d33eb2207993a7d0e
This commit is contained in:
parent
1635c02e92
commit
ebe3355de7
|
@ -0,0 +1,40 @@
|
|||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#include <cxxreact/JSBigString.h>
|
||||
|
||||
namespace facebook {
|
||||
namespace react {
|
||||
|
||||
class NSDataBigString : public JSBigString {
|
||||
public:
|
||||
// The NSData passed in must be be null-terminated.
|
||||
NSDataBigString(NSData *data);
|
||||
|
||||
// The ASCII optimization is not enabled on iOS
|
||||
bool isAscii() const override {
|
||||
return false;
|
||||
}
|
||||
|
||||
const char *c_str() const override {
|
||||
return (const char *)[m_data bytes];
|
||||
}
|
||||
|
||||
size_t size() const override {
|
||||
return m_length;
|
||||
}
|
||||
|
||||
private:
|
||||
NSData *m_data;
|
||||
size_t m_length;
|
||||
};
|
||||
|
||||
} }
|
|
@ -0,0 +1,44 @@
|
|||
/**
|
||||
* Copyright (c) 2015-present, Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD-style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*/
|
||||
|
||||
#import "NSDataBigString.h"
|
||||
|
||||
namespace facebook {
|
||||
namespace react {
|
||||
|
||||
static NSData *ensureNullTerminated(NSData *source)
|
||||
{
|
||||
if (!source || source.length == 0) {
|
||||
return nil;
|
||||
}
|
||||
|
||||
NSUInteger sourceLength = source.length;
|
||||
unsigned char lastByte;
|
||||
[source getBytes:&lastByte range:NSMakeRange(sourceLength - 1, 1)];
|
||||
|
||||
// TODO: bundles from the packager should always include a NULL byte
|
||||
// or we should we relax this requirement and only read as much from the
|
||||
// buffer as length indicates
|
||||
if (lastByte == '\0') {
|
||||
return source;
|
||||
} else {
|
||||
NSMutableData *data = [source mutableCopy];
|
||||
unsigned char nullByte = '\0';
|
||||
[data appendBytes:&nullByte length:1];
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
NSDataBigString::NSDataBigString(NSData *data)
|
||||
{
|
||||
m_length = [data length];
|
||||
m_data = ensureNullTerminated(data);
|
||||
}
|
||||
|
||||
} }
|
|
@ -40,6 +40,7 @@
|
|||
#import <cxxreact/Platform.h>
|
||||
#import <jschelpers/Value.h>
|
||||
|
||||
#import "NSDataBigString.h"
|
||||
#import "RCTMessageThread.h"
|
||||
#import "RCTNativeModule.h"
|
||||
#import "RCTObjcExecutor.h"
|
||||
|
@ -1183,10 +1184,7 @@ RCT_NOT_IMPLEMENTED(- (instancetype)initWithBundleURL:(__unused NSURL *)bundleUR
|
|||
self->_reactInstance->loadUnbundle(std::move(ramBundle), std::move(scriptStr),
|
||||
[[url absoluteString] UTF8String]);
|
||||
} else if (self->_reactInstance) {
|
||||
auto bigbuf = std::make_unique<JSBigBufferString>([script length]);
|
||||
memcpy(bigbuf->data(), [script bytes], bigbuf->size());
|
||||
|
||||
self->_reactInstance->loadScriptFromString(std::move(bigbuf),
|
||||
self->_reactInstance->loadScriptFromString(std::make_unique<NSDataBigString>(script),
|
||||
[[url absoluteString] UTF8String]);
|
||||
}
|
||||
}];
|
||||
|
@ -1210,10 +1208,8 @@ RCT_NOT_IMPLEMENTED(- (instancetype)initWithBundleURL:(__unused NSURL *)bundleUR
|
|||
[[url absoluteString] UTF8String]);
|
||||
}
|
||||
} else if (self->_reactInstance) {
|
||||
auto bigbuf = std::make_unique<JSBigBufferString>([script length]);
|
||||
memcpy(bigbuf->data(), [script bytes], bigbuf->size());
|
||||
|
||||
self->_reactInstance->loadScriptFromStringSync(std::move(bigbuf), [[url absoluteString] UTF8String]);
|
||||
self->_reactInstance->loadScriptFromStringSync(std::make_unique<NSDataBigString>(script),
|
||||
[[url absoluteString] UTF8String]);
|
||||
} else {
|
||||
throw std::logic_error(
|
||||
"Attempt to call loadApplicationScriptSync: on uninitialized bridge");
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -32,7 +32,11 @@ public:
|
|||
virtual ~JSBigString() {}
|
||||
|
||||
virtual bool isAscii() const = 0;
|
||||
|
||||
// This needs to be a \0 terminated string
|
||||
virtual const char* c_str() const = 0;
|
||||
|
||||
// Length of the c_str without the NULL byte.
|
||||
virtual size_t size() const = 0;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue