Guard DataPointer arithmetic
This commit is contained in:
@@ -39,11 +39,12 @@ class NativeCFFI {
|
||||
@:cffi private static function lime_application_update (handle:Dynamic):Bool;
|
||||
@:cffi private static function lime_audio_load (data:Dynamic, buffer:Dynamic):Dynamic;
|
||||
@:cffi private static function lime_bytes_from_data_pointer (data:Float, length:Int):Dynamic;
|
||||
@:cffi private static function lime_bytes_get_data_pointer (data:Dynamic):Float;
|
||||
@:cffi private static function lime_bytes_get_data_pointer (data:Dynamic, offset:Int):Float;
|
||||
@:cffi private static function lime_bytes_read_file (path:String, bytes:Dynamic):Dynamic;
|
||||
@:cffi private static function lime_cffi_get_native_pointer (ptr:Dynamic):Float;
|
||||
@:cffi private static function lime_clipboard_get_text ():Dynamic;
|
||||
@:cffi private static function lime_clipboard_set_text (text:String):Void;
|
||||
@:cffi private static function lime_data_pointer_offset (dataPointer:DataPointer, offset:Int):Float;
|
||||
@:cffi private static function lime_deflate_compress (data:Dynamic, bytes:Dynamic):Dynamic;
|
||||
@:cffi private static function lime_deflate_decompress (data:Dynamic, bytes:Dynamic):Dynamic;
|
||||
@:cffi private static function lime_drop_event_manager_register (callback:Dynamic, eventObject:Dynamic):Void;
|
||||
|
||||
@@ -52,9 +52,9 @@ abstract DataPointer(DataPointerType) to DataPointerType {
|
||||
@:from @:noCompletion public static function fromBytesPointer (pointer:BytePointer):DataPointer {
|
||||
|
||||
#if (lime_cffi && !macro)
|
||||
if (pointer == null) return cast 0;
|
||||
var data:Float = NativeCFFI.lime_bytes_get_data_pointer (pointer.bytes);
|
||||
return new DataPointer (data + pointer.offset);
|
||||
if (pointer == null || pointer.bytes == null) return cast 0;
|
||||
var data:Float = NativeCFFI.lime_bytes_get_data_pointer (pointer.bytes, pointer.offset);
|
||||
return new DataPointer (data);
|
||||
#elseif (js && !display)
|
||||
return fromBytes (pointer.bytes);
|
||||
#else
|
||||
@@ -68,8 +68,8 @@ abstract DataPointer(DataPointerType) to DataPointerType {
|
||||
|
||||
#if (lime_cffi && !js && !macro)
|
||||
if (arrayBufferView == null) return cast 0;
|
||||
var data:Float = NativeCFFI.lime_bytes_get_data_pointer (arrayBufferView.buffer);
|
||||
return new DataPointer (data + arrayBufferView.byteOffset);
|
||||
var data:Float = NativeCFFI.lime_bytes_get_data_pointer (arrayBufferView.buffer, arrayBufferView.byteOffset);
|
||||
return new DataPointer (data);
|
||||
#elseif (js && !display)
|
||||
return new DataPointer (arrayBufferView);
|
||||
#else
|
||||
@@ -97,7 +97,7 @@ abstract DataPointer(DataPointerType) to DataPointerType {
|
||||
|
||||
#if (lime_cffi && !macro)
|
||||
if (bytes == null) return cast 0;
|
||||
var data:Float = NativeCFFI.lime_bytes_get_data_pointer (bytes);
|
||||
var data:Float = NativeCFFI.lime_bytes_get_data_pointer (bytes, 0);
|
||||
return new DataPointer (data);
|
||||
#elseif (js && !display)
|
||||
return fromArrayBuffer (bytes.getData ());
|
||||
@@ -152,6 +152,19 @@ abstract DataPointer(DataPointerType) to DataPointerType {
|
||||
}
|
||||
|
||||
|
||||
private static function __withOffset (data:DataPointer, offset:Int):DataPointer {
|
||||
|
||||
#if (lime_cffi && !macro)
|
||||
if (data == 0) return cast 0;
|
||||
var data:Float = NativeCFFI.lime_data_pointer_offset (data, offset);
|
||||
return new DataPointer (data);
|
||||
#else
|
||||
return null;
|
||||
#end
|
||||
|
||||
}
|
||||
|
||||
|
||||
@:noCompletion @:op(A == B) private static inline function equals (a:DataPointer, b:Int):Bool { return (a:Float) == b; }
|
||||
@:noCompletion @:op(A == B) private static inline function equalsPointer (a:DataPointer, b:DataPointer):Bool { return (a:Float) == (b:Float); }
|
||||
@:noCompletion @:op(A > B) private static inline function greaterThan (a:DataPointer, b:Int):Bool { return (a:Float) > b; }
|
||||
@@ -164,10 +177,10 @@ abstract DataPointer(DataPointerType) to DataPointerType {
|
||||
@:noCompletion @:op(A <= B) private static inline function lessThanOrEqualPointer (a:DataPointer, b:CFFIPointer):Bool { return (a:Float) <= b; }
|
||||
@:noCompletion @:op(A != B) private static inline function notEquals (a:DataPointer, b:Int):Bool { return (a:Float) != b; }
|
||||
@:noCompletion @:op(A != B) private static inline function notEqualsPointer (a:DataPointer, b:DataPointer):Bool { return (a:Float) != (b:Float); }
|
||||
@:noCompletion @:op(A + B) private static inline function plus (a:DataPointer, b:Int):DataPointer { return new DataPointer ((a:Float) + b); }
|
||||
@:noCompletion @:op(A + B) private static inline function plusPointer (a:DataPointer, b:DataPointer):DataPointer { return new DataPointer ((a:Float) + (b:Float)); }
|
||||
@:noCompletion @:op(A - B) private static inline function minus (a:DataPointer, b:Int):DataPointer { return new DataPointer ((a:Float) - b); }
|
||||
@:noCompletion @:op(A - B) private static inline function minusPointer (a:DataPointer, b:DataPointer):DataPointer { return new DataPointer ((a:Float) - (b:Float)); }
|
||||
@:noCompletion @:op(A + B) private static inline function plus (a:DataPointer, b:Int):DataPointer { return __withOffset (a, b); }
|
||||
@:noCompletion @:op(A + B) private static inline function plusPointer (a:DataPointer, b:DataPointer):DataPointer { return __withOffset (a, Std.int ((b:Float))); }
|
||||
@:noCompletion @:op(A - B) private static inline function minus (a:DataPointer, b:Int):DataPointer { return __withOffset (a, -b); }
|
||||
@:noCompletion @:op(A - B) private static inline function minusPointer (a:DataPointer, b:DataPointer):DataPointer { return __withOffset (a, -Std.int ((b:Float))); }
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -224,10 +224,10 @@ namespace lime {
|
||||
}
|
||||
|
||||
|
||||
double lime_bytes_get_data_pointer (value bytes) {
|
||||
double lime_bytes_get_data_pointer (value bytes, int offset) {
|
||||
|
||||
Bytes data = Bytes (bytes);
|
||||
return (uintptr_t)data.Data ();
|
||||
return (uintptr_t)data.Data () + offset;
|
||||
|
||||
}
|
||||
|
||||
@@ -292,6 +292,13 @@ namespace lime {
|
||||
}
|
||||
|
||||
|
||||
double lime_data_pointer_offset (double pointer, int offset) {
|
||||
|
||||
return (uintptr_t)pointer + offset;
|
||||
|
||||
}
|
||||
|
||||
|
||||
value lime_deflate_compress (value buffer, value bytes) {
|
||||
|
||||
#ifdef LIME_ZLIB
|
||||
@@ -1773,12 +1780,13 @@ namespace lime {
|
||||
DEFINE_PRIME1 (lime_application_update);
|
||||
DEFINE_PRIME2 (lime_audio_load);
|
||||
DEFINE_PRIME2 (lime_bytes_from_data_pointer);
|
||||
DEFINE_PRIME1 (lime_bytes_get_data_pointer);
|
||||
DEFINE_PRIME2 (lime_bytes_get_data_pointer);
|
||||
DEFINE_PRIME2 (lime_bytes_read_file);
|
||||
DEFINE_PRIME1 (lime_cffi_get_native_pointer);
|
||||
DEFINE_PRIME1 (lime_cffi_set_finalizer);
|
||||
DEFINE_PRIME0 (lime_clipboard_get_text);
|
||||
DEFINE_PRIME1v (lime_clipboard_set_text);
|
||||
DEFINE_PRIME2 (lime_data_pointer_offset);
|
||||
DEFINE_PRIME2 (lime_deflate_compress);
|
||||
DEFINE_PRIME2 (lime_deflate_decompress);
|
||||
DEFINE_PRIME2v (lime_drop_event_manager_register);
|
||||
|
||||
Reference in New Issue
Block a user