Guard DataPointer arithmetic

This commit is contained in:
Joshua Granick
2017-03-28 16:38:44 -07:00
parent 01e3f134fa
commit a5c0de0449
3 changed files with 36 additions and 14 deletions

View File

@@ -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;

View File

@@ -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))); }
}

View File

@@ -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);